|
|
@@ -5,6 +5,7 @@ import (
|
|
|
"dashoo.cn/micro/app/dao"
|
|
|
"dashoo.cn/micro/app/model"
|
|
|
"dashoo.cn/opms_libary/utils"
|
|
|
+ "github.com/gogf/gf/container/gset"
|
|
|
"github.com/gogf/gf/database/gdb"
|
|
|
"github.com/gogf/gf/errors/gerror"
|
|
|
"github.com/gogf/gf/frame/g"
|
|
|
@@ -106,7 +107,7 @@ func (s *roleService) GetRoleDeptTreeselect(id int64) (deptIds []int, err error)
|
|
|
}
|
|
|
|
|
|
// GetRolesMenuPermissions 获取角色菜单权限
|
|
|
-func (s roleService) GetRolesMenuPermissions(ids []int) (perms []string, err error) {
|
|
|
+func (s *roleService) GetRolesMenuPermissions(ids []int) (perms []string, err error) {
|
|
|
result, err := dao.NewSysMenuDao(s.Tenant).Fields(dao.SysMenu.Columns.Perms).WhereIn(dao.SysMenu.Columns.MenuType, g.Slice{"C", "F"}).
|
|
|
WhereIn(dao.SysMenu.Columns.Id, s.roleMenuDao.WhereIn(s.roleMenuDao.Columns.RoleId, ids).Fields(s.roleMenuDao.Columns.MenuId)).
|
|
|
WhereNot(dao.SysMenu.Columns.Perms, "").Array()
|
|
|
@@ -220,3 +221,105 @@ func (s *roleService) UpdateRoleDataScope(req *model.DataScopeReq) error {
|
|
|
})
|
|
|
return err
|
|
|
}
|
|
|
+
|
|
|
+// GetMaxRoleDataScopeByUser 获取用户所拥有的角色最高数据权限
|
|
|
+func (s *roleService) GetMaxRoleDataScopeByUser(userId int) (string, []int, error) {
|
|
|
+ roleIds, err := dao.NewSysUserRoleDao(s.Tenant).Fields(dao.SysUserRole.Columns.RoleId).Where(dao.SysUserRole.Columns.UserId, userId).Array()
|
|
|
+ if err != nil {
|
|
|
+ return "", nil, err
|
|
|
+ }
|
|
|
+ if roleIds == nil {
|
|
|
+ return "-1", nil, nil
|
|
|
+ }
|
|
|
+
|
|
|
+ scopes, err := s.Dao.Fields(s.Dao.Columns.DataScope).Distinct().Order(s.Dao.Columns.DataScope).WhereIn(s.Dao.Columns.Id, roleIds).Array()
|
|
|
+ if err != nil {
|
|
|
+ return "", nil, err
|
|
|
+ }
|
|
|
+ if scopes == nil || len(scopes) == 0 {
|
|
|
+ return "", nil, gerror.New("用户角色设定有错误。")
|
|
|
+ }
|
|
|
+
|
|
|
+ scope := scopes[0].String()
|
|
|
+ if scope == "30" {
|
|
|
+ for _, v := range scopes {
|
|
|
+ if v.String() == "40" {
|
|
|
+ scope = "40"
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return scope, gconv.Ints(roleIds), err
|
|
|
+}
|
|
|
+
|
|
|
+// GetDataScope 获取某用户数据集合权限,返回Ids(用户Id列表),返回-1表示无角色,返回-2表示有全部集合权限
|
|
|
+func (s *roleService) GetDataScope(userId int) (ids string, err error) {
|
|
|
+ userDao := dao.NewSysUserDao(s.Tenant)
|
|
|
+ _, err = userDao.WherePri(userId).FindOne()
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取角色,获取最高数据权限
|
|
|
+ dataScope, roleIds, err := s.GetMaxRoleDataScopeByUser(userId)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ if dataScope == "-1" { // 无角色
|
|
|
+ return "-1", nil
|
|
|
+ }
|
|
|
+
|
|
|
+ // 数据集合权限 10:全部数据权限 20:自定数据权限 30:本部门数据权限 40:本部门及以下数据权限 50:仅本人数据权限
|
|
|
+ ids = "-1"
|
|
|
+ switch dataScope {
|
|
|
+ case "10": // 所有数据权限
|
|
|
+ return "-2", nil
|
|
|
+ case "20": // 自定数据权限
|
|
|
+ result, err := userDao.Fields(userDao.Columns.Id).WhereIn(
|
|
|
+ userDao.Columns.DeptId, s.roleDeptDao.Fields(s.roleDeptDao.Columns.DeptId).WhereIn(s.roleDeptDao.Columns.RoleId, roleIds),
|
|
|
+ ).Array()
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ ids = utils.ToIdsString(result)
|
|
|
+ case "30": // 本部门数据权限
|
|
|
+ result, err := userDao.Fields(userDao.Columns.Id).Where(
|
|
|
+ userDao.Columns.DeptId, userDao.Fields(userDao.Columns.DeptId).WherePri(userId),
|
|
|
+ ).Array()
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ ids = utils.ToIdsString(result)
|
|
|
+ case "40": // 本部门及以下数据权限
|
|
|
+ deptId, err := userDao.Value(userDao.Columns.DeptId, userDao.Columns.Id, userId)
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+
|
|
|
+ deptSrv := &deptService{
|
|
|
+ contextService: s.contextService,
|
|
|
+ Dao: dao.NewSysDeptDao(s.Tenant),
|
|
|
+ }
|
|
|
+ //获取正常状态部门数据
|
|
|
+ depts, err := deptSrv.GetList(&model.SysDeptSearchParams{Status: "10"})
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ deptIdArr := gset.New()
|
|
|
+ childrenList := deptSrv.FindSonByParentId(depts, gconv.Int(deptId))
|
|
|
+ for _, children := range childrenList {
|
|
|
+ deptIdArr.Add(gconv.Int(children.Id))
|
|
|
+ }
|
|
|
+
|
|
|
+ result, err := userDao.Fields(userDao.Columns.Id).WhereIn(userDao.Columns.DeptId, deptIdArr).Array()
|
|
|
+ if err != nil {
|
|
|
+ return "", err
|
|
|
+ }
|
|
|
+ ids = utils.ToIdsString(result)
|
|
|
+ case "50": // 仅本人数据权限
|
|
|
+ ids = gconv.String(userId)
|
|
|
+ }
|
|
|
+
|
|
|
+ return ids, nil
|
|
|
+}
|