相关方入职离职处理

main
zhaokai 2025-12-15 15:37:00 +08:00
parent 875f6d1afa
commit ab6976a66a
22 changed files with 143 additions and 56 deletions

View File

@ -54,5 +54,7 @@ public class UserCorpController {
userCorpService.edit(userCorpUpdateCmd);
return SingleResponse.buildSuccess();
}
}

View File

@ -8,9 +8,11 @@ import com.alibaba.cola.dto.SingleResponse;
import com.jjb.saas.framework.auth.model.SSOUser;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.basic.info.api.UserCorpRecordServiceI;
import com.zcloud.basic.info.dto.UserChangeRecordInfoQry;
import com.zcloud.basic.info.dto.UserCorpRecordAddCmd;
import com.zcloud.basic.info.dto.UserCorpRecordPageQry;
import com.zcloud.basic.info.dto.UserCorpRecordUpdateCmd;
import com.zcloud.basic.info.dto.clientobject.UserChangeRecordCO;
import com.zcloud.basic.info.dto.clientobject.UserCorpRecordCO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -52,5 +54,10 @@ public class UserCorpRecordController {
userCorpRecordService.edit(userCorpRecordUpdateCmd);
return SingleResponse.buildSuccess();
}
@ApiOperation("变更记录详情详情")
@PostMapping("/getUserCorpRecordById")
public SingleResponse<UserCorpRecordCO> getChangerRecordInfoById(@RequestBody UserChangeRecordInfoQry userChangeRecordInfoQry) {
return SingleResponse.of(userCorpRecordService.getChangerRecordInfoById(userChangeRecordInfoQry));
}
}

View File

@ -125,6 +125,11 @@ public class UserAddExe {
}
zcloudRedisUtil.del(RedisConstant.PHONE_CODE_KEY + cmd.getPhone());
}
//验证手机号重复
UserDO userDO = userRepository.getByPhone(cmd.getPhone());
if(userDO != null){
throw new BizException("手机号已注册");
}
CorpInfoDO corpInfoDO = corpInfoRepository.getCorpInfoByCorpName("相关方通用租户");
@ -193,6 +198,9 @@ public class UserAddExe {
throw new BizException("用户在当前企业存在多条离职数据,请联系管理员。");
}
UserCorpDO userCorpDO = userCorpList.get(0);
if(userCorpDO.getEmploymentFlag() != null && UserEmploymentFlagEnum.ON.getCode().equals(userCorpDO.getEmploymentFlag()) ){
throw new BizException("该用户在当前企业已入职,无法入职");
}
userCorpDO.setEmploymentFlag(UserEmploymentFlagEnum.ENTRY_AUDIT.getCode());
UserCorpE userCorpE = new UserCorpE();
BeanUtils.copyProperties(userCorpDO, userCorpE);
@ -211,6 +219,11 @@ public class UserAddExe {
userCorpGateway.add(userCorpE);
}
}else{
if(userDO.getCorpinfoId() != null && userDO.getCorpinfoId().equals(cmd.getCorpinfoId())){
throw new BizException("该用户在当前企业已入职,无法入职");
}
userE.setEmploymentFlag(UserEmploymentFlagEnum.ENTRY_AUDIT.getCode());
// 扫码入职时, 固定人员user表企业id变为入职的企业
userE.setCorpinfoId(cmd.getCorpinfoId());

View File

@ -251,7 +251,7 @@ public class UserUpdateExe {
//入职待审核
ReviewEntryAudit(userDO, userReviewStatusCmd);
}else if(UserEmploymentFlagEnum.RESIGNATION_AUDIT.getCode().equals(userReviewStatusCmd.getEmploymentFlag())){
//离职待审核
//就是离职待审核
ReviewResignationAudit(userDO, userReviewStatusCmd);
}
@ -362,13 +362,15 @@ public class UserUpdateExe {
com.jjb.saas.system.client.user.request.UserAddCmd userAddCmd = new com.jjb.saas.system.client.user.request.UserAddCmd();
userAddCmd.setAccount(userDO.getPhone());
userAddCmd.setMobile(userDO.getPhone());
// userAddCmd.setMobile(userDO.getPhone());
userAddCmd.setName(userDO.getPhone());
RoleDeptAddCmd roleDeptAddCmd = new RoleDeptAddCmd();
roleDeptAddCmd.setRoleId(1994326788804837377L);
Long roleId = userRepository.getDefaultRoleId();
roleDeptAddCmd.setRoleId(roleId);
roleDeptAddCmd.setDeptId(userDO.getDepartmentId());
List<RoleDeptAddCmd> roleDeptAddCmdList = Collections.singletonList(roleDeptAddCmd);
userAddCmd.setRoleDepts(roleDeptAddCmdList);
userAddCmd.setTenantId(userDO.getCorpinfoId());
// userAddCmd.setTenantId(userDO.getCorpinfoId());
SingleResponse<Long> gbsResult = userFacade.add(userAddCmd);
userDO.setId(gbsResult.getData());
@ -419,10 +421,12 @@ public class UserUpdateExe {
}
UserCorpRecordDO userCorpRecordDO = userCorpRecordRepository.getInfoByUserId(userDO.getId(), corpinfoId, UserEmploymentFlagEnum.ON.getCode());
userCorpRecordDO.setStatus(UserChangeRecordStatusEnum.PENDING.getCode());
userCorpRecordDO.setResignationReason(appUserResignationCmd.getResignationReason());
userCorpRecordRepository.updateById(userCorpRecordDO);
//插入变更记录
UserChangeRecordE userChangeRecordE = new UserChangeRecordE();
userChangeRecordE.executeResignation(userE, UserEmploymentFlagEnum.RESIGNATION.getCode(), UserChangeRecordStatusEnum.PENDING.getCode(), employmentFlagBefore);
userChangeRecordE.setResignationReason(appUserResignationCmd.getResignationReason());
userChangeRecordGateway.add(userChangeRecordE);
// 处理未完成工作
List<UserJobHandoverDO> allJob = getUserJob(userDO.getId(),corpinfoId,userChangeRecordE.getUserChangeRecordId());

View File

@ -1,14 +1,22 @@
package com.zcloud.basic.info.command.query;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.cola.dto.PageResponse;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.basic.info.command.convertor.UserCorpRecordCoConvertor;
import com.zcloud.basic.info.command.convertor.UserJobHandoverCoConvertor;
import com.zcloud.basic.info.domain.enums.UserChangeRecordStatusEnum;
import com.zcloud.basic.info.dto.UserChangeRecordInfoQry;
import com.zcloud.basic.info.dto.UserCorpRecordPageQry;
import com.zcloud.basic.info.dto.clientobject.UserCO;
import com.zcloud.basic.info.dto.clientobject.UserChangeRecordCO;
import com.zcloud.basic.info.dto.clientobject.UserCorpRecordCO;
import com.zcloud.basic.info.persistence.dataobject.UserChangeRecordDO;
import com.zcloud.basic.info.persistence.dataobject.UserCorpRecordDO;
import com.zcloud.basic.info.persistence.dataobject.UserDO;
import com.zcloud.basic.info.persistence.dataobject.UserJobHandoverDO;
import com.zcloud.basic.info.persistence.repository.UserCorpRecordRepository;
import com.zcloud.basic.info.persistence.repository.UserJobHandoverRepository;
import com.zcloud.basic.info.persistence.repository.UserRepository;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import lombok.AllArgsConstructor;
@ -31,7 +39,8 @@ public class UserCorpRecordQueryExe {
private final UserCorpRecordRepository userCorpRecordRepository;
private final UserCorpRecordCoConvertor userCorpRecordCoConvertor;
private final UserRepository userRepository;
private final UserJobHandoverRepository userJobHandoverRepository;
private final UserJobHandoverCoConvertor userJobHandoverCoConvertor;
/**
*
*
@ -68,5 +77,28 @@ public class UserCorpRecordQueryExe {
userCO.setPostName(userCorpRecordDO.getPostName());
return userCO;
}
public UserCorpRecordCO getChangerRecordInfoById(UserChangeRecordInfoQry userChangeRecordInfoQry) {
if(userChangeRecordInfoQry.getCorpinfoId() == null){
userChangeRecordInfoQry.setCorpinfoId(AuthContext.getTenantId());
}
UserCorpRecordDO userCorpRecordDO = userCorpRecordRepository.getUserCorpRecordInfoByUserStatus(userChangeRecordInfoQry.getUserId(), userChangeRecordInfoQry.getCorpinfoId(), UserChangeRecordStatusEnum.PENDING.getCode());
if(userCorpRecordDO == null){
return null;
}
UserCorpRecordCO co = new UserCorpRecordCO();
BeanUtils.copyProperties(userCorpRecordDO, co);
//组装未完成的工作
List<UserJobHandoverDO> userJobHandoverDOList = userJobHandoverRepository.getListByUserId(userChangeRecordInfoQry.getUserId(), userChangeRecordInfoQry.getCorpinfoId());
if(CollUtil.isNotEmpty(userJobHandoverDOList))
co.setUserJobHandoverCOList(userJobHandoverCoConvertor.converDOsToCOs(userJobHandoverDOList));
return co;
}
}

View File

@ -13,6 +13,7 @@ import com.jjb.saas.framework.utils.CaptchaUtils;
import com.zcloud.basic.info.command.convertor.CorpInfoCoConvertor;
import com.zcloud.basic.info.command.convertor.UserCoConvertor;
import com.zcloud.basic.info.constant.RedisConstant;
import com.zcloud.basic.info.domain.enums.UserEmploymentFlagEnum;
import com.zcloud.basic.info.domain.enums.UserFlowFlagEnum;
import com.zcloud.basic.info.domain.gateway.UserGateway;
import com.zcloud.basic.info.domain.model.UserE;
@ -242,7 +243,7 @@ public class UserQueryExe {
List<CorpInfoCO> corpInfoCOList = new ArrayList<>();
//判断是流动人员还是固定人员
if(UserFlowFlagEnum.FIXED.getCode().equals(userDO.getFlowFlag()) && userDO.getCorpinfoId() != null){
if(UserFlowFlagEnum.FIXED.getCode().equals(userDO.getFlowFlag()) && userDO.getCorpinfoId() != null && UserEmploymentFlagEnum.ON.getCode().equals(userDO.getEmploymentFlag())){
CorpInfoDO corpInfoDO = corpInfoRepository.getById(userDO.getCorpinfoId());
CorpInfoCO corpInfoCO = new CorpInfoCO();
BeanUtils.copyProperties(corpInfoDO, corpInfoCO);
@ -250,14 +251,14 @@ public class UserQueryExe {
}
if(UserFlowFlagEnum.FLOW.getCode().equals(userDO.getFlowFlag())){
List<UserCorpDO> userCorpDOS = userCorpRepository.getONCorpInfo(userDO.getId());
if(CollUtil.isEmpty(userCorpDOS)){
return null;
}
if(CollUtil.isNotEmpty(userCorpDOS)){
List<Long> corpinfoIds = userCorpDOS.stream().map(UserCorpDO::getCorpinfoId).collect(Collectors.toList());
List<CorpInfoDO> corpInfoDOList = corpInfoRepository.getByIdList(corpinfoIds);
List<CorpInfoCO> corpInfoCOS = corpInfoCoConvertor.converDOsToCOs(corpInfoDOList);
corpInfoCOList.addAll(corpInfoCOS);
}
}
userLoginCO.setCorpInfoCOList(corpInfoCOList);
userLoginCO.setUserCO(userCoConvertor.converDOToCO(userDO));
return userLoginCO;

View File

@ -7,10 +7,12 @@ import com.zcloud.basic.info.command.UserCorpRecordAddExe;
import com.zcloud.basic.info.command.UserCorpRecordRemoveExe;
import com.zcloud.basic.info.command.UserCorpRecordUpdateExe;
import com.zcloud.basic.info.command.query.UserCorpRecordQueryExe;
import com.zcloud.basic.info.dto.UserChangeRecordInfoQry;
import com.zcloud.basic.info.dto.UserCorpRecordAddCmd;
import com.zcloud.basic.info.dto.UserCorpRecordPageQry;
import com.zcloud.basic.info.dto.UserCorpRecordUpdateCmd;
import com.zcloud.basic.info.dto.clientobject.UserCO;
import com.zcloud.basic.info.dto.clientobject.UserChangeRecordCO;
import com.zcloud.basic.info.dto.clientobject.UserCorpRecordCO;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@ -62,5 +64,11 @@ public class UserCorpRecordServiceImpl implements UserCorpRecordServiceI {
return userCorpRecordQueryExe.getInfoById(id);
}
@Override
public UserCorpRecordCO getChangerRecordInfoById(UserChangeRecordInfoQry userChangeRecordInfoQry) {
return userCorpRecordQueryExe.getChangerRecordInfoById(userChangeRecordInfoQry);
}
}

View File

@ -2,10 +2,12 @@ package com.zcloud.basic.info.api;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.basic.info.dto.UserChangeRecordInfoQry;
import com.zcloud.basic.info.dto.UserCorpRecordAddCmd;
import com.zcloud.basic.info.dto.UserCorpRecordPageQry;
import com.zcloud.basic.info.dto.UserCorpRecordUpdateCmd;
import com.zcloud.basic.info.dto.clientobject.UserCO;
import com.zcloud.basic.info.dto.clientobject.UserChangeRecordCO;
import com.zcloud.basic.info.dto.clientobject.UserCorpRecordCO;
/**
@ -26,5 +28,7 @@ public interface UserCorpRecordServiceI {
void removeBatch(Long[] ids);
UserCO getInfoById(Long id);
UserCorpRecordCO getChangerRecordInfoById(UserChangeRecordInfoQry userChangeRecordInfoQry);
}

View File

@ -26,8 +26,6 @@ public class AppUserInfoCmd extends Command {
@NotNull(message = "主键id不能为空")
private Long id;
@ApiModelProperty(value = "业务主键id", name = "userId", required = true)
private String userId;
@ApiModelProperty(value = "人脸照片url", name = "userAvatarUrl", required = true)
@NotEmpty(message = "人脸照片url不能为空")

View File

@ -1,10 +1,12 @@
package com.zcloud.basic.info.dto.clientobject;
import com.alibaba.cola.dto.ClientObject;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
@ -45,8 +47,8 @@ public class UserCorpRecordCO extends ClientObject {
//审批状态1-待审批, 2-通过,3-驳回
@ApiModelProperty(value = "审批状态1-待审批, 2-通过,3-驳回")
private Integer status;
//入职状态1-在职 0-离职, 11-入职待审核, 10-离职待审核
@ApiModelProperty(value = "入职状态1-在职 0-离职, 11-入职待审核, 10-离职待审核")
//入职状态1-在职 0-离职
@ApiModelProperty(value = "入职状态1-在职 0-离职,")
private Integer employmentFlag;
//开始时间
@ApiModelProperty(value = "开始时间")
@ -54,41 +56,14 @@ public class UserCorpRecordCO extends ClientObject {
//结束时间
@ApiModelProperty(value = "结束时间")
private LocalDateTime endTime;
//乐观锁
@ApiModelProperty(value = "乐观锁")
private Integer version;
//创建人
@ApiModelProperty(value = "创建人")
private Long createId;
//创建人姓名
@ApiModelProperty(value = "创建人姓名")
private String createName;
//创建时间
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
//更新人
@ApiModelProperty(value = "更新人")
private Long updateId;
//修改人名称
@ApiModelProperty(value = "修改人名称")
private String updateName;
//更新时间
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;
//描述
@ApiModelProperty(value = "描述")
private String remarks;
//是否删除
@ApiModelProperty(value = "是否删除")
private String deleteEnum;
//租户ID
@ApiModelProperty(value = "租户ID")
private Long tenantId;
//机构ID
@ApiModelProperty(value = "机构ID")
private Long orgId;
//环境
@ApiModelProperty(value = "环境")
private String env;
@ApiModelProperty(value = "离职原因")
private String resignationReason;
@ApiModelProperty(value = "用户id")
private String userName;
@ApiModelProperty(value = "工作交接记录信息")
private List<UserJobHandoverCO> userJobHandoverCOList;
}

View File

@ -41,6 +41,7 @@ public class UserCorpRecordE extends BaseE {
private LocalDateTime startTime;
//结束时间
private LocalDateTime endTime;
private String resignationReason;
//乐观锁
private Integer version;
//创建人

View File

@ -51,6 +51,7 @@ public class UserGatewayImpl implements UserGateway {
userE.setEmploymentFlag(UserEmploymentFlagEnum.ON.getCode());
BeanUtils.copyProperties(userE, d);
userE.resetPassword();
d.setPassword(userE.getPassword());
userRepository.saveUserXgf(d);
userE.setId(d.getId());
return true;

View File

@ -1,5 +1,6 @@
package com.zcloud.basic.info.persistence.dataobject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jjb.saas.framework.repository.basedo.BaseDO;
import io.swagger.annotations.ApiModelProperty;
@ -57,6 +58,15 @@ public class UserCorpRecordDO extends BaseDO {
@ApiModelProperty(value = "结束时间")
private LocalDateTime endTime;
//离职原因
@ApiModelProperty(value = "离职原因")
private String resignationReason;
@ApiModelProperty(value = "用户id")
@TableField(exist = false)
private String userName;
public UserCorpRecordDO(String userCorpRecordId) {
this.userCorpRecordId = userCorpRecordId;
}

View File

@ -13,5 +13,6 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserCorpRecordMapper extends BaseMapper<UserCorpRecordDO> {
UserCorpRecordDO getUserCorpRecordInfoByUserStatus(Long userId, Long corpinfoId, Integer status);
}

View File

@ -38,5 +38,6 @@ public interface CorpInfoRepository extends BaseRepository<CorpInfoDO> {
Boolean remove(Long id);
List<CorpInfoDO> getByIdList(List<Long> corpinfoIds);
}

View File

@ -21,5 +21,7 @@ public interface UserCorpRecordRepository extends BaseRepository<UserCorpRecordD
UserCorpRecordDO getInfoByUserStatus(Long id, Long corpinfoId, Integer status);
List<UserCorpRecordDO> getInfoListByUserId(Long id);
UserCorpRecordDO getUserCorpRecordInfoByUserStatus(Long userId, Long corpinfoId, Integer code);
}

View File

@ -25,5 +25,7 @@ public interface UserJobHandoverRepository extends BaseRepository<UserJobHandove
List<UserJobHandoverDO> getListByChangerRecordId(String userChangeRecordId);
void processUserJobHandover(String userChangeRecordId);
List<UserJobHandoverDO> getListByUserId(Long userId, Long corpinfoId);
}

View File

@ -64,5 +64,10 @@ public class UserCorpRecordRepositoryImpl extends BaseRepositoryImpl<UserCorpRec
queryWrapper.ne("employment_flag", UserEmploymentFlagEnum.RESIGNATION.getCode());
return userCorpRecordMapper.selectList(queryWrapper);
}
@Override
public UserCorpRecordDO getUserCorpRecordInfoByUserStatus(Long userId, Long corpinfoId, Integer status) {
return userCorpRecordMapper.getUserCorpRecordInfoByUserStatus(userId,corpinfoId,status);
}
}

View File

@ -113,7 +113,7 @@ public class UserCorpRepositoryImpl extends BaseRepositoryImpl<UserCorpMapper, U
public List<UserCorpDO> getONCorpInfo(Long id) {
QueryWrapper<UserCorpDO> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", id);
queryWrapper.eq("employment_flag", UserEmploymentFlagEnum.ON.getCode());
queryWrapper.in("employment_flag", UserEmploymentFlagEnum.ON.getCode(), UserEmploymentFlagEnum.RESIGNATION_AUDIT.getCode());
return userCorpMapper.selectList(queryWrapper);
}

View File

@ -80,6 +80,15 @@ public class UserJobHandoverRepositoryImpl extends BaseRepositoryImpl<UserJobHan
userJobHandoverMapper.update(null, updateWrapper);
}
@Override
public List<UserJobHandoverDO> getListByUserId(Long userId, Long corpinfoId) {
QueryWrapper<UserJobHandoverDO> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", userId);
queryWrapper.eq("corpinfo_id", corpinfoId);
queryWrapper.eq("handover_status", UserJobStatusEnum.UNTREATED.getCode());
queryWrapper.orderByDesc("create_time");
List<UserJobHandoverDO> result = userJobHandoverMapper.selectList(queryWrapper);
return result;
}
}

View File

@ -287,7 +287,7 @@ public class UserRepositoryImpl extends BaseRepositoryImpl<UserMapper, UserDO> i
// userDO.setEmploymentFlag(11);
// 默认不是主账号
userDO.setMainCorpFlag(0);
userDO.setUserId(UuidUtil.get32UUID());
userDO.setUserId(Tools.get32UUID());
// 相关方
userDO.setCorpinfoId(null);
save(userDO);

View File

@ -4,5 +4,16 @@
<mapper namespace="com.zcloud.basic.info.persistence.mapper.UserCorpRecordMapper">
<select id="getUserCorpRecordInfoByUserStatus" resultType="com.zcloud.basic.info.persistence.dataobject.UserCorpRecordDO">
select ucr.*,u.name as userName
from user_corp_record ucr
left join user u on ucr.user_id = u.id
where ucr.delete_enum = 'FALSE'
and ucr.corpinfo_id =#{corpinfoId}
and ucr.user_id =#{userId}
and ucr.status =#{status}
order by ucr.create_time desc
limit 1
</select>
</mapper>