sys_role.go 9.7 KB

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