From b43696469ca65dccbc76bc53a0b8a59256ed11a7 Mon Sep 17 00:00:00 2001 From: zhaokai Date: Tue, 23 Jun 2026 10:05:35 +0800 Subject: [PATCH] =?UTF-8?q?feat(corp):=20=E6=B7=BB=E5=8A=A0=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E7=94=A8=E6=88=B7=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=92=8C=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7=E5=8F=98=E6=9B=B4?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=A4=84=E7=90=86,=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=A6=BB=E8=81=8C=E5=B7=A5=E4=BD=9C=E4=BA=A4?= =?UTF-8?q?=E6=8E=A5=E5=B7=A5=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../info/facade/ZcloudUserFacadeImpl.java | 91 +- .../info/web/UserChangeRecordController.java | 51 +- .../info/web/UserCorpRecordController.java | 9 +- .../info/command/HumanUserUpdateExe.java | 1075 +++++++++++++++++ .../zcloud/basic/info/command/UserAddExe.java | 21 +- .../UserChangeRecordWorkChangeExe.java | 656 ++++++++++ .../query/UserChangeRecordQueryExe.java | 53 +- .../command/query/UserCorpRecordQueryExe.java | 3 +- .../service/UserChangeRecordServiceImpl.java | 44 +- .../service/UserCorpRecordServiceImpl.java | 9 +- .../basic/info/service/UserServiceImpl.java | 12 +- .../info/api/UserChangeRecordServiceI.java | 23 +- .../info/api/UserCorpRecordServiceI.java | 7 +- .../zcloud/basic/info/api/UserServiceI.java | 2 + .../com/zcloud/basic/info/dto/UserAddCmd.java | 2 + .../info/dto/UserChangeRecordInfoQry.java | 7 +- .../info/dto/UserChangeRecordPageQry.java | 6 + .../basic/info/dto/UserCorpInfoPageQry.java | 17 + .../basic/info/dto/UserCorpRecordInfoQry.java | 33 + .../zcloud/basic/info/dto/UserUpdateCmd.java | 5 + .../basic/info/dto/WorkChangeUpdateCmd.java | 47 + .../dto/clientobject/UserCorpInfoStatCO.java | 32 + .../enums/UserJobHandoverWorkTypeEnum.java | 43 +- .../info/domain/model/UserChangeRecordE.java | 24 + .../dataobject/UserCorpInfoStatDO.java | 33 + .../persistence/mapper/CorpInfoMapper.java | 4 + .../mapper/UserChangeRecordMapper.java | 7 +- .../info/persistence/mapper/UserMapper.java | 2 + .../repository/CorpInfoRepository.java | 3 + .../UserChangeRecordRepository.java | 4 +- .../repository/UserRepository.java | 4 + .../impl/CorpInfoRepositoryImpl.java | 12 + .../impl/UserChangeRecordRepositoryImpl.java | 24 +- .../repository/impl/UserRepositoryImpl.java | 17 + .../main/resources/mapper/CorpInfoMapper.xml | 47 + .../mapper/UserChangeRecordMapper.xml | 31 +- .../src/main/resources/mapper/UserMapper.xml | 6 + 37 files changed, 2374 insertions(+), 92 deletions(-) create mode 100644 web-app/src/main/java/com/zcloud/basic/info/command/HumanUserUpdateExe.java create mode 100644 web-app/src/main/java/com/zcloud/basic/info/command/UserChangeRecordWorkChangeExe.java create mode 100644 web-client/src/main/java/com/zcloud/basic/info/dto/UserCorpInfoPageQry.java create mode 100644 web-client/src/main/java/com/zcloud/basic/info/dto/UserCorpRecordInfoQry.java create mode 100644 web-client/src/main/java/com/zcloud/basic/info/dto/WorkChangeUpdateCmd.java create mode 100644 web-client/src/main/java/com/zcloud/basic/info/dto/clientobject/UserCorpInfoStatCO.java create mode 100644 web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/dataobject/UserCorpInfoStatDO.java diff --git a/web-adapter/src/main/java/com/zcloud/basic/info/facade/ZcloudUserFacadeImpl.java b/web-adapter/src/main/java/com/zcloud/basic/info/facade/ZcloudUserFacadeImpl.java index 2f2a1342..460820fe 100644 --- a/web-adapter/src/main/java/com/zcloud/basic/info/facade/ZcloudUserFacadeImpl.java +++ b/web-adapter/src/main/java/com/zcloud/basic/info/facade/ZcloudUserFacadeImpl.java @@ -1,23 +1,27 @@ package com.zcloud.basic.info.facade; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.json.JSONUtil; import com.alibaba.cola.dto.MultiResponse; import com.alibaba.cola.dto.SingleResponse; +import com.alibaba.cola.exception.BizException; import com.zcloud.basic.info.api.UserServiceI; import com.zcloud.basic.info.command.convertor.UserCoConvertor; import com.zcloud.basic.info.dto.UserAddCmd; +import com.zcloud.basic.info.dto.UserUpdateCmd; import com.zcloud.basic.info.dto.clientobject.UserCO; import com.zcloud.basic.info.persistence.dataobject.UserDO; import com.zcloud.basic.info.persistence.dataobject.UserImgDO; import com.zcloud.basic.info.persistence.repository.UserRepository; import com.zcloud.gbscommon.utils.PageQueryHelper; import com.zcloud.gbscommon.zclouduser.facade.ZcloudUserFacade; -import com.zcloud.gbscommon.zclouduser.request.ZcloudUserAddCmd; -import com.zcloud.gbscommon.zclouduser.request.ZcloudUserImgQry; -import com.zcloud.gbscommon.zclouduser.request.ZcloudUserQry; +import com.zcloud.gbscommon.zclouduser.request.*; import com.zcloud.gbscommon.zclouduser.response.ZcloudUserCo; import com.zcloud.gbscommon.zclouduser.response.ZcloudUserImgBase64Co; +import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.util.ArrayList; @@ -28,6 +32,7 @@ import java.util.Map; /** * @author lin */ +@Slf4j @DubboService public class ZcloudUserFacadeImpl implements ZcloudUserFacade { @Resource @@ -106,5 +111,85 @@ public class ZcloudUserFacadeImpl implements ZcloudUserFacade { return userServiceI.addHumanUser(userAddCmd); } + /** + * 人资用户变更 Dubbo 入口。 + * 这里负责把外部系统的更新命令转换为本系统命令对象, + * 并在查到原用户时先回填老数据,再将非空的新值覆盖进去, + * 最终统一交给 humanUserUpdateExe 按新增、离职、跨企业变更、企业内修改四种场景处理。 + */ + @Override + public SingleResponse updateHumanUser(ZcloudUserUpdateCmd zcloudUserUpdateCmd) { + if (zcloudUserUpdateCmd == null) { + throw new BizException("用户更新参数不能为空"); + } + log.info("接收人资用户变更请求参数: {}", JSONUtil.toJsonStr(zcloudUserUpdateCmd)); + + UserUpdateCmd userUpdateCmd = new UserUpdateCmd(); + UserDO userDO = null; + if (zcloudUserUpdateCmd.getId() != null) { + userDO = userRepository.getInfoById(zcloudUserUpdateCmd.getId()); + if (userDO != null) { + userUpdateCmd = BeanUtil.toBean(userDO, UserUpdateCmd.class); + } + } + + BeanUtil.copyProperties(zcloudUserUpdateCmd, userUpdateCmd, CopyOptions.create().ignoreNullValue()); + fillHumanUserUpdateCmd(userUpdateCmd, userDO, zcloudUserUpdateCmd); + return userServiceI.updateHumanUser(userUpdateCmd); + } + + @Override + public MultiResponse listUserByInfo(ZcloudUserInfoQry zcloudUserInfoQry) { + Map parmas = PageQueryHelper.toHashMap(zcloudUserInfoQry); + List userList = userRepository.listUserByInfo(parmas); + List zcloudUserCos = userCoConvertor.converDOsToDubboCOs(userList); + return MultiResponse.of(zcloudUserCos); + } + + /** + * 补齐人资更新入口需要的关键字段。 + * 这样在外部系统做局部更新时,可以避免 userId、手机号、账号等关键值丢失。 + * 但如果企业、部门、岗位 id 已发生变化,则需要主动清空旧名称, + * 让下游按变更后的 id 重新解析名称,避免跨企业变更时 after 名称仍然写成旧值。 + */ + private void fillHumanUserUpdateCmd(UserUpdateCmd userUpdateCmd, UserDO userDO, ZcloudUserUpdateCmd zcloudUserUpdateCmd) { + if (userDO != null && !StringUtils.hasText(userUpdateCmd.getUserId())) { + userUpdateCmd.setUserId(userDO.getUserId()); + } + if (userDO != null && !StringUtils.hasText(userUpdateCmd.getPhone())) { + userUpdateCmd.setPhone(userDO.getPhone()); + } + if (!StringUtils.hasText(userUpdateCmd.getUsername())) { + if (StringUtils.hasText(zcloudUserUpdateCmd.getPhone()) + && (userDO == null || !StringUtils.hasText(userDO.getUsername()) || userDO.getUsername().equals(userDO.getPhone()))) { + userUpdateCmd.setUsername(zcloudUserUpdateCmd.getPhone()); + } else if (userDO != null) { + userUpdateCmd.setUsername(userDO.getUsername()); + } + } + if (userDO != null + && userUpdateCmd.getCorpinfoId() != null + && !userUpdateCmd.getCorpinfoId().equals(userDO.getCorpinfoId())) { + userUpdateCmd.setCorpinfoName(null); + } + if (userDO != null + && userUpdateCmd.getDepartmentId() != null + && !userUpdateCmd.getDepartmentId().equals(userDO.getDepartmentId())) { + userUpdateCmd.setDepartmentName(null); + } + if (userDO != null + && userUpdateCmd.getPostId() != null + && !userUpdateCmd.getPostId().equals(userDO.getPostId())) { + userUpdateCmd.setPostName(null); + } + if (userDO != null && !StringUtils.hasText(userUpdateCmd.getPostName())) { + userUpdateCmd.setPostName(userDO.getPostName()); + } + } + + //人员 + + + } diff --git a/web-adapter/src/main/java/com/zcloud/basic/info/web/UserChangeRecordController.java b/web-adapter/src/main/java/com/zcloud/basic/info/web/UserChangeRecordController.java index 2271e556..833c6a12 100644 --- a/web-adapter/src/main/java/com/zcloud/basic/info/web/UserChangeRecordController.java +++ b/web-adapter/src/main/java/com/zcloud/basic/info/web/UserChangeRecordController.java @@ -1,47 +1,64 @@ package com.zcloud.basic.info.web; - -import com.zcloud.basic.info.api.UserChangeRecordServiceI; -import com.zcloud.basic.info.dto.*; -import com.alibaba.cola.dto.MultiResponse; import com.alibaba.cola.dto.PageResponse; -import com.alibaba.cola.dto.Response; 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.UserChangeRecordServiceI; +import com.zcloud.basic.info.dto.UserChangeRecordInfoQry; +import com.zcloud.basic.info.dto.UserChangeRecordPageQry; +import com.zcloud.basic.info.dto.UserCorpInfoPageQry; +import com.zcloud.basic.info.dto.WorkChangeUpdateCmd; import com.zcloud.basic.info.dto.clientobject.UserChangeRecordCO; +import com.zcloud.basic.info.dto.clientobject.UserCorpInfoStatCO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** - * web-adapter - * - * @Author SondonYong - * @Date 2025-12-02 14:08:18 + * 用户变更记录控制器。 */ @Api(tags = "用户变更记录") @RequestMapping("/${application.gateway}/userChangeRecord") @RestController @AllArgsConstructor +@Slf4j public class UserChangeRecordController { private final UserChangeRecordServiceI userChangeRecordService; + @ApiOperation(value = "企业中户中台-监管端首页") + @PostMapping("/userCorpInfoList") + public PageResponse userCorpInfoList(@RequestBody UserCorpInfoPageQry qry) { + return userChangeRecordService.userCorpInfoList(qry); + } - @ApiOperation(value = "分页",hidden = true) + @ApiOperation(value = "用户变更记录分页") @PostMapping("/list") public PageResponse page(@RequestBody UserChangeRecordPageQry qry) { return userChangeRecordService.listPage(qry); } - - @ApiOperation("变更记录详情详情") + @ApiOperation("用户变更记录详情") @PostMapping("/getChangerRecordInfoById") public SingleResponse getChangerRecordInfoById(@RequestBody UserChangeRecordInfoQry userChangeRecordInfoQry) { return SingleResponse.of(userChangeRecordService.getChangerRecordInfoById(userChangeRecordInfoQry)); } + /** + * 用户变更工作交接处理接口。 + * 当前统一走 workChangeHandle,后续新增工作类型时只扩执行器分派逻辑,不再新增重复入口。 + */ + @ApiOperation("工作交接处理") + @PostMapping("/workChangeHandle") + public SingleResponse workChangeHandle(@RequestBody WorkChangeUpdateCmd workChangeUpdateCmd) { + log.info("进入工作交接处理接口,交接记录id:{}, 交接企业id:{}, 交接人id:{}", + workChangeUpdateCmd.getId(), + workChangeUpdateCmd.getHandoverCompanyId(), + workChangeUpdateCmd.getHandoverUserId()); + userChangeRecordService.workChangeHandle(workChangeUpdateCmd); + return SingleResponse.buildSuccess(); + } } - diff --git a/web-adapter/src/main/java/com/zcloud/basic/info/web/UserCorpRecordController.java b/web-adapter/src/main/java/com/zcloud/basic/info/web/UserCorpRecordController.java index 86745736..a2a437cc 100644 --- a/web-adapter/src/main/java/com/zcloud/basic/info/web/UserCorpRecordController.java +++ b/web-adapter/src/main/java/com/zcloud/basic/info/web/UserCorpRecordController.java @@ -8,10 +8,7 @@ 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.*; import com.zcloud.basic.info.dto.clientobject.UserChangeRecordCO; import com.zcloud.basic.info.dto.clientobject.UserCorpRecordCO; import io.swagger.annotations.Api; @@ -56,8 +53,8 @@ public class UserCorpRecordController { } @ApiOperation("变更记录详情详情") @PostMapping("/getUserCorpRecordById") - public SingleResponse getChangerRecordInfoById(@RequestBody UserChangeRecordInfoQry userChangeRecordInfoQry) { - return SingleResponse.of(userCorpRecordService.getChangerRecordInfoById(userChangeRecordInfoQry)); + public SingleResponse getChangerRecordInfoById(@RequestBody UserCorpRecordInfoQry userCorpRecordInfoQry) { + return SingleResponse.of(userCorpRecordService.getChangerRecordInfoById(userCorpRecordInfoQry)); } } diff --git a/web-app/src/main/java/com/zcloud/basic/info/command/HumanUserUpdateExe.java b/web-app/src/main/java/com/zcloud/basic/info/command/HumanUserUpdateExe.java new file mode 100644 index 00000000..ddb16b56 --- /dev/null +++ b/web-app/src/main/java/com/zcloud/basic/info/command/HumanUserUpdateExe.java @@ -0,0 +1,1075 @@ +package com.zcloud.basic.info.command; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.cola.dto.MultiResponse; +import com.alibaba.cola.dto.Response; +import com.alibaba.cola.dto.SingleResponse; +import com.alibaba.cola.exception.BizException; +import com.jjb.saas.system.client.user.facade.UserFacade; +import com.jjb.saas.system.client.user.request.UserUpdateQuitCmd; +import com.zcloud.basic.info.domain.enums.CommonFlagEnum; +import com.zcloud.basic.info.domain.enums.UserChangeRecordStatusEnum; +import com.zcloud.basic.info.domain.enums.UserEmploymentFlagEnum; +import com.zcloud.basic.info.domain.enums.UserJobHandoverWorkTypeEnum; +import com.zcloud.basic.info.domain.gateway.UserChangeRecordGateway; +import com.zcloud.basic.info.domain.gateway.UserCorpRecordGateway; +import com.zcloud.basic.info.domain.gateway.UserGateway; +import com.zcloud.basic.info.domain.model.UserChangeRecordE; +import com.zcloud.basic.info.domain.model.UserCorpRecordE; +import com.zcloud.basic.info.domain.model.UserE; +import com.zcloud.basic.info.dto.UserAddCmd; +import com.zcloud.basic.info.dto.UserUpdateCmd; +import com.zcloud.basic.info.persistence.dataobject.CorpInfoDO; +import com.zcloud.basic.info.persistence.dataobject.DepartmentDO; +import com.zcloud.basic.info.persistence.dataobject.PostDO; +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.CorpInfoRepository; +import com.zcloud.basic.info.persistence.repository.DepartmentRepository; +import com.zcloud.basic.info.persistence.repository.PostRepository; +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.Tools; +import com.zcloud.gbscommon.zcloudeightwork.facade.ZcloudEightWorkFacade; +import com.zcloud.gbscommon.zcloudeightwork.request.EightWorkQry; +import com.zcloud.gbscommon.zcloudeightwork.response.EightWorkListByUserCO; +import com.zcloud.gbscommon.zcloudhidden.face.ZcloudHiddenFacade; +import com.zcloud.gbscommon.zcloudhidden.request.HiddenStatisticsListQry; +import com.zcloud.gbscommon.zcloudhidden.response.HiddenListByUserCO; +import com.zcloud.gbscommon.zcloudinspection.face.ZcloudInspectionWorkFacade; +import com.zcloud.gbscommon.zcloudinspection.request.InspectionQry; +import com.zcloud.gbscommon.zcloudinspection.response.InspectionListByUserCO; +import com.zcloud.gbscommon.zcloudrisk.facade.ZcloudRiskFacade; +import com.zcloud.gbscommon.zcloudrisk.request.ListManagerQry; +import com.zcloud.gbscommon.zcloudrisk.response.ListManagerListByUserCO; +import com.zcloud.gbscommon.zcloudqualifications.face.ZcloudProjectApprovalFacade; +import com.zcloud.gbscommon.zcloudqualifications.request.ProjectApprovalQry; +import com.zcloud.gbscommon.zcloudqualifications.response.ProjectListByUserCO; +import com.zcloud.gbscommon.zloudfirecheck.facade.ZcloudFireCheckFacade; +import com.zcloud.gbscommon.zloudfirecheck.request.FireCheckQry; +import com.zcloud.gbscommon.zloudfirecheck.response.FireCheckListByUserCO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; + +/** + * 人资用户变更执行器。 + * 负责新增、离职、跨企业调整、企业内资料调整四类处理。 + */ +@Component +@AllArgsConstructor +@Slf4j +public class HumanUserUpdateExe { + private final UserGateway userGateway; + private final UserRepository userRepository; + private final CorpInfoRepository corpInfoRepository; + private final DepartmentRepository departmentRepository; + private final PostRepository postRepository; + private final UserAddExe userAddExe; + private final UserUpdateExe userUpdateExe; + private final UserChangeRecordGateway userChangeRecordGateway; + private final UserCorpRecordRepository userCorpRecordRepository; + private final UserCorpRecordGateway userCorpRecordGateway; + private final UserJobHandoverRepository userJobHandoverRepository; + + @DubboReference + private UserFacade userFacade; + + @DubboReference + private ZcloudHiddenFacade zcloudHiddenFacade; + + @DubboReference + private ZcloudRiskFacade zcloudRiskFacade; + + @DubboReference + private ZcloudEightWorkFacade zcloudEightWorkFacade; + @DubboReference + private ZcloudFireCheckFacade zcloudFireCheckFacade; + @DubboReference + private ZcloudProjectApprovalFacade zcloudProjectApprovalFacade; + @DubboReference + private ZcloudInspectionWorkFacade zcloudInspectionWorkFacade; + + /** + * 人资用户变更总入口。 + * 处理顺序如下: + * 1. 根据 id 判断是新增还是修改。 + * 2. 如果是离职,先处理离职前待交接任务。 + * 3. 如果是跨企业调整,先将原企业离职,再按新增处理当前企业。 + * 4. 如果是在当前企业内调整部门、岗位等资料,直接走普通修改并同步底座。 + * + * @param userUpdateCmd 人资侧传入的用户变更命令 + * @return 当前处理的 GBS 用户 id + */ + @Transactional(rollbackFor = Exception.class) + public SingleResponse updateHumanUser(UserUpdateCmd userUpdateCmd) { + if (userUpdateCmd == null) { + throw new BizException("用户变更参数不能为空"); + } + + UserDO oldUserDO = userUpdateCmd.getId() == null ? null : userRepository.getInfoById(userUpdateCmd.getId()); + if (oldUserDO == null) { + Long userId = addHumanUser(userUpdateCmd); + return SingleResponse.of(userId); + } + + fillMissingFields(userUpdateCmd, oldUserDO); + if (isResignation(userUpdateCmd)) { + log.info("用户{}触发离职处理,准备检查离职前待交接任务", oldUserDO.getId()); + boolean resigned = executeHumanResignation(oldUserDO); + if (!resigned) { + log.info("用户{}存在待交接任务,已进入信息变更中状态,等待后续交接完成", oldUserDO.getId()); + } + return SingleResponse.of(oldUserDO.getId()); + } + + if (isCorpChanged(oldUserDO, userUpdateCmd)) { + log.info("用户{}发生跨企业调整,先记录变更前后企业信息,再处理原企业离职和新企业入职", oldUserDO.getId()); + Long userId = executeChangeCorp(oldUserDO, userUpdateCmd); + return SingleResponse.of(userId); + } + + log.info("用户{}在当前企业内发生部门、岗位等资料调整,直接走普通修改并同步底座", oldUserDO.getId()); + executeInsideCorpUpdate(oldUserDO, userUpdateCmd); + return SingleResponse.of(oldUserDO.getId()); + } + + /** + * 新增人资用户。 + * 新增成功后同步创建当前企业任职记录和用户变更记录。 + * + * @param userUpdateCmd 人资用户变更命令 + * @return 新增后的 GBS 用户 id + */ + private Long addHumanUser(UserUpdateCmd userUpdateCmd) { + checkAddRequired(userUpdateCmd); + fillAddMissingFields(userUpdateCmd); + + UserAddCmd userAddCmd = new UserAddCmd(); + BeanUtils.copyProperties(userUpdateCmd, userAddCmd); + Long userId = userAddExe.executeHumanUser(userAddCmd); + + UserE userE = buildUserE(userAddCmd, userId); + createOrUpdateCurrentCorpRecord(userE, userAddCmd.getCorpinfoName(), userAddCmd.getDepartmentName()); + createAddChangeRecord(userE, userAddCmd.getCorpinfoName(), userAddCmd.getDepartmentName()); + return userId; + } + + /** + * 处理跨企业变更。 + * 先记录跨企业变更前后信息,再对原企业执行离职流程。 + * 如果原企业存在待交接任务,则先挂起到工作交接流程,等工作全部交接完成后再由交接收口接口完成离职和新企业入职。 + * 如果原企业没有待交接任务,则当前流程内直接完成原企业离职并在新企业入职。 + * + * @param oldUserDO 原用户信息 + * @param userUpdateCmd 人资更新命令 + * @return 新企业中的 GBS 用户 id;如果原企业仍有待交接任务,则返回原用户 id + */ + private Long executeChangeCorp(UserDO oldUserDO, UserUpdateCmd userUpdateCmd) { + if (UserEmploymentFlagEnum.RESIGNATION.getCode().equals(oldUserDO.getEmploymentFlag())) { + return addHumanUser(userUpdateCmd); + } + + UserE oldUserE = buildUserE(oldUserDO); + oldUserE.setEmploymentFlag(UserEmploymentFlagEnum.INFO_CHANGE.getCode()); + oldUserE.setRzFlag(CommonFlagEnum.YES.getCode()); + markCurrentCorpRecordPending(oldUserDO); + + UserChangeRecordE userChangeRecordE = createCrossCorpChangeRecord(oldUserDO, userUpdateCmd); + userChangeRecordGateway.add(userChangeRecordE); + + log.info("开始汇总跨企业变更待交接任务,用户id:{}, 原企业id:{}, 新企业id:{}, 变更记录:{}", + oldUserDO.getId(), oldUserDO.getCorpinfoId(), userUpdateCmd.getCorpinfoId(), userChangeRecordE.getUserChangeRecordId()); + List allJob = getUserJob( + oldUserDO.getId(), + oldUserDO.getDepartmentId(), + oldUserDO.getCorpinfoId(), + userChangeRecordE.getUserChangeRecordId()); + if (CollUtil.isNotEmpty(allJob)) { + log.info("用户{}跨企业调整存在{}条待交接任务,先挂起交接,待交接完成后再进入新企业", + oldUserDO.getId(), allJob.size()); + userJobHandoverRepository.saveBatch(allJob); + userGateway.update(oldUserE); + return oldUserDO.getId(); + } + + log.info("用户{}跨企业调整不存在待交接任务,直接完成原企业离职并在新企业入职", oldUserDO.getId()); +// oldUserE.setEmploymentFlag(UserEmploymentFlagEnum.RESIGNATION.getCode()); +// userGateway.update(oldUserE); + userRepository.updateEmploymentFlagAndDeleteEnum( + oldUserE.getId(), + UserEmploymentFlagEnum.RESIGNATION.getCode(), + "TRUE"); + completeResignation(oldUserDO, userChangeRecordE); + return createEntryUserByChangeRecord(oldUserDO, userChangeRecordE); + } + + /** + * 处理企业内部资料调整。 + * 调整完成后,以数据库最新结果同步任职记录和用户变更记录,避免 after 字段仍然写成旧值。 + * + * @param oldUserDO 修改前用户信息 + * @param userUpdateCmd 修改命令 + */ + private void executeInsideCorpUpdate(UserDO oldUserDO, UserUpdateCmd userUpdateCmd) { + userUpdateCmd.setEmploymentFlag(oldUserDO.getEmploymentFlag()); + userUpdateCmd.setRzFlag(CommonFlagEnum.YES.getCode()); + userUpdateExe.execute(userUpdateCmd); + + UserDO newUserDO = userRepository.getInfoById(oldUserDO.getId()); + if (newUserDO == null) { + throw new BizException("用户修改完成后未查询到最新数据"); + } + + createOrUpdateCurrentCorpRecord(buildUserE(newUserDO), resolveCorpinfoName(newUserDO), resolveDepartmentName(newUserDO)); + createUpdateChangeRecord(oldUserDO, newUserDO); + } + + /** + * 处理人资离职。 + * 先将用户状态置为信息变更中,再汇总离职前待交接任务。 + * 如果存在待交接任务,则生成交接记录后停止本次离职收口; + * 如果不存在待交接任务,则直接完成离职并同步底座。 + * + * @param oldUserDO 当前用户 + * @return true 表示已直接完成离职;false 表示已生成交接任务,等待后续交接完成 + */ + private boolean executeHumanResignation(UserDO oldUserDO) { + UserE oldUserE = buildUserE(oldUserDO); + oldUserE.setEmploymentFlag(UserEmploymentFlagEnum.INFO_CHANGE.getCode()); + oldUserE.setRzFlag(CommonFlagEnum.YES.getCode()); + + markCurrentCorpRecordPending(oldUserDO); + + UserChangeRecordE userChangeRecordE = new UserChangeRecordE(); + userChangeRecordE.executeResignation(buildUserE(oldUserDO), + UserEmploymentFlagEnum.RESIGNATION.getCode(), + UserChangeRecordStatusEnum.PENDING.getCode(), + oldUserDO.getEmploymentFlag()); + userChangeRecordGateway.add(userChangeRecordE); + + log.info("开始汇总用户离职前待交接任务,用户id:{}, 部门id:{}, 企业id:{}, 变更记录:{}", + oldUserDO.getId(), oldUserDO.getDepartmentId(), oldUserDO.getCorpinfoId(), userChangeRecordE.getUserChangeRecordId()); + List allJob = getUserJob(oldUserDO.getId(), oldUserDO.getDepartmentId(), oldUserDO.getCorpinfoId(), userChangeRecordE.getUserChangeRecordId()); + if (CollUtil.isNotEmpty(allJob)) { + log.info("用户{}存在{}条待交接任务,保存工作交接记录并将用户状态更新为信息变更中", + oldUserDO.getId(), allJob.size()); + userJobHandoverRepository.saveBatch(allJob); + userGateway.update(oldUserE); + return false; + } + + log.info("用户{}不存在待交接任务,直接完成离职处理", oldUserDO.getId()); + oldUserE.setEmploymentFlag(UserEmploymentFlagEnum.RESIGNATION.getCode()); + userGateway.update(oldUserE); + completeResignation(oldUserDO, userChangeRecordE); + return true; + } + + /** + * 完成离职收口。 + * 包括更新当前任职记录、更新用户变更记录,以及调用底座离职。 + * + * @param oldUserDO 离职用户 + * @param userChangeRecordE 离职变更记录 + */ + private void completeResignation(UserDO oldUserDO, UserChangeRecordE userChangeRecordE) { + UserCorpRecordDO userCorpRecordDO = userCorpRecordRepository.getInfoByUserId( + oldUserDO.getId(), oldUserDO.getCorpinfoId(), UserEmploymentFlagEnum.ON.getCode()); + UserCorpRecordE userCorpRecordE = new UserCorpRecordE(); + if (userCorpRecordDO != null) { + BeanUtils.copyProperties(userCorpRecordDO, userCorpRecordE); + userCorpRecordE.executeResignation(userCorpRecordE, buildUserE(oldUserDO), + UserEmploymentFlagEnum.RESIGNATION.getCode(), UserChangeRecordStatusEnum.APPROVED.getCode()); + userCorpRecordGateway.update(userCorpRecordE); + } else { + userCorpRecordE = buildUserCorpRecordE(buildUserE(oldUserDO), resolveCorpinfoName(oldUserDO), resolveDepartmentName(oldUserDO)); + userCorpRecordE.initResignation(buildUserE(oldUserDO), + UserEmploymentFlagEnum.RESIGNATION.getCode(), UserChangeRecordStatusEnum.APPROVED.getCode()); + userCorpRecordGateway.add(userCorpRecordE); + } + + userChangeRecordE.setStatus(UserChangeRecordStatusEnum.APPROVED.getCode()); + userChangeRecordGateway.update(userChangeRecordE); + quitBaseUser(oldUserDO.getId()); + } + + /** + * 创建或更新当前企业任职记录。 + * + * @param userE 用户领域对象 + * @param corpinfoName 企业名称 + * @param departmentName 部门名称 + */ + private void createOrUpdateCurrentCorpRecord(UserE userE, String corpinfoName, String departmentName) { + UserCorpRecordDO userCorpRecordDO = userCorpRecordRepository.getInfoByUserId( + userE.getId(), userE.getCorpinfoId(), UserEmploymentFlagEnum.ON.getCode()); + if (userCorpRecordDO == null) { + UserCorpRecordE userCorpRecordE = buildUserCorpRecordE(userE, corpinfoName, departmentName); + userCorpRecordE.initAdd(userE, corpinfoName, departmentName); + userCorpRecordGateway.add(userCorpRecordE); + return; + } + + UserCorpRecordE userCorpRecordE = new UserCorpRecordE(); + BeanUtils.copyProperties(userCorpRecordDO, userCorpRecordE); + userCorpRecordE.setCorpinfoName(corpinfoName); + userCorpRecordE.setDepartmentId(userE.getDepartmentId()); + userCorpRecordE.setDepartmentName(departmentName); + userCorpRecordE.setPostId(userE.getPostId()); + userCorpRecordE.setPostName(userE.getPostName()); + userCorpRecordE.setFlowFlag(userE.getFlowFlag()); + userCorpRecordGateway.update(userCorpRecordE); + } + + /** + * 创建新增场景的人事变更记录。 + * + * @param userE 用户信息 + * @param corpinfoName 企业名称 + * @param departmentName 部门名称 + */ + private void createAddChangeRecord(UserE userE, String corpinfoName, String departmentName) { + UserChangeRecordE userChangeRecordE = new UserChangeRecordE(); + userChangeRecordE.initUserAdd(userE, corpinfoName, departmentName); + userChangeRecordGateway.add(userChangeRecordE); + } + + /** + * 创建企业内资料变更记录。 + * after 数据统一使用数据库回查后的最新用户信息,避免 after 字段仍然使用修改前值。 + * + * @param oldUserDO 修改前用户信息 + * @param newUserDO 修改后最新用户信息 + */ + private void createUpdateChangeRecord(UserDO oldUserDO, UserDO newUserDO) { + UserE oldUserE = buildUserE(oldUserDO); + UserE newUserE = buildUserE(newUserDO); + UserChangeRecordE userChangeRecordE = new UserChangeRecordE(); + userChangeRecordE.initUserUpdate(newUserE, oldUserE, resolveCorpinfoName(newUserDO), resolveDepartmentName(newUserDO)); + userChangeRecordGateway.add(userChangeRecordE); + } + + /** + * 创建跨企业变更记录。 + * 该记录同时保留变更前和变更后的企业、部门、岗位信息,供后续工作交接完成后恢复新企业入职使用。 + * + * @param oldUserDO 原用户信息 + * @param userUpdateCmd 变更后的目标信息 + * @return 跨企业变更记录 + */ + private UserChangeRecordE createCrossCorpChangeRecord(UserDO oldUserDO, UserUpdateCmd userUpdateCmd) { + UserChangeRecordE userChangeRecordE = new UserChangeRecordE(); + userChangeRecordE.setUserId(oldUserDO.getId()); + userChangeRecordE.setChangeTime(new java.util.Date()); + userChangeRecordE.setCorpinfoIdBefore(oldUserDO.getCorpinfoId()); + userChangeRecordE.setCorpinfoNameBefore(resolveCorpinfoName(oldUserDO)); + userChangeRecordE.setDepartmentIdBefore(oldUserDO.getDepartmentId()); + userChangeRecordE.setDepartmentNameBefore(resolveDepartmentName(oldUserDO)); + userChangeRecordE.setPostIdBefore(oldUserDO.getPostId()); + userChangeRecordE.setPostNameBefore(oldUserDO.getPostName()); + userChangeRecordE.setUserStatusBefore(oldUserDO.getEmploymentFlag()); + + userChangeRecordE.setCorpinfoIdAfter(userUpdateCmd.getCorpinfoId()); + userChangeRecordE.setCorpinfoNameAfter(resolveChangedCorpinfoName(userUpdateCmd, oldUserDO)); + userChangeRecordE.setDepartmentIdAfter(userUpdateCmd.getDepartmentId()); + userChangeRecordE.setDepartmentNameAfter(resolveChangedDepartmentName(userUpdateCmd, oldUserDO)); + userChangeRecordE.setPostIdAfter(userUpdateCmd.getPostId()); + userChangeRecordE.setPostNameAfter(resolveChangedPostName(userUpdateCmd, oldUserDO)); + userChangeRecordE.setUserStatusAfter(UserEmploymentFlagEnum.ON.getCode()); + userChangeRecordE.setStatus(UserChangeRecordStatusEnum.PENDING.getCode()); + return userChangeRecordE; + } + + /** + * 根据跨企业变更记录为新企业创建用户并补齐入职记录。 + * + * @param oldUserDO 原企业用户信息 + * @param userChangeRecordE 变更记录 + * @return 新企业用户 id + */ + private Long createEntryUserByChangeRecord(UserDO oldUserDO, UserChangeRecordE userChangeRecordE) { + UserAddCmd userAddCmd = buildCrossCorpUserAddCmd(oldUserDO, userChangeRecordE); + Long userId = userAddExe.executeHumanUser(userAddCmd); + + UserE userE = buildUserE(userAddCmd, userId); + createOrUpdateCurrentCorpRecord(userE, userAddCmd.getCorpinfoName(), userAddCmd.getDepartmentName()); + log.info("跨企业变更新企业入职完成,原用户id:{}, 新用户id:{}, 新企业id:{}", + oldUserDO.getId(), userId, userAddCmd.getCorpinfoId()); + return userId; + } + + /** + * 使用原用户基础资料和变更记录中的 after 信息组装新企业入职命令。 + * + * @param oldUserDO 原企业用户信息 + * @param userChangeRecordE 变更记录 + * @return 新企业入职命令 + */ + private UserAddCmd buildCrossCorpUserAddCmd(UserDO oldUserDO, UserChangeRecordE userChangeRecordE) { + UserAddCmd userAddCmd = new UserAddCmd(); + BeanUtils.copyProperties(oldUserDO, userAddCmd); + userAddCmd.setCorpinfoId(userChangeRecordE.getCorpinfoIdAfter()); + userAddCmd.setCorpinfoName(userChangeRecordE.getCorpinfoNameAfter()); + userAddCmd.setDepartmentId(userChangeRecordE.getDepartmentIdAfter()); + userAddCmd.setDepartmentName(userChangeRecordE.getDepartmentNameAfter()); + userAddCmd.setPostId(userChangeRecordE.getPostIdAfter()); + userAddCmd.setPostName(userChangeRecordE.getPostNameAfter()); + userAddCmd.setUsername(oldUserDO.getUsername()); + userAddCmd.setPhone(oldUserDO.getPhone()); + userAddCmd.setName(oldUserDO.getName()); + userAddCmd.setUserId(oldUserDO.getUserId()); + return userAddCmd; + } + + /** + * 调用底座执行离职。 + * 三方接口异常时只记录日志,不影响当前主流程继续完成。 + * + * @param userId GBS 用户 id + */ + private void quitBaseUser(Long userId) { + UserUpdateQuitCmd quitCmd = new UserUpdateQuitCmd(); + quitCmd.setId(userId); + log.info("开始调用底座离职接口,用户id:{}", userId); + try { + Response quit = userFacade.quit(quitCmd); + if (quit == null || !quit.isSuccess()) { + String errMessage = quit == null ? "底座未返回结果" : quit.getErrMessage(); + log.error("底座离职处理失败,用户id:{}, 原因:{}", userId, errMessage); + return; + } + log.info("底座离职处理完成,用户id:{}, 返回结果:{}", userId, JSONUtil.toJsonStr(quit)); + } catch (Exception e) { + log.error("调用底座离职接口发生异常,用户id:{}", userId, e); + } + } + + /** + * 用旧用户信息补齐更新命令的缺失字段,避免部分字段更新时把原值覆盖为空。 + * + * @param userUpdateCmd 更新命令 + * @param oldUserDO 旧用户信息 + */ + private void fillMissingFields(UserUpdateCmd userUpdateCmd, UserDO oldUserDO) { + if (!StringUtils.hasText(userUpdateCmd.getUserId())) { + userUpdateCmd.setUserId(oldUserDO.getUserId()); + } + if (!StringUtils.hasText(userUpdateCmd.getUsername())) { + userUpdateCmd.setUsername(oldUserDO.getUsername()); + } + if (!StringUtils.hasText(userUpdateCmd.getPhone())) { + userUpdateCmd.setPhone(oldUserDO.getPhone()); + } + if (!StringUtils.hasText(userUpdateCmd.getName())) { + userUpdateCmd.setName(oldUserDO.getName()); + } + if (userUpdateCmd.getCorpinfoId() == null) { + userUpdateCmd.setCorpinfoId(oldUserDO.getCorpinfoId()); + } + if (!StringUtils.hasText(userUpdateCmd.getCorpinfoName())) { + userUpdateCmd.setCorpinfoName(oldUserDO.getCorpinfoName()); + } + if (userUpdateCmd.getDepartmentId() == null) { + userUpdateCmd.setDepartmentId(oldUserDO.getDepartmentId()); + } + if (!StringUtils.hasText(userUpdateCmd.getDepartmentName())) { + userUpdateCmd.setDepartmentName(oldUserDO.getDepartmentName()); + } + if (userUpdateCmd.getPostId() == null) { + userUpdateCmd.setPostId(oldUserDO.getPostId()); + } + if (!StringUtils.hasText(userUpdateCmd.getPostName())) { + userUpdateCmd.setPostName(oldUserDO.getPostName()); + } + if (userUpdateCmd.getRoleId() == null) { + userUpdateCmd.setRoleId(oldUserDO.getRoleId()); + } + if (userUpdateCmd.getMainCorpFlag() == null) { + userUpdateCmd.setMainCorpFlag(oldUserDO.getMainCorpFlag()); + } + if (userUpdateCmd.getUserType() == null) { + userUpdateCmd.setUserType(oldUserDO.getUserType()); + } + if (userUpdateCmd.getFlowFlag() == null) { + userUpdateCmd.setFlowFlag(oldUserDO.getFlowFlag()); + } + if (userUpdateCmd.getRzFlag() == null) { + userUpdateCmd.setRzFlag(oldUserDO.getRzFlag()); + } + if (userUpdateCmd.getEmploymentFlag() == null) { + userUpdateCmd.setEmploymentFlag(oldUserDO.getEmploymentFlag()); + } + if (!StringUtils.hasText(userUpdateCmd.getUsername()) && StringUtils.hasText(userUpdateCmd.getPhone())) { + userUpdateCmd.setUsername(userUpdateCmd.getPhone()); + } + if (!StringUtils.hasText(userUpdateCmd.getPostName())) { + userUpdateCmd.setPostName(resolvePostName(userUpdateCmd.getPostId(), oldUserDO.getPostName())); + } + } + + /** + * 补齐新增用户所需的默认字段和值。 + * + * @param userUpdateCmd 新增命令 + */ + private void fillAddMissingFields(UserUpdateCmd userUpdateCmd) { + if (!StringUtils.hasText(userUpdateCmd.getUserId())) { + userUpdateCmd.setUserId(Tools.get32UUID()); + } + if (!StringUtils.hasText(userUpdateCmd.getUsername()) && StringUtils.hasText(userUpdateCmd.getPhone())) { + userUpdateCmd.setUsername(userUpdateCmd.getPhone()); + } + if (!StringUtils.hasText(userUpdateCmd.getCorpinfoName())) { + userUpdateCmd.setCorpinfoName(resolveCorpinfoName(userUpdateCmd.getCorpinfoId(), null)); + } + if (!StringUtils.hasText(userUpdateCmd.getDepartmentName())) { + userUpdateCmd.setDepartmentName(resolveDepartmentName(userUpdateCmd.getDepartmentId(), null)); + } + if (!StringUtils.hasText(userUpdateCmd.getPostName())) { + userUpdateCmd.setPostName(resolvePostName(userUpdateCmd.getPostId(), null)); + } + } + + /** + * 校验新增人资用户的必填项。 + * + * @param userUpdateCmd 新增命令 + */ + private void checkAddRequired(UserUpdateCmd userUpdateCmd) { + if (!StringUtils.hasText(userUpdateCmd.getName())) { + throw new BizException("姓名不能为空"); + } + if (!StringUtils.hasText(userUpdateCmd.getPhone())) { + throw new BizException("手机号不能为空"); + } + if (userUpdateCmd.getCorpinfoId() == null) { + throw new BizException("企业id不能为空"); + } + if (userUpdateCmd.getDepartmentId() == null) { + throw new BizException("部门id不能为空"); + } + if (userUpdateCmd.getRoleId() == null) { + throw new BizException("角色id不能为空"); + } + } + + /** + * 判断本次修改是否为离职。 + */ + private boolean isResignation(UserUpdateCmd userUpdateCmd) { + return Objects.equals(UserEmploymentFlagEnum.RESIGNATION.getCode(), userUpdateCmd.getEmploymentFlag()); + } + + /** + * 判断是否发生了跨企业变更。 + */ + private boolean isCorpChanged(UserDO oldUserDO, UserUpdateCmd userUpdateCmd) { + return userUpdateCmd.getCorpinfoId() != null + && !Objects.equals(oldUserDO.getCorpinfoId(), userUpdateCmd.getCorpinfoId()); + } + + /** + * 将数据库对象转换为用户领域对象。 + */ + private UserE buildUserE(UserDO userDO) { + UserE userE = new UserE(); + BeanUtils.copyProperties(userDO, userE); + return userE; + } + + /** + * 将更新命令转换为用户领域对象。 + */ + private UserE buildUserE(UserUpdateCmd userUpdateCmd, Long userId) { + UserE userE = new UserE(); + BeanUtils.copyProperties(userUpdateCmd, userE); + userE.setId(userId); + return userE; + } + + /** + * 将新增命令转换为用户领域对象。 + */ + private UserE buildUserE(UserAddCmd userAddCmd, Long userId) { + UserE userE = new UserE(); + BeanUtils.copyProperties(userAddCmd, userE); + userE.setId(userId); + userE.setEmploymentFlag(UserEmploymentFlagEnum.ON.getCode()); + return userE; + } + + /** + * 组装用户当前企业任职记录领域对象。 + */ + private UserCorpRecordE buildUserCorpRecordE(UserE userE, String corpinfoName, String departmentName) { + UserCorpRecordE userCorpRecordE = new UserCorpRecordE(); + userCorpRecordE.setUserId(userE.getId()); + userCorpRecordE.setCorpinfoId(userE.getCorpinfoId()); + userCorpRecordE.setCorpinfoName(corpinfoName); + userCorpRecordE.setDepartmentId(userE.getDepartmentId()); + userCorpRecordE.setDepartmentName(departmentName); + userCorpRecordE.setPostId(userE.getPostId()); + userCorpRecordE.setPostName(userE.getPostName()); + userCorpRecordE.setFlowFlag(userE.getFlowFlag()); + return userCorpRecordE; + } + + /** + * 优先使用命令中的企业名称;如果未传,则按企业 id 回查。 + */ + private String resolveCorpinfoName(UserUpdateCmd userUpdateCmd, UserDO oldUserDO) { + if (StringUtils.hasText(userUpdateCmd.getCorpinfoName())) { + return userUpdateCmd.getCorpinfoName(); + } + return resolveCorpinfoName(userUpdateCmd.getCorpinfoId(), oldUserDO == null ? null : oldUserDO.getCorpinfoName()); + } + + /** + * 优先使用命令中的部门名称;如果未传,则按部门 id 回查。 + */ + private String resolveDepartmentName(UserUpdateCmd userUpdateCmd, UserDO oldUserDO) { + if (StringUtils.hasText(userUpdateCmd.getDepartmentName())) { + return userUpdateCmd.getDepartmentName(); + } + return resolveDepartmentName(userUpdateCmd.getDepartmentId(), oldUserDO == null ? null : oldUserDO.getDepartmentName()); + } + + /** + * 解析当前用户所属企业名称。 + */ + private String resolveCorpinfoName(UserDO oldUserDO) { + return resolveCorpinfoName(oldUserDO.getCorpinfoId(), oldUserDO.getCorpinfoName()); + } + + /** + * 解析当前用户所属部门名称。 + */ + private String resolveDepartmentName(UserDO oldUserDO) { + return resolveDepartmentName(oldUserDO.getDepartmentId(), oldUserDO.getDepartmentName()); + } + + /** + * 按企业 id 回查企业名称。 + */ + private String resolveCorpinfoName(Long corpinfoId, String defaultName) { + if (StringUtils.hasText(defaultName)) { + return defaultName; + } + if (corpinfoId == null) { + return defaultName; + } + CorpInfoDO corpInfoDO = corpInfoRepository.getById(corpinfoId); + return corpInfoDO == null ? defaultName : corpInfoDO.getCorpName(); + } + + /** + * 按部门 id 回查部门名称。 + */ + private String resolveDepartmentName(Long departmentId, String defaultName) { + if (StringUtils.hasText(defaultName)) { + return defaultName; + } + if (departmentId == null) { + return defaultName; + } + DepartmentDO departmentDO = departmentRepository.getById(departmentId); + return departmentDO == null ? defaultName : departmentDO.getName(); + } + + /** + * 按岗位 id 回查岗位名称。 + */ + private String resolvePostName(Long postId, String defaultName) { + if (StringUtils.hasText(defaultName)) { + return defaultName; + } + if (postId == null) { + return defaultName; + } + PostDO postDO = postRepository.getById(postId); + return postDO == null ? defaultName : postDO.getPostName(); + } + + /** + * 解析跨企业变更后的企业名称。 + * 如果企业 id 已发生变化,则必须以新企业 id 回查名称,不能继续沿用旧企业名称。 + */ + private String resolveChangedCorpinfoName(UserUpdateCmd userUpdateCmd, UserDO oldUserDO) { + if (userUpdateCmd.getCorpinfoId() != null + && !Objects.equals(userUpdateCmd.getCorpinfoId(), oldUserDO.getCorpinfoId())) { + return resolveCorpinfoName(userUpdateCmd.getCorpinfoId(), null); + } + return resolveCorpinfoName(userUpdateCmd, oldUserDO); + } + + /** + * 解析跨企业变更后的部门名称。 + * 如果部门 id 已发生变化,则必须以新部门 id 回查名称,不能继续沿用旧部门名称。 + */ + private String resolveChangedDepartmentName(UserUpdateCmd userUpdateCmd, UserDO oldUserDO) { + if (userUpdateCmd.getDepartmentId() != null + && !Objects.equals(userUpdateCmd.getDepartmentId(), oldUserDO.getDepartmentId())) { + return resolveDepartmentName(userUpdateCmd.getDepartmentId(), null); + } + return resolveDepartmentName(userUpdateCmd, oldUserDO); + } + + /** + * 解析跨企业变更后的岗位名称。 + * 如果岗位 id 已发生变化,则必须以新岗位 id 回查名称,不能继续沿用旧岗位名称。 + */ + private String resolveChangedPostName(UserUpdateCmd userUpdateCmd, UserDO oldUserDO) { + if (userUpdateCmd.getPostId() != null + && !Objects.equals(userUpdateCmd.getPostId(), oldUserDO.getPostId())) { + return resolvePostName(userUpdateCmd.getPostId(), null); + } + return resolvePostName(userUpdateCmd.getPostId(), userUpdateCmd.getPostName()); + } + + /** + * 将当前在职任职记录置为处理中。 + * 如果原记录不存在,则补建一条待处理记录,保证离职变更流程数据闭环。 + * + * @param oldUserDO 原用户信息 + */ + private void markCurrentCorpRecordPending(UserDO oldUserDO) { + UserCorpRecordDO userCorpRecordDO = userCorpRecordRepository.getInfoByUserId( + oldUserDO.getId(), oldUserDO.getCorpinfoId(), UserEmploymentFlagEnum.ON.getCode()); + if (userCorpRecordDO != null) { + UserCorpRecordE userCorpRecordE = new UserCorpRecordE(); + BeanUtils.copyProperties(userCorpRecordDO, userCorpRecordE); + userCorpRecordE.setStatus(UserChangeRecordStatusEnum.PENDING.getCode()); + userCorpRecordGateway.update(userCorpRecordE); + return; + } + + UserE userE = buildUserE(oldUserDO); + UserCorpRecordE userCorpRecordE = buildUserCorpRecordE(userE, resolveCorpinfoName(oldUserDO), resolveDepartmentName(oldUserDO)); + userCorpRecordE.setEmploymentFlag(oldUserDO.getEmploymentFlag()); + userCorpRecordE.setStatus(UserChangeRecordStatusEnum.PENDING.getCode()); + userCorpRecordGateway.add(userCorpRecordE); + } + + /** + * 汇总离职前需要交接的全部工作。 + * 当前接入隐患、风险辨识检查、危险作业三个系统,并行查询以减少整体耗时。 + * 任一三方系统查询失败时,只记录日志并返回该系统空结果,不影响主流程继续处理。 + * + * @param userId GBS 用户 id + * @param departmentId 当前部门 id + * @param corpinfoId 当前企业 id + * @param userChangeRecordId 当前用户变更记录 id + * @return 待交接工作列表 + */ + private List getUserJob(Long userId, Long departmentId, Long corpinfoId, String userChangeRecordId) { + CompletableFuture> hiddenFuture = CompletableFuture.supplyAsync( + () -> queryHiddenJobs(userId, departmentId, corpinfoId, userChangeRecordId)); + CompletableFuture> riskFuture = CompletableFuture.supplyAsync( + () -> queryRiskJobs(userId, corpinfoId, userChangeRecordId)); + CompletableFuture> eightWorkFuture = CompletableFuture.supplyAsync( + () -> queryEightWorkJobs(userId, corpinfoId, userChangeRecordId)); + CompletableFuture> fireCheckFuture = CompletableFuture.supplyAsync( + () -> queryFireCheckJobs(userId, corpinfoId, userChangeRecordId)); + CompletableFuture> projectApprovalFuture = CompletableFuture.supplyAsync( + () -> queryProjectApprovalJobs(userId, corpinfoId, userChangeRecordId)); + CompletableFuture> inspectionWorkFuture = CompletableFuture.supplyAsync( + () -> queryInspectionWorkJobs(userId, corpinfoId, userChangeRecordId)); + + CompletableFuture.allOf(hiddenFuture, riskFuture, eightWorkFuture,fireCheckFuture, projectApprovalFuture, inspectionWorkFuture).join(); + List allJob = new ArrayList<>(); + allJob.addAll(hiddenFuture.join()); + allJob.addAll(riskFuture.join()); + allJob.addAll(eightWorkFuture.join()); + allJob.addAll(fireCheckFuture.join()); + allJob.addAll(projectApprovalFuture.join()); + allJob.addAll(inspectionWorkFuture.join()); + log.info("离职待交接任务汇总完成,用户id:{}, 部门id:{}, 企业id:{}, 总数量:{}", + userId, departmentId, corpinfoId, allJob.size()); + return allJob; + } + + /** + * 查询消防检查系统中的待交接任务。 + * 调用方式与其他三方系统保持一致,按用户和企业维度汇总待交接数据。 + * 三方接口异常时只记录日志,不影响离职主流程继续执行。 + */ + private List queryFireCheckJobs(Long userId, Long corpinfoId, String userChangeRecordId) { + FireCheckQry fireCheckQry = new FireCheckQry(); + fireCheckQry.setUserId(userId); + fireCheckQry.setCorpinfoId(corpinfoId); + + log.info("查询未完成工作,开始异步查询消防检查待交接任务,用户id:{}, 企业id:{}", userId, corpinfoId); + try { + MultiResponse response = zcloudFireCheckFacade.listManagerByUserId(fireCheckQry); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "消防检查服务未返回结果" : response.getErrMessage(); + log.error("查询消防检查待交接任务失败,用户id:{}, 企业id:{}, 原因:{}", + userId, corpinfoId, errMessage); + return new ArrayList<>(); + } + + List fireCheckList = response.getData(); + if (CollUtil.isEmpty(fireCheckList)) { + log.info("消防检查待交接任务查询完成,未查询到数据,用户id:{}, 企业id:{}", userId, corpinfoId); + return new ArrayList<>(); + } + + List result = new ArrayList<>(); + fireCheckList.forEach(info -> result.add(buildUserJobHandoverDO( + userId, + corpinfoId, + userChangeRecordId, + UserJobHandoverWorkTypeEnum.FIRECHECK.getCode(), + info.getFireCheckId(), + info.getWorkProject(), + info.getWorkContent()))); + log.info("消防检查待交接任务查询完成,用户id:{}, 企业id:{}, 数量:{}", userId, corpinfoId, result.size()); + return result; + } catch (Exception e) { + log.error("查询消防检查待交接任务发生异常,用户id:{}, 企业id:{}", userId, corpinfoId, e); + return new ArrayList<>(); + } + } + + /** + * 查询相关方项目审核系统中的待交接任务。 + * 调用方式与其他三方系统保持一致,按用户和企业维度汇总待交接数据。 + * 三方接口异常时只记录日志,不影响离职主流程继续执行。 + */ + private List queryProjectApprovalJobs(Long userId, Long corpinfoId, String userChangeRecordId) { + ProjectApprovalQry projectApprovalQry = new ProjectApprovalQry(); + projectApprovalQry.setUserId(userId); + projectApprovalQry.setCorpinfoId(corpinfoId); + + log.info("查询未完成工作,开始异步查询相关方项目审核待交接任务,用户id:{}, 企业id:{}", userId, corpinfoId); + try { + MultiResponse response = zcloudProjectApprovalFacade.listProjectByUserId(projectApprovalQry); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "相关方项目审核服务未返回结果" : response.getErrMessage(); + log.error("查询相关方项目审核待交接任务失败,用户id:{}, 企业id:{}, 原因:{}", + userId, corpinfoId, errMessage); + return new ArrayList<>(); + } + + List projectList = response.getData(); + if (CollUtil.isEmpty(projectList)) { + log.info("相关方项目审核待交接任务查询完成,未查询到数据,用户id:{}, 企业id:{}", userId, corpinfoId); + return new ArrayList<>(); + } + + List result = new ArrayList<>(); + projectList.forEach(info -> result.add(buildUserJobHandoverDO( + userId, + corpinfoId, + userChangeRecordId, + UserJobHandoverWorkTypeEnum.PROJECT_APPROVAL.getCode(), + info.getProjectId(), + info.getWorkProject(), + info.getWorkContent()))); + log.info("相关方项目审核待交接任务查询完成,用户id:{}, 企业id:{}, 数量:{}", + userId, corpinfoId, result.size()); + return result; + } catch (Exception e) { + log.error("查询相关方项目审核待交接任务发生异常,用户id:{}, 企业id:{}", userId, corpinfoId, e); + return new ArrayList<>(); + } + } + /** + * 查询安全环保检查系统中的待交接任务。 + * 调用方式与其他三方系统保持一致,按用户和企业维度汇总待交接数据。 + * 三方接口异常时只记录日志,不影响离职主流程继续执行。 + */ + private List queryInspectionWorkJobs(Long userId, Long corpinfoId, String userChangeRecordId) { + InspectionQry inspectionQry = new InspectionQry(); + inspectionQry.setUserId(userId); + inspectionQry.setCorpinfoId(corpinfoId); + + log.info("查询未完成工作,开始异步查询安全环保检查待交接任务,用户id:{}, 企业id:{}", userId, corpinfoId); + try { + MultiResponse response = zcloudInspectionWorkFacade.listWorkByUserId(inspectionQry); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "安全环保检查服务未返回结果" : response.getErrMessage(); + log.error("查询安全环保检查待交接任务失败,用户id:{}, 企业id:{}, 原因:{}", + userId, corpinfoId, errMessage); + return new ArrayList<>(); + } + + List inspectionList = response.getData(); + if (CollUtil.isEmpty(inspectionList)) { + log.info("安全环保检查待交接任务查询完成,未查询到数据,用户id:{}, 企业id:{}", userId, corpinfoId); + return new ArrayList<>(); + } + + List result = new ArrayList<>(); + inspectionList.forEach(info -> result.add(buildUserJobHandoverDO( + userId, + corpinfoId, + userChangeRecordId, + UserJobHandoverWorkTypeEnum.INSPECTION_WORK.getCode(), + info.getWorkId(), + info.getWorkProject(), + info.getWorkContent()))); + log.info("安全环保检查待交接任务查询完成,用户id:{}, 企业id:{}, 数量:{}", + userId, corpinfoId, result.size()); + return result; + } catch (Exception e) { + log.error("查询安全环保检查待交接任务发生异常,用户id:{}, 企业id:{}", userId, corpinfoId, e); + return new ArrayList<>(); + } + } + private List queryHiddenJobs(Long userId, Long departmentId, Long corpinfoId, String userChangeRecordId) { + HiddenStatisticsListQry hiddenStatisticsListQry = new HiddenStatisticsListQry(); + hiddenStatisticsListQry.setUserId(userId); + hiddenStatisticsListQry.setDeptId(departmentId); + + log.info("查询未完成工作,开始异步查询隐患待交接任务,用户id:{}, 部门id:{}", userId, departmentId); + try { + MultiResponse response = zcloudHiddenFacade.listByUserId(hiddenStatisticsListQry); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "隐患服务未返回结果" : response.getErrMessage(); + log.error("查询隐患待交接任务失败,用户id:{}, 部门id:{}, 原因:{}", + userId, departmentId, errMessage); + return new ArrayList<>(); + } + + List hiddenList = response.getData(); + if (CollUtil.isEmpty(hiddenList)) { + log.info("隐患待交接任务查询完成,未查询到数据,用户id:{}, 部门id:{}", userId, departmentId); + return new ArrayList<>(); + } + + List result = new ArrayList<>(); + hiddenList.forEach(info -> result.add(buildUserJobHandoverDO( + userId, + corpinfoId, + userChangeRecordId, + UserJobHandoverWorkTypeEnum.HIDDENINFO.getCode(), + info.getHiddenId(), + info.getWorkProject(), + info.getWorkContent()))); + log.info("隐患待交接任务查询完成,用户id:{}, 部门id:{}, 数量:{}", userId, departmentId, result.size()); + return result; + } catch (Exception e) { + log.error("查询隐患待交接任务发生异常,用户id:{}, 部门id:{}", userId, departmentId, e); + return new ArrayList<>(); + } + } + + /** + * 查询风险辨识检查系统中的待交接任务。 + * 三方接口异常时只记录日志,不影响离职主流程。 + */ + private List queryRiskJobs(Long userId, Long corpinfoId, String userChangeRecordId) { + ListManagerQry listManagerQry = new ListManagerQry(); + listManagerQry.setUserId(userId); + listManagerQry.setCorpinfoId(corpinfoId); + + log.info("查询未完成工作,开始异步查询风险辨识检查待交接任务,用户id:{}, 企业id:{}", userId, corpinfoId); + try { + MultiResponse response = zcloudRiskFacade.listManagerByUserId(listManagerQry); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "风险服务未返回结果" : response.getErrMessage(); + log.error("查询风险辨识检查待交接任务失败,用户id:{}, 企业id:{}, 原因:{}", + userId, corpinfoId, errMessage); + return new ArrayList<>(); + } + + List riskList = response.getData(); + if (CollUtil.isEmpty(riskList)) { + log.info("风险辨识检查待交接任务查询完成,未查询到数据,用户id:{}, 企业id:{}", + userId, corpinfoId); + return new ArrayList<>(); + } + + List result = new ArrayList<>(); + riskList.forEach(info -> result.add(buildUserJobHandoverDO( + userId, + corpinfoId, + userChangeRecordId, + UserJobHandoverWorkTypeEnum.RISK.getCode(), + info.getListManagerId(), + info.getWorkProject(), + info.getWorkContent()))); + log.info("风险辨识检查待交接任务查询完成,用户id:{}, 企业id:{}, 数量:{}", + userId, corpinfoId, result.size()); + return result; + } catch (Exception e) { + log.error("查询风险辨识检查待交接任务发生异常,用户id:{}, 企业id:{}", userId, corpinfoId, e); + return new ArrayList<>(); + } + } + + /** + * 查询危险作业系统中的待交接任务。 + * 三方接口异常时只记录日志,不影响离职主流程。 + */ + private List queryEightWorkJobs(Long userId, Long corpinfoId, String userChangeRecordId) { + EightWorkQry eightWorkQry = new EightWorkQry(); + eightWorkQry.setUserId(userId); + eightWorkQry.setCorpinfoId(corpinfoId); + + log.info("查询未完成工作,开始异步查询危险作业待交接任务,用户id:{}, 企业id:{}", userId, corpinfoId); + try { + MultiResponse response = zcloudEightWorkFacade.eightWorkByUserId(eightWorkQry); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "危险作业服务未返回结果" : response.getErrMessage(); + log.error("查询危险作业待交接任务失败,用户id:{}, 企业id:{}, 原因:{}", + userId, corpinfoId, errMessage); + return new ArrayList<>(); + } + + List eightWorkList = response.getData(); + if (CollUtil.isEmpty(eightWorkList)) { + log.info("危险作业待交接任务查询完成,未查询到数据,用户id:{}, 企业id:{}", userId, corpinfoId); + return new ArrayList<>(); + } + + List result = new ArrayList<>(); + eightWorkList.forEach(info -> result.add(buildUserJobHandoverDO( + userId, + corpinfoId, + userChangeRecordId, + UserJobHandoverWorkTypeEnum.EIGHTWORK.getCode(), + info.getWorkId(), + info.getWorkProject(), + info.getWorkContent()))); + log.info("危险作业待交接任务查询完成,用户id:{}, 企业id:{}, 数量:{}", + userId, corpinfoId, result.size()); + return result; + } catch (Exception e) { + log.error("查询危险作业待交接任务发生异常,用户id:{}, 企业id:{}", userId, corpinfoId, e); + return new ArrayList<>(); + } + } + + /** + * 组装统一的工作交接记录。 + * 不同业务系统最终都转换成统一交接表结构,便于后续工作交接流程统一处理。 + */ + private UserJobHandoverDO buildUserJobHandoverDO(Long userId, Long corpinfoId, String userChangeRecordId, + Integer workType, String foreignKey, String workProject, String workContent) { + UserJobHandoverDO userJobHandoverDO = new UserJobHandoverDO(); + userJobHandoverDO.setUserJobHandoverId(Tools.get32UUID()); + userJobHandoverDO.setUserId(userId); + userJobHandoverDO.setWorkProject(workProject); + userJobHandoverDO.setWorkContent(workContent); + userJobHandoverDO.setForeignKey(foreignKey); + userJobHandoverDO.setWorkType(workType); + userJobHandoverDO.setUserChangeRecordId(userChangeRecordId); + userJobHandoverDO.setCorpinfoId(corpinfoId); + return userJobHandoverDO; + } +} diff --git a/web-app/src/main/java/com/zcloud/basic/info/command/UserAddExe.java b/web-app/src/main/java/com/zcloud/basic/info/command/UserAddExe.java index 6088386d..b58f5886 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/command/UserAddExe.java +++ b/web-app/src/main/java/com/zcloud/basic/info/command/UserAddExe.java @@ -21,6 +21,7 @@ import com.zcloud.basic.info.command.convertor.UserCoConvertor; import com.zcloud.basic.info.command.query.CorpInfoQueryExe; import com.zcloud.basic.info.constant.RedisConstant; import com.zcloud.basic.info.domain.config.CodeConfig; +import com.zcloud.basic.info.domain.enums.CommonFlagEnum; import com.zcloud.basic.info.domain.enums.CorpTypeEnum; import com.zcloud.basic.info.domain.enums.UserEmploymentFlagEnum; import com.zcloud.basic.info.domain.enums.UserFlowFlagEnum; @@ -646,7 +647,23 @@ public class UserAddExe { List userList = userRepository.getListByPhone(userE.getPhone(), employmentFlagList); if (CollUtil.isNotEmpty(userList)) { List userEList = userCoConvertor.convertDOsToEs(userList); - userE.checkPhone(userEList); +// userE.checkPhone(userEList); + if (CollUtil.isNotEmpty(userEList)) { + //判断是否有当前企业 + boolean existInCurrentCorp = userEList.stream() + .anyMatch(userE1 -> userE1.getCorpinfoId().equals(cmd.getCorpinfoId())); + + //判断是否在其他企业存在且为在职状态(employment_flag=1) + boolean existInOtherCorpAndOnJob = userEList.stream() + .filter(userE1 -> !userE1.getCorpinfoId().equals(cmd.getCorpinfoId())) + .anyMatch(userE1 -> UserEmploymentFlagEnum.ON.getCode().equals(userE1.getEmploymentFlag())); + + if (existInCurrentCorp) { + throw new BizException("当前手机号在当前企业已存在,请联系管理员"); + } else if (existInOtherCorpAndOnJob) { + throw new BizException("当前手机号已在其他企业存在且为在职状态,请联系管理员"); + } + } } CorpInfoDO corpInfoDO = corpInfoRepository.getById(userE.getCorpinfoId()); @@ -658,6 +675,8 @@ public class UserAddExe { userE.setUserType(CorpTypeEnum.getUserTypeByCode(corpInfoDO.getType())); userE.resetPassword(corpInfoDO.getType()); userE.setDepartmentLeaderFlag(0); + userE.setUserId(Tools.get32UUID()); + userE.setRzFlag(CommonFlagEnum.YES.getCode()); res = userGateway.add(userE); if (corpInfoDO != null && !ObjectUtils.isEmpty(corpInfoDO.getCorpName())) { corpName = corpInfoDO.getCorpName(); diff --git a/web-app/src/main/java/com/zcloud/basic/info/command/UserChangeRecordWorkChangeExe.java b/web-app/src/main/java/com/zcloud/basic/info/command/UserChangeRecordWorkChangeExe.java new file mode 100644 index 00000000..32f1feb2 --- /dev/null +++ b/web-app/src/main/java/com/zcloud/basic/info/command/UserChangeRecordWorkChangeExe.java @@ -0,0 +1,656 @@ +package com.zcloud.basic.info.command; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.cola.dto.Response; +import com.alibaba.cola.dto.SingleResponse; +import com.alibaba.cola.exception.BizException; +import com.jjb.saas.system.client.user.facade.UserFacade; +import com.jjb.saas.system.client.user.request.UserUpdateQuitCmd; +import com.zcloud.basic.info.domain.enums.UserChangeRecordStatusEnum; +import com.zcloud.basic.info.domain.enums.UserEmploymentFlagEnum; +import com.zcloud.basic.info.domain.enums.UserJobHandoverWorkTypeEnum; +import com.zcloud.basic.info.domain.enums.UserJobStatusEnum; +import com.zcloud.basic.info.domain.gateway.UserChangeRecordGateway; +import com.zcloud.basic.info.domain.gateway.UserCorpRecordGateway; +import com.zcloud.basic.info.domain.gateway.UserGateway; +import com.zcloud.basic.info.domain.model.UserChangeRecordE; +import com.zcloud.basic.info.domain.model.UserCorpRecordE; +import com.zcloud.basic.info.domain.model.UserE; +import com.zcloud.basic.info.dto.UserAddCmd; +import com.zcloud.basic.info.dto.WorkChangeUpdateCmd; +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.UserChangeRecordRepository; +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.zcloudeightwork.facade.ZcloudEightWorkFacade; +import com.zcloud.gbscommon.zcloudeightwork.request.EightWorkChangeCmd; +import com.zcloud.gbscommon.zcloudhidden.face.ZcloudHiddenFacade; +import com.zcloud.gbscommon.zcloudhidden.request.HiddenWorkChangeCmd; +import com.zcloud.gbscommon.zcloudinspection.face.ZcloudInspectionWorkFacade; +import com.zcloud.gbscommon.zcloudqualifications.face.ZcloudProjectApprovalFacade; +import com.zcloud.gbscommon.zcloudqualifications.response.ProjectWorkChangeCmd; +import com.zcloud.gbscommon.zcloudrisk.facade.ZcloudRiskFacade; +import com.zcloud.gbscommon.zcloudrisk.request.ListManagerWorkChangeCmd; +import com.zcloud.gbscommon.zloudfirecheck.facade.ZcloudFireCheckFacade; +import com.zcloud.gbscommon.zloudfirecheck.response.FireCheckWorkChangeCmd; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Objects; + +/** + * 用户变更工作交接执行器。 + * 负责按工作类型分派交接处理、关闭当前交接记录, + * 并在同一条变更记录下全部交接完成后执行离职收口。 + */ +@Component +@AllArgsConstructor +@Slf4j +public class UserChangeRecordWorkChangeExe { + private final UserAddExe userAddExe; + private final UserJobHandoverRepository userJobHandoverRepository; + private final UserChangeRecordRepository userChangeRecordRepository; + private final UserRepository userRepository; + private final UserCorpRecordRepository userCorpRecordRepository; + private final UserGateway userGateway; + private final UserCorpRecordGateway userCorpRecordGateway; + private final UserChangeRecordGateway userChangeRecordGateway; + + @DubboReference + private UserFacade userFacade; + + @DubboReference + private ZcloudHiddenFacade zcloudHiddenFacade; + + @DubboReference + private ZcloudRiskFacade zcloudRiskFacade; + + @DubboReference + private ZcloudEightWorkFacade zcloudEightWorkFacade; + + @DubboReference + private ZcloudFireCheckFacade zcloudFireCheckFacade; + + @DubboReference + private ZcloudProjectApprovalFacade zcloudProjectApprovalFacade; + + @DubboReference + private ZcloudInspectionWorkFacade zcloudInspectionWorkFacade; + + /** + * 工作交接处理入口。 + * 先根据工作类型调用对应三方系统,再关闭当前交接记录; + * 如果同一条变更记录下全部工作都已交接完成,则执行离职收口。 + * + * @param workChangeUpdateCmd 工作交接命令 + */ + @Transactional(rollbackFor = Exception.class) + public void workChangeHandle(WorkChangeUpdateCmd workChangeUpdateCmd) { + if (workChangeUpdateCmd == null) { + throw new BizException("工作交接参数不能为空"); + } + log.info("开始处理工作交接,交接记录id:{}, 交接企业id:{}, 交接部门id:{}, 交接用户id:{}", + workChangeUpdateCmd.getId(), + workChangeUpdateCmd.getHandoverCompanyId(), + workChangeUpdateCmd.getHandoverDepartmentId(), + workChangeUpdateCmd.getHandoverUserId()); + + UserJobHandoverDO handoverDO = getRequiredHandover(workChangeUpdateCmd.getId()); + if (Objects.equals(UserJobStatusEnum.CLOSE_TASK.getCode(), handoverDO.getHandoverStatus())) { + log.info("工作交接记录已完成,跳过重复处理,交接记录id:{}, 变更记录:{}", + handoverDO.getId(), handoverDO.getUserChangeRecordId()); + finishResignationIfNeeded(handoverDO.getUserChangeRecordId()); + return; + } + + dispatchWorkChange(handoverDO, workChangeUpdateCmd); + closeCurrentHandover(handoverDO, workChangeUpdateCmd); + finishResignationIfNeeded(handoverDO.getUserChangeRecordId()); + log.info("工作交接处理完成,交接记录id:{}, 变更记录:{}, 工作类型:{}", + handoverDO.getId(), + handoverDO.getUserChangeRecordId(), + handoverDO.getWorkType()); + } + + /** + * 根据工作类型分派到对应业务系统。 + * 当前已接入隐患信息、风险辨识检查、危险作业。 + */ + private void dispatchWorkChange(UserJobHandoverDO handoverDO, WorkChangeUpdateCmd workChangeUpdateCmd) { + UserJobHandoverWorkTypeEnum workTypeEnum = UserJobHandoverWorkTypeEnum.getByCode(handoverDO.getWorkType()); + if (workTypeEnum == null) { + throw new BizException("不支持的工作交接类型"); + } + log.info("开始分派工作交接,交接记录id:{}, 工作类型:{}, 业务主键:{}", + handoverDO.getId(), + handoverDO.getWorkType(), + handoverDO.getForeignKey()); + + switch (workTypeEnum) { + case HIDDENINFO: + processHiddenInfoHandover(handoverDO, workChangeUpdateCmd); + return; + case RISK: + processRiskInfoHandover(handoverDO, workChangeUpdateCmd); + return; + case EIGHTWORK: + processEightWorkInfoHandover(handoverDO, workChangeUpdateCmd); + return; + case FIRECHECK: + processFireCheckInfoHandover(handoverDO, workChangeUpdateCmd); + return; + case PROJECT_APPROVAL: + processProjectApprovalInfoHandover(handoverDO, workChangeUpdateCmd); + return; + case INSPECTION_WORK: + processInspectionWorkInfoHandover(handoverDO, workChangeUpdateCmd); + return; + default: + log.warn("工作类型暂未接入交接微服务,交接记录id:{}, 工作类型:{}", + handoverDO.getId(), handoverDO.getWorkType()); + } + } + + /** + * 处理隐患信息交接。 + * 三方接口异常时只记录日志,不中断当前总流程。 + */ + private void processHiddenInfoHandover(UserJobHandoverDO handoverDO, WorkChangeUpdateCmd workChangeUpdateCmd) { + HiddenWorkChangeCmd hiddenWorkChangeCmd = new HiddenWorkChangeCmd(); + hiddenWorkChangeCmd.setHiddenId(handoverDO.getForeignKey()); + hiddenWorkChangeCmd.setOldUserId(handoverDO.getUserId()); + hiddenWorkChangeCmd.setUserId(workChangeUpdateCmd.getHandoverUserId()); + hiddenWorkChangeCmd.setUserName(workChangeUpdateCmd.getHandoverUserName()); + hiddenWorkChangeCmd.setDeptId(workChangeUpdateCmd.getHandoverDepartmentId()); + hiddenWorkChangeCmd.setDeptName(workChangeUpdateCmd.getHandoverDepartmentName()); + hiddenWorkChangeCmd.setCorpId(workChangeUpdateCmd.getHandoverCompanyId()); + hiddenWorkChangeCmd.setCorpName(workChangeUpdateCmd.getHandoverCompanyName()); + + log.info("开始处理隐患信息交接,交接记录id:{}, hiddenId:{}, 原责任人:{}, 新责任人:{}", + handoverDO.getId(), + handoverDO.getForeignKey(), + handoverDO.getUserId(), + workChangeUpdateCmd.getHandoverUserId()); + try { + SingleResponse response = zcloudHiddenFacade.updateHiddenWorkChange(hiddenWorkChangeCmd); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "隐患服务未返回结果" : response.getErrMessage(); + log.error("隐患信息交接失败,交接记录id:{}, hiddenId:{}, 原因:{}", + handoverDO.getId(), handoverDO.getForeignKey(), errMessage); + return; + } + log.info("隐患信息交接完成,交接记录id:{}, hiddenId:{}, 新责任人:{}", + handoverDO.getId(), handoverDO.getForeignKey(), workChangeUpdateCmd.getHandoverUserId()); + } catch (Exception e) { + log.error("隐患信息交接发生异常,交接记录id:{}, hiddenId:{}", + handoverDO.getId(), handoverDO.getForeignKey(), e); + } + } + + /** + * 处理危险作业交接。 + * 三方接口异常时只记录日志,不中断当前总流程。 + */ + private void processEightWorkInfoHandover(UserJobHandoverDO handoverDO, WorkChangeUpdateCmd workChangeUpdateCmd) { + EightWorkChangeCmd eightWorkChangeCmd = new EightWorkChangeCmd(); + eightWorkChangeCmd.setWorkId(handoverDO.getForeignKey()); + eightWorkChangeCmd.setOldUserId(handoverDO.getUserId()); + eightWorkChangeCmd.setUserId(workChangeUpdateCmd.getHandoverUserId()); + eightWorkChangeCmd.setUserName(workChangeUpdateCmd.getHandoverUserName()); + eightWorkChangeCmd.setDeptId(workChangeUpdateCmd.getHandoverDepartmentId()); + eightWorkChangeCmd.setDeptName(workChangeUpdateCmd.getHandoverDepartmentName()); + eightWorkChangeCmd.setCorpId(workChangeUpdateCmd.getHandoverCompanyId()); + eightWorkChangeCmd.setCorpName(workChangeUpdateCmd.getHandoverCompanyName()); + + log.info("开始处理危险作业交接,交接记录id:{}, workId:{}, 原责任人:{}, 新责任人:{}", + handoverDO.getId(), + handoverDO.getForeignKey(), + handoverDO.getUserId(), + workChangeUpdateCmd.getHandoverUserId()); + try { + SingleResponse response = zcloudEightWorkFacade.updateEightWorkChange(eightWorkChangeCmd); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "危险作业服务未返回结果" : response.getErrMessage(); + log.error("危险作业交接失败,交接记录id:{}, workId:{}, 原因:{}", + handoverDO.getId(), handoverDO.getForeignKey(), errMessage); + return; + } + log.info("危险作业交接完成,交接记录id:{}, workId:{}, 新责任人:{}", + handoverDO.getId(), handoverDO.getForeignKey(), workChangeUpdateCmd.getHandoverUserId()); + } catch (Exception e) { + log.error("危险作业交接发生异常,交接记录id:{}, workId:{}", + handoverDO.getId(), handoverDO.getForeignKey(), e); + } + } + + /** + * 处理风险辨识检查交接。 + * 三方接口异常时只记录日志,不中断当前总流程。 + */ + /** + * 处理消防检查交接。 + * 调用方式与隐患、风险、危险作业保持一致。 + * 三方接口异常时只记录日志,不中断当前总流程。 + */ + private void processFireCheckInfoHandover(UserJobHandoverDO handoverDO, WorkChangeUpdateCmd workChangeUpdateCmd) { + FireCheckWorkChangeCmd fireCheckWorkChangeCmd = new FireCheckWorkChangeCmd(); + fireCheckWorkChangeCmd.setFireCheckId(handoverDO.getForeignKey()); + fireCheckWorkChangeCmd.setOldUserId(handoverDO.getUserId()); + fireCheckWorkChangeCmd.setUserId(workChangeUpdateCmd.getHandoverUserId()); + fireCheckWorkChangeCmd.setUserName(workChangeUpdateCmd.getHandoverUserName()); + fireCheckWorkChangeCmd.setDeptId(workChangeUpdateCmd.getHandoverDepartmentId()); + fireCheckWorkChangeCmd.setDeptName(workChangeUpdateCmd.getHandoverDepartmentName()); + fireCheckWorkChangeCmd.setCorpId(workChangeUpdateCmd.getHandoverCompanyId()); + fireCheckWorkChangeCmd.setCorpName(workChangeUpdateCmd.getHandoverCompanyName()); + + log.info("开始处理消防检查交接,交接记录id:{}, fireCheckId:{}, 原责任人:{}, 新责任人:{}", + handoverDO.getId(), + handoverDO.getForeignKey(), + handoverDO.getUserId(), + workChangeUpdateCmd.getHandoverUserId()); + try { + SingleResponse response = zcloudFireCheckFacade.updateRiskWorkChange(fireCheckWorkChangeCmd); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "消防检查服务未返回结果" : response.getErrMessage(); + log.error("消防检查交接失败,交接记录id:{}, fireCheckId:{}, 原因:{}", + handoverDO.getId(), handoverDO.getForeignKey(), errMessage); + return; + } + log.info("消防检查交接完成,交接记录id:{}, fireCheckId:{}, 新责任人:{}", + handoverDO.getId(), handoverDO.getForeignKey(), workChangeUpdateCmd.getHandoverUserId()); + } catch (Exception e) { + log.error("消防检查交接发生异常,交接记录id:{}, fireCheckId:{}", + handoverDO.getId(), handoverDO.getForeignKey(), e); + } + } + + /** + * 处理相关方项目审核交接。 + * 调用方式与隐患、风险、危险作业、消防检查保持一致。 + * 三方接口异常时只记录日志,不中断当前总流程。 + */ + private void processProjectApprovalInfoHandover(UserJobHandoverDO handoverDO, WorkChangeUpdateCmd workChangeUpdateCmd) { + ProjectWorkChangeCmd projectWorkChangeCmd = new ProjectWorkChangeCmd(); + projectWorkChangeCmd.setProjectId(handoverDO.getForeignKey()); + projectWorkChangeCmd.setOldUserId(handoverDO.getUserId()); + projectWorkChangeCmd.setUserId(workChangeUpdateCmd.getHandoverUserId()); + projectWorkChangeCmd.setUserName(workChangeUpdateCmd.getHandoverUserName()); + projectWorkChangeCmd.setDeptId(workChangeUpdateCmd.getHandoverDepartmentId()); + projectWorkChangeCmd.setDeptName(workChangeUpdateCmd.getHandoverDepartmentName()); + projectWorkChangeCmd.setCorpId(workChangeUpdateCmd.getHandoverCompanyId()); + projectWorkChangeCmd.setCorpName(workChangeUpdateCmd.getHandoverCompanyName()); + + log.info("开始处理相关方项目审核交接,交接记录id:{}, projectId:{}, 原责任人:{}, 新责任人:{}", + handoverDO.getId(), + handoverDO.getForeignKey(), + handoverDO.getUserId(), + workChangeUpdateCmd.getHandoverUserId()); + try { + SingleResponse response = zcloudProjectApprovalFacade.updateRiskWorkChange(projectWorkChangeCmd); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "相关方项目审核服务未返回结果" : response.getErrMessage(); + log.error("相关方项目审核交接失败,交接记录id:{}, projectId:{}, 原因:{}", + handoverDO.getId(), handoverDO.getForeignKey(), errMessage); + return; + } + log.info("相关方项目审核交接完成,交接记录id:{}, projectId:{}, 新责任人:{}", + handoverDO.getId(), handoverDO.getForeignKey(), workChangeUpdateCmd.getHandoverUserId()); + } catch (Exception e) { + log.error("相关方项目审核交接发生异常,交接记录id:{}, projectId:{}", + handoverDO.getId(), handoverDO.getForeignKey(), e); + } + } + + /** + * 处理安全环保检查交接。 + * 查询走安全环保检查自己的接口,交接字段组装方式与其他工作类型保持一致。 + * 三方接口异常时只记录日志,不中断当前总流程。 + */ + private void processInspectionWorkInfoHandover(UserJobHandoverDO handoverDO, WorkChangeUpdateCmd workChangeUpdateCmd) { + FireCheckWorkChangeCmd inspectionWorkChangeCmd = new FireCheckWorkChangeCmd(); + inspectionWorkChangeCmd.setFireCheckId(handoverDO.getForeignKey()); + inspectionWorkChangeCmd.setOldUserId(handoverDO.getUserId()); + inspectionWorkChangeCmd.setUserId(workChangeUpdateCmd.getHandoverUserId()); + inspectionWorkChangeCmd.setUserName(workChangeUpdateCmd.getHandoverUserName()); + inspectionWorkChangeCmd.setDeptId(workChangeUpdateCmd.getHandoverDepartmentId()); + inspectionWorkChangeCmd.setDeptName(workChangeUpdateCmd.getHandoverDepartmentName()); + inspectionWorkChangeCmd.setCorpId(workChangeUpdateCmd.getHandoverCompanyId()); + inspectionWorkChangeCmd.setCorpName(workChangeUpdateCmd.getHandoverCompanyName()); + + log.info("开始处理安全环保检查交接,交接记录id:{}, workId:{}, 原责任人:{}, 新责任人:{}", + handoverDO.getId(), + handoverDO.getForeignKey(), + handoverDO.getUserId(), + workChangeUpdateCmd.getHandoverUserId()); + try { + SingleResponse response = zcloudInspectionWorkFacade.updateRiskWorkChange(inspectionWorkChangeCmd); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "安全环保检查服务未返回结果" : response.getErrMessage(); + log.error("安全环保检查交接失败,交接记录id:{}, workId:{}, 原因:{}", + handoverDO.getId(), handoverDO.getForeignKey(), errMessage); + return; + } + log.info("安全环保检查交接完成,交接记录id:{}, workId:{}, 新责任人:{}", + handoverDO.getId(), handoverDO.getForeignKey(), workChangeUpdateCmd.getHandoverUserId()); + } catch (Exception e) { + log.error("安全环保检查交接发生异常,交接记录id:{}, workId:{}", + handoverDO.getId(), handoverDO.getForeignKey(), e); + } + } + private void processRiskInfoHandover(UserJobHandoverDO handoverDO, WorkChangeUpdateCmd workChangeUpdateCmd) { + ListManagerWorkChangeCmd listManagerWorkChangeCmd = new ListManagerWorkChangeCmd(); + listManagerWorkChangeCmd.setListManagerId(handoverDO.getForeignKey()); + listManagerWorkChangeCmd.setOldUserId(handoverDO.getUserId()); + listManagerWorkChangeCmd.setUserId(workChangeUpdateCmd.getHandoverUserId()); + listManagerWorkChangeCmd.setUserName(workChangeUpdateCmd.getHandoverUserName()); + listManagerWorkChangeCmd.setDeptId(workChangeUpdateCmd.getHandoverDepartmentId()); + listManagerWorkChangeCmd.setDeptName(workChangeUpdateCmd.getHandoverDepartmentName()); + listManagerWorkChangeCmd.setCorpId(workChangeUpdateCmd.getHandoverCompanyId()); + listManagerWorkChangeCmd.setCorpName(workChangeUpdateCmd.getHandoverCompanyName()); + + log.info("开始处理风险辨识检查交接,交接记录id:{}, listManagerId:{}, 原责任人:{}, 新责任人:{}", + handoverDO.getId(), + handoverDO.getForeignKey(), + handoverDO.getUserId(), + workChangeUpdateCmd.getHandoverUserId()); + try { + SingleResponse response = zcloudRiskFacade.updateRiskWorkChange(listManagerWorkChangeCmd); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "风险服务未返回结果" : response.getErrMessage(); + log.error("风险辨识检查交接失败,交接记录id:{}, listManagerId:{}, 原因:{}", + handoverDO.getId(), handoverDO.getForeignKey(), errMessage); + return; + } + log.info("风险辨识检查交接完成,交接记录id:{}, listManagerId:{}, 新责任人:{}", + handoverDO.getId(), handoverDO.getForeignKey(), workChangeUpdateCmd.getHandoverUserId()); + } catch (Exception e) { + log.error("风险辨识检查交接发生异常,交接记录id:{}, listManagerId:{}", + handoverDO.getId(), handoverDO.getForeignKey(), e); + } + } + + /** + * 关闭当前工作交接记录。 + * 同一条变更记录下可能还有其他未完成事项,因此这里只关闭当前记录。 + */ + private void closeCurrentHandover(UserJobHandoverDO handoverDO, WorkChangeUpdateCmd workChangeUpdateCmd) { + UserJobHandoverDO updateDO = new UserJobHandoverDO(); + updateDO.setId(handoverDO.getId()); + updateDO.setHandoverStatus(UserJobStatusEnum.CLOSE_TASK.getCode()); + updateDO.setHandoverCompanyId(workChangeUpdateCmd.getHandoverCompanyId()); + updateDO.setHandoverCompanyName(workChangeUpdateCmd.getHandoverCompanyName()); + updateDO.setHandoverDepartmentId(workChangeUpdateCmd.getHandoverDepartmentId()); + updateDO.setHandoverDepartmentName(workChangeUpdateCmd.getHandoverDepartmentName()); + updateDO.setHandoverPostId(workChangeUpdateCmd.getHandoverPostId()); + updateDO.setHandoverPostName(workChangeUpdateCmd.getHandoverPostName()); + updateDO.setHandoverUserId(workChangeUpdateCmd.getHandoverUserId()); + updateDO.setHandoverUserName(workChangeUpdateCmd.getHandoverUserName()); + userJobHandoverRepository.updateById(updateDO); + log.info("当前工作交接记录已关闭,交接记录id:{}, 新交接用户id:{}", + handoverDO.getId(), workChangeUpdateCmd.getHandoverUserId()); + } + + /** + * 当同一条变更记录下全部工作交接都已关闭后,执行离职收口。 + * 如果是跨企业变更,则在原企业离职完成后,根据变更记录中的 after 信息继续完成新企业入职。 + */ + private void finishResignationIfNeeded(String userChangeRecordId) { + if (!StringUtils.hasText(userChangeRecordId)) { + throw new BizException("用户变更记录不能为空"); + } + + List handoverDOList = userJobHandoverRepository.getListByChangerRecordId(userChangeRecordId); + if (CollUtil.isEmpty(handoverDOList)) { + log.info("当前变更记录下没有工作交接数据,无需离职收口,变更记录:{}", userChangeRecordId); + return; + } + + boolean allFinished = handoverDOList.stream() + .allMatch(item -> Objects.equals(UserJobStatusEnum.CLOSE_TASK.getCode(), item.getHandoverStatus())); + if (!allFinished) { + log.info("当前变更记录下仍有未完成的工作交接,暂不执行离职收口,变更记录:{}", userChangeRecordId); + return; + } + + log.info("当前变更记录下全部工作交接已完成,开始执行离职收口,变更记录:{}", userChangeRecordId); + UserChangeRecordDO userChangeRecordDO = userChangeRecordRepository.getChangerRecordInfoById(userChangeRecordId); + if (userChangeRecordDO == null) { + throw new BizException("未查询到对应的用户变更记录"); + } + if (Objects.equals(UserChangeRecordStatusEnum.APPROVED.getCode(), userChangeRecordDO.getStatus())) { + log.info("用户变更记录已是通过状态,跳过重复离职收口,变更记录:{}", userChangeRecordId); + return; + } + + UserDO userDO = userRepository.getInfoById(userChangeRecordDO.getUserId()); + if (userDO == null) { + throw new BizException("未查询到待离职用户"); + } + + updateUserEmploymentFlag(userDO, userChangeRecordDO); + updateUserCorpRecord(userDO, userChangeRecordDO); + quitBaseUser(userDO.getId()); + if (needEntryNewCorp(userChangeRecordDO)) { + Long newUserId = createEntryUserByChangeRecord(userDO, userChangeRecordDO); + log.info("跨企业变更工作交接收口完成新企业入职,原用户id:{}, 新用户id:{}, 变更记录:{}", + userDO.getId(), newUserId, userChangeRecordId); + } + updateUserChangeRecord(userChangeRecordDO); + } + + /** + * 将用户主表状态改为离职。 + */ + private void updateUserEmploymentFlag(UserDO userDO, UserChangeRecordDO userChangeRecordDO) { + if (Objects.equals(UserEmploymentFlagEnum.RESIGNATION.getCode(), userDO.getEmploymentFlag())) { + log.info("用户主表已是离职状态,跳过更新,用户id:{}", userDO.getId()); + return; + } + UserE userE = buildUserE(userDO, userChangeRecordDO); + userE.setEmploymentFlag(UserEmploymentFlagEnum.RESIGNATION.getCode()); + userE.setDeleteEnum("TRUE"); + userRepository.updateEmploymentFlagAndDeleteEnum( + userDO.getId(), + UserEmploymentFlagEnum.RESIGNATION.getCode(), + "TRUE"); + log.info("用户主表离职状态更新完成,用户id:{}", userDO.getId()); + } + + /** + * 收口企业任职记录。 + */ + private void updateUserCorpRecord(UserDO userDO, UserChangeRecordDO userChangeRecordDO) { + Long corpinfoId = userChangeRecordDO.getCorpinfoIdBefore() != null + ? userChangeRecordDO.getCorpinfoIdBefore() + : userDO.getCorpinfoId(); + UserCorpRecordDO userCorpRecordDO = userCorpRecordRepository.getInfoByUserStatus( + userDO.getId(), + corpinfoId, + UserChangeRecordStatusEnum.PENDING.getCode()); + if (userCorpRecordDO == null) { + userCorpRecordDO = userCorpRecordRepository.getInfoByUserId( + userDO.getId(), + corpinfoId, + UserEmploymentFlagEnum.ON.getCode()); + } + + UserE userE = buildUserE(userDO, userChangeRecordDO); + if (userCorpRecordDO != null) { + UserCorpRecordE userCorpRecordE = new UserCorpRecordE(); + BeanUtils.copyProperties(userCorpRecordDO, userCorpRecordE); + userCorpRecordE.executeResignation( + userCorpRecordE, + userE, + UserEmploymentFlagEnum.RESIGNATION.getCode(), + UserChangeRecordStatusEnum.APPROVED.getCode()); + if (StringUtils.hasText(userChangeRecordDO.getResignationReason())) { + userCorpRecordE.setResignationReason(userChangeRecordDO.getResignationReason()); + } + userCorpRecordGateway.update(userCorpRecordE); + log.info("任职记录离职收口完成,用户id:{}, 企业id:{}", userDO.getId(), corpinfoId); + return; + } + + UserCorpRecordE userCorpRecordE = new UserCorpRecordE(); + userCorpRecordE.initResignation( + userE, + UserEmploymentFlagEnum.RESIGNATION.getCode(), + UserChangeRecordStatusEnum.APPROVED.getCode()); + userCorpRecordE.setResignationReason(userChangeRecordDO.getResignationReason()); + userCorpRecordGateway.add(userCorpRecordE); + log.info("补建离职任职记录完成,用户id:{}, 企业id:{}", userDO.getId(), corpinfoId); + } + + /** + * 将当前待处理的用户变更记录更新为已通过。 + */ + private void updateUserChangeRecord(UserChangeRecordDO userChangeRecordDO) { + UserChangeRecordE userChangeRecordE = new UserChangeRecordE(); + BeanUtils.copyProperties(userChangeRecordDO, userChangeRecordE); + userChangeRecordE.setStatus(UserChangeRecordStatusEnum.APPROVED.getCode()); + userChangeRecordGateway.update(userChangeRecordE); + log.info("用户变更记录状态更新为已通过,变更记录:{}", userChangeRecordDO.getUserChangeRecordId()); + } + + /** + * 同步底座离职。 + * 三方接口异常时只记录日志,不影响当前交接收口主流程。 + */ + private void quitBaseUser(Long userId) { + UserUpdateQuitCmd quitCmd = new UserUpdateQuitCmd(); + quitCmd.setId(userId); + log.info("开始调用底座离职接口,用户id:{}", userId); + try { + Response response = userFacade.quit(quitCmd); + if (response == null || !response.isSuccess()) { + String errMessage = response == null ? "底座未返回结果" : response.getErrMessage(); + log.error("底座离职处理失败,用户id:{}, 原因:{}", userId, errMessage); + return; + } + log.info("底座离职接口调用完成,用户id:{}", userId); + } catch (Exception e) { + log.error("调用底座离职接口发生异常,用户id:{}", userId, e); + } + } + + /** + * 查询并校验当前交接记录必须存在。 + */ + private UserJobHandoverDO getRequiredHandover(Long id) { + if (id == null) { + throw new BizException("工作交接记录id不能为空"); + } + SingleResponse response = userJobHandoverRepository.getInfoById(id); + UserJobHandoverDO handoverDO = response == null ? null : response.getData(); + if (handoverDO == null) { + throw new BizException("工作交接记录不存在"); + } + return handoverDO; + } + + /** + * 组装离职收口时使用的用户快照。 + */ + private UserE buildUserE(UserDO userDO, UserChangeRecordDO userChangeRecordDO) { + UserE userE = new UserE(); + BeanUtils.copyProperties(userDO, userE); + if (userChangeRecordDO == null) { + return userE; + } + if (!StringUtils.hasText(userE.getCorpinfoName())) { + userE.setCorpinfoName(userChangeRecordDO.getCorpinfoNameBefore()); + } + if (!StringUtils.hasText(userE.getDepartmentName())) { + userE.setDepartmentName(userChangeRecordDO.getDepartmentNameBefore()); + } + if (!StringUtils.hasText(userE.getPostName())) { + userE.setPostName(userChangeRecordDO.getPostNameBefore()); + } + if (userE.getCorpinfoId() == null) { + userE.setCorpinfoId(userChangeRecordDO.getCorpinfoIdBefore()); + } + if (userE.getDepartmentId() == null) { + userE.setDepartmentId(userChangeRecordDO.getDepartmentIdBefore()); + } + if (userE.getPostId() == null) { + userE.setPostId(userChangeRecordDO.getPostIdBefore()); + } + return userE; + } + + /** + * 判断当前变更记录是否需要在离职完成后继续执行新企业入职。 + */ + private boolean needEntryNewCorp(UserChangeRecordDO userChangeRecordDO) { + return userChangeRecordDO.getCorpinfoIdAfter() != null; + } + + /** + * 根据变更记录中的 after 信息,为新企业创建用户并补齐入职记录。 + * 新用户基础资料沿用原用户信息,企业、部门、岗位取变更记录中的变更后数据。 + */ + private Long createEntryUserByChangeRecord(UserDO oldUserDO, UserChangeRecordDO userChangeRecordDO) { + UserAddCmd userAddCmd = buildCrossCorpUserAddCmd(oldUserDO, userChangeRecordDO); + Long userId = userAddExe.executeHumanUser(userAddCmd); + + UserE userE = new UserE(); + BeanUtils.copyProperties(userAddCmd, userE); + userE.setId(userId); + userE.setEmploymentFlag(UserEmploymentFlagEnum.ON.getCode()); + + createCurrentCorpRecord(userE, userAddCmd.getCorpinfoName(), userAddCmd.getDepartmentName()); + return userId; + } + + /** + * 使用原用户基础信息和变更记录中的 after 信息组装新企业入职命令。 + */ + private UserAddCmd buildCrossCorpUserAddCmd(UserDO oldUserDO, UserChangeRecordDO userChangeRecordDO) { + UserAddCmd userAddCmd = new UserAddCmd(); + BeanUtils.copyProperties(oldUserDO, userAddCmd); + userAddCmd.setUserId(oldUserDO.getUserId()); + userAddCmd.setUsername(oldUserDO.getUsername()); + userAddCmd.setPhone(oldUserDO.getPhone()); + userAddCmd.setName(oldUserDO.getName()); + userAddCmd.setCorpinfoId(userChangeRecordDO.getCorpinfoIdAfter()); + userAddCmd.setCorpinfoName(userChangeRecordDO.getCorpinfoNameAfter()); + userAddCmd.setDepartmentId(userChangeRecordDO.getDepartmentIdAfter()); + userAddCmd.setDepartmentName(userChangeRecordDO.getDepartmentNameAfter()); + userAddCmd.setPostId(userChangeRecordDO.getPostIdAfter()); + userAddCmd.setPostName(userChangeRecordDO.getPostNameAfter()); + return userAddCmd; + } + + /** + * 创建新企业当前任职记录。 + */ + private void createCurrentCorpRecord(UserE userE, String corpinfoName, String departmentName) { + UserCorpRecordDO userCorpRecordDO = userCorpRecordRepository.getInfoByUserId( + userE.getId(), userE.getCorpinfoId(), UserEmploymentFlagEnum.ON.getCode()); + if (userCorpRecordDO != null) { + return; + } + + UserCorpRecordE userCorpRecordE = new UserCorpRecordE(); + userCorpRecordE.setUserId(userE.getId()); + userCorpRecordE.setCorpinfoId(userE.getCorpinfoId()); + userCorpRecordE.setCorpinfoName(corpinfoName); + userCorpRecordE.setDepartmentId(userE.getDepartmentId()); + userCorpRecordE.setDepartmentName(departmentName); + userCorpRecordE.setPostId(userE.getPostId()); + userCorpRecordE.setPostName(userE.getPostName()); + userCorpRecordE.setFlowFlag(userE.getFlowFlag()); + userCorpRecordE.initAdd(userE, corpinfoName, departmentName); + userCorpRecordGateway.add(userCorpRecordE); + } +} diff --git a/web-app/src/main/java/com/zcloud/basic/info/command/query/UserChangeRecordQueryExe.java b/web-app/src/main/java/com/zcloud/basic/info/command/query/UserChangeRecordQueryExe.java index 3d543d40..7bdb52f5 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/command/query/UserChangeRecordQueryExe.java +++ b/web-app/src/main/java/com/zcloud/basic/info/command/query/UserChangeRecordQueryExe.java @@ -2,6 +2,8 @@ package com.zcloud.basic.info.command.query; import cn.hutool.core.collection.CollUtil; import com.alibaba.cola.dto.MultiResponse; +import com.alibaba.cola.dto.PageResponse; +import com.alibaba.cola.dto.SingleResponse; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.jjb.saas.framework.auth.utils.AuthContext; import com.zcloud.basic.info.command.convertor.UserChangeRecordCoConvertor; @@ -10,21 +12,23 @@ import com.zcloud.basic.info.domain.enums.UserChangeRecordStatusEnum; import com.zcloud.basic.info.dto.UserChangeRecordInfoQry; import com.zcloud.basic.info.dto.UserChangeRecordPageQry; import com.zcloud.basic.info.dto.UserChangeRecordListQry; +import com.zcloud.basic.info.dto.UserCorpInfoPageQry; import com.zcloud.basic.info.dto.clientobject.UserChangeRecordCO; +import com.zcloud.basic.info.dto.clientobject.UserCorpInfoStatCO; import com.zcloud.basic.info.persistence.dataobject.UserChangeRecordDO; +import com.zcloud.basic.info.persistence.dataobject.UserCorpInfoStatDO; import com.zcloud.basic.info.persistence.dataobject.UserJobHandoverDO; +import com.zcloud.basic.info.persistence.repository.CorpInfoRepository; import com.zcloud.basic.info.persistence.repository.UserChangeRecordRepository; import com.zcloud.basic.info.persistence.repository.UserJobHandoverRepository; import com.zcloud.gbscommon.utils.PageQueryHelper; -import com.alibaba.cola.dto.PageResponse; -import com.alibaba.cola.dto.SingleResponse; import lombok.AllArgsConstructor; -import org.apache.catalina.User; import org.springframework.stereotype.Component; import org.springframework.beans.BeanUtils; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** @@ -40,6 +44,28 @@ public class UserChangeRecordQueryExe { private final UserChangeRecordCoConvertor userChangeRecordCoConvertor; private final UserJobHandoverRepository userJobHandoverRepository; private final UserJobHandoverCoConvertor userJobHandoverCoConvertor; + private final CorpInfoRepository corpInfoRepository; + + /** + * 企业用户统计分页。 + * 直接走专用 Repository 聚合查询,部门数、岗位数、人员总数、人资数都在 SQL 中完成统计。 + * 以企业为主表进行分页,因此即使企业下暂时没有用户,也会正常返回并统计为 0。 + * + * @param qry 企业用户统计查询 + * @return 企业用户统计分页结果 + */ + public PageResponse userCorpInfoList(UserCorpInfoPageQry qry) { + Map params = PageQueryHelper.toHashMap(qry); + params.put("typeList", java.util.Arrays.asList(0, 1, 2, 6)); + params.put("eqUseFlag", 1); + PageResponse pageResponse = corpInfoRepository.userCorpInfoListPage(params); + List result = pageResponse.getData().stream().map(statDO -> { + UserCorpInfoStatCO co = new UserCorpInfoStatCO(); + BeanUtils.copyProperties(statDO, co); + return co; + }).collect(Collectors.toList()); + return PageResponse.of(result, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex()); + } /** * 分页 @@ -68,12 +94,20 @@ public class UserChangeRecordQueryExe { } public UserChangeRecordCO getChangerRecordInfoById(UserChangeRecordInfoQry userChangeRecordInfoQry) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - if(userChangeRecordInfoQry.getCorpinfoId() == null){ - userChangeRecordInfoQry.setCorpinfoId(AuthContext.getTenantId()); + + if(userChangeRecordInfoQry.getUserChangeRecordId() == null){ + if(userChangeRecordInfoQry.getUserId() == null){ + throw new RuntimeException("请选择用户"); + } + //查找最新的变更记录信息 + String lastestChangeRecordId = userChangeRecordRepository.getLastestChangeRecordId(userChangeRecordInfoQry.getUserId()); + if(lastestChangeRecordId == null){ + return null; + } + userChangeRecordInfoQry.setUserChangeRecordId(lastestChangeRecordId); } - UserChangeRecordDO userChangeRecordDO =userChangeRecordRepository.getChangerRecordInfoById(userChangeRecordInfoQry.getUserId(), userChangeRecordInfoQry.getCorpinfoId(),UserChangeRecordStatusEnum.PENDING.getCode()); + UserChangeRecordDO userChangeRecordDO =userChangeRecordRepository.getChangerRecordInfoById(userChangeRecordInfoQry.getUserChangeRecordId()); if(userChangeRecordDO == null){ @@ -84,8 +118,9 @@ public class UserChangeRecordQueryExe { //组装未完成的工作 List userJobHandoverDOList = userJobHandoverRepository.getListByChangerRecordId(co.getUserChangeRecordId()); - if(CollUtil.isNotEmpty(userJobHandoverDOList)) - co.setUserJobHandoverCOList(userJobHandoverCoConvertor.converDOsToCOs(userJobHandoverDOList)); + if(CollUtil.isNotEmpty(userJobHandoverDOList)){ + co.setUserJobHandoverCOList(userJobHandoverCoConvertor.converDOsToCOs(userJobHandoverDOList)); + } return co; diff --git a/web-app/src/main/java/com/zcloud/basic/info/command/query/UserCorpRecordQueryExe.java b/web-app/src/main/java/com/zcloud/basic/info/command/query/UserCorpRecordQueryExe.java index 00e338d5..437ab0c5 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/command/query/UserCorpRecordQueryExe.java +++ b/web-app/src/main/java/com/zcloud/basic/info/command/query/UserCorpRecordQueryExe.java @@ -7,6 +7,7 @@ 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.UserCorpRecordInfoQry; import com.zcloud.basic.info.dto.UserCorpRecordPageQry; import com.zcloud.basic.info.dto.clientobject.UserCO; import com.zcloud.basic.info.dto.clientobject.UserCorpRecordCO; @@ -86,7 +87,7 @@ public class UserCorpRecordQueryExe { return userCO; } - public UserCorpRecordCO getChangerRecordInfoById(UserChangeRecordInfoQry userChangeRecordInfoQry) { + public UserCorpRecordCO getChangerRecordInfoById(UserCorpRecordInfoQry userChangeRecordInfoQry) { if(userChangeRecordInfoQry.getCorpinfoId() == null){ userChangeRecordInfoQry.setCorpinfoId(AuthContext.getTenantId()); } diff --git a/web-app/src/main/java/com/zcloud/basic/info/service/UserChangeRecordServiceImpl.java b/web-app/src/main/java/com/zcloud/basic/info/service/UserChangeRecordServiceImpl.java index 5d5a5e8a..cc31b373 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/service/UserChangeRecordServiceImpl.java +++ b/web-app/src/main/java/com/zcloud/basic/info/service/UserChangeRecordServiceImpl.java @@ -1,32 +1,44 @@ package com.zcloud.basic.info.service; import com.alibaba.cola.dto.MultiResponse; +import com.alibaba.cola.dto.PageResponse; +import com.alibaba.cola.dto.SingleResponse; import com.zcloud.basic.info.api.UserChangeRecordServiceI; import com.zcloud.basic.info.command.UserChangeRecordAddExe; import com.zcloud.basic.info.command.UserChangeRecordRemoveExe; import com.zcloud.basic.info.command.UserChangeRecordUpdateExe; +import com.zcloud.basic.info.command.UserChangeRecordWorkChangeExe; import com.zcloud.basic.info.command.query.UserChangeRecordQueryExe; -import com.zcloud.basic.info.dto.*; - -import com.alibaba.cola.dto.PageResponse; -import com.alibaba.cola.dto.SingleResponse; +import com.zcloud.basic.info.dto.UserChangeRecordAddCmd; +import com.zcloud.basic.info.dto.UserChangeRecordInfoQry; +import com.zcloud.basic.info.dto.UserChangeRecordListQry; +import com.zcloud.basic.info.dto.UserChangeRecordPageQry; +import com.zcloud.basic.info.dto.UserChangeRecordUpdateCmd; +import com.zcloud.basic.info.dto.UserCorpInfoPageQry; +import com.zcloud.basic.info.dto.WorkChangeUpdateCmd; import com.zcloud.basic.info.dto.clientobject.UserChangeRecordCO; +import com.zcloud.basic.info.dto.clientobject.UserCorpInfoStatCO; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** - * web-app - * - * @Author SondonYong - * @Date 2025-12-02 14:08:19 + * 用户变更记录服务实现。 */ @Service @AllArgsConstructor +@Slf4j public class UserChangeRecordServiceImpl implements UserChangeRecordServiceI { private final UserChangeRecordAddExe userChangeRecordAddExe; private final UserChangeRecordUpdateExe userChangeRecordUpdateExe; private final UserChangeRecordRemoveExe userChangeRecordRemoveExe; private final UserChangeRecordQueryExe userChangeRecordQueryExe; + private final UserChangeRecordWorkChangeExe userChangeRecordWorkChangeExe; + + @Override + public PageResponse userCorpInfoList(UserCorpInfoPageQry qry) { + return userChangeRecordQueryExe.userCorpInfoList(qry); + } @Override public PageResponse listPage(UserChangeRecordPageQry qry) { @@ -44,7 +56,7 @@ public class UserChangeRecordServiceImpl implements UserChangeRecordServiceI { } @Override - public SingleResponse add(UserChangeRecordAddCmd cmd) { + public SingleResponse add(UserChangeRecordAddCmd cmd) { userChangeRecordAddExe.execute(cmd); return SingleResponse.buildSuccess(); } @@ -68,5 +80,17 @@ public class UserChangeRecordServiceImpl implements UserChangeRecordServiceI { public UserChangeRecordCO getChangerRecordInfoById(UserChangeRecordInfoQry userChangeRecordInfoQry) { return userChangeRecordQueryExe.getChangerRecordInfoById(userChangeRecordInfoQry); } -} + /** + * 工作交接服务入口。 + * 这里只负责记录调用日志并委托给专门执行器,避免控制器和执行逻辑耦合。 + */ + @Override + public void workChangeHandle(WorkChangeUpdateCmd workChangeUpdateCmd) { + log.info("收到工作交接处理请求,交接记录id:{}, 交接人id:{}, 交接企业id:{}", + workChangeUpdateCmd.getId(), + workChangeUpdateCmd.getHandoverUserId(), + workChangeUpdateCmd.getHandoverCompanyId()); + userChangeRecordWorkChangeExe.workChangeHandle(workChangeUpdateCmd); + } +} diff --git a/web-app/src/main/java/com/zcloud/basic/info/service/UserCorpRecordServiceImpl.java b/web-app/src/main/java/com/zcloud/basic/info/service/UserCorpRecordServiceImpl.java index 2f13a66c..011f27e8 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/service/UserCorpRecordServiceImpl.java +++ b/web-app/src/main/java/com/zcloud/basic/info/service/UserCorpRecordServiceImpl.java @@ -7,10 +7,7 @@ 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.*; import com.zcloud.basic.info.dto.clientobject.UserCO; import com.zcloud.basic.info.dto.clientobject.UserChangeRecordCO; import com.zcloud.basic.info.dto.clientobject.UserCorpRecordCO; @@ -66,8 +63,8 @@ public class UserCorpRecordServiceImpl implements UserCorpRecordServiceI { } @Override - public UserCorpRecordCO getChangerRecordInfoById(UserChangeRecordInfoQry userChangeRecordInfoQry) { - return userCorpRecordQueryExe.getChangerRecordInfoById(userChangeRecordInfoQry); + public UserCorpRecordCO getChangerRecordInfoById(UserCorpRecordInfoQry userCorpRecordInfoQry) { + return userCorpRecordQueryExe.getChangerRecordInfoById(userCorpRecordInfoQry); } } diff --git a/web-app/src/main/java/com/zcloud/basic/info/service/UserServiceImpl.java b/web-app/src/main/java/com/zcloud/basic/info/service/UserServiceImpl.java index 99841c69..47806a22 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/service/UserServiceImpl.java +++ b/web-app/src/main/java/com/zcloud/basic/info/service/UserServiceImpl.java @@ -5,10 +5,7 @@ import com.alibaba.cola.dto.PageResponse; import com.alibaba.cola.dto.Response; import com.alibaba.cola.dto.SingleResponse; import com.zcloud.basic.info.api.UserServiceI; -import com.zcloud.basic.info.command.UserAddExe; -import com.zcloud.basic.info.command.UserImportExe; -import com.zcloud.basic.info.command.UserRemoveExe; -import com.zcloud.basic.info.command.UserUpdateExe; +import com.zcloud.basic.info.command.*; import com.zcloud.basic.info.command.query.UserQueryExe; import com.zcloud.basic.info.dto.*; import com.zcloud.basic.info.dto.clientobject.*; @@ -36,7 +33,7 @@ public class UserServiceImpl implements UserServiceI { private final UserRemoveExe userRemoveExe; private final UserQueryExe userQueryExe; private final UserImportExe userImportExe; - + private final HumanUserUpdateExe humanUserUpdateExe; @Override public PageResponse listPage(UserPageQry qry) { @@ -271,5 +268,10 @@ public class UserServiceImpl implements UserServiceI { Long userId = userAddExe.executeHumanUser(cmd); return SingleResponse.of(userId); } + + @Override + public SingleResponse updateHumanUser(UserUpdateCmd userUpdateCmd) { + return humanUserUpdateExe.updateHumanUser(userUpdateCmd); + } } diff --git a/web-client/src/main/java/com/zcloud/basic/info/api/UserChangeRecordServiceI.java b/web-client/src/main/java/com/zcloud/basic/info/api/UserChangeRecordServiceI.java index bdb4392c..76c0ab4d 100644 --- a/web-client/src/main/java/com/zcloud/basic/info/api/UserChangeRecordServiceI.java +++ b/web-client/src/main/java/com/zcloud/basic/info/api/UserChangeRecordServiceI.java @@ -1,19 +1,24 @@ package com.zcloud.basic.info.api; import com.alibaba.cola.dto.MultiResponse; -import com.zcloud.basic.info.dto.*; - import com.alibaba.cola.dto.PageResponse; import com.alibaba.cola.dto.SingleResponse; +import com.zcloud.basic.info.dto.UserChangeRecordAddCmd; +import com.zcloud.basic.info.dto.UserChangeRecordInfoQry; +import com.zcloud.basic.info.dto.UserChangeRecordListQry; +import com.zcloud.basic.info.dto.UserChangeRecordPageQry; +import com.zcloud.basic.info.dto.UserChangeRecordUpdateCmd; +import com.zcloud.basic.info.dto.UserCorpInfoPageQry; +import com.zcloud.basic.info.dto.WorkChangeUpdateCmd; import com.zcloud.basic.info.dto.clientobject.UserChangeRecordCO; +import com.zcloud.basic.info.dto.clientobject.UserCorpInfoStatCO; /** - * web-client - * - * @Author SondonYong - * @Date 2025-12-02 14:08:19 + * 用户变更记录服务接口。 */ public interface UserChangeRecordServiceI { + PageResponse userCorpInfoList(UserCorpInfoPageQry qry); + PageResponse listPage(UserChangeRecordPageQry qry); MultiResponse list(UserChangeRecordListQry qry); @@ -29,5 +34,9 @@ public interface UserChangeRecordServiceI { void removeBatch(Long[] ids); UserChangeRecordCO getChangerRecordInfoById(UserChangeRecordInfoQry userChangeRecordInfoQry); -} + /** + * 处理用户变更工作交接。 + */ + void workChangeHandle(WorkChangeUpdateCmd workChangeUpdateCmd); +} diff --git a/web-client/src/main/java/com/zcloud/basic/info/api/UserCorpRecordServiceI.java b/web-client/src/main/java/com/zcloud/basic/info/api/UserCorpRecordServiceI.java index d3e06685..0dee4b69 100644 --- a/web-client/src/main/java/com/zcloud/basic/info/api/UserCorpRecordServiceI.java +++ b/web-client/src/main/java/com/zcloud/basic/info/api/UserCorpRecordServiceI.java @@ -2,10 +2,7 @@ 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.*; import com.zcloud.basic.info.dto.clientobject.UserCO; import com.zcloud.basic.info.dto.clientobject.UserChangeRecordCO; import com.zcloud.basic.info.dto.clientobject.UserCorpRecordCO; @@ -29,6 +26,6 @@ public interface UserCorpRecordServiceI { UserCO getInfoById(Long id); - UserCorpRecordCO getChangerRecordInfoById(UserChangeRecordInfoQry userChangeRecordInfoQry); + UserCorpRecordCO getChangerRecordInfoById(UserCorpRecordInfoQry userCorpRecordInfoQry); } diff --git a/web-client/src/main/java/com/zcloud/basic/info/api/UserServiceI.java b/web-client/src/main/java/com/zcloud/basic/info/api/UserServiceI.java index 17833a57..5b2d5a0c 100644 --- a/web-client/src/main/java/com/zcloud/basic/info/api/UserServiceI.java +++ b/web-client/src/main/java/com/zcloud/basic/info/api/UserServiceI.java @@ -104,5 +104,7 @@ public interface UserServiceI { List listBase64ByUrl(Map map); SingleResponse addHumanUser(UserAddCmd cmd); + + SingleResponse updateHumanUser(UserUpdateCmd userUpdateCmd); } diff --git a/web-client/src/main/java/com/zcloud/basic/info/dto/UserAddCmd.java b/web-client/src/main/java/com/zcloud/basic/info/dto/UserAddCmd.java index 13a25bcf..f74e7f15 100644 --- a/web-client/src/main/java/com/zcloud/basic/info/dto/UserAddCmd.java +++ b/web-client/src/main/java/com/zcloud/basic/info/dto/UserAddCmd.java @@ -159,5 +159,7 @@ public class UserAddCmd extends Command { @ApiModelProperty(value = "是否缴纳其他人身伤害保险") private Integer isBf; + private Integer rzFlag; + } diff --git a/web-client/src/main/java/com/zcloud/basic/info/dto/UserChangeRecordInfoQry.java b/web-client/src/main/java/com/zcloud/basic/info/dto/UserChangeRecordInfoQry.java index fada479e..037181c6 100644 --- a/web-client/src/main/java/com/zcloud/basic/info/dto/UserChangeRecordInfoQry.java +++ b/web-client/src/main/java/com/zcloud/basic/info/dto/UserChangeRecordInfoQry.java @@ -26,10 +26,11 @@ public class UserChangeRecordInfoQry implements Serializable { * - `le`: 小于等于比较查询 * - `ne`: 不等比较查询,对应SQL的!=操作符 */ - @ApiModelProperty(value = "企业ID") - private Long corpinfoId; +// @ApiModelProperty(value = "企业ID") +// private Long corpinfoId; @ApiModelProperty(value = "用户ID") private Long userId; - + @ApiModelProperty(value = "变更记录id") + private String userChangeRecordId; } diff --git a/web-client/src/main/java/com/zcloud/basic/info/dto/UserChangeRecordPageQry.java b/web-client/src/main/java/com/zcloud/basic/info/dto/UserChangeRecordPageQry.java index 3d4e8a4a..34e345af 100644 --- a/web-client/src/main/java/com/zcloud/basic/info/dto/UserChangeRecordPageQry.java +++ b/web-client/src/main/java/com/zcloud/basic/info/dto/UserChangeRecordPageQry.java @@ -1,8 +1,11 @@ package com.zcloud.basic.info.dto; import com.alibaba.cola.dto.PageQuery; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotNull; + /** * web-client @@ -24,5 +27,8 @@ public class UserChangeRecordPageQry extends PageQuery { * - `ne`: 不等比较查询,对应SQL的!=操作符 */ private String likeUserChangeRecordId; + @ApiModelProperty(value = "用户id", name = "eqUserId", required = true) + @NotNull(message = "用户id不能为空") + private Long eqUserId; } diff --git a/web-client/src/main/java/com/zcloud/basic/info/dto/UserCorpInfoPageQry.java b/web-client/src/main/java/com/zcloud/basic/info/dto/UserCorpInfoPageQry.java new file mode 100644 index 00000000..2a559cc2 --- /dev/null +++ b/web-client/src/main/java/com/zcloud/basic/info/dto/UserCorpInfoPageQry.java @@ -0,0 +1,17 @@ +package com.zcloud.basic.info.dto; + +import com.alibaba.cola.dto.PageQuery; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 企业用户统计分页查询。 + */ +@Data +public class UserCorpInfoPageQry extends PageQuery { + @ApiModelProperty(value = "企业名称") + private String likeCorpName; + + @ApiModelProperty(value = "菜单路径") + private String menuPath; +} diff --git a/web-client/src/main/java/com/zcloud/basic/info/dto/UserCorpRecordInfoQry.java b/web-client/src/main/java/com/zcloud/basic/info/dto/UserCorpRecordInfoQry.java new file mode 100644 index 00000000..ae91f9ee --- /dev/null +++ b/web-client/src/main/java/com/zcloud/basic/info/dto/UserCorpRecordInfoQry.java @@ -0,0 +1,33 @@ +package com.zcloud.basic.info.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + + +/** + * web-client + * + * @Author zhangyue + * @Date 2025-11-04 14:07:36 + */ +@Data +public class UserCorpRecordInfoQry implements Serializable { + + /** + * 查询条件操作前缀,支持以下几种数据库查询操作: + * - `like`: 模糊匹配查询,对应SQL的LIKE操作符 + * - `eq`: 等值查询,对应SQL的=操作符 + * - `gt`: 大于比较查询 + * - `lt`: 小于比较查询 + * - `ge`: 大于等于比较查询 + * - `le`: 小于等于比较查询 + * - `ne`: 不等比较查询,对应SQL的!=操作符 + */ + @ApiModelProperty(value = "企业ID") + private Long corpinfoId; + @ApiModelProperty(value = "用户ID") + private Long userId; +} + diff --git a/web-client/src/main/java/com/zcloud/basic/info/dto/UserUpdateCmd.java b/web-client/src/main/java/com/zcloud/basic/info/dto/UserUpdateCmd.java index 6f87ced2..3ce256f5 100644 --- a/web-client/src/main/java/com/zcloud/basic/info/dto/UserUpdateCmd.java +++ b/web-client/src/main/java/com/zcloud/basic/info/dto/UserUpdateCmd.java @@ -35,12 +35,14 @@ public class UserUpdateCmd extends Command { private String name; @ApiModelProperty(value = "企业id", name = "corpinfoId") private Long corpinfoId; + private String corpinfoName; @ApiModelProperty(value = "是否主账号1是0否", name = "mainCorpFlag") private Integer mainCorpFlag; @ApiModelProperty(value = "用户类型,1监管2企业3相关方", name = "userType") private Integer userType; @ApiModelProperty(value = "部门id", name = "departmentId") private Long departmentId; + private String departmentName; @ApiModelProperty(value = "岗位id", name = "postId") private Long postId; @ApiModelProperty(value = "岗位名称", name = "postName") @@ -94,9 +96,12 @@ public class UserUpdateCmd extends Command { // 入职状态 @ApiModelProperty(value = "是否流动人员,1-流动,0-固定人员") private Integer flowFlag; + private Integer rzFlag; // 微信openid @ApiModelProperty(value = "微信openid") private String openId; + @ApiModelProperty(value = "入职状态,0-离职, 1-在职, 2-信息变更中, 3-未入职, 4-实习生, 5-实习结束, 6-退休, 7-劳务派遣, 8-劳务派遣结束, 11-入职待审核, 10-离职待审核") + private Integer employmentFlag; @ApiModelProperty(value = "是否特殊工种") private Integer isSpecialJob; diff --git a/web-client/src/main/java/com/zcloud/basic/info/dto/WorkChangeUpdateCmd.java b/web-client/src/main/java/com/zcloud/basic/info/dto/WorkChangeUpdateCmd.java new file mode 100644 index 00000000..96cf0905 --- /dev/null +++ b/web-client/src/main/java/com/zcloud/basic/info/dto/WorkChangeUpdateCmd.java @@ -0,0 +1,47 @@ +package com.zcloud.basic.info.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NonNull; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + + +@Data +public class WorkChangeUpdateCmd implements Serializable { + + @ApiModelProperty(value = "工作交接记录id") + @NotNull(message = "工作交接记录id不能为空") + private Long id; + + //交接人企业id + @ApiModelProperty(value = "交接人企业id") + @NotNull(message = "交接人企业不能为空") + private Long handoverCompanyId; + //交接人公司名称 + @ApiModelProperty(value = "交接人公司名称") + private String handoverCompanyName; + //交接人部门id + @ApiModelProperty(value = "交接人部门id") + @NotNull(message = "交接人部门不能为空") + private Long handoverDepartmentId; + //交接人部门名称 + @ApiModelProperty(value = "交接人部门名称") + private String handoverDepartmentName; + //交接人岗位id + @ApiModelProperty(value = "交接人岗位id") + private Long handoverPostId; + //交接人岗位名称 + @ApiModelProperty(value = "交接人岗位名称") + private String handoverPostName; + //交接人id + @ApiModelProperty(value = "交接人id") + @NotNull(message = "交接人不能为空") + private Long handoverUserId; + //交接人名称 + @ApiModelProperty(value = "交接人名称") + private String handoverUserName; + +} + diff --git a/web-client/src/main/java/com/zcloud/basic/info/dto/clientobject/UserCorpInfoStatCO.java b/web-client/src/main/java/com/zcloud/basic/info/dto/clientobject/UserCorpInfoStatCO.java new file mode 100644 index 00000000..dcec0ee6 --- /dev/null +++ b/web-client/src/main/java/com/zcloud/basic/info/dto/clientobject/UserCorpInfoStatCO.java @@ -0,0 +1,32 @@ +package com.zcloud.basic.info.dto.clientobject; + +import com.alibaba.cola.dto.ClientObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 企业用户统计结果。 + */ +@Data +public class UserCorpInfoStatCO extends ClientObject { + @ApiModelProperty(value = "企业id") + private Long id; + + @ApiModelProperty(value = "企业名称") + private String corpName; + + @ApiModelProperty(value = "公司类型") + private Integer type; + + @ApiModelProperty(value = "部门数") + private Long departmentCount; + + @ApiModelProperty(value = "岗位数") + private Long postCount; + + @ApiModelProperty(value = "人员总数") + private Long userCount; + + @ApiModelProperty(value = "人资数") + private Long rzUserCount; +} diff --git a/web-domain/src/main/java/com/zcloud/basic/info/domain/enums/UserJobHandoverWorkTypeEnum.java b/web-domain/src/main/java/com/zcloud/basic/info/domain/enums/UserJobHandoverWorkTypeEnum.java index 612186f1..c0c1194f 100644 --- a/web-domain/src/main/java/com/zcloud/basic/info/domain/enums/UserJobHandoverWorkTypeEnum.java +++ b/web-domain/src/main/java/com/zcloud/basic/info/domain/enums/UserJobHandoverWorkTypeEnum.java @@ -3,18 +3,35 @@ package com.zcloud.basic.info.domain.enums; import lombok.Getter; /** - * 工作类型,1:隐患信息 + * 工作交接类型枚举。 */ @Getter public enum UserJobHandoverWorkTypeEnum { /** - * 工作类型,1:隐患信息 + * 隐患信息。 */ - HIDDENINFO(1,"隐患信息"), - RISK(2,"风险辨识检查"), + HIDDENINFO(1, "隐患信息"), + /** + * 风险辨识检查。 + */ + RISK(2, "风险辨识检查"), + /** + * 危险作业。 + */ + EIGHTWORK(3, "危险作业"), + /** + * 消防检查。 + */ + FIRECHECK(4, "消防检查"), + /** + * 相关方项目审核。 + */ + PROJECT_APPROVAL(5, "相关方项目审核"), + /** + * 安全环保检查。 + */ + INSPECTION_WORK(6, "安全环保检查"); - -; private final Integer code; private final String name; @@ -22,11 +39,17 @@ public enum UserJobHandoverWorkTypeEnum { this.code = code; this.name = name; } - //根据code获取枚举 + + /** + * 根据编码获取工作交接类型枚举。 + * + * @param code 类型编码 + * @return 对应枚举,未匹配到时返回 null + */ public static UserJobHandoverWorkTypeEnum getByCode(Integer code) { - for (UserJobHandoverWorkTypeEnum e : values()) { - if (e.getCode().equals(code)) { - return e; + for (UserJobHandoverWorkTypeEnum item : values()) { + if (item.getCode().equals(code)) { + return item; } } return null; diff --git a/web-domain/src/main/java/com/zcloud/basic/info/domain/model/UserChangeRecordE.java b/web-domain/src/main/java/com/zcloud/basic/info/domain/model/UserChangeRecordE.java index f31f1249..174ffd59 100644 --- a/web-domain/src/main/java/com/zcloud/basic/info/domain/model/UserChangeRecordE.java +++ b/web-domain/src/main/java/com/zcloud/basic/info/domain/model/UserChangeRecordE.java @@ -181,5 +181,29 @@ public class UserChangeRecordE extends BaseE { this.setUserStatusAfter(employmentFlagAfter); this.setStatus(status); } + /** + * 离职相关 + * @param userE + */ + public void executeHumanResignation(UserE userE,UserE oldUserE) { + this.setUserId(userE.getId()); + this.setChangeTime(new Date()); + this.setCorpinfoIdBefore(userE.getCorpinfoId()); + this.setCorpinfoNameBefore(userE.getCorpinfoName()); + this.setDepartmentIdBefore(userE.getDepartmentId()); + this.setDepartmentNameBefore(userE.getDepartmentName()); + this.setPostIdBefore(userE.getPostId()); + this.setPostNameBefore(userE.getPostName()); + this.setUserStatusBefore(oldUserE.getEmploymentFlag()); + this.setCorpinfoIdAfter(oldUserE.getCorpinfoId()); + this.setCorpinfoNameAfter(oldUserE.getCorpinfoName()); + this.setDepartmentIdAfter(oldUserE.getDepartmentId()); + this.setDepartmentNameAfter(oldUserE.getDepartmentName()); + this.setPostIdAfter(oldUserE.getPostId()); + this.setPostNameAfter(oldUserE.getPostName()); + this.setUserStatusAfter(userE.getEmploymentFlag()); + this.setStatus(1); + } + } diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/dataobject/UserCorpInfoStatDO.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/dataobject/UserCorpInfoStatDO.java new file mode 100644 index 00000000..5e4d6f0a --- /dev/null +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/dataobject/UserCorpInfoStatDO.java @@ -0,0 +1,33 @@ +package com.zcloud.basic.info.persistence.dataobject; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 企业用户统计数据对象。 + */ +@Data +public class UserCorpInfoStatDO implements Serializable { + @ApiModelProperty(value = "企业id") + private Long id; + + @ApiModelProperty(value = "企业名称") + private String corpName; + + @ApiModelProperty(value = "公司类型") + private Integer type; + + @ApiModelProperty(value = "部门数") + private Long departmentCount; + + @ApiModelProperty(value = "岗位数") + private Long postCount; + + @ApiModelProperty(value = "人员总数") + private Long userCount; + + @ApiModelProperty(value = "人资数") + private Long rzUserCount; +} diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/CorpInfoMapper.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/CorpInfoMapper.java index a7cf5274..7a2449e4 100644 --- a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/CorpInfoMapper.java +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/CorpInfoMapper.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.jjb.saas.framework.datascope.annotation.DataScope; import com.jjb.saas.framework.datascope.annotation.DataScopes; import com.zcloud.basic.info.persistence.dataobject.CorpInfoDO; +import com.zcloud.basic.info.persistence.dataobject.UserCorpInfoStatDO; import com.zcloud.basic.info.persistence.dataobject.UserDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,11 +23,14 @@ import java.util.Map; @DataScopes({ @DataScope(method = "selectUserBasicPage", menuPerms = ""), @DataScope(method = "corpUserMiddlePage", menuPerms = ""), + @DataScope(method = "userCorpInfoListPage", menuPerms = ""), }) public interface CorpInfoMapper extends BaseMapper { IPage corpUserMiddlePage(IPage iPage, Map params, String menuPerms); + IPage userCorpInfoListPage(IPage iPage, Map params, String menuPerms); + IPage selectUserPage(IPage iPage, @Param("ew") QueryWrapper queryWrapper, String menuPerms); IPage selectUserBasicPage(IPage iPage, @Param("ew") QueryWrapper queryWrapper, String menuPerms); diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/UserChangeRecordMapper.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/UserChangeRecordMapper.java index 7e8a0742..bef34c77 100644 --- a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/UserChangeRecordMapper.java +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/UserChangeRecordMapper.java @@ -1,9 +1,12 @@ package com.zcloud.basic.info.persistence.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.zcloud.basic.info.persistence.dataobject.UserChangeRecordDO; import org.apache.ibatis.annotations.Mapper; +import java.util.Map; + /** * web-infrastructure * @@ -13,6 +16,8 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserChangeRecordMapper extends BaseMapper { - UserChangeRecordDO getChangerRecordInfoById(Long userId, Long corpinfoId, Integer status); + UserChangeRecordDO getChangerRecordInfoById(String userChangeRecordId); + + IPage selectUserChangeRecordPage(IPage iPage, Map params); } diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/UserMapper.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/UserMapper.java index 30ea6946..35407e2b 100644 --- a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/UserMapper.java +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/UserMapper.java @@ -53,5 +53,7 @@ public interface UserMapper extends BaseMapper { List listBase64ByUrl(@Param("params") Map params); + + void updateEmploymentFlagAndDeleteEnum(Long userId, Integer employmentFlag, String deleteEnum); } diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/CorpInfoRepository.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/CorpInfoRepository.java index 8c44998a..675f4d69 100644 --- a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/CorpInfoRepository.java +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/CorpInfoRepository.java @@ -3,6 +3,7 @@ package com.zcloud.basic.info.persistence.repository; import com.alibaba.cola.dto.PageResponse; import com.jjb.saas.framework.repository.repo.BaseRepository; import com.zcloud.basic.info.persistence.dataobject.CorpInfoDO; +import com.zcloud.basic.info.persistence.dataobject.UserCorpInfoStatDO; import java.util.List; import java.util.Map; @@ -35,6 +36,8 @@ public interface CorpInfoRepository extends BaseRepository { PageResponse corpUserMiddlePage(Map parmas); + PageResponse userCorpInfoListPage(Map params); + CorpInfoDO getCorpInfoByCorpName(String corpName); Boolean remove(Long id); diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/UserChangeRecordRepository.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/UserChangeRecordRepository.java index d6e968ba..4b6b9821 100644 --- a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/UserChangeRecordRepository.java +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/UserChangeRecordRepository.java @@ -23,6 +23,8 @@ public interface UserChangeRecordRepository extends BaseRepository getInfoById(Long id); - UserChangeRecordDO getChangerRecordInfoById(Long userId, Long corpinfoId, Integer status); + UserChangeRecordDO getChangerRecordInfoById(String userChangeRecordId); + + String getLastestChangeRecordId(Long userId); } diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/UserRepository.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/UserRepository.java index 2aa47ee2..72d7c950 100644 --- a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/UserRepository.java +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/UserRepository.java @@ -112,5 +112,9 @@ public interface UserRepository extends BaseRepository { List listBase64ByUrl(Map params); List getUserListByUserId(String foreignKey); + + List listUserByInfo(Map parmas); + + void updateEmploymentFlagAndDeleteEnum(Long id, Integer code, String aTrue); } diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/CorpInfoRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/CorpInfoRepositoryImpl.java index 20ef28cc..fb3b7495 100644 --- a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/CorpInfoRepositoryImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/CorpInfoRepositoryImpl.java @@ -25,6 +25,7 @@ import com.zcloud.basic.info.domain.enums.CorpTypeEnum; import com.zcloud.basic.info.domain.enums.CorpUseFlagEnum; import com.zcloud.basic.info.domain.enums.MenuEnum; import com.zcloud.basic.info.persistence.dataobject.CorpInfoDO; +import com.zcloud.basic.info.persistence.dataobject.UserCorpInfoStatDO; import com.zcloud.basic.info.persistence.mapper.CorpInfoMapper; import com.zcloud.basic.info.persistence.repository.CorpInfoRepository; import com.zcloud.basic.info.utils.Query; @@ -278,6 +279,17 @@ public class CorpInfoRepositoryImpl extends BaseRepositoryImpl userCorpInfoListPage(Map params) { + IPage iPage = new Query().getPage(params); + String menuPerms = ""; + if (!ObjectUtils.isEmpty(params.get("menuPath"))) { + menuPerms = MenuEnum.getMenuKeyByPath(params.get("menuPath").toString()); + } + IPage result = corpInfoMapper.userCorpInfoListPage(iPage, params, menuPerms); + return PageHelper.pageToResponse(result, result.getRecords()); + } + @Override public CorpInfoDO getCorpInfoByCorpName(String corpName) { QueryWrapper queryWrapper = new QueryWrapper<>(); diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/UserChangeRecordRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/UserChangeRecordRepositoryImpl.java index ac20a423..adb2f300 100644 --- a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/UserChangeRecordRepositoryImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/UserChangeRecordRepositoryImpl.java @@ -1,6 +1,7 @@ package com.zcloud.basic.info.persistence.repository.impl; import com.jjb.saas.framework.repository.common.PageHelper; +import com.zcloud.basic.info.domain.enums.UserChangeRecordStatusEnum; import com.zcloud.basic.info.persistence.dataobject.UserChangeRecordDO; import com.zcloud.basic.info.persistence.mapper.UserChangeRecordMapper; import com.zcloud.basic.info.persistence.repository.UserChangeRecordRepository; @@ -30,12 +31,15 @@ public class UserChangeRecordRepositoryImpl extends BaseRepositoryImpl listPage(Map params) { - IPage iPage = new Query().getPage(params); + /* IPage iPage = new Query().getPage(params); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper = PageQueryHelper.createPageQueryWrapper(queryWrapper, params); queryWrapper.orderByDesc("create_time"); - IPage result = userChangeRecordMapper.selectPage(iPage, queryWrapper); + IPage result = userChangeRecordMapper.selectPage(iPage, queryWrapper);*/ + IPage iPage = new Query().getPage(params); + IPage result = userChangeRecordMapper.selectUserChangeRecordPage(iPage, params); return PageHelper.pageToResponse(result, result.getRecords()); + } @Override @@ -53,8 +57,20 @@ public class UserChangeRecordRepositoryImpl extends BaseRepositoryImpl queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", userId); + queryWrapper.eq("status", UserChangeRecordStatusEnum.PENDING.getCode()); + queryWrapper.eq("delete_enum", "FALSE"); + queryWrapper.orderByDesc("create_time"); + queryWrapper.last("LIMIT 1"); + UserChangeRecordDO one = getOne(queryWrapper); + return one != null ? one.getUserChangeRecordId() : null; } } diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/UserRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/UserRepositoryImpl.java index 9aeba000..00c4a9e1 100644 --- a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/UserRepositoryImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/UserRepositoryImpl.java @@ -316,6 +316,7 @@ public class UserRepositoryImpl extends BaseRepositoryImpl i userAddCmd.setAccount(userDO.getUsername()); userAddCmd.setName(userDO.getName()); userAddCmd.setPassword(userDO.getPassword()); + userAddCmd.setTenantId(userDO.getCorpinfoId()); RoleDeptAddCmd roleDeptAddCmd = new RoleDeptAddCmd(); roleDeptAddCmd.setRoleId(userDO.getRoleId()); roleDeptAddCmd.setDeptId(userDO.getDepartmentId()); @@ -767,5 +768,21 @@ public class UserRepositoryImpl extends BaseRepositoryImpl i queryWrapperList.orderByAsc("create_time"); return list(queryWrapperList); } + + @Override + public List listUserByInfo(Map parmas) { + QueryWrapper queryWrapperList = new QueryWrapper<>(); + queryWrapperList.eq("phone", parmas.get("phone")); + queryWrapperList.eq("employment_flag",1); + queryWrapperList.eq("user_id_card", parmas.get("userIdCard")); + queryWrapperList.eq("delete_enum", "FALSE"); + queryWrapperList.orderByAsc("create_time"); + return list(queryWrapperList); + } + + @Override + public void updateEmploymentFlagAndDeleteEnum(Long userId, Integer employmentFlag, String deleteEnum) { + userMapper.updateEmploymentFlagAndDeleteEnum(userId, employmentFlag, deleteEnum); + } } diff --git a/web-infrastructure/src/main/resources/mapper/CorpInfoMapper.xml b/web-infrastructure/src/main/resources/mapper/CorpInfoMapper.xml index 78acb14b..e7e2c4b3 100644 --- a/web-infrastructure/src/main/resources/mapper/CorpInfoMapper.xml +++ b/web-infrastructure/src/main/resources/mapper/CorpInfoMapper.xml @@ -49,6 +49,53 @@ c.create_time DESC + + + diff --git a/web-infrastructure/src/main/resources/mapper/UserMapper.xml b/web-infrastructure/src/main/resources/mapper/UserMapper.xml index 679f35e5..8c2ab6e3 100644 --- a/web-infrastructure/src/main/resources/mapper/UserMapper.xml +++ b/web-infrastructure/src/main/resources/mapper/UserMapper.xml @@ -595,5 +595,11 @@ + + UPDATE user + SET employment_flag = #{employmentFlag}, + delete_enum = #{deleteEnum} + WHERE id = #{userId} +