sys_user_datascope.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package service
  2. import (
  3. "dashoo.cn/micro/app/dao"
  4. "dashoo.cn/micro/app/model"
  5. "dashoo.cn/opms_libary/myerrors"
  6. "dashoo.cn/opms_libary/request"
  7. "github.com/gogf/gf/container/gset"
  8. "github.com/gogf/gf/frame/g"
  9. "github.com/gogf/gf/util/gconv"
  10. )
  11. // GetUserPermission 获取用户权限字符(角色、岗位、用户组)
  12. func (s *UserService) GetUserPermission(userId int) ([]string, []string, []string, error) {
  13. s.userRoleDao = dao.NewSysUserRoleDao(s.Tenant)
  14. s.userPostDao = dao.NewSysUserPostDao(s.Tenant)
  15. s.userGroupDao = dao.NewSysUserGroupDao(s.Tenant)
  16. roleList, err := s.userRoleDao.As("user_role").LeftJoin(dao.SysRole.Table, "role", "user_role.role_id=role.id").
  17. Fields(dao.SysRole.C.RoleKey).Where(s.userRoleDao.C.UserId, userId).Array()
  18. if err != nil {
  19. g.Log().Error(err)
  20. return nil, nil, nil, err
  21. }
  22. postList, err := s.userPostDao.As("user_post").LeftJoin(dao.SysPost.Table, "post", "user_post.post_id=post.id").
  23. Fields(dao.SysPost.C.PostCode).Where(s.userPostDao.C.UserId, userId).Array()
  24. if err != nil {
  25. g.Log().Error(err)
  26. return nil, nil, nil, err
  27. }
  28. groupList, err := s.userGroupDao.As("user_group").LeftJoin(dao.SysGroup.Table, "group", "user_group.group_id=group.id").
  29. Fields(dao.SysGroup.C.GroupCode).Where(s.userGroupDao.C.UserId, userId).Array()
  30. if err != nil {
  31. g.Log().Error(err)
  32. return nil, nil, nil, err
  33. }
  34. return gconv.Strings(roleList), gconv.Strings(postList), gconv.Strings(groupList), err
  35. }
  36. // GetUserRoleIds 获取用户角色
  37. func (s *UserService) GetUserRoleIds(userId int) (roleIds []int, err error) {
  38. s.userRoleDao = dao.NewSysUserRoleDao(s.Tenant)
  39. list, err := s.userRoleDao.Where(dao.SysUserRole.C.UserId, userId).Fields(dao.SysUserRole.C.RoleId).Array()
  40. if err != nil {
  41. g.Log().Error(err)
  42. return nil, myerrors.TipsError("获取用户岗位信息失败")
  43. }
  44. return gconv.Ints(list), nil
  45. }
  46. // GetUserPostIds 获取用户岗位
  47. func (s *UserService) GetUserPostIds(userId int) (postIds []int, err error) {
  48. s.userPostDao = dao.NewSysUserPostDao(s.Tenant)
  49. list, err := s.userPostDao.Where(dao.SysUserPost.C.UserId, userId).Fields(dao.SysUserPost.C.PostId).Array()
  50. if err != nil {
  51. g.Log().Error(err)
  52. return nil, myerrors.TipsError("获取用户岗位信息失败")
  53. }
  54. return gconv.Ints(list), nil
  55. }
  56. // GetUserGroupIds 获取用户的用户组
  57. func (s *UserService) GetUserGroupIds(userId int) (postIds []int, err error) {
  58. s.userGroupDao = dao.NewSysUserGroupDao(s.Tenant)
  59. list, err := s.userGroupDao.Where(dao.SysUserGroup.C.UserId, userId).Fields(dao.SysUserGroup.C.GroupId).Array()
  60. if err != nil {
  61. g.Log().Error(err)
  62. return nil, myerrors.TipsError("获取用户岗位信息失败")
  63. }
  64. return gconv.Ints(list), nil
  65. }
  66. // GetRolesByUserId 根据用户id获取角色信息详情
  67. func (s *UserService) GetRolesByUserId(userId int) ([]*model.SysRole, error) {
  68. roleIds, err := s.GetUserRoleIds(userId)
  69. if err != nil {
  70. return nil, err
  71. }
  72. roles, err := dao.NewSysRoleDao(s.Tenant).WhereIn(dao.SysRole.C.Id, roleIds).All()
  73. return roles, err
  74. }
  75. // GetPostsByUserId 根据用户id获取岗位信息详情
  76. func (s *UserService) GetPostsByUserId(userId int) ([]*model.SysPost, error) {
  77. postIds, err := s.GetUserPostIds(userId)
  78. if err != nil {
  79. return nil, err
  80. }
  81. posts, err := dao.NewSysPostDao(s.Tenant).Where(dao.SysPost.C.Id+" in (?)", postIds).All()
  82. return posts, err
  83. }
  84. // GetMaxRoleDataScopeByUser 获取用户所拥有的角色最高数据权限
  85. func (s *UserService) GetMaxRoleDataScopeByUser(userId int) ([]*model.SysRole, error) {
  86. // 获取岗位角色
  87. postRoleIds, err := dao.NewSysPostRoleDao(s.Tenant).As("postRole").Fields(dao.SysPostRole.C.RoleId).
  88. WhereIn(dao.SysPostRole.C.PostId,
  89. dao.NewSysUserPostDao(s.Tenant).Fields(dao.SysUserPost.C.PostId).Where(dao.SysUserPost.C.UserId, userId).M,
  90. ).Array()
  91. if err != nil {
  92. return nil, err
  93. }
  94. // 获取用户角色
  95. userRoleIds, err := dao.NewSysUserRoleDao(s.Tenant).Fields(dao.SysUserRole.C.RoleId).Where(dao.SysUserRole.C.UserId, userId).Array()
  96. if err != nil {
  97. return nil, err
  98. }
  99. roleIds := append(postRoleIds, userRoleIds...)
  100. roles, err := dao.NewSysRoleDao(s.Tenant).Distinct().Order(dao.SysRole.C.DataScope).WhereIn(s.Dao.C.Id, roleIds).All()
  101. if err != nil {
  102. return nil, err
  103. }
  104. if len(roles) == 0 {
  105. return nil, nil
  106. }
  107. return roles, err
  108. }
  109. // GetDataScope 获取某用户数据集合权限,返回Ids(用户Id列表),返回-1表示无角色,返回-2表示有全部集合权限
  110. func (s *UserService) GetDataScope(userInfo *request.UserInfo) (dataScope g.Map, err error) {
  111. userDao := s.Dao
  112. userId := userInfo.Id
  113. // 权限
  114. userInfo.Roles, userInfo.Posts, userInfo.Groups, err = s.GetUserPermission(userInfo.Id)
  115. if err != nil {
  116. g.Log().Error(err)
  117. return nil, myerrors.TipsError("获取用户权限失败")
  118. }
  119. // 产品线数据权限
  120. lineSrv, _ := NewLineService(s.Ctx)
  121. productLineList, err := lineSrv.getCurrentUserProductAuth(userId)
  122. if err != nil {
  123. return nil, err
  124. }
  125. // 大项目授权数据权限
  126. isBigProject, err := lineSrv.getCurrentUserBigProjectAuth(userId)
  127. if err != nil {
  128. return nil, err
  129. }
  130. // 地区数据权限
  131. regionSrv, _ := NewRegionService(s.Ctx)
  132. regionList, err := regionSrv.getCurrentUserRegionAuth(userId)
  133. if err != nil {
  134. return nil, err
  135. }
  136. // 获取角色
  137. roles, err := s.GetMaxRoleDataScopeByUser(userId)
  138. if err != nil {
  139. return nil, err
  140. }
  141. if len(roles) == 0 { // 无角色
  142. return g.Map{"userIds": userId}, nil
  143. }
  144. // 数据集合权限 10:全部数据权限 20:自定数据权限 30:本部门数据权限 40:本部门及以下数据权限 50:仅本人数据权限
  145. userIdArr := gset.NewIntSet()
  146. deptFlag, deptAndSonFlag := false, false
  147. for _, role := range roles {
  148. switch role.DataScope {
  149. case "10": // 所有数据权限
  150. return g.Map{"userIds": "-1"}, nil
  151. case "20": // 自定数据权限
  152. userIds, err := userDao.Fields(userDao.C.Id).WhereIn(
  153. userDao.C.DeptId, dao.NewSysRoleDeptDao(s.Tenant).Fields(dao.SysRoleDept.C.DeptId).WhereIn(dao.SysRoleDept.C.RoleId, role.Id).M,
  154. ).Array()
  155. if err != nil {
  156. return nil, err
  157. }
  158. userIdArr.Add(gconv.Ints(userIds)...)
  159. case "30": // 本部门数据权限
  160. if deptAndSonFlag || deptFlag {
  161. continue
  162. }
  163. deptFlag = true
  164. userIds, err := userDao.Fields(userDao.C.Id).Where(userDao.C.DeptId, userInfo.DeptId).Array()
  165. if err != nil {
  166. return nil, err
  167. }
  168. userIdArr.Add(gconv.Ints(userIds)...)
  169. case "40": // 本部门及以下数据权限
  170. if deptAndSonFlag {
  171. continue
  172. }
  173. deptAndSonFlag = true
  174. deptSrv, _ := NewDeptService(s.Ctx)
  175. //获取下级部门数据
  176. deptIds, err := deptSrv.GetSonAndSelfIdByParentId(userInfo.DeptId)
  177. if err != nil {
  178. return nil, err
  179. }
  180. userIds, err := userDao.Fields(userDao.C.Id).WhereIn(userDao.C.DeptId, deptIds).Array()
  181. if err != nil {
  182. return nil, err
  183. }
  184. userIdArr.Add(gconv.Ints(userIds)...)
  185. case "50": // 仅本人数据权限
  186. userIdArr.Add(userId)
  187. }
  188. }
  189. if userIdArr.Size() == 0 {
  190. userIdArr.Add(userId)
  191. }
  192. dataScope = g.Map{"userIds": userIdArr.Slice(), "cust_city_id": regionList, "product_line": productLineList}
  193. if isBigProject != "" {
  194. dataScope["is_big"] = isBigProject
  195. }
  196. dataScope["roles"] = userInfo.Roles
  197. dataScope["posts"] = userInfo.Posts
  198. return dataScope, nil
  199. }