sys_user_datascope.go 7.2 KB

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