From ae529ebcac36e59f83bbb11a8862f6f90eaa99b8 Mon Sep 17 00:00:00 2001 From: zhangxiongfeng Date: Tue, 4 Aug 2026 14:13:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E5=8D=8E=E5=8F=A3=E9=97=A8=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 65ad2b538e17143405490877880f2e62d3d596fb) # Conflicts: # web-app/src/main/java/com/zcloud/basic/info/command/UserAddExe.java # web-app/src/main/java/com/zcloud/basic/info/command/UserRemoveExe.java # web-app/src/main/java/com/zcloud/basic/info/command/UserUpdateExe.java --- .../zcloud/basic/info/command/UserAddExe.java | 77 +++++++++---------- .../basic/info/command/UserRemoveExe.java | 18 ++--- .../basic/info/command/UserUpdateExe.java | 26 +++---- 3 files changed, 59 insertions(+), 62 deletions(-) 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 f19ec61c..fb16133d 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 @@ -31,9 +31,9 @@ import com.zcloud.basic.info.domain.model.*; import com.zcloud.basic.info.dto.*; import com.zcloud.basic.info.persistence.dataobject.*; import com.zcloud.basic.info.persistence.repository.*; -import com.zcloud.gbscommon.utils.*; -import com.zcloud.gbscommon.dahua.facade.ZcloudDaHuaFacade; import com.zcloud.gbscommon.dahua.cmd.DaHuaPersonSyncCmd; +import com.zcloud.gbscommon.dahua.facade.ZcloudDaHuaFacade; +import com.zcloud.gbscommon.utils.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -188,7 +188,6 @@ public class UserAddExe { userE.setUserType(CorpTypeEnum.getUserTypeByCode(corpInfoDO.getType())); userE.resetPassword(corpInfoDO.getType()); - // ① 先本地落库 + 底座GBS新增。GBS失败抛 RuntimeException,整个事务回滚 res = userGateway.add(userE); if (corpInfoDO != null && !ObjectUtils.isEmpty(corpInfoDO.getCorpName())) { corpName = corpInfoDO.getCorpName(); @@ -204,7 +203,6 @@ public class UserAddExe { } catch (Exception e) { log.error("用户变更记录保存失败(不影响用户主体), userId: {}, error: {}", userE.getId(), e.getMessage(), e); } - // ② 本地和底座都成功后,最后才同步大华。失败→抛异常→回滚本地+GBS(避免留下"大华人成功但本地没数据") DaHuaSyncResult syncResult = syncDaHuaPerson(userE); if (syncResult.dahuaId != null || (syncResult.dahuaCode != null && !syncResult.dahuaCode.trim().isEmpty())) { try { @@ -450,7 +448,8 @@ public class UserAddExe { List bioList = (List) biosObj; cmd.setPersonBiosignatures(bioList); } - + log.info("Dubbo调用primeport.zcloudDaHuaFacade.syncPerson, name={}, departmentId(corpId)={}", + cmd.getName(), cmd.getDepartmentId()); SingleResponse syncResp = zcloudDaHuaFacade.syncPerson(cmd); String maskedIdCard = plainIdCard; if (plainIdCard != null && plainIdCard.length() >= 14) { @@ -990,51 +989,51 @@ public class UserAddExe { userExpandInfoRepository.updateByPhone(userE.getPhone(),userE.getFlowFlag()); } - // ========== 相关方用户同步大华(新增场景跳过,修改场景同步;重复信息返回false直接跳过不影响本地)========== - if (addFlag) { - log.info("相关方用户新增场景,跳过大华同步"); + // ========== 相关方用户同步大华(仅修改场景调大华,新增场景跳过)========== + Long xgfUserId = addFlag ? userE.getId() : userDOUpdate.getId(); + if (xgfUserId == null) { + log.warn("相关方用户保存后未获取到userId,跳过大华同步及dahua信息写回, addFlag={}", addFlag); } else { - Long xgfUserId = userDOUpdate.getId(); - if (xgfUserId == null) { - log.warn("相关方用户修改后未获取到userId,跳过大华同步及dahua信息写回"); - } else { + DaHuaSyncResult xgfSyncResult = null; + if (!addFlag) { Object xgfAvatarSource = cmd.getUserImg(); if (xgfAvatarSource == null) { xgfAvatarSource = cmd.getUserAvatarUrl(); } - DaHuaSyncResult xgfSyncResult = null; try { xgfSyncResult = syncDaHuaPerson(userE, xgfAvatarSource, false); } catch (Exception e) { - log.error("相关方用户同步大华异常(不影响本地保存,继续执行写回身份证号为dahuaCode), userId={}, error={}", - xgfUserId, e.getMessage(), e); + log.error("相关方用户同步大华异常(不影响本地保存,继续执行写回身份证号为dahuaCode), userId={}, addFlag={}, error={}", + xgfUserId, addFlag, e.getMessage(), e); } - Integer xgfDahuaId = xgfSyncResult != null ? xgfSyncResult.dahuaId : null; - String xgfDahuaCode = xgfSyncResult != null ? xgfSyncResult.dahuaCode : null; - if ((xgfDahuaCode == null || xgfDahuaCode.trim().isEmpty()) && userE.getUserIdCard() != null && !userE.getUserIdCard().trim().isEmpty()) { - String idCardRaw = userE.getUserIdCard().trim(); - try { - xgfDahuaCode = new String(java.util.Base64.getDecoder().decode(idCardRaw), java.nio.charset.StandardCharsets.UTF_8); - } catch (Exception e) { - xgfDahuaCode = idCardRaw; - } + } else { + log.info("相关方用户新增场景,跳过大华同步, userId={}", xgfUserId); + } + Integer xgfDahuaId = xgfSyncResult != null ? xgfSyncResult.dahuaId : null; + String xgfDahuaCode = xgfSyncResult != null ? xgfSyncResult.dahuaCode : null; + if ((xgfDahuaCode == null || xgfDahuaCode.trim().isEmpty()) && userE.getUserIdCard() != null && !userE.getUserIdCard().trim().isEmpty()) { + String idCardRaw = userE.getUserIdCard().trim(); + try { + xgfDahuaCode = new String(java.util.Base64.getDecoder().decode(idCardRaw), java.nio.charset.StandardCharsets.UTF_8); + } catch (Exception e) { + xgfDahuaCode = idCardRaw; } - if (xgfDahuaId != null || (xgfDahuaCode != null && !xgfDahuaCode.trim().isEmpty())) { - try { - UserE updateDahua = new UserE(); - updateDahua.setId(xgfUserId); - updateDahua.setDahuaId(xgfDahuaId); - updateDahua.setDahuaCode(xgfDahuaCode); - userRepository.updateDahuaInfo(updateDahua.getId(), updateDahua.getDahuaId(), updateDahua.getDahuaCode()); - log.info("相关方用户写回dahuaId/dahuaCode成功, userId={}, dahuaId={}, dahuaCode={}", - xgfUserId, xgfDahuaId, xgfDahuaCode); - } catch (Exception e) { - log.error("相关方用户写回dahuaId/dahuaCode失败, userId={}, dahuaId={}, dahuaCode={}", - xgfUserId, xgfDahuaId, xgfDahuaCode, e); - } - } else { - log.warn("相关方用户既无dahuaId也无dahuaCode可写回,跳过update, userId={}", xgfUserId); + } + if (xgfDahuaId != null || (xgfDahuaCode != null && !xgfDahuaCode.trim().isEmpty())) { + try { + UserE updateDahua = new UserE(); + updateDahua.setId(xgfUserId); + updateDahua.setDahuaId(xgfDahuaId); + updateDahua.setDahuaCode(xgfDahuaCode); + userRepository.updateDahuaInfo(updateDahua.getId(), updateDahua.getDahuaId(), updateDahua.getDahuaCode()); + log.info("相关方用户写回dahuaId/dahuaCode成功, userId={}, addFlag={}, dahuaId={}, dahuaCode={}", + xgfUserId, addFlag, xgfDahuaId, xgfDahuaCode); + } catch (Exception e) { + log.error("相关方用户写回dahuaId/dahuaCode失败, userId={}, addFlag={}, dahuaId={}, dahuaCode={}", + xgfUserId, addFlag, xgfDahuaId, xgfDahuaCode, e); } + } else { + log.warn("相关方用户既无dahuaId也无dahuaCode可写回,跳过update, userId={}, addFlag={}", xgfUserId, addFlag); } } // ========================================================================= diff --git a/web-app/src/main/java/com/zcloud/basic/info/command/UserRemoveExe.java b/web-app/src/main/java/com/zcloud/basic/info/command/UserRemoveExe.java index 9c18a4f4..7d11b445 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/command/UserRemoveExe.java +++ b/web-app/src/main/java/com/zcloud/basic/info/command/UserRemoveExe.java @@ -21,9 +21,9 @@ 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.basic.info.domain.config.DaHuaConfig; -import com.zcloud.gbscommon.utils.ZcloudRedisUtil; -import com.zcloud.gbscommon.dahua.facade.ZcloudDaHuaFacade; import com.zcloud.gbscommon.dahua.cmd.DaHuaPersonDeleteCmd; +import com.zcloud.gbscommon.dahua.facade.ZcloudDaHuaFacade; +import com.zcloud.gbscommon.utils.ZcloudRedisUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; @@ -52,7 +52,7 @@ public class UserRemoveExe { @DubboReference(check = false) private UserFacade userFacade; // @Autowired - private ZcloudRedisUtil zcloudRedisUtil; + private final ZcloudRedisUtil zcloudRedisUtil; private final UserCorpRecordRepository userCorpRecordRepository; private final DaHuaConfig daHuaConfig; @DubboReference @@ -81,16 +81,15 @@ public class UserRemoveExe { // ② 本地操作完成后再删大华。若大华失败 → throw BizException → 本地全部回滚 if (needDeleteDaHua) { if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) { - log.info("大华对接未开启(dockFlag={}), 跳过删除大华人员, userId={}", daHuaConfig.getDockFlag(), id); + log.info("【单个删除-大华删除跳过】dockFlag未开启, userId={}", id); } else { DaHuaPersonDeleteCmd delCmd = new DaHuaPersonDeleteCmd(); delCmd.setIds(Collections.singletonList(dahuaId.longValue())); - log.info("Dubbo调用zcloudDaHuaFacade.deletePerson, dahuaId={}", dahuaId); SingleResponse delResp = zcloudDaHuaFacade.deletePerson(delCmd); if (delResp == null || !delResp.isSuccess()) { String errCode = delResp == null ? "" : delResp.getErrCode(); String errMessage = delResp == null ? "大华Dubbo返回为空" : delResp.getErrMessage(); - if (errMessage == null || errMessage.trim().isEmpty()) errMessage = "删除大华人员失败"; + if (errMessage == null || errMessage.trim().isEmpty()) errMessage = "大华人员删除失败"; log.error("【单个删除-大华删除失败→触发本地回滚】userId={}, dahuaId={}, errCode={}, errMessage={}", id, dahuaId, errCode, errMessage); throw new BizException("删除大华平台人员失败:" + errMessage); @@ -219,16 +218,15 @@ public class UserRemoveExe { // ② 本地成功后再删大华。大华失败→throw→本地回滚 if (!dahuaIds.isEmpty()) { if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) { - log.info("大华对接未开启(dockFlag={}), 跳过批量删除大华人员, idList={}", daHuaConfig.getDockFlag(), idList); + log.info("【批量删除-大华删除跳过】dockFlag未开启, idList={}", idList); } else { DaHuaPersonDeleteCmd delCmd = new DaHuaPersonDeleteCmd(); - delCmd.setIds(dahuaIds.stream().map(Long::longValue).collect(Collectors.toList())); - log.info("Dubbo调用zcloudDaHuaFacade.deletePerson, dahuaIds={}", dahuaIds); + delCmd.setIds(dahuaIds.stream().map(Integer::longValue).collect(Collectors.toList())); SingleResponse delResp = zcloudDaHuaFacade.deletePerson(delCmd); if (delResp == null || !delResp.isSuccess()) { String errCode = delResp == null ? "" : delResp.getErrCode(); String errMessage = delResp == null ? "大华Dubbo返回为空" : delResp.getErrMessage(); - if (errMessage == null || errMessage.trim().isEmpty()) errMessage = "删除大华人员失败"; + if (errMessage == null || errMessage.trim().isEmpty()) errMessage = "大华人员删除失败"; log.error("【批量删除-大华删除失败→触发本地回滚】localIds={}, dahuaIds={}, errCode={}, errMessage={}", idList, dahuaIds, errCode, errMessage); throw new BizException("删除大华平台人员失败:" + errMessage); diff --git a/web-app/src/main/java/com/zcloud/basic/info/command/UserUpdateExe.java b/web-app/src/main/java/com/zcloud/basic/info/command/UserUpdateExe.java index 50c15358..2a57aa8b 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/command/UserUpdateExe.java +++ b/web-app/src/main/java/com/zcloud/basic/info/command/UserUpdateExe.java @@ -21,6 +21,9 @@ import com.zcloud.basic.info.domain.model.*; import com.zcloud.basic.info.dto.*; import com.zcloud.basic.info.persistence.dataobject.*; import com.zcloud.basic.info.persistence.repository.*; +import com.zcloud.gbscommon.dahua.cmd.DaHuaPersonDeleteCmd; +import com.zcloud.gbscommon.dahua.cmd.DaHuaPersonSyncCmd; +import com.zcloud.gbscommon.dahua.facade.ZcloudDaHuaFacade; import com.zcloud.gbscommon.utils.Tools; import com.zcloud.gbscommon.utils.ZcloudRedisUtil; import com.zcloud.gbscommon.zcloudhidden.face.ZcloudHiddenFacade; @@ -28,9 +31,6 @@ import com.zcloud.gbscommon.zcloudhidden.request.HiddenStatisticsListQry; import com.zcloud.gbscommon.zcloudhidden.request.HiddenUpdateCmd; import com.zcloud.gbscommon.zcloudhidden.response.HiddenListByUserCO; import com.zcloud.gbscommon.zcloudrisk.facade.ZcloudRiskFacade; -import com.zcloud.gbscommon.dahua.facade.ZcloudDaHuaFacade; -import com.zcloud.gbscommon.dahua.cmd.DaHuaPersonSyncCmd; -import com.zcloud.gbscommon.dahua.cmd.DaHuaPersonDeleteCmd; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; @@ -38,10 +38,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; -import javax.servlet.http.HttpServletRequest; import java.nio.charset.StandardCharsets; import java.time.LocalDate; import java.time.LocalDateTime; @@ -80,9 +77,9 @@ public class UserUpdateExe { private ZcloudHiddenFacade zcloudHiddenFacade; @DubboReference private ZcloudRiskFacade zcloudRiskFacade; + private final DaHuaConfig daHuaConfig; @DubboReference private ZcloudDaHuaFacade zcloudDaHuaFacade; - private final DaHuaConfig daHuaConfig; @Transactional(rollbackFor = Exception.class) @@ -457,7 +454,7 @@ public class UserUpdateExe { } if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) { - log.info("大华对接未开启(dockFlag={}), 跳过同步人员更新到大华", daHuaConfig.getDockFlag()); + log.info("大华对接未开启(dockFlag={}), 跳过更新大华人员", daHuaConfig.getDockFlag()); return; } @@ -468,8 +465,8 @@ public class UserUpdateExe { List bioList = (List) biosObj; cmd.setPersonBiosignatures(bioList); } - log.info("Dubbo调用zcloudDaHuaFacade.updatePerson, id={}, name={}, departmentId(corpId)={}", - cmd.getId(), cmd.getName(), cmd.getDepartmentId()); + log.info("Dubbo调用primeport.zcloudDaHuaFacade.updatePerson, name={}, departmentId(corpId)={}", + cmd.getName(), cmd.getDepartmentId()); SingleResponse updateResp = zcloudDaHuaFacade.updatePerson(cmd); String maskedIdCard = plainIdCard; if (plainIdCard != null && plainIdCard.length() >= 14) { @@ -770,16 +767,15 @@ public class UserUpdateExe { if (dahuaId != null) { log.info("【离职-同步删除大华人员】userId={}, name={}, dahuaId={}", userDO.getId(), userDO.getName(), dahuaId); if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) { - log.info("大华对接未开启(dockFlag={}), 跳过删除大华人员, dahuaId={}", daHuaConfig.getDockFlag(), dahuaId); + log.info("【离职-大华删除跳过】dockFlag未开启, userId={}", userDO.getId()); } else { DaHuaPersonDeleteCmd delCmd = new DaHuaPersonDeleteCmd(); delCmd.setIds(Collections.singletonList(dahuaId.longValue())); - log.info("Dubbo调用zcloudDaHuaFacade.deletePerson, dahuaId={}", dahuaId); SingleResponse delResp = zcloudDaHuaFacade.deletePerson(delCmd); if (delResp == null || !delResp.isSuccess()) { String errCode = delResp == null ? "" : delResp.getErrCode(); String errMessage = delResp == null ? "大华Dubbo返回为空" : delResp.getErrMessage(); - if (errMessage == null || errMessage.trim().isEmpty()) errMessage = "删除大华人员失败"; + if (errMessage == null || errMessage.trim().isEmpty()) errMessage = "大华人员删除失败"; log.error("【离职-大华删除失败→触发本地回滚】userId={}, dahuaId={}, errCode={}, errMessage={}", userDO.getId(), dahuaId, errCode, errMessage); throw new BizException("同步大华平台删除离职人员失败:" + errMessage); @@ -1013,6 +1009,10 @@ public class UserUpdateExe { } } + public List collectUserJob(Long userId, Long departmentId, Long corpinfoId, String userChangeRecordId) { + return getUserJob(userId, corpinfoId, userChangeRecordId); + } + private List getUserJob(Long userId, Long corpinfoId, String userChangeRecordId) { List allJob = new ArrayList<>(); //隐患id