| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- package service
- import (
- "context"
- "dashoo.cn/micro/app/dao"
- "dashoo.cn/micro/app/model"
- "dashoo.cn/opms_libary/myerrors"
- "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"
- "github.com/gogf/gf/util/gconv"
- )
- type RoleService struct {
- *contextService
- Dao *dao.SysRoleDao
- roleMenuDao *dao.SysRoleMenuDao
- roleDeptDao *dao.SysRoleDeptDao
- }
- func NewRoleService(ctx context.Context) (svc *RoleService, err error) {
- svc = new(RoleService)
- if svc.contextService, err = svc.Init(ctx); err != nil {
- return nil, err
- }
- svc.Dao = dao.NewSysRoleDao(svc.Tenant)
- svc.Table = svc.Dao.Table
- svc.roleMenuDao = dao.NewSysRoleMenuDao(svc.Tenant)
- svc.roleDeptDao = dao.NewSysRoleDeptDao(svc.Tenant)
- return svc, nil
- }
- // GetRoleList 获取角色列表
- func (s *RoleService) GetRoleList() (list []*model.SysRole, err error) {
- //从数据库获取
- list, err = s.Dao.Order(s.Dao.Columns.Sort + " asc," + s.Dao.Columns.Id + " asc").All()
- if err != nil {
- g.Log().Error(err)
- err = gerror.New("获取角色数据失败")
- }
- return
- }
- func (s *RoleService) GetRoleListSearch(req *model.SelectPageReq) (total int, list []*model.SysRole, err error) {
- db := dao.SysRole.M
- if req.RoleName != "" {
- db = db.Where("role_name like ?", "%"+req.RoleName+"%")
- }
- if req.Status != "" {
- db = db.Where("status", req.Status)
- }
- if req.BeginTime != "" {
- db = db.Where("created_time >= ? ", utils.StrToTimestamp(req.BeginTime))
- }
- if req.EndTime != "" {
- db = db.Where("created_time<=?", utils.StrToTimestamp(req.EndTime))
- }
- total, err = db.Count()
- if err != nil {
- g.Log().Error(err)
- err = gerror.New("获取总行数失败")
- return
- }
- err = db.Page(req.GetPage()).Order("id asc").Scan(&list)
- if err != nil {
- g.Log().Error(err)
- err = gerror.New("获取数据失败")
- return
- }
- return
- }
- func (s *RoleService) GetRoleById(id int64) (roleInfo *model.UpdateSysRoleReq, err error) {
- roleInfo = new(model.UpdateSysRoleReq)
- role := new(model.SysRole)
- err = s.Dao.WherePri(id).Scan(&role)
- if err := gconv.Struct(role, roleInfo); err != nil {
- return nil, err
- }
- var menuList []model.SysRoleMenu
- err = s.roleMenuDao.Where("role_id", id).Scan(&menuList)
- if err != nil {
- return nil, err
- }
- roleInfo.MenuIds = []int{}
- for _, v := range menuList {
- roleInfo.MenuIds = append(roleInfo.MenuIds, v.MenuId)
- }
- return
- }
- func (s *RoleService) GetRoleDeptTreeselect(id int64) (deptIds []int, err error) {
- count, err := s.Dao.WherePri(id).Count()
- if err != nil || count == 0 {
- return nil, gerror.New("角色不存在")
- }
- roleDeptList, err := s.roleDeptDao.Where("role_id", id).FindAll()
- if err != nil {
- return nil, err
- }
- deptIds = make([]int, len(roleDeptList))
- for _, v := range roleDeptList {
- deptIds = append(deptIds, v.DeptId)
- }
- return
- }
- // GetRolesMenuPermissions 获取角色菜单权限
- 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()
- perms = gconv.Strings(result)
- return perms, err
- }
- func (s *RoleService) CreateRole(req *model.SysRoleReq) error {
- data := new(model.SysRole)
- if err := gconv.Struct(req, data); err != nil {
- return err
- }
- SetCreatedInfo(data, s.GetCxtUserId(), s.GetCxtUserName())
- err := s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
- roleId, err := s.Dao.TX(tx).Data(data).InsertAndGetId()
- if err != nil {
- return err
- }
- return s.createRoleMenu(tx, roleId, req.MenuIds)
- })
- return err
- }
- func (s *RoleService) UpdateRole(req *model.UpdateSysRoleReq) error {
- //保存角色信息
- roleMap := gdb.Map{
- "id": req.Id,
- "role_name": req.RoleName,
- "role_Key": req.RoleKey,
- "status": req.Status,
- "sort": req.Sort,
- "remark": req.Remark,
- }
- SetUpdatedInfo(roleMap, s.GetCxtUserId(), s.GetCxtUserName())
- err := s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
- _, err := tx.Model(model.SysRole{}).Data(roleMap).WherePri(req.Id).Update()
- if err != nil {
- return err
- }
- _, err = s.roleMenuDao.TX(tx).Where(dao.SysRoleMenu.Columns.RoleId, req.Id).Delete()
- if err != nil {
- return err
- }
- return s.createRoleMenu(tx, int64(req.Id), req.MenuIds)
- })
- return err
- }
- // 角色关联菜单
- func (s *RoleService) createRoleMenu(tx *gdb.TX, roleId int64, menuIds []int) error {
- list := g.Slice{}
- for _, v := range menuIds {
- list = append(list, g.Map{
- dao.SysRoleMenu.Columns.RoleId: roleId,
- dao.SysRoleMenu.Columns.MenuId: v,
- })
- }
- _, err := s.roleMenuDao.TX(tx).Insert(list)
- if err != nil {
- return err
- }
- return nil
- }
- func (s *RoleService) DeleteByIds(ids []int64) (err error) {
- err = s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
- _, err = s.Dao.TX(tx).Where("id in(?)", ids).Delete()
- if err != nil {
- return err
- }
- // 删除角色菜单权限
- _, err = s.roleMenuDao.TX(tx).WhereIn(dao.SysRoleMenu.Columns.RoleId, ids).Delete()
- if err != nil {
- return err
- }
- // 删除角色数据权限
- _, err = s.roleDeptDao.TX(tx).WhereIn(dao.SysRoleMenu.Columns.RoleId, ids).Delete()
- return err
- })
- return err
- }
- func (s *RoleService) UpdateRoleStatus(req *model.StatusSetReq) error {
- _, err := s.Dao.Where(s.Dao.Columns.Id, req.RoleId).Data(s.Dao.Columns.Status, req.Status).Update()
- return err
- }
- // 设置角色数据权限
- func (s *RoleService) UpdateRoleDataScope(req *model.DataScopeReq) error {
- err := s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
- _, err := s.Dao.TX(tx).Where("id", req.RoleId).Data(g.Map{"data_scope": req.DataScope}).Update()
- if err != nil {
- return err
- }
- if req.DataScope == 2 {
- _, err := s.roleDeptDao.Where(s.roleDeptDao.Columns.RoleId, req.RoleId).Delete()
- if err != nil {
- return err
- }
- data := g.List{}
- for _, deptId := range req.DeptIds {
- data = append(data, g.Map{"role_id": req.RoleId, "dept_id": deptId})
- }
- _, err = s.roleDeptDao.Data(data).Insert()
- if err != nil {
- return err
- }
- }
- return nil
- })
- return err
- }
- // GetMaxRoleDataScopeByUser 获取用户所拥有的角色最高数据权限
- func (s *RoleService) GetMaxRoleDataScopeByUser(userId int) (string, []int, error) {
- // 获取岗位角色
- postRoleIds, err := dao.NewSysPostRoleDao(s.Tenant).As("postRole").Fields(dao.SysPostRole.Columns.RoleId).
- WhereIn(dao.SysPostRole.Columns.PostId, dao.NewSysUserPostDao(s.Tenant).Where(dao.SysUserPost.Columns.UserId, userId)).Array()
- if err != nil {
- return "", nil, err
- }
- if postRoleIds == nil {
- return "-1", nil, nil
- }
- // 获取用户角色
- userRoleIds, err := dao.NewSysUserRoleDao(s.Tenant).Fields(dao.SysUserRole.Columns.RoleId).Where(dao.SysUserRole.Columns.UserId, userId).Array()
- if err != nil {
- return "", nil, err
- }
- if userRoleIds == nil {
- return "-1", nil, nil
- }
- roleIds := append(postRoleIds, userRoleIds...)
- 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)
- userInfo, err := userDao.WherePri(userId).Where(dao.SysUser.Columns.Status, "10").FindOne()
- if err != nil {
- return "", err
- }
- if userInfo != nil {
- return "", myerrors.TipsError("用户不存在")
- }
- // 获取角色,获取最高数据权限
- 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": // 自定数据权限
- userIds, 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(userIds)
- case "30": // 本部门数据权限
- userIds, err := userDao.Fields(userDao.Columns.Id).Where(userDao.Columns.DeptId, userInfo.DeptId).Array()
- if err != nil {
- return "", err
- }
- ids = utils.ToIdsString(userIds)
- case "40": // 本部门及以下数据权限
- 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, userInfo.DeptId)
- for _, children := range childrenList {
- deptIdArr.Add(gconv.Int(children.Id))
- }
- userIds, err := userDao.Fields(userDao.Columns.Id).WhereIn(userDao.Columns.DeptId, deptIdArr).Array()
- if err != nil {
- return "", err
- }
- ids = utils.ToIdsString(userIds)
- case "50": // 仅本人数据权限
- ids = gconv.String(userId)
- }
- return ids, nil
- }
|