sys_role.go 6.2 KB

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