大华口门对接

(cherry picked from commit 65ad2b538e)
dahua_koumen
zhangxiongfeng 2026-08-04 14:51:08 +08:00
parent 5aa49b9a3e
commit b7ba5e46c2
4 changed files with 137 additions and 188 deletions

View File

@ -32,6 +32,8 @@ 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.utils.*;
import com.zcloud.gbscommon.dahua.facade.ZcloudDaHuaFacade;
import com.zcloud.gbscommon.dahua.cmd.DaHuaPersonSyncCmd;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -98,6 +100,8 @@ public class UserAddExe {
private final UserExpandInfoRepository userExpandInfoRepository; private final UserExpandInfoRepository userExpandInfoRepository;
private final ImgFilesRepository imgFilesRepository; private final ImgFilesRepository imgFilesRepository;
private final DaHuaConfig daHuaConfig; private final DaHuaConfig daHuaConfig;
@DubboReference
private ZcloudDaHuaFacade zcloudDaHuaFacade;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean execute(UserAddCmd cmd) { public boolean execute(UserAddCmd cmd) {
@ -373,11 +377,11 @@ public class UserAddExe {
log.error("同步大华人员失败人脸图片base64主体长度过短({}),缩略图可能损坏", bodyLen); log.error("同步大华人员失败人脸图片base64主体长度过短({}),缩略图可能损坏", bodyLen);
} }
List<Map<String, Object>> personBiosignatures = new ArrayList<>(); List<DaHuaPersonSyncCmd.PersonBiosignature> personBiosignatures = new ArrayList<>();
Map<String, Object> biosignature = new java.util.LinkedHashMap<>(); DaHuaPersonSyncCmd.PersonBiosignature biosignature = new DaHuaPersonSyncCmd.PersonBiosignature();
biosignature.put("type", 3); biosignature.setType(3);
biosignature.put("index", 1); biosignature.setIndex(1);
biosignature.put("base64Data", cleanBase64); biosignature.setBase64Data(cleanBase64);
personBiosignatures.add(biosignature); personBiosignatures.add(biosignature);
personMap.put("personBiosignatures", personBiosignatures); personMap.put("personBiosignatures", personBiosignatures);
} else { } else {
@ -430,44 +434,34 @@ public class UserAddExe {
} }
personMap.put("age", age); personMap.put("age", age);
personMap.put("sex", sex); personMap.put("sex", sex);
Map<String, String> extraHeaders = new HashMap<>();
try {
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attrs != null) {
HttpServletRequest req = attrs.getRequest();
String token = req.getHeader("token");
String orgid = req.getHeader("orgid");
String tenantId = req.getHeader("tenantId");
if (token != null && !token.trim().isEmpty()) {
extraHeaders.put("token", token);
}
if (orgid != null && !orgid.trim().isEmpty()) {
extraHeaders.put("orgid", orgid);
}
if (tenantId != null && !tenantId.trim().isEmpty()) {
extraHeaders.put("tenantId", tenantId);
}
}
} catch (Exception e) {
log.warn("获取当前请求头异常: {}", e.getMessage());
}
Map<String, Object> syncResult = daHuaConfig.syncPerson(personMap, extraHeaders);
Boolean success = (Boolean) syncResult.get("success");
Boolean skipped = (Boolean) syncResult.get("skipped");
DaHuaSyncResult result = new DaHuaSyncResult(); DaHuaSyncResult result = new DaHuaSyncResult();
result.setDahuaCode(plainIdCard); result.setDahuaCode(plainIdCard);
if (skipped != null && skipped) { if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) {
log.info("大华对接未开启(dockFlag={}), 跳过同步人员到大华", daHuaConfig.getDockFlag());
userE.setDahuaCode(plainIdCard);
return result; return result;
} }
DaHuaPersonSyncCmd cmd = cn.hutool.core.bean.BeanUtil.toBean(personMap, DaHuaPersonSyncCmd.class);
Object biosObj = personMap.get("personBiosignatures");
if (biosObj instanceof List) {
@SuppressWarnings("unchecked")
List<DaHuaPersonSyncCmd.PersonBiosignature> bioList = (List<DaHuaPersonSyncCmd.PersonBiosignature>) biosObj;
cmd.setPersonBiosignatures(bioList);
}
SingleResponse<Object> syncResp = zcloudDaHuaFacade.syncPerson(cmd);
String maskedIdCard = plainIdCard; String maskedIdCard = plainIdCard;
if (plainIdCard != null && plainIdCard.length() >= 14) { if (plainIdCard != null && plainIdCard.length() >= 14) {
maskedIdCard = plainIdCard.substring(0, 6) + "********" + plainIdCard.substring(plainIdCard.length() - 4); maskedIdCard = plainIdCard.substring(0, 6) + "********" + plainIdCard.substring(plainIdCard.length() - 4);
} }
result.setDahuaCode(plainIdCard); result.setDahuaCode(plainIdCard);
userE.setDahuaCode(plainIdCard); userE.setDahuaCode(plainIdCard);
if (success == null || !success) { if (syncResp == null || !syncResp.isSuccess()) {
String errCode = (String) syncResult.getOrDefault("errCode", ""); String errCode = syncResp == null ? "" : syncResp.getErrCode();
String errMessage = (String) syncResult.getOrDefault("errMessage", "大华人员同步失败"); String errMessage = syncResp == null ? "大华Dubbo返回为空" : syncResp.getErrMessage();
if (errMessage == null || errMessage.trim().isEmpty()) errMessage = "大华人员同步失败";
if (throwOnFail) { if (throwOnFail) {
throw new BizException("同步大华平台失败:" + errMessage); throw new BizException("同步大华平台失败:" + errMessage);
} else { } else {
@ -476,7 +470,7 @@ public class UserAddExe {
return result; return result;
} }
} }
Object data = syncResult.get("data"); Object data = syncResp.getData();
if (data != null) { if (data != null) {
if (data instanceof Map) { if (data instanceof Map) {
Map<String, Object> dataMap = (Map<String, Object>) data; Map<String, Object> dataMap = (Map<String, Object>) data;
@ -996,10 +990,13 @@ public class UserAddExe {
userExpandInfoRepository.updateByPhone(userE.getPhone(),userE.getFlowFlag()); userExpandInfoRepository.updateByPhone(userE.getPhone(),userE.getFlowFlag());
} }
// ========== 相关方用户同步大华(统一用 /person/sync重复信息返回false直接跳过不影响本地========== // ========== 相关方用户同步大华新增场景跳过修改场景同步重复信息返回false直接跳过不影响本地==========
Long xgfUserId = addFlag ? userE.getId() : userDOUpdate.getId(); if (addFlag) {
log.info("相关方用户新增场景,跳过大华同步");
} else {
Long xgfUserId = userDOUpdate.getId();
if (xgfUserId == null) { if (xgfUserId == null) {
log.warn("相关方用户保存后未获取到userId跳过大华同步及dahua信息写回, addFlag={}", addFlag); log.warn("相关方用户修改后未获取到userId跳过大华同步及dahua信息写回");
} else { } else {
Object xgfAvatarSource = cmd.getUserImg(); Object xgfAvatarSource = cmd.getUserImg();
if (xgfAvatarSource == null) { if (xgfAvatarSource == null) {
@ -1009,15 +1006,11 @@ public class UserAddExe {
try { try {
xgfSyncResult = syncDaHuaPerson(userE, xgfAvatarSource, false); xgfSyncResult = syncDaHuaPerson(userE, xgfAvatarSource, false);
} catch (Exception e) { } catch (Exception e) {
log.error("相关方用户同步大华异常不影响本地保存继续执行写回身份证号为dahuaCode, userId={}, addFlag={}, error={}", log.error("相关方用户同步大华异常不影响本地保存继续执行写回身份证号为dahuaCode, userId={}, error={}",
xgfUserId, addFlag, e.getMessage(), e); xgfUserId, e.getMessage(), e);
} }
// 无论大华同步成功/失败/返回false/抛异常都尝试写回dahuaId/dahuaCode
// dahuaId = 大华返回的id成功时才有失败/异常/重复时为null
// dahuaCode = 前端传的身份证号经过Base64解码的明文syncDaHuaPerson里即使失败也已经set到result了
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;
// 如果xgfSyncResult异常或dahuaCode为空兜底直接把userE.getUserIdCard()做一次Base64解码写入dahuaCode保证100%写回
if ((xgfDahuaCode == null || xgfDahuaCode.trim().isEmpty()) && userE.getUserIdCard() != null && !userE.getUserIdCard().trim().isEmpty()) { if ((xgfDahuaCode == null || xgfDahuaCode.trim().isEmpty()) && userE.getUserIdCard() != null && !userE.getUserIdCard().trim().isEmpty()) {
String idCardRaw = userE.getUserIdCard().trim(); String idCardRaw = userE.getUserIdCard().trim();
try { try {
@ -1033,14 +1026,15 @@ 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={}, addFlag={}, dahuaId={}, dahuaCode={}", log.info("相关方用户写回dahuaId/dahuaCode成功, userId={}, dahuaId={}, dahuaCode={}",
xgfUserId, addFlag, xgfDahuaId, xgfDahuaCode); xgfUserId, xgfDahuaId, xgfDahuaCode);
} catch (Exception e) { } catch (Exception e) {
log.error("相关方用户写回dahuaId/dahuaCode失败, userId={}, addFlag={}, dahuaId={}, dahuaCode={}", log.error("相关方用户写回dahuaId/dahuaCode失败, userId={}, dahuaId={}, dahuaCode={}",
xgfUserId, addFlag, xgfDahuaId, xgfDahuaCode, e); xgfUserId, xgfDahuaId, xgfDahuaCode, e);
} }
} else { } else {
log.warn("相关方用户既无dahuaId也无dahuaCode可写回跳过update, userId={}, addFlag={}", xgfUserId, addFlag); log.warn("相关方用户既无dahuaId也无dahuaCode可写回跳过update, userId={}", xgfUserId);
}
} }
} }
// ========================================================================= // =========================================================================

View File

@ -22,16 +22,15 @@ 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.utils.ZcloudRedisUtil;
import com.zcloud.gbscommon.dahua.facade.ZcloudDaHuaFacade;
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;
import org.springframework.beans.BeanUtils; 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.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -56,6 +55,8 @@ public class UserRemoveExe {
private ZcloudRedisUtil zcloudRedisUtil; private ZcloudRedisUtil zcloudRedisUtil;
private final UserCorpRecordRepository userCorpRecordRepository; private final UserCorpRecordRepository userCorpRecordRepository;
private final DaHuaConfig daHuaConfig; private final DaHuaConfig daHuaConfig;
@DubboReference
private ZcloudDaHuaFacade zcloudDaHuaFacade;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean execute(Long id) { public boolean execute(Long id) {
@ -79,21 +80,22 @@ public class UserRemoveExe {
// ② 本地操作完成后再删大华。若大华失败 → throw BizException → 本地全部回滚 // ② 本地操作完成后再删大华。若大华失败 → throw BizException → 本地全部回滚
if (needDeleteDaHua) { if (needDeleteDaHua) {
Map<String, Object> deleteResult = daHuaConfig.deletePerson( if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) {
Collections.singletonList(dahuaId), getDaHuaExtraHeaders()); log.info("大华对接未开启(dockFlag={}), 跳过删除大华人员, userId={}", daHuaConfig.getDockFlag(), id);
Boolean skipped = (Boolean) deleteResult.get("skipped"); } else {
if (skipped == null || !skipped) { DaHuaPersonDeleteCmd delCmd = new DaHuaPersonDeleteCmd();
Boolean success = (Boolean) deleteResult.get("success"); delCmd.setIds(Collections.singletonList(dahuaId.longValue()));
String errCode = (String) deleteResult.getOrDefault("errCode", ""); log.info("Dubbo调用zcloudDaHuaFacade.deletePerson, dahuaId={}", dahuaId);
String errMessage = (String) deleteResult.getOrDefault("errMessage", ""); SingleResponse<Boolean> delResp = zcloudDaHuaFacade.deletePerson(delCmd);
if (success == null || !success) { 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 = "删除大华人员失败";
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);
} }
log.info("【单个删除-大华删除成功】userId={}, dahuaId={}", id, dahuaId); log.info("【单个删除-大华删除成功】userId={}, dahuaId={}", id, dahuaId);
} else {
log.info("【单个删除-大华删除跳过】dockFlag未开启, userId={}", id);
} }
} }
} catch (BizException e) { } catch (BizException e) {
@ -195,32 +197,6 @@ public class UserRemoveExe {
return true; return true;
} }
private Map<String, String> getDaHuaExtraHeaders() {
Map<String, String> extraHeaders = new HashMap<>();
try {
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attrs != null) {
HttpServletRequest req = attrs.getRequest();
String token = req.getHeader("token");
String orgid = req.getHeader("orgid");
String tenantId = req.getHeader("tenantId");
if (token != null && !token.trim().isEmpty()) {
extraHeaders.put("token", token);
}
if (orgid != null && !orgid.trim().isEmpty()) {
extraHeaders.put("orgid", orgid);
}
if (tenantId != null && !tenantId.trim().isEmpty()) {
extraHeaders.put("tenantId", tenantId);
}
}
} catch (Exception e) {
log.warn("获取大华透传请求头失败: {}", e.getMessage());
}
return extraHeaders;
}
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean execute(Long[] ids) { public boolean execute(Long[] ids) {
try { try {
@ -242,21 +218,22 @@ public class UserRemoveExe {
// ② 本地成功后再删大华。大华失败→throw→本地回滚 // ② 本地成功后再删大华。大华失败→throw→本地回滚
if (!dahuaIds.isEmpty()) { if (!dahuaIds.isEmpty()) {
Map<String, String> extraHeaders = getDaHuaExtraHeaders(); if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) {
Map<String, Object> deleteResult = daHuaConfig.deletePerson(dahuaIds, extraHeaders); log.info("大华对接未开启(dockFlag={}), 跳过批量删除大华人员, idList={}", daHuaConfig.getDockFlag(), idList);
Boolean skipped = (Boolean) deleteResult.get("skipped"); } else {
if (skipped == null || !skipped) { DaHuaPersonDeleteCmd delCmd = new DaHuaPersonDeleteCmd();
Boolean success = (Boolean) deleteResult.get("success"); delCmd.setIds(dahuaIds.stream().map(Long::longValue).collect(Collectors.toList()));
String errCode = (String) deleteResult.getOrDefault("errCode", ""); log.info("Dubbo调用zcloudDaHuaFacade.deletePerson, dahuaIds={}", dahuaIds);
String errMessage = (String) deleteResult.getOrDefault("errMessage", ""); SingleResponse<Boolean> delResp = zcloudDaHuaFacade.deletePerson(delCmd);
if (success == null || !success) { 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 = "删除大华人员失败";
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);
} }
log.info("【批量删除-大华删除成功】dahuaIds={}", dahuaIds); log.info("【批量删除-大华删除成功】dahuaIds={}", dahuaIds);
} else {
log.info("【批量删除-大华删除跳过】dockFlag未开启, idList={}", idList);
} }
} }
return true; return true;

View File

@ -28,6 +28,9 @@ 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;
@ -77,6 +80,8 @@ public class UserUpdateExe {
private ZcloudHiddenFacade zcloudHiddenFacade; private ZcloudHiddenFacade zcloudHiddenFacade;
@DubboReference @DubboReference
private ZcloudRiskFacade zcloudRiskFacade; private ZcloudRiskFacade zcloudRiskFacade;
@DubboReference
private ZcloudDaHuaFacade zcloudDaHuaFacade;
private final DaHuaConfig daHuaConfig; private final DaHuaConfig daHuaConfig;
@ -442,50 +447,38 @@ public class UserUpdateExe {
throw new BizException("同步大华平台失败:人脸图片不完整"); throw new BizException("同步大华平台失败:人脸图片不完整");
} }
List<Map<String, Object>> personBiosignatures = new ArrayList<>(); List<DaHuaPersonSyncCmd.PersonBiosignature> personBiosignatures = new ArrayList<>();
Map<String, Object> biosignature = new java.util.LinkedHashMap<>(); DaHuaPersonSyncCmd.PersonBiosignature biosignature = new DaHuaPersonSyncCmd.PersonBiosignature();
biosignature.put("type", 3); biosignature.setType(3);
biosignature.put("index", 1); biosignature.setIndex(1);
biosignature.put("base64Data", cleanBase64); biosignature.setBase64Data(cleanBase64);
personBiosignatures.add(biosignature); personBiosignatures.add(biosignature);
personMap.put("personBiosignatures", personBiosignatures); personMap.put("personBiosignatures", personBiosignatures);
} }
Map<String, String> extraHeaders = new HashMap<>(); if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) {
try { log.info("大华对接未开启(dockFlag={}), 跳过同步人员更新到大华", daHuaConfig.getDockFlag());
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attrs != null) {
HttpServletRequest req = attrs.getRequest();
String token = req.getHeader("token");
String orgid = req.getHeader("orgid");
String tenantId = req.getHeader("tenantId");
if (token != null && !token.trim().isEmpty()) {
extraHeaders.put("token", token);
}
if (orgid != null && !orgid.trim().isEmpty()) {
extraHeaders.put("orgid", orgid);
}
if (tenantId != null && !tenantId.trim().isEmpty()) {
extraHeaders.put("tenantId", tenantId);
}
}
} catch (Exception e) {
log.warn("获取当前请求头异常: {}", e.getMessage());
}
Map<String, Object> syncResult = daHuaConfig.updatePerson(personMap, extraHeaders);
Boolean success = (Boolean) syncResult.get("success");
Boolean skipped = (Boolean) syncResult.get("skipped");
if (skipped != null && skipped) {
return; return;
} }
DaHuaPersonSyncCmd cmd = cn.hutool.core.bean.BeanUtil.toBean(personMap, DaHuaPersonSyncCmd.class);
Object biosObj = personMap.get("personBiosignatures");
if (biosObj instanceof List) {
@SuppressWarnings("unchecked")
List<DaHuaPersonSyncCmd.PersonBiosignature> bioList = (List<DaHuaPersonSyncCmd.PersonBiosignature>) biosObj;
cmd.setPersonBiosignatures(bioList);
}
log.info("Dubbo调用zcloudDaHuaFacade.updatePerson, id={}, name={}, departmentId(corpId)={}",
cmd.getId(), cmd.getName(), cmd.getDepartmentId());
SingleResponse<Boolean> updateResp = zcloudDaHuaFacade.updatePerson(cmd);
String maskedIdCard = plainIdCard; String maskedIdCard = plainIdCard;
if (plainIdCard != null && plainIdCard.length() >= 14) { if (plainIdCard != null && plainIdCard.length() >= 14) {
maskedIdCard = plainIdCard.substring(0, 6) + "********" + plainIdCard.substring(plainIdCard.length() - 4); maskedIdCard = plainIdCard.substring(0, 6) + "********" + plainIdCard.substring(plainIdCard.length() - 4);
} }
if (success == null || !success) { if (updateResp == null || !updateResp.isSuccess()) {
String errCode = (String) syncResult.getOrDefault("errCode", ""); String errCode = updateResp == null ? "" : updateResp.getErrCode();
String errMessage = (String) syncResult.getOrDefault("errMessage", "大华人员更新失败"); String errMessage = updateResp == null ? "大华Dubbo返回为空" : updateResp.getErrMessage();
if (errMessage == null || errMessage.trim().isEmpty()) errMessage = "大华人员更新失败";
log.error("同步大华人员(更新)失败, errCode={}, errMessage={}, name={}, idCard={}", errCode, errMessage, newName, maskedIdCard); log.error("同步大华人员(更新)失败, errCode={}, errMessage={}, name={}, idCard={}", errCode, errMessage, newName, maskedIdCard);
throw new BizException("同步大华平台失败:" + errMessage); throw new BizException("同步大华平台失败:" + errMessage);
} }
@ -776,35 +769,22 @@ public class UserUpdateExe {
Integer dahuaId = userDO.getDahuaId(); Integer dahuaId = userDO.getDahuaId();
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);
Map<String, String> extraHeaders = new HashMap<>(); if (daHuaConfig.getDockFlag() == null || daHuaConfig.getDockFlag() != 1) {
try { log.info("大华对接未开启(dockFlag={}), 跳过删除大华人员, dahuaId={}", daHuaConfig.getDockFlag(), dahuaId);
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); } else {
if (attrs != null) { DaHuaPersonDeleteCmd delCmd = new DaHuaPersonDeleteCmd();
HttpServletRequest req = attrs.getRequest(); delCmd.setIds(Collections.singletonList(dahuaId.longValue()));
String token = req.getHeader("token"); log.info("Dubbo调用zcloudDaHuaFacade.deletePerson, dahuaId={}", dahuaId);
String orgid = req.getHeader("orgid"); SingleResponse<Boolean> delResp = zcloudDaHuaFacade.deletePerson(delCmd);
String tenantId = req.getHeader("tenantId"); if (delResp == null || !delResp.isSuccess()) {
if (token != null && !token.trim().isEmpty()) extraHeaders.put("token", token); String errCode = delResp == null ? "" : delResp.getErrCode();
if (orgid != null && !orgid.trim().isEmpty()) extraHeaders.put("orgid", orgid); String errMessage = delResp == null ? "大华Dubbo返回为空" : delResp.getErrMessage();
if (tenantId != null && !tenantId.trim().isEmpty()) extraHeaders.put("tenantId", tenantId); if (errMessage == null || errMessage.trim().isEmpty()) errMessage = "删除大华人员失败";
}
} catch (Exception e) {
log.warn("【离职-获取大华透传请求头异常】: {}", e.getMessage());
}
Map<String, Object> deleteResult = daHuaConfig.deletePerson(Collections.singletonList(dahuaId), extraHeaders);
Boolean skipped = (Boolean) deleteResult.get("skipped");
if (skipped == null || !skipped) {
Boolean success = (Boolean) deleteResult.get("success");
String errCode = (String) deleteResult.getOrDefault("errCode", "");
String errMessage = (String) deleteResult.getOrDefault("errMessage", "");
if (success == null || !success) {
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);
} }
log.info("【离职-大华删除成功】userId={}, dahuaId={}", userDO.getId(), dahuaId); log.info("【离职-大华删除成功】userId={}, dahuaId={}", userDO.getId(), dahuaId);
} else {
log.info("【离职-大华删除跳过】dockFlag未开启, userId={}", userDO.getId());
} }
} else { } else {
log.info("【离职-跳过同步大华】用户dahuaId为空,未同步过大华平台, userId={}, name={}", userDO.getId(), userDO.getName()); log.info("【离职-跳过同步大华】用户dahuaId为空,未同步过大华平台, userId={}, name={}", userDO.getId(), userDO.getName());

View File

@ -6,7 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.util.List; @Data
/** /**
* web-infrastructure * web-infrastructure
@ -14,7 +14,6 @@ import java.util.List;
* @Author zhaokai * @Author zhaokai
* @Date 2025-10-30 10:10:48 * @Date 2025-10-30 10:10:48
*/ */
@Data
@TableName("department") @TableName("department")
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class DepartmentLeaderStatictiscDO extends BaseDO { public class DepartmentLeaderStatictiscDO extends BaseDO {
@ -28,4 +27,3 @@ public class DepartmentLeaderStatictiscDO extends BaseDO {
} }