sys_role.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  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/container/gset"
  8. "github.com/gogf/gf/database/gdb"
  9. "github.com/gogf/gf/errors/gerror"
  10. "github.com/gogf/gf/frame/g"
  11. "github.com/gogf/gf/util/gconv"
  12. )
  13. type roleService struct {
  14. *contextService
  15. Dao *dao.SysRoleDao
  16. roleMenuDao *dao.SysRoleMenuDao
  17. roleDeptDao *dao.SysRoleDeptDao
  18. }
  19. func NewRoleService(ctx context.Context) (svc *roleService, err error) {
  20. svc = new(roleService)
  21. if svc.contextService, err = svc.Init(ctx); err != nil {
  22. return nil, err
  23. }
  24. svc.Dao = dao.NewSysRoleDao(svc.Tenant)
  25. svc.Table = svc.Dao.Table
  26. svc.roleMenuDao = dao.NewSysRoleMenuDao(svc.Tenant)
  27. svc.roleDeptDao = dao.NewSysRoleDeptDao(svc.Tenant)
  28. return svc, nil
  29. }
  30. // GetRoleList 获取角色列表
  31. func (s *roleService) GetRoleList() (list []*model.SysRole, err error) {
  32. //从数据库获取
  33. list, err = s.Dao.Order(s.Dao.Columns.Sort + " asc," + s.Dao.Columns.Id + " asc").All()
  34. if err != nil {
  35. g.Log().Error(err)
  36. err = gerror.New("获取角色数据失败")
  37. }
  38. return
  39. }
  40. func (s *roleService) GetRoleListSearch(req *model.SelectPageReq) (total int, list []*model.SysRole, err error) {
  41. db := dao.SysRole.M
  42. if req.RoleName != "" {
  43. db = db.Where("role_name like ?", "%"+req.RoleName+"%")
  44. }
  45. if req.Status != "" {
  46. db = db.Where("status", req.Status)
  47. }
  48. if req.BeginTime != "" {
  49. db = db.Where("created_time >= ? ", utils.StrToTimestamp(req.BeginTime))
  50. }
  51. if req.EndTime != "" {
  52. db = db.Where("created_time<=?", utils.StrToTimestamp(req.EndTime))
  53. }
  54. total, err = db.Count()
  55. if err != nil {
  56. g.Log().Error(err)
  57. err = gerror.New("获取总行数失败")
  58. return
  59. }
  60. err = db.Page(req.GetPage()).Order("id asc").Scan(&list)
  61. if err != nil {
  62. g.Log().Error(err)
  63. err = gerror.New("获取数据失败")
  64. return
  65. }
  66. return
  67. }
  68. func (s *roleService) GetRoleById(id int64) (roleInfo *model.UpdateSysRoleReq, err error) {
  69. roleInfo = new(model.UpdateSysRoleReq)
  70. role := new(model.SysRole)
  71. err = s.Dao.WherePri(id).Scan(&role)
  72. if err := gconv.Struct(role, roleInfo); err != nil {
  73. return nil, err
  74. }
  75. var menuList []model.SysRoleMenu
  76. err = s.roleMenuDao.Where("role_id", id).Scan(&menuList)
  77. if err != nil {
  78. return nil, err
  79. }
  80. roleInfo.MenuIds = []int{}
  81. for _, v := range menuList {
  82. roleInfo.MenuIds = append(roleInfo.MenuIds, v.MenuId)
  83. }
  84. return
  85. }
  86. func (s *roleService) GetRoleDeptTreeselect(id int64) (deptIds []int, err error) {
  87. count, err := s.Dao.WherePri(id).Count()
  88. if err != nil || count == 0 {
  89. return nil, gerror.New("角色不存在")
  90. }
  91. roleDeptList, err := s.roleDeptDao.Where("role_id", id).FindAll()
  92. if err != nil {
  93. return nil, err
  94. }
  95. deptIds = make([]int, len(roleDeptList))
  96. for _, v := range roleDeptList {
  97. deptIds = append(deptIds, v.DeptId)
  98. }
  99. return
  100. }
  101. // GetRolesMenuPermissions 获取角色菜单权限
  102. func (s *roleService) GetRolesMenuPermissions(ids []int) (perms []string, err error) {
  103. result, err := dao.NewSysMenuDao(s.Tenant).Fields(dao.SysMenu.Columns.Perms).WhereIn(dao.SysMenu.Columns.MenuType, g.Slice{"C", "F"}).
  104. WhereIn(dao.SysMenu.Columns.Id, s.roleMenuDao.WhereIn(s.roleMenuDao.Columns.RoleId, ids).Fields(s.roleMenuDao.Columns.MenuId)).
  105. WhereNot(dao.SysMenu.Columns.Perms, "").Array()
  106. perms = gconv.Strings(result)
  107. return perms, err
  108. }
  109. func (s *roleService) CreateRole(req *model.SysRoleReq) error {
  110. data := new(model.SysRole)
  111. if err := gconv.Struct(req, data); err != nil {
  112. return err
  113. }
  114. SetCreatedInfo(data, s.GetCxtUserId(), s.GetCxtUserName())
  115. err := s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  116. roleId, err := s.Dao.TX(tx).Data(data).InsertAndGetId()
  117. if err != nil {
  118. return err
  119. }
  120. return s.createRoleMenu(tx, roleId, req.MenuIds)
  121. })
  122. return err
  123. }
  124. func (s *roleService) UpdateRole(req *model.UpdateSysRoleReq) error {
  125. //保存角色信息
  126. roleMap := gdb.Map{
  127. "id": req.Id,
  128. "role_name": req.RoleName,
  129. "role_Key": req.RoleKey,
  130. "status": req.Status,
  131. "sort": req.Sort,
  132. "remark": req.Remark,
  133. }
  134. SetUpdatedInfo(roleMap, s.GetCxtUserId(), s.GetCxtUserName())
  135. err := s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  136. _, err := tx.Model(model.SysRole{}).Data(roleMap).WherePri(req.Id).Update()
  137. if err != nil {
  138. return err
  139. }
  140. _, err = s.roleMenuDao.TX(tx).Where(dao.SysRoleMenu.Columns.RoleId, req.Id).Delete()
  141. if err != nil {
  142. return err
  143. }
  144. return s.createRoleMenu(tx, int64(req.Id), req.MenuIds)
  145. })
  146. return err
  147. }
  148. // 角色关联菜单
  149. func (s *roleService) createRoleMenu(tx *gdb.TX, roleId int64, menuIds []int) error {
  150. list := g.Slice{}
  151. for _, v := range menuIds {
  152. list = append(list, g.Map{
  153. dao.SysRoleMenu.Columns.RoleId: roleId,
  154. dao.SysRoleMenu.Columns.MenuId: v,
  155. })
  156. }
  157. _, err := s.roleMenuDao.TX(tx).Insert(list)
  158. if err != nil {
  159. return err
  160. }
  161. return nil
  162. }
  163. func (s *roleService) DeleteByIds(ids []int64) (err error) {
  164. err = s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  165. _, err = s.Dao.TX(tx).Where("id in(?)", ids).Delete()
  166. if err != nil {
  167. return err
  168. }
  169. // 删除角色菜单权限
  170. _, err = s.roleMenuDao.TX(tx).WhereIn(dao.SysRoleMenu.Columns.RoleId, ids).Delete()
  171. if err != nil {
  172. return err
  173. }
  174. // 删除角色数据权限
  175. _, err = s.roleDeptDao.TX(tx).WhereIn(dao.SysRoleMenu.Columns.RoleId, ids).Delete()
  176. return err
  177. })
  178. return err
  179. }
  180. func (s *roleService) UpdateRoleStatus(req *model.StatusSetReq) error {
  181. _, err := s.Dao.Where(s.Dao.Columns.Id, req.RoleId).Data(s.Dao.Columns.Status, req.Status).Update()
  182. return err
  183. }
  184. // 设置角色数据权限
  185. func (s *roleService) UpdateRoleDataScope(req *model.DataScopeReq) error {
  186. err := s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  187. _, err := s.Dao.TX(tx).Where("id", req.RoleId).Data(g.Map{"data_scope": req.DataScope}).Update()
  188. if err != nil {
  189. return err
  190. }
  191. if req.DataScope == 2 {
  192. _, err := s.roleDeptDao.Where(s.roleDeptDao.Columns.RoleId, req.RoleId).Delete()
  193. if err != nil {
  194. return err
  195. }
  196. data := g.List{}
  197. for _, deptId := range req.DeptIds {
  198. data = append(data, g.Map{"role_id": req.RoleId, "dept_id": deptId})
  199. }
  200. _, err = s.roleDeptDao.Data(data).Insert()
  201. if err != nil {
  202. return err
  203. }
  204. }
  205. return nil
  206. })
  207. return err
  208. }
  209. // GetMaxRoleDataScopeByUser 获取用户所拥有的角色最高数据权限
  210. func (s *roleService) GetMaxRoleDataScopeByUser(userId int) (string, []int, error) {
  211. roleIds, err := dao.NewSysUserRoleDao(s.Tenant).Fields(dao.SysUserRole.Columns.RoleId).Where(dao.SysUserRole.Columns.UserId, userId).Array()
  212. if err != nil {
  213. return "", nil, err
  214. }
  215. if roleIds == nil {
  216. return "-1", nil, nil
  217. }
  218. scopes, err := s.Dao.Fields(s.Dao.Columns.DataScope).Distinct().Order(s.Dao.Columns.DataScope).WhereIn(s.Dao.Columns.Id, roleIds).Array()
  219. if err != nil {
  220. return "", nil, err
  221. }
  222. if scopes == nil || len(scopes) == 0 {
  223. return "", nil, gerror.New("用户角色设定有错误。")
  224. }
  225. scope := scopes[0].String()
  226. if scope == "30" {
  227. for _, v := range scopes {
  228. if v.String() == "40" {
  229. scope = "40"
  230. break
  231. }
  232. }
  233. }
  234. return scope, gconv.Ints(roleIds), err
  235. }
  236. // GetDataScope 获取某用户数据集合权限,返回Ids(用户Id列表),返回-1表示无角色,返回-2表示有全部集合权限
  237. func (s *roleService) GetDataScope(userId int) (ids string, err error) {
  238. userDao := dao.NewSysUserDao(s.Tenant)
  239. _, err = userDao.WherePri(userId).FindOne()
  240. if err != nil {
  241. return "", err
  242. }
  243. // 获取角色,获取最高数据权限
  244. dataScope, roleIds, err := s.GetMaxRoleDataScopeByUser(userId)
  245. if err != nil {
  246. return "", err
  247. }
  248. if dataScope == "-1" { // 无角色
  249. return "-1", nil
  250. }
  251. // 数据集合权限 10:全部数据权限 20:自定数据权限 30:本部门数据权限 40:本部门及以下数据权限 50:仅本人数据权限
  252. ids = "-1"
  253. switch dataScope {
  254. case "10": // 所有数据权限
  255. return "-2", nil
  256. case "20": // 自定数据权限
  257. result, err := userDao.Fields(userDao.Columns.Id).WhereIn(
  258. userDao.Columns.DeptId, s.roleDeptDao.Fields(s.roleDeptDao.Columns.DeptId).WhereIn(s.roleDeptDao.Columns.RoleId, roleIds),
  259. ).Array()
  260. if err != nil {
  261. return "", err
  262. }
  263. ids = utils.ToIdsString(result)
  264. case "30": // 本部门数据权限
  265. result, err := userDao.Fields(userDao.Columns.Id).Where(
  266. userDao.Columns.DeptId, userDao.Fields(userDao.Columns.DeptId).WherePri(userId),
  267. ).Array()
  268. if err != nil {
  269. return "", err
  270. }
  271. ids = utils.ToIdsString(result)
  272. case "40": // 本部门及以下数据权限
  273. deptId, err := userDao.Value(userDao.Columns.DeptId, userDao.Columns.Id, userId)
  274. if err != nil {
  275. return "", err
  276. }
  277. deptSrv := &deptService{
  278. contextService: s.contextService,
  279. Dao: dao.NewSysDeptDao(s.Tenant),
  280. }
  281. //获取正常状态部门数据
  282. depts, err := deptSrv.GetList(&model.SysDeptSearchParams{Status: "10"})
  283. if err != nil {
  284. return "", err
  285. }
  286. deptIdArr := gset.New()
  287. childrenList := deptSrv.FindSonByParentId(depts, gconv.Int(deptId))
  288. for _, children := range childrenList {
  289. deptIdArr.Add(gconv.Int(children.Id))
  290. }
  291. result, err := userDao.Fields(userDao.Columns.Id).WhereIn(userDao.Columns.DeptId, deptIdArr).Array()
  292. if err != nil {
  293. return "", err
  294. }
  295. ids = utils.ToIdsString(result)
  296. case "50": // 仅本人数据权限
  297. ids = gconv.String(userId)
  298. }
  299. return ids, nil
  300. }