sys_role.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package service
  2. import (
  3. "context"
  4. "dashoo.cn/micro/app/dao"
  5. "dashoo.cn/micro/app/model"
  6. "dashoo.cn/opms_libary/utils"
  7. "github.com/gogf/gf/database/gdb"
  8. "github.com/gogf/gf/errors/gerror"
  9. "github.com/gogf/gf/frame/g"
  10. "github.com/gogf/gf/util/gconv"
  11. )
  12. type RoleService struct {
  13. *contextService
  14. Dao *dao.SysRoleDao
  15. roleMenuDao *dao.SysRoleMenuDao
  16. roleDeptDao *dao.SysRoleDeptDao
  17. }
  18. func NewRoleService(ctx context.Context) (svc *RoleService, err error) {
  19. svc = new(RoleService)
  20. if svc.contextService, err = svc.Init(ctx); err != nil {
  21. return nil, err
  22. }
  23. svc.Dao = dao.NewSysRoleDao(svc.Tenant)
  24. svc.roleMenuDao = dao.NewSysRoleMenuDao(svc.Tenant)
  25. svc.roleDeptDao = dao.NewSysRoleDeptDao(svc.Tenant)
  26. return svc, nil
  27. }
  28. // GetRoleList 获取角色列表
  29. func (s *RoleService) GetRoleList() (list []*model.SysRole, err error) {
  30. //从数据库获取
  31. list, err = s.Dao.OrderAsc(s.Dao.C.Sort).All()
  32. if err != nil {
  33. g.Log().Error(err)
  34. err = gerror.New("获取角色数据失败")
  35. }
  36. return
  37. }
  38. func (s *RoleService) GetRoleListSearch(req *model.SelectPageReq) (total int, list []*model.SysRole, err error) {
  39. db := s.Dao.M
  40. if req.RoleName != "" {
  41. db = db.Where("role_name like ?", "%"+req.RoleName+"%")
  42. }
  43. if req.Status != "" {
  44. db = db.Where("status", req.Status)
  45. }
  46. if req.BeginTime != "" {
  47. db = db.Where("created_time >= ? ", utils.StrToTimestamp(req.BeginTime))
  48. }
  49. if req.EndTime != "" {
  50. db = db.Where("created_time<=?", utils.StrToTimestamp(req.EndTime))
  51. }
  52. total, err = db.Count()
  53. if err != nil {
  54. g.Log().Error(err)
  55. err = gerror.New("获取总行数失败")
  56. return
  57. }
  58. err = db.Page(req.GetPage()).OrderAsc(s.Dao.C.Sort).Scan(&list)
  59. if err != nil {
  60. g.Log().Error(err)
  61. err = gerror.New("获取数据失败")
  62. return
  63. }
  64. return
  65. }
  66. func (s *RoleService) GetRoleById(id int64) (roleInfo *model.UpdateSysRoleReq, err error) {
  67. roleInfo = new(model.UpdateSysRoleReq)
  68. role := new(model.SysRole)
  69. err = s.Dao.WherePri(id).Scan(&role)
  70. if err := gconv.Struct(role, roleInfo); err != nil {
  71. return nil, err
  72. }
  73. var menuList []model.SysRoleMenu
  74. err = s.roleMenuDao.Where("role_id", id).Scan(&menuList)
  75. if err != nil {
  76. return nil, err
  77. }
  78. roleInfo.MenuIds = []int{}
  79. for _, v := range menuList {
  80. roleInfo.MenuIds = append(roleInfo.MenuIds, v.MenuId)
  81. }
  82. return
  83. }
  84. func (s *RoleService) GetRoleDeptTreeselect(id int64) (deptIds []int, err error) {
  85. count, err := s.Dao.WherePri(id).Count()
  86. if err != nil || count == 0 {
  87. return nil, gerror.New("角色不存在")
  88. }
  89. roleDeptList, err := s.roleDeptDao.Where("role_id", id).FindAll()
  90. if err != nil {
  91. return nil, err
  92. }
  93. deptIds = make([]int, len(roleDeptList))
  94. for _, v := range roleDeptList {
  95. deptIds = append(deptIds, v.DeptId)
  96. }
  97. return
  98. }
  99. // GetRolesMenuPermissions 获取角色菜单权限
  100. func (s *RoleService) GetRolesMenuPermissions(ids []int) (perms []string, err error) {
  101. result, err := dao.NewSysMenuDao(s.Tenant).Fields(dao.SysMenu.C.Perms).WhereIn(dao.SysMenu.C.MenuType, g.Slice{"C", "F"}).
  102. WhereIn(dao.SysMenu.C.Id, s.roleMenuDao.WhereIn(s.roleMenuDao.C.RoleId, ids).Fields(s.roleMenuDao.C.MenuId).M).
  103. WhereNot(dao.SysMenu.C.Perms, "").Array()
  104. perms = gconv.Strings(result)
  105. return perms, err
  106. }
  107. func (s *RoleService) CreateRole(req *model.SysRoleReq) error {
  108. data := new(model.SysRole)
  109. if err := gconv.Struct(req, data); err != nil {
  110. return err
  111. }
  112. SetCreatedInfo(data, s.GetCxtUserId(), s.GetCxtUserName())
  113. err := s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  114. roleId, err := s.Dao.TX(tx).Data(data).InsertAndGetId()
  115. if err != nil {
  116. return err
  117. }
  118. return s.createRoleMenu(tx, roleId, req.MenuIds)
  119. })
  120. return err
  121. }
  122. func (s *RoleService) UpdateRole(req *model.UpdateSysRoleReq) error {
  123. //保存角色信息
  124. roleMap := gdb.Map{
  125. "id": req.Id,
  126. "role_name": req.RoleName,
  127. "role_Key": req.RoleKey,
  128. "status": req.Status,
  129. "sort": req.Sort,
  130. "remark": req.Remark,
  131. }
  132. SetUpdatedInfo(roleMap, s.GetCxtUserId(), s.GetCxtUserName())
  133. err := s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  134. _, err := tx.Model(model.SysRole{}).Data(roleMap).WherePri(req.Id).Update()
  135. if err != nil {
  136. return err
  137. }
  138. _, err = s.roleMenuDao.TX(tx).Where(dao.SysRoleMenu.C.RoleId, req.Id).Delete()
  139. if err != nil {
  140. return err
  141. }
  142. return s.createRoleMenu(tx, int64(req.Id), req.MenuIds)
  143. })
  144. return err
  145. }
  146. // 角色关联菜单
  147. func (s *RoleService) createRoleMenu(tx *gdb.TX, roleId int64, menuIds []int) error {
  148. list := g.Slice{}
  149. for _, v := range menuIds {
  150. list = append(list, g.Map{
  151. dao.SysRoleMenu.C.RoleId: roleId,
  152. dao.SysRoleMenu.C.MenuId: v,
  153. })
  154. }
  155. _, err := s.roleMenuDao.TX(tx).Insert(list)
  156. if err != nil {
  157. return err
  158. }
  159. return nil
  160. }
  161. func (s *RoleService) DeleteByIds(ids []int64) (err error) {
  162. err = s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  163. _, err = s.Dao.TX(tx).Where("id in(?)", ids).Delete()
  164. if err != nil {
  165. return err
  166. }
  167. // 删除角色菜单权限
  168. _, err = s.roleMenuDao.TX(tx).WhereIn(dao.SysRoleMenu.C.RoleId, ids).Delete()
  169. if err != nil {
  170. return err
  171. }
  172. // 删除角色数据权限
  173. _, err = s.roleDeptDao.TX(tx).WhereIn(dao.SysRoleMenu.C.RoleId, ids).Delete()
  174. return err
  175. })
  176. return err
  177. }
  178. func (s *RoleService) UpdateRoleStatus(req *model.StatusSetReq) error {
  179. _, err := s.Dao.WherePri(req.RoleId).Data(s.Dao.C.Status, req.Status).Update()
  180. return err
  181. }
  182. // 设置角色数据权限
  183. func (s *RoleService) UpdateRoleDataScope(req *model.DataScopeReq) error {
  184. err := s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  185. _, err := s.Dao.TX(tx).WherePri(req.RoleId).Data(g.Map{s.Dao.C.DataScope: req.DataScope, s.Dao.C.DeptCheckStrictly: req.DeptCheckStrictly}).Update()
  186. if err != nil {
  187. return err
  188. }
  189. if req.DataScope == 2 {
  190. _, err := s.roleDeptDao.Where(s.roleDeptDao.C.RoleId, req.RoleId).Delete()
  191. if err != nil {
  192. return err
  193. }
  194. data := g.List{}
  195. for _, deptId := range req.DeptIds {
  196. data = append(data, g.Map{s.roleDeptDao.C.RoleId: req.RoleId, s.roleDeptDao.C.DeptId: deptId})
  197. }
  198. _, err = s.roleDeptDao.TX(tx).Data(data).Insert()
  199. if err != nil {
  200. return err
  201. }
  202. }
  203. return nil
  204. })
  205. return err
  206. }
  207. // GetRoleKeys 根据用户id获取角色key
  208. func (s *RoleService) GetRoleKeys(roleIds []int) ([]string, error) {
  209. roles, err := s.Dao.WhereIn(dao.SysRole.C.Id, roleIds).Fields(dao.SysRole.C.RoleKey).Distinct().Array()
  210. if err != nil {
  211. return nil, err
  212. }
  213. return gconv.Strings(roles), nil
  214. }