mirror of https://gitee.com/stylefeng/roses
【7.6.0】【sys】【user】整理添加用户逻辑
parent
d90b99ecea
commit
11d2f58e0d
|
@ -32,6 +32,14 @@
|
|||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!--文件api-->
|
||||
<!--用户头像相关的操作-->
|
||||
<dependency>
|
||||
<groupId>cn.stylefeng.roses</groupId>
|
||||
<artifactId>file-api</artifactId>
|
||||
<version>${roses.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!--资源api模块-->
|
||||
<!--用在资源控制器,资源扫描上-->
|
||||
<dependency>
|
||||
|
|
|
@ -29,12 +29,12 @@ public class SysUserController {
|
|||
private SysUserService sysUserService;
|
||||
|
||||
/**
|
||||
* 添加
|
||||
* 添加用户
|
||||
*
|
||||
* @author fengshuonan
|
||||
* @date 2023/06/10 21:26
|
||||
*/
|
||||
@PostResource(name = "添加", path = "/sysUser/add")
|
||||
@PostResource(name = "添加用户", path = "/sysUser/add")
|
||||
public ResponseData<SysUser> add(@RequestBody @Validated(SysUserRequest.add.class) SysUserRequest sysUserRequest) {
|
||||
sysUserService.add(sysUserRequest);
|
||||
return new SuccessResponseData<>();
|
||||
|
|
|
@ -16,7 +16,17 @@ public enum SysUserOrgExceptionEnum implements AbstractExceptionEnum {
|
|||
/**
|
||||
* 查询结果不存在
|
||||
*/
|
||||
SYS_USER_ORG_NOT_EXISTED(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10001", "查询结果不存在");
|
||||
SYS_USER_ORG_NOT_EXISTED(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10001", "查询结果不存在"),
|
||||
|
||||
/**
|
||||
* 绑定用户组织机构失败,参数存在缺失,请检查orgId,positionId,mainFlag
|
||||
*/
|
||||
EMPTY_PARAM(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10002", "绑定用户组织机构失败,参数存在缺失,请检查orgId,positionId,mainFlag"),
|
||||
|
||||
/**
|
||||
* 用户主部门数量错误,请确保用户有且只有一个主部门
|
||||
*/
|
||||
MAIN_FLAG_ERROR(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10003", "用户主部门数量错误,请确保用户有且只有一个主部门");
|
||||
|
||||
/**
|
||||
* 错误编码
|
||||
|
|
|
@ -2,11 +2,16 @@ package cn.stylefeng.roses.kernel.sys.modular.user.pojo.request;
|
|||
|
||||
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
|
||||
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
|
||||
import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserOrg;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 系统用户封装类
|
||||
|
@ -29,6 +34,7 @@ public class SysUserRequest extends BaseRequest {
|
|||
* 姓名
|
||||
*/
|
||||
@ChineseDescription("姓名")
|
||||
@NotBlank(message = "姓名不能为空", groups = {add.class, edit.class})
|
||||
private String realName;
|
||||
|
||||
/**
|
||||
|
@ -47,7 +53,7 @@ public class SysUserRequest extends BaseRequest {
|
|||
/**
|
||||
* 密码,加密方式为BCrypt
|
||||
*/
|
||||
@NotBlank(message = "密码,加密方式为BCrypt不能为空", groups = {add.class, edit.class})
|
||||
@NotBlank(message = "密码,加密方式为BCrypt不能为空", groups = {add.class})
|
||||
@ChineseDescription("密码,加密方式为BCrypt")
|
||||
private String password;
|
||||
|
||||
|
@ -98,27 +104,16 @@ public class SysUserRequest extends BaseRequest {
|
|||
/**
|
||||
* 状态:1-正常,2-冻结
|
||||
*/
|
||||
@NotNull(message = "状态:1-正常,2-冻结不能为空", groups = {add.class, edit.class})
|
||||
@ChineseDescription("状态:1-正常,2-冻结")
|
||||
@NotNull(message = "状态不能为空", groups = {add.class, edit.class})
|
||||
private Integer statusFlag;
|
||||
|
||||
/**
|
||||
* 登录次数
|
||||
* 用户的排序
|
||||
*/
|
||||
@ChineseDescription("登录次数")
|
||||
private Integer loginCount;
|
||||
|
||||
/**
|
||||
* 最后登陆IP
|
||||
*/
|
||||
@ChineseDescription("最后登陆IP")
|
||||
private String lastLoginIp;
|
||||
|
||||
/**
|
||||
* 最后登陆时间
|
||||
*/
|
||||
@ChineseDescription("最后登陆时间")
|
||||
private String lastLoginTime;
|
||||
@TableField("user_sort")
|
||||
@ChineseDescription("用户的排序")
|
||||
private BigDecimal userSort = new BigDecimal(1000);
|
||||
|
||||
/**
|
||||
* 对接外部主数据的用户id
|
||||
|
@ -136,4 +131,11 @@ public class SysUserRequest extends BaseRequest {
|
|||
@ChineseDescription("组织机构id查询条件")
|
||||
private Long orgIdCondition;
|
||||
|
||||
/**
|
||||
* 用户和组织机构关系集合
|
||||
*/
|
||||
@ChineseDescription("用户和组织机构关系集合")
|
||||
@NotEmpty(message = "用户和组织机构关系集合不能为空", groups = {add.class, edit.class})
|
||||
private List<SysUserOrg> userOrgList;
|
||||
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ import java.util.List;
|
|||
*/
|
||||
public interface SysUserOrgService extends IService<SysUserOrg> {
|
||||
|
||||
/**
|
||||
/**
|
||||
* 新增
|
||||
*
|
||||
* @param sysUserOrgRequest 请求参数
|
||||
|
@ -24,7 +24,7 @@ public interface SysUserOrgService extends IService<SysUserOrg> {
|
|||
*/
|
||||
void add(SysUserOrgRequest sysUserOrgRequest);
|
||||
|
||||
/**
|
||||
/**
|
||||
* 删除
|
||||
*
|
||||
* @param sysUserOrgRequest 请求参数
|
||||
|
@ -33,7 +33,7 @@ public interface SysUserOrgService extends IService<SysUserOrg> {
|
|||
*/
|
||||
void del(SysUserOrgRequest sysUserOrgRequest);
|
||||
|
||||
/**
|
||||
/**
|
||||
* 编辑
|
||||
*
|
||||
* @param sysUserOrgRequest 请求参数
|
||||
|
@ -42,7 +42,7 @@ public interface SysUserOrgService extends IService<SysUserOrg> {
|
|||
*/
|
||||
void edit(SysUserOrgRequest sysUserOrgRequest);
|
||||
|
||||
/**
|
||||
/**
|
||||
* 查询详情
|
||||
*
|
||||
* @param sysUserOrgRequest 请求参数
|
||||
|
@ -51,24 +51,34 @@ public interface SysUserOrgService extends IService<SysUserOrg> {
|
|||
*/
|
||||
SysUserOrg detail(SysUserOrgRequest sysUserOrgRequest);
|
||||
|
||||
/**
|
||||
/**
|
||||
* 获取列表
|
||||
*
|
||||
* @param sysUserOrgRequest 请求参数
|
||||
* @param sysUserOrgRequest 请求参数
|
||||
* @return List<SysUserOrg> 返回结果
|
||||
* @author fengshuonan
|
||||
* @date 2023/06/10 21:26
|
||||
*/
|
||||
List<SysUserOrg> findList(SysUserOrgRequest sysUserOrgRequest);
|
||||
|
||||
/**
|
||||
/**
|
||||
* 获取列表(带分页)
|
||||
*
|
||||
* @param sysUserOrgRequest 请求参数
|
||||
* @param sysUserOrgRequest 请求参数
|
||||
* @return PageResult<SysUserOrg> 返回结果
|
||||
* @author fengshuonan
|
||||
* @date 2023/06/10 21:26
|
||||
*/
|
||||
PageResult<SysUserOrg> findPage(SysUserOrgRequest sysUserOrgRequest);
|
||||
|
||||
/**
|
||||
* 更新用户的任职信息
|
||||
*
|
||||
* @param userId 用户id
|
||||
* @param userOrgList 用户绑定的组织机构列表
|
||||
* @author fengshuonan
|
||||
* @since 2023/6/11 22:23
|
||||
*/
|
||||
void updateUserOrg(Long userId, List<SysUserOrg> userOrgList);
|
||||
|
||||
}
|
|
@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
|
|||
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
|
||||
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
|
||||
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
|
||||
import cn.stylefeng.roses.kernel.sys.api.callback.RemoveOrgCallbackApi;
|
||||
import cn.stylefeng.roses.kernel.sys.api.enums.HrOrganizationExceptionEnum;
|
||||
|
@ -17,6 +18,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
@ -62,6 +64,22 @@ public class SysUserOrgServiceImpl extends ServiceImpl<SysUserOrgMapper, SysUser
|
|||
return PageResultFactory.createPageResult(sysRolePage);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void updateUserOrg(Long userId, List<SysUserOrg> userOrgList) {
|
||||
|
||||
// 先校验组织机构
|
||||
List<SysUserOrg> sysUserOrgResult = this.validateUserOrgParam(userId, userOrgList);
|
||||
|
||||
// 删除已经绑定的组织机构
|
||||
LambdaQueryWrapper<SysUserOrg> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(SysUserOrg::getUserId, userId);
|
||||
this.remove(wrapper);
|
||||
|
||||
// 重新绑定用户对应的组织机构
|
||||
this.saveBatch(sysUserOrgResult);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SysUserOrg> findList(SysUserOrgRequest sysUserOrgRequest) {
|
||||
LambdaQueryWrapper<SysUserOrg> wrapper = this.createWrapper(sysUserOrgRequest);
|
||||
|
@ -114,4 +132,41 @@ public class SysUserOrgServiceImpl extends ServiceImpl<SysUserOrgMapper, SysUser
|
|||
return queryWrapper;
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验用户绑定的组织机构是否合法
|
||||
* <p>
|
||||
* 1. 校验orgId和positionId和mainFlag是否有空的
|
||||
* 2. 校验是否有且只有一个主部门
|
||||
*
|
||||
* @return 填充好userId的正确参数,直接可以保存到库中
|
||||
* @author fengshuonan
|
||||
* @since 2023/6/11 22:26
|
||||
*/
|
||||
private List<SysUserOrg> validateUserOrgParam(Long userId, List<SysUserOrg> userOrgList) {
|
||||
|
||||
int mainFlagCount = 0;
|
||||
|
||||
for (SysUserOrg sysUserOrg : userOrgList) {
|
||||
|
||||
// 校验参数是否缺失
|
||||
if (ObjectUtil.isEmpty(sysUserOrg.getOrgId()) || ObjectUtil.isEmpty(sysUserOrg.getPositionId()) || ObjectUtil.isEmpty(sysUserOrg.getMainFlag())) {
|
||||
throw new ServiceException(SysUserOrgExceptionEnum.EMPTY_PARAM);
|
||||
}
|
||||
|
||||
// 统计主部门的数量
|
||||
if (YesOrNotEnum.Y.getCode().equals(sysUserOrg.getMainFlag())) {
|
||||
mainFlagCount++;
|
||||
}
|
||||
|
||||
// 绑定用户id
|
||||
sysUserOrg.setUserId(userId);
|
||||
}
|
||||
|
||||
if (mainFlagCount > 1 || mainFlagCount == 0) {
|
||||
throw new ServiceException(SysUserOrgExceptionEnum.MAIN_FLAG_ERROR);
|
||||
}
|
||||
|
||||
return userOrgList;
|
||||
}
|
||||
|
||||
}
|
|
@ -2,21 +2,25 @@ package cn.stylefeng.roses.kernel.sys.modular.user.service.impl;
|
|||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi;
|
||||
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
|
||||
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||
import cn.stylefeng.roses.kernel.file.api.constants.FileConstants;
|
||||
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
|
||||
import cn.stylefeng.roses.kernel.sys.api.SysUserServiceApi;
|
||||
import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUser;
|
||||
import cn.stylefeng.roses.kernel.sys.modular.user.enums.SysUserExceptionEnum;
|
||||
import cn.stylefeng.roses.kernel.sys.modular.user.mapper.SysUserMapper;
|
||||
import cn.stylefeng.roses.kernel.sys.modular.user.pojo.request.SysUserRequest;
|
||||
import cn.stylefeng.roses.kernel.sys.modular.user.service.SysUserOrgService;
|
||||
import cn.stylefeng.roses.kernel.sys.modular.user.service.SysUserService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
@ -33,11 +37,28 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
@Resource
|
||||
private SysUserServiceApi sysUserServiceApi;
|
||||
|
||||
@Resource
|
||||
private PasswordStoredEncryptApi passwordStoredEncryptApi;
|
||||
|
||||
@Resource
|
||||
private SysUserOrgService sysUserOrgService;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void add(SysUserRequest sysUserRequest) {
|
||||
SysUser sysUser = new SysUser();
|
||||
BeanUtil.copyProperties(sysUserRequest, sysUser);
|
||||
|
||||
// 将密码加密存储到库中
|
||||
sysUser.setPassword(passwordStoredEncryptApi.encrypt(sysUser.getPassword()));
|
||||
|
||||
// 设置用户默认头像
|
||||
sysUser.setAvatar(FileConstants.DEFAULT_AVATAR_FILE_ID);
|
||||
|
||||
this.save(sysUser);
|
||||
|
||||
// 更新用户的任职信息
|
||||
sysUserOrgService.updateUserOrg(sysUser.getUserId(), sysUserRequest.getUserOrgList());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Reference in New Issue