大华口门对接

(cherry picked from commit 65ad2b538e)

# 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
dahua_koumen
zhangxiongfeng 2026-08-04 14:13:09 +08:00
parent b7ba5e46c2
commit ae529ebcac
3 changed files with 59 additions and 62 deletions

View File

@ -31,9 +31,9 @@ import com.zcloud.basic.info.domain.model.*;
import com.zcloud.basic.info.dto.*; import com.zcloud.basic.info.dto.*;
import com.zcloud.basic.info.persistence.dataobject.*; import com.zcloud.basic.info.persistence.dataobject.*;
import com.zcloud.basic.info.persistence.repository.*; 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.cmd.DaHuaPersonSyncCmd;
import com.zcloud.gbscommon.dahua.facade.ZcloudDaHuaFacade;
import com.zcloud.gbscommon.utils.*;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -188,7 +188,6 @@ public class UserAddExe {
userE.setUserType(CorpTypeEnum.getUserTypeByCode(corpInfoDO.getType())); userE.setUserType(CorpTypeEnum.getUserTypeByCode(corpInfoDO.getType()));
userE.resetPassword(corpInfoDO.getType()); userE.resetPassword(corpInfoDO.getType());
// ① 先本地落库 + 底座GBS新增。GBS失败抛 RuntimeException整个事务回滚
res = userGateway.add(userE); res = userGateway.add(userE);
if (corpInfoDO != null && !ObjectUtils.isEmpty(corpInfoDO.getCorpName())) { if (corpInfoDO != null && !ObjectUtils.isEmpty(corpInfoDO.getCorpName())) {
corpName = corpInfoDO.getCorpName(); corpName = corpInfoDO.getCorpName();
@ -204,7 +203,6 @@ public class UserAddExe {
} catch (Exception e) { } catch (Exception e) {
log.error("用户变更记录保存失败(不影响用户主体), userId: {}, error: {}", userE.getId(), e.getMessage(), e); log.error("用户变更记录保存失败(不影响用户主体), userId: {}, error: {}", userE.getId(), e.getMessage(), e);
} }
// ② 本地和底座都成功后,最后才同步大华。失败→抛异常→回滚本地+GBS避免留下"大华人成功但本地没数据"
DaHuaSyncResult syncResult = syncDaHuaPerson(userE); DaHuaSyncResult syncResult = syncDaHuaPerson(userE);
if (syncResult.dahuaId != null || (syncResult.dahuaCode != null && !syncResult.dahuaCode.trim().isEmpty())) { if (syncResult.dahuaId != null || (syncResult.dahuaCode != null && !syncResult.dahuaCode.trim().isEmpty())) {
try { try {
@ -450,7 +448,8 @@ public class UserAddExe {
List<DaHuaPersonSyncCmd.PersonBiosignature> bioList = (List<DaHuaPersonSyncCmd.PersonBiosignature>) biosObj; List<DaHuaPersonSyncCmd.PersonBiosignature> bioList = (List<DaHuaPersonSyncCmd.PersonBiosignature>) biosObj;
cmd.setPersonBiosignatures(bioList); cmd.setPersonBiosignatures(bioList);
} }
log.info("Dubbo调用primeport.zcloudDaHuaFacade.syncPerson, name={}, departmentId(corpId)={}",
cmd.getName(), cmd.getDepartmentId());
SingleResponse<Object> syncResp = zcloudDaHuaFacade.syncPerson(cmd); SingleResponse<Object> syncResp = zcloudDaHuaFacade.syncPerson(cmd);
String maskedIdCard = plainIdCard; String maskedIdCard = plainIdCard;
if (plainIdCard != null && plainIdCard.length() >= 14) { if (plainIdCard != null && plainIdCard.length() >= 14) {
@ -990,24 +989,25 @@ public class UserAddExe {
userExpandInfoRepository.updateByPhone(userE.getPhone(),userE.getFlowFlag()); userExpandInfoRepository.updateByPhone(userE.getPhone(),userE.getFlowFlag());
} }
// ========== 相关方用户同步大华新增场景跳过修改场景同步重复信息返回false直接跳过不影响本地========== // ========== 相关方用户同步大华(仅修改场景调大华,新增场景跳过)==========
if (addFlag) { Long xgfUserId = addFlag ? userE.getId() : userDOUpdate.getId();
log.info("相关方用户新增场景,跳过大华同步");
} else {
Long xgfUserId = userDOUpdate.getId();
if (xgfUserId == null) { if (xgfUserId == null) {
log.warn("相关方用户修改后未获取到userId跳过大华同步及dahua信息写回"); log.warn("相关方用户保存后未获取到userId跳过大华同步及dahua信息写回, addFlag={}", addFlag);
} else { } else {
DaHuaSyncResult xgfSyncResult = null;
if (!addFlag) {
Object xgfAvatarSource = cmd.getUserImg(); Object xgfAvatarSource = cmd.getUserImg();
if (xgfAvatarSource == null) { if (xgfAvatarSource == null) {
xgfAvatarSource = cmd.getUserAvatarUrl(); xgfAvatarSource = cmd.getUserAvatarUrl();
} }
DaHuaSyncResult xgfSyncResult = null;
try { try {
xgfSyncResult = syncDaHuaPerson(userE, xgfAvatarSource, false); xgfSyncResult = syncDaHuaPerson(userE, xgfAvatarSource, false);
} catch (Exception e) { } catch (Exception e) {
log.error("相关方用户同步大华异常不影响本地保存继续执行写回身份证号为dahuaCode, userId={}, error={}", log.error("相关方用户同步大华异常不影响本地保存继续执行写回身份证号为dahuaCode, userId={}, addFlag={}, error={}",
xgfUserId, e.getMessage(), e); xgfUserId, addFlag, e.getMessage(), e);
}
} else {
log.info("相关方用户新增场景,跳过大华同步, userId={}", xgfUserId);
} }
Integer xgfDahuaId = xgfSyncResult != null ? xgfSyncResult.dahuaId : null; Integer xgfDahuaId = xgfSyncResult != null ? xgfSyncResult.dahuaId : null;
String xgfDahuaCode = xgfSyncResult != null ? xgfSyncResult.dahuaCode : null; String xgfDahuaCode = xgfSyncResult != null ? xgfSyncResult.dahuaCode : null;
@ -1026,15 +1026,14 @@ public class UserAddExe {
updateDahua.setDahuaId(xgfDahuaId); updateDahua.setDahuaId(xgfDahuaId);
updateDahua.setDahuaCode(xgfDahuaCode); updateDahua.setDahuaCode(xgfDahuaCode);
userRepository.updateDahuaInfo(updateDahua.getId(), updateDahua.getDahuaId(), updateDahua.getDahuaCode()); userRepository.updateDahuaInfo(updateDahua.getId(), updateDahua.getDahuaId(), updateDahua.getDahuaCode());
log.info("相关方用户写回dahuaId/dahuaCode成功, userId={}, dahuaId={}, dahuaCode={}", log.info("相关方用户写回dahuaId/dahuaCode成功, userId={}, addFlag={}, dahuaId={}, dahuaCode={}",
xgfUserId, xgfDahuaId, xgfDahuaCode); xgfUserId, addFlag, xgfDahuaId, xgfDahuaCode);
} catch (Exception e) { } catch (Exception e) {
log.error("相关方用户写回dahuaId/dahuaCode失败, userId={}, dahuaId={}, dahuaCode={}", log.error("相关方用户写回dahuaId/dahuaCode失败, userId={}, addFlag={}, dahuaId={}, dahuaCode={}",
xgfUserId, xgfDahuaId, xgfDahuaCode, e); xgfUserId, addFlag, xgfDahuaId, xgfDahuaCode, e);
} }
} else { } else {
log.warn("相关方用户既无dahuaId也无dahuaCode可写回跳过update, userId={}", xgfUserId); log.warn("相关方用户既无dahuaId也无dahuaCode可写回跳过update, userId={}, addFlag={}", xgfUserId, addFlag);
}
} }
} }
// ========================================================================= // =========================================================================

View File

@ -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.UserJobHandoverRepository;
import com.zcloud.basic.info.persistence.repository.UserRepository; import com.zcloud.basic.info.persistence.repository.UserRepository;
import com.zcloud.basic.info.domain.config.DaHuaConfig; 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.cmd.DaHuaPersonDeleteCmd;
import com.zcloud.gbscommon.dahua.facade.ZcloudDaHuaFacade;
import com.zcloud.gbscommon.utils.ZcloudRedisUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
@ -52,7 +52,7 @@ public class UserRemoveExe {
@DubboReference(check = false) @DubboReference(check = false)
private UserFacade userFacade; private UserFacade userFacade;
// @Autowired // @Autowired
private ZcloudRedisUtil zcloudRedisUtil; private final ZcloudRedisUtil zcloudRedisUtil;
private final UserCorpRecordRepository userCorpRecordRepository; private final UserCorpRecordRepository userCorpRecordRepository;
private final DaHuaConfig daHuaConfig; private final DaHuaConfig daHuaConfig;
@DubboReference @DubboReference
@ -81,16 +81,15 @@ public class UserRemoveExe {
// ② 本地操作完成后再删大华。若大华失败 → throw BizException → 本地全部回滚 // ② 本地操作完成后再删大华。若大华失败 → throw BizException → 本地全部回滚
if (needDeleteDaHua) { if (needDeleteDaHua) {
if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) { if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) {
log.info("大华对接未开启(dockFlag={}), 跳过删除大华人员, userId={}", daHuaConfig.getDockFlag(), id); log.info("【单个删除-大华删除跳过】dockFlag未开启, userId={}", id);
} else { } else {
DaHuaPersonDeleteCmd delCmd = new DaHuaPersonDeleteCmd(); DaHuaPersonDeleteCmd delCmd = new DaHuaPersonDeleteCmd();
delCmd.setIds(Collections.singletonList(dahuaId.longValue())); delCmd.setIds(Collections.singletonList(dahuaId.longValue()));
log.info("Dubbo调用zcloudDaHuaFacade.deletePerson, dahuaId={}", dahuaId);
SingleResponse<Boolean> delResp = zcloudDaHuaFacade.deletePerson(delCmd); SingleResponse<Boolean> delResp = zcloudDaHuaFacade.deletePerson(delCmd);
if (delResp == null || !delResp.isSuccess()) { if (delResp == null || !delResp.isSuccess()) {
String errCode = delResp == null ? "" : delResp.getErrCode(); String errCode = delResp == null ? "" : delResp.getErrCode();
String errMessage = delResp == null ? "大华Dubbo返回为空" : delResp.getErrMessage(); 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={}", log.error("【单个删除-大华删除失败→触发本地回滚】userId={}, dahuaId={}, errCode={}, errMessage={}",
id, dahuaId, errCode, errMessage); id, dahuaId, errCode, errMessage);
throw new BizException("删除大华平台人员失败:" + errMessage); throw new BizException("删除大华平台人员失败:" + errMessage);
@ -219,16 +218,15 @@ public class UserRemoveExe {
// ② 本地成功后再删大华。大华失败→throw→本地回滚 // ② 本地成功后再删大华。大华失败→throw→本地回滚
if (!dahuaIds.isEmpty()) { if (!dahuaIds.isEmpty()) {
if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) { if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) {
log.info("大华对接未开启(dockFlag={}), 跳过批量删除大华人员, idList={}", daHuaConfig.getDockFlag(), idList); log.info("【批量删除-大华删除跳过】dockFlag未开启, idList={}", idList);
} else { } else {
DaHuaPersonDeleteCmd delCmd = new DaHuaPersonDeleteCmd(); DaHuaPersonDeleteCmd delCmd = new DaHuaPersonDeleteCmd();
delCmd.setIds(dahuaIds.stream().map(Long::longValue).collect(Collectors.toList())); delCmd.setIds(dahuaIds.stream().map(Integer::longValue).collect(Collectors.toList()));
log.info("Dubbo调用zcloudDaHuaFacade.deletePerson, dahuaIds={}", dahuaIds);
SingleResponse<Boolean> delResp = zcloudDaHuaFacade.deletePerson(delCmd); SingleResponse<Boolean> delResp = zcloudDaHuaFacade.deletePerson(delCmd);
if (delResp == null || !delResp.isSuccess()) { if (delResp == null || !delResp.isSuccess()) {
String errCode = delResp == null ? "" : delResp.getErrCode(); String errCode = delResp == null ? "" : delResp.getErrCode();
String errMessage = delResp == null ? "大华Dubbo返回为空" : delResp.getErrMessage(); 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={}", log.error("【批量删除-大华删除失败→触发本地回滚】localIds={}, dahuaIds={}, errCode={}, errMessage={}",
idList, dahuaIds, errCode, errMessage); idList, dahuaIds, errCode, errMessage);
throw new BizException("删除大华平台人员失败:" + errMessage); throw new BizException("删除大华平台人员失败:" + errMessage);

View File

@ -21,6 +21,9 @@ import com.zcloud.basic.info.domain.model.*;
import com.zcloud.basic.info.dto.*; import com.zcloud.basic.info.dto.*;
import com.zcloud.basic.info.persistence.dataobject.*; import com.zcloud.basic.info.persistence.dataobject.*;
import com.zcloud.basic.info.persistence.repository.*; 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.Tools;
import com.zcloud.gbscommon.utils.ZcloudRedisUtil; import com.zcloud.gbscommon.utils.ZcloudRedisUtil;
import com.zcloud.gbscommon.zcloudhidden.face.ZcloudHiddenFacade; 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.request.HiddenUpdateCmd;
import com.zcloud.gbscommon.zcloudhidden.response.HiddenListByUserCO; import com.zcloud.gbscommon.zcloudhidden.response.HiddenListByUserCO;
import com.zcloud.gbscommon.zcloudrisk.facade.ZcloudRiskFacade; 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.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
@ -38,10 +38,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils; 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.nio.charset.StandardCharsets;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -80,9 +77,9 @@ public class UserUpdateExe {
private ZcloudHiddenFacade zcloudHiddenFacade; private ZcloudHiddenFacade zcloudHiddenFacade;
@DubboReference @DubboReference
private ZcloudRiskFacade zcloudRiskFacade; private ZcloudRiskFacade zcloudRiskFacade;
private final DaHuaConfig daHuaConfig;
@DubboReference @DubboReference
private ZcloudDaHuaFacade zcloudDaHuaFacade; private ZcloudDaHuaFacade zcloudDaHuaFacade;
private final DaHuaConfig daHuaConfig;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -457,7 +454,7 @@ public class UserUpdateExe {
} }
if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) { if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) {
log.info("大华对接未开启(dockFlag={}), 跳过同步人员更新大华", daHuaConfig.getDockFlag()); log.info("大华对接未开启(dockFlag={}), 跳过更新大华人员", daHuaConfig.getDockFlag());
return; return;
} }
@ -468,8 +465,8 @@ public class UserUpdateExe {
List<DaHuaPersonSyncCmd.PersonBiosignature> bioList = (List<DaHuaPersonSyncCmd.PersonBiosignature>) biosObj; List<DaHuaPersonSyncCmd.PersonBiosignature> bioList = (List<DaHuaPersonSyncCmd.PersonBiosignature>) biosObj;
cmd.setPersonBiosignatures(bioList); cmd.setPersonBiosignatures(bioList);
} }
log.info("Dubbo调用zcloudDaHuaFacade.updatePerson, id={}, name={}, departmentId(corpId)={}", log.info("Dubbo调用primeport.zcloudDaHuaFacade.updatePerson, name={}, departmentId(corpId)={}",
cmd.getId(), cmd.getName(), cmd.getDepartmentId()); cmd.getName(), cmd.getDepartmentId());
SingleResponse<Boolean> updateResp = zcloudDaHuaFacade.updatePerson(cmd); SingleResponse<Boolean> updateResp = zcloudDaHuaFacade.updatePerson(cmd);
String maskedIdCard = plainIdCard; String maskedIdCard = plainIdCard;
if (plainIdCard != null && plainIdCard.length() >= 14) { if (plainIdCard != null && plainIdCard.length() >= 14) {
@ -770,16 +767,15 @@ public class UserUpdateExe {
if (dahuaId != null) { if (dahuaId != null) {
log.info("【离职-同步删除大华人员】userId={}, name={}, dahuaId={}", userDO.getId(), userDO.getName(), dahuaId); log.info("【离职-同步删除大华人员】userId={}, name={}, dahuaId={}", userDO.getId(), userDO.getName(), dahuaId);
if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) { if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) {
log.info("大华对接未开启(dockFlag={}), 跳过删除大华人员, dahuaId={}", daHuaConfig.getDockFlag(), dahuaId); log.info("【离职-大华删除跳过】dockFlag未开启, userId={}", userDO.getId());
} else { } else {
DaHuaPersonDeleteCmd delCmd = new DaHuaPersonDeleteCmd(); DaHuaPersonDeleteCmd delCmd = new DaHuaPersonDeleteCmd();
delCmd.setIds(Collections.singletonList(dahuaId.longValue())); delCmd.setIds(Collections.singletonList(dahuaId.longValue()));
log.info("Dubbo调用zcloudDaHuaFacade.deletePerson, dahuaId={}", dahuaId);
SingleResponse<Boolean> delResp = zcloudDaHuaFacade.deletePerson(delCmd); SingleResponse<Boolean> delResp = zcloudDaHuaFacade.deletePerson(delCmd);
if (delResp == null || !delResp.isSuccess()) { if (delResp == null || !delResp.isSuccess()) {
String errCode = delResp == null ? "" : delResp.getErrCode(); String errCode = delResp == null ? "" : delResp.getErrCode();
String errMessage = delResp == null ? "大华Dubbo返回为空" : delResp.getErrMessage(); 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={}", log.error("【离职-大华删除失败→触发本地回滚】userId={}, dahuaId={}, errCode={}, errMessage={}",
userDO.getId(), dahuaId, errCode, errMessage); userDO.getId(), dahuaId, errCode, errMessage);
throw new BizException("同步大华平台删除离职人员失败:" + errMessage); throw new BizException("同步大华平台删除离职人员失败:" + errMessage);
@ -1013,6 +1009,10 @@ public class UserUpdateExe {
} }
} }
public List<UserJobHandoverDO> collectUserJob(Long userId, Long departmentId, Long corpinfoId, String userChangeRecordId) {
return getUserJob(userId, corpinfoId, userChangeRecordId);
}
private List<UserJobHandoverDO> getUserJob(Long userId, Long corpinfoId, String userChangeRecordId) { private List<UserJobHandoverDO> getUserJob(Long userId, Long corpinfoId, String userChangeRecordId) {
List<UserJobHandoverDO> allJob = new ArrayList<>(); List<UserJobHandoverDO> allJob = new ArrayList<>();
//隐患id //隐患id