chore: 并入 iotlcm-admin-svr 历史到 admin-svr/(原提交 49818c6)
This commit is contained in:
@@ -0,0 +1,340 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user