package agent import ( "context" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/consts" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/dao" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/contexts" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/os/gtime" "github.com/gogf/gf/v2/util/gconv" ) type sAgentUser struct { *agentBase } func NewAgentUser() *sAgentUser { return &sAgentUser{ agentBase: newAgentBase(), } } func init() { service.RegisterAgentUser(NewAgentUser()) } // UserList 查询用户列表 func (s *sAgentUser) UserList(ctx context.Context, in *model.AgentUserListParam) (list []*model.AgentUserListModel, total int, err error) { deptId := contexts.GetDeptId(ctx) if deptId == 0 { return nil, 0, gerror.New("当前用户未绑定组织") } if in.Page <= 0 { in.Page = 1 } if in.PageSize <= 0 { in.PageSize = 20 } m := s.userModel(ctx).Where(dao.SysUser.Columns().DeptId, deptId) if in.UserName != "" { m = m.WhereLike(dao.SysUser.Columns().UserName, "%"+in.UserName+"%") } if in.NickName != "" { m = m.WhereLike(dao.SysUser.Columns().NickName, "%"+in.NickName+"%") } if in.Email != "" { m = m.WhereLike(dao.SysUser.Columns().Email, "%"+in.Email+"%") } if in.Phonenumber != "" { m = m.WhereLike(dao.SysUser.Columns().Phonenumber, "%"+in.Phonenumber+"%") } if in.Status != "" { m = m.Where(dao.SysUser.Columns().Status, in.Status) } if len(in.CreatedAt) == 2 { begin, end := gtime.NewFromStr(in.CreatedAt[0]), gtime.NewFromStr(in.CreatedAt[1]) m = m.WhereBetween(dao.SysUser.Columns().CreatedAt, begin, end.EndOfDay()) } total, err = m.Count() if err != nil { return nil, 0, err } var sysList []*model.SysUserListModel err = m.Order(dao.SysUser.Columns().UserId, "ASC").WithAll().Page(in.Page, in.PageSize).Scan(&sysList) if err != nil { return nil, 0, err } if err = s.fillRolesAndDefaultFlag(ctx, sysList); err != nil { return nil, 0, err } if err = gconv.Structs(sysList, &list); err != nil { return nil, 0, err } return list, total, nil } // UserView 查看用户详情 func (s *sAgentUser) UserView(ctx context.Context, userId int64) (res *model.AgentUserViewModel, err error) { sysUser, err := service.SysUser().GetUserById(ctx, userId) if err != nil { return nil, err } if sysUser == nil || sysUser.UserId == 0 { return nil, gerror.New("用户不存在") } if sysUser.DeptId != contexts.GetDeptId(ctx) { return nil, gerror.New("只能操作本级用户") } res = &model.AgentUserViewModel{} if err = gconv.Struct(sysUser, res); err != nil { return nil, err } res.IsDefaultUser, err = s.isDefaultUser(ctx, userId) if err != nil { return nil, err } return res, nil } // filterRoleIdsByDept 过滤角色ID,只保留本级及下一级角色 func (s *sAgentUser) filterRoleIdsByDept(ctx context.Context, deptId int64, roleIds []int64) (res []int64, err error) { if len(roleIds) == 0 { return roleIds, nil } var roles []*entity.SysRole err = s.roleModel(ctx). WhereIn(dao.SysRole.Columns().RoleId, roleIds). Where(dao.SysRole.Columns().DeptId, deptId). Where("is_pass", 0). Scan(&roles) if err != nil { return nil, err } for _, role := range roles { res = append(res, role.RoleId) } return res, nil } // fillRolesAndDefaultFlag 填充用户角色和默认标志 func (s *sAgentUser) fillRolesAndDefaultFlag(ctx context.Context, list []*model.SysUserListModel) error { if len(list) == 0 { return nil } userIds := make([]int64, 0, len(list)) deptIds := make([]int64, 0, len(list)) userById := make(map[int64]*model.SysUserListModel, len(list)) for _, user := range list { userIds = append(userIds, user.UserId) deptIds = append(deptIds, user.DeptId) userById[user.UserId] = user } var userRoles []*entity.SysUserRole err := dao.SysUserRole.Ctx(ctx). WhereIn(dao.SysUserRole.Columns().UserId, userIds). Scan(&userRoles) if err != nil { return err } roleIds := make([]int64, 0, len(userRoles)) userRoleMap := make(map[int64][]int64, len(userRoles)) for _, userRole := range userRoles { roleIds = append(roleIds, userRole.RoleId) userRoleMap[userRole.UserId] = append(userRoleMap[userRole.UserId], userRole.RoleId) } if len(roleIds) > 0 { var roles []*entity.SysRole if err = s.roleModel(ctx). WhereIn(dao.SysRole.Columns().RoleId, roleIds). Scan(&roles); err != nil { return err } roleMap := make(map[int64]*entity.SysRole, len(roles)) for _, role := range roles { roleMap[role.RoleId] = role } for _, userRole := range userRoles { role := roleMap[userRole.RoleId] user := userById[userRole.UserId] if role == nil || user == nil { continue } user.Roles = append(user.Roles, &model.SysRoleMiniModel{ RoleId: role.RoleId, RoleName: role.RoleName, DataScope: role.DataScope, }) } } var depts []*entity.SysDept if err = s.deptModel(ctx). WhereIn(dao.SysDept.Columns().DeptId, deptIds). Scan(&depts); err != nil { return err } deptRoleMap := make(map[int64]int64, len(depts)) for _, dept := range depts { if dept.DeptRole > 0 { deptRoleMap[dept.DeptId] = dept.DeptRole } } for _, user := range list { deptRoleId := deptRoleMap[user.DeptId] if deptRoleId == 0 { continue } for _, roleId := range userRoleMap[user.UserId] { if roleId == deptRoleId { user.IsDefaultUser = true break } } } return nil } // isDefaultUser 判断用户是否为默认用户 func (s *sAgentUser) isDefaultUser(ctx context.Context, userId int64) (bool, error) { var user *entity.SysUser if err := s.userModel(ctx). Where(dao.SysUser.Columns().UserId, userId). Scan(&user); err != nil { return false, err } if user == nil || user.UserId == 0 { return false, gerror.New("用户不存在") } var dept *entity.SysDept if err := s.deptModel(ctx). Where(dao.SysDept.Columns().DeptId, user.DeptId). Scan(&dept); err != nil { return false, err } if dept == nil || dept.DeptRole == 0 { return false, nil } count, err := dao.SysUserRole.Ctx(ctx). Where(dao.SysUserRole.Columns().UserId, userId). Where(dao.SysUserRole.Columns().RoleId, dept.DeptRole). Count() return count > 0, err } // UserSave 新增/修改用户 func (s *sAgentUser) UserSave(ctx context.Context, in *model.SysUserAddModel) (res *model.AgentUserViewModel, err error) { user := contexts.GetUser(ctx) if user == nil { return nil, gerror.New("登录已过期") } in.TenantId = user.TenantId in.DeptId = user.DeptId in.UserType = consts.SysUserTypeSys if in.DeptId == 0 { return nil, gerror.New("当前用户未绑定组织") } if len(in.RoleIds) == 0 { return nil, gerror.New("请选择角色") } in.RoleIds, err = s.filterRoleIdsByDept(ctx, in.DeptId, in.RoleIds) if err != nil { return nil, err } if len(in.RoleIds) == 0 { return nil, gerror.New("请选择本级角色") } // 验证角色的DeptId和用户的deptId一致 if err = s.ensureRoleDeptInScope(ctx, in.DeptId, in.RoleIds); err != nil { return nil, err } sysUser, err := service.SysUser().AddUser(ctx, in) if err != nil { return nil, err } res = &model.AgentUserViewModel{} if err = gconv.Struct(sysUser, res); err != nil { return nil, err } res.IsDefaultUser, err = s.isDefaultUser(ctx, res.UserId) if err != nil { return nil, err } return res, nil } // UserUpdate 更新用户 func (s *sAgentUser) UserUpdate(ctx context.Context, in *model.SysUserUpdateModel) (err error) { current, err := s.UserView(ctx, in.UserId) if err != nil { return err } currentDeptId := contexts.GetDeptId(ctx) if currentDeptId == 0 { return gerror.New("当前用户未绑定组织") } if current.DeptId != currentDeptId { return gerror.New("只能修改本级用户") } in.DeptId = ¤t.DeptId if len(in.RoleIds) == 0 { return gerror.New("请选择角色") } in.RoleIds, err = s.filterRoleIdsByDept(ctx, *in.DeptId, in.RoleIds) if err != nil { return err } if len(in.RoleIds) == 0 { return gerror.New("请选择本级角色") } userType := consts.SysUserTypeSys in.UserType = &userType // 验证角色的DeptId和用户的deptId一致 if err = s.ensureRoleDeptInScope(ctx, *in.DeptId, in.RoleIds); err != nil { return err } return service.SysUser().UpdateUser(ctx, in) } // UserDelete 删除用户 func (s *sAgentUser) UserDelete(ctx context.Context, userIds []int64) (err error) { for _, userId := range userIds { if _, err = s.UserView(ctx, userId); err != nil { return err } } return service.SysUser().DeleteUser(ctx, userIds) } // UserResetPassword 重置用户密码 func (s *sAgentUser) UserResetPassword(ctx context.Context, userId int64, password string) (err error) { if _, err = s.UserView(ctx, userId); err != nil { return err } return service.SysUser().ResetPassword(ctx, userId, password) } // 验证角色部门和用户部门是否一致 func (s *sAgentUser) ensureRoleDeptInScope(ctx context.Context, deptId int64, roleIds []int64) (err error) { // 验证角色的DeptId和用户的deptId一致 var roles []*entity.SysRole err = s.roleModel(ctx). WhereIn(dao.SysRole.Columns().RoleId, roleIds). Scan(&roles) if err != nil { return err } for _, role := range roles { if role.DeptId != deptId { return gerror.New("角色部门与用户部门不一致") } } return nil }