sys_role.go 6.1 KB

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