feat(human): 更新人资用户状态同步功能

master
zhaokai 2026-06-29 17:05:51 +08:00
parent 440982b858
commit 02f479a7db
3 changed files with 335 additions and 86 deletions

View File

@ -11,7 +11,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
* *
*/ */
@RequiredArgsConstructor @RequiredArgsConstructor
@Component @Component
@ -22,19 +22,22 @@ public class HumanCorpUserChangeSyncJob implements Job {
@Override @Override
// @JobRegister(cron = "0 30 0 * * ?", jobDesc = "人资部门数据同步任务开始",triggerStatus = 1) // @JobRegister(cron = "0 30 0 * * ?", jobDesc = "人资部门数据同步任务开始",triggerStatus = 1)
@JobRegister(cron = "0 30 0 1 1 ?", jobDesc = "人资用户变更数据同步任务开始",triggerStatus = 1) @JobRegister(cron = "0 30 0 1 1 ?", jobDesc = "人资用户状态同步任务开始", triggerStatus = 1)
@XxlJob("com.zcloud.human.user.plan.HumanCorpUserChangeSyncJob") @XxlJob("com.zcloud.human.user.plan.HumanCorpUserChangeSyncJob")
public ReturnT<String> execute(String param) { public ReturnT<String> execute(String param) {
XxlJobHelper.log("============人资人员变更数据同步任务开始=========="); XxlJobHelper.log("============人资用户状态同步任务开始param={}==========", param);
log.info("============人资用户状态同步任务开始param={}==========", param);
try { try {
String result = humanUserSyncExe.CorpUserChangeSync(param); String result = humanUserSyncExe.CorpUserChangeSync(param);
XxlJobHelper.log("同步结果:{}", result); XxlJobHelper.log("人资用户状态同步结果:{}", result);
XxlJobHelper.log("============人资人员变更数据同步任务结束=========="); log.info("人资用户状态同步结果:{}", result);
XxlJobHelper.log("============人资用户状态同步任务结束==========");
log.info("============人资用户状态同步任务结束==========");
return new ReturnT<>(ReturnT.SUCCESS_CODE, result); return new ReturnT<>(ReturnT.SUCCESS_CODE, result);
} catch (Exception e) { } catch (Exception e) {
XxlJobHelper.log("人资人员变更数据同步任务执行失败:{}", e.getMessage()); XxlJobHelper.log("人资用户状态同步任务执行失败:{}", e.getMessage());
return new ReturnT<>(ReturnT.FAIL_CODE, "人资人员变更数据同步任务执行失败:" + e.getMessage()); log.error("人资用户状态同步任务执行失败param={}", param, e);
return new ReturnT<>(ReturnT.FAIL_CODE, "人资用户状态同步任务执行失败:" + e.getMessage());
} }
} }
} }

View File

@ -21,6 +21,9 @@ import com.zcloud.gbscommon.zcloudcorp.response.ZcloudCorpInfoCO;
import com.zcloud.gbscommon.zclouddepartment.face.ZcloudDepartmentFacade; import com.zcloud.gbscommon.zclouddepartment.face.ZcloudDepartmentFacade;
import com.zcloud.gbscommon.zclouddepartment.request.ZcloudDepartmentPageQry; import com.zcloud.gbscommon.zclouddepartment.request.ZcloudDepartmentPageQry;
import com.zcloud.gbscommon.zclouddepartment.response.ZcloudDepartmentInfoCo; import com.zcloud.gbscommon.zclouddepartment.response.ZcloudDepartmentInfoCo;
import com.zcloud.gbscommon.zcloudpost.facade.ZcloudPostFacade;
import com.zcloud.gbscommon.zcloudpost.request.ZcloudPostQry;
import com.zcloud.gbscommon.zcloudpost.response.ZcloudPostCO;
import com.zcloud.gbscommon.zclouduser.facade.ZcloudUserFacade; import com.zcloud.gbscommon.zclouduser.facade.ZcloudUserFacade;
import com.zcloud.gbscommon.zclouduser.request.ZcloudUserAddCmd; import com.zcloud.gbscommon.zclouduser.request.ZcloudUserAddCmd;
import com.zcloud.gbscommon.zclouduser.request.ZcloudUserInfoQry; import com.zcloud.gbscommon.zclouduser.request.ZcloudUserInfoQry;
@ -43,9 +46,17 @@ import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.*; import java.util.*;
/** /**
* *
* <p> * <p>
@ -104,6 +115,9 @@ public class HumanUserSyncExe {
* *
*/ */
private static final String HUMAN_RESOURCE_USER_CHANGE_API_ID = "1057031732824408064"; private static final String HUMAN_RESOURCE_USER_CHANGE_API_ID = "1057031732824408064";
private static final int HUMAN_RESOURCE_USER_CHANGE_PAGE_SIZE = 100;
private static final String HUMAN_RESOURCE_USER_CHANGE_TEST_FILE_PATH = "D:\\work\\GBS\\统一用户管理\\对接人资系统\\员工变更.json";
private static final DateTimeFormatter CHANGE_SYNC_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@DubboReference @DubboReference
@ -119,6 +133,8 @@ public class HumanUserSyncExe {
private ZcloudCorpFacade zcloudCorpFacade; private ZcloudCorpFacade zcloudCorpFacade;
@DubboReference @DubboReference
private ZcloudDepartmentFacade zcloudDepartmentFacade; private ZcloudDepartmentFacade zcloudDepartmentFacade;
@DubboReference
private ZcloudPostFacade zcloudPostFacade;
private final HumanUserGateway humanUserGateway; private final HumanUserGateway humanUserGateway;
private final HumanUserRepository humanUserRepository; private final HumanUserRepository humanUserRepository;
@ -291,9 +307,14 @@ public class HumanUserSyncExe {
* @return IDnull * @return IDnull
*/ */
private Long addThirdPartyUser(JSONObject jsonObject, Long corpId, Long deptId) { private Long addThirdPartyUser(JSONObject jsonObject, Long corpId, Long deptId) {
return addThirdPartyUser(jsonObject, corpId, deptId, null);
}
private Long addThirdPartyUser(JSONObject jsonObject, Long corpId, Long deptId, Long postId) {
try { try {
String employeeName = jsonObject.getStr("employee_name"); String employeeName = jsonObject.getStr("employee_name");
String phone = jsonObject.getStr("phone_number"); String phone = jsonObject.getStr("phone_number");
String postName = resolvePostName(jsonObject);
ZcloudUserAddCmd cmd = new ZcloudUserAddCmd(); ZcloudUserAddCmd cmd = new ZcloudUserAddCmd();
cmd.setPhone(phone); cmd.setPhone(phone);
@ -301,9 +322,9 @@ public class HumanUserSyncExe {
cmd.setCorpinfoId(corpId); cmd.setCorpinfoId(corpId);
cmd.setCorpinfoName(SYSTEM_CORP_NAME); cmd.setCorpinfoName(SYSTEM_CORP_NAME);
cmd.setDepartmentId(deptId); cmd.setDepartmentId(deptId);
cmd.setPostId(postId);
cmd.setPostName(postName);
cmd.setRoleId(getDefaultRoleId()); cmd.setRoleId(getDefaultRoleId());
// TODO 暂留岗位
// cmd.setPostId(postId);
SingleResponse<Long> result = zcloudUserFacade.addHumanUser(cmd); SingleResponse<Long> result = zcloudUserFacade.addHumanUser(cmd);
if (result.getData() != null) { if (result.getData() != null) {
return result.getData(); return result.getData();
@ -374,6 +395,51 @@ public class HumanUserSyncExe {
return result; return result;
} }
private Map<String, Long> getDeptPostNameIdMap(Long corpId, Long deptId) {
if (corpId == null || deptId == null) {
return Collections.emptyMap();
}
ZcloudPostQry qry = new ZcloudPostQry();
qry.setCorpinfoId(corpId);
qry.setDepartmentId(deptId);
MultiResponse<ZcloudPostCO> response = zcloudPostFacade.listByPostIds(qry);
if (response == null || !response.isSuccess() || response.getData() == null) {
log.warn("获取岗位列表失败corpId={}deptId={}", corpId, deptId);
return Collections.emptyMap();
}
Map<String, Long> result = new HashMap<>();
for (ZcloudPostCO post : response.getData()) {
if (post == null || !corpId.equals(post.getCorpinfoId())) {
continue;
}
if (!isPostBelongsToDept(post, deptId)) {
continue;
}
String postName = normalizeLookupName(post.getPostName());
if (StringUtils.isEmpty(postName) || post.getId() == null) {
continue;
}
result.put(postName, post.getId());
}
return result;
}
private boolean isPostBelongsToDept(ZcloudPostCO post, Long deptId) {
if (post == null || deptId == null) {
return false;
}
if (deptId.equals(post.getDepartmentId())) {
return true;
}
if (post.getDepartmentList() == null) {
return false;
}
return post.getDepartmentList().stream()
.filter(Objects::nonNull)
.anyMatch(item -> deptId.equals(item.getDepartmentId()));
}
/** /**
* IDID * IDID
* *
@ -763,35 +829,56 @@ public class HumanUserSyncExe {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public String CorpUserChangeSync(String param) { public String CorpUserChangeSync(String param) {
log.info("开始同步人资人员变更数据"); UserChangeSyncRange syncRange = resolveUserChangeSyncRange(param);
JSONArray sourceRows = pullAllCorpUserChangeRows(param); log.info("开始同步人资人员变更数据param={}startDate={}endDate={}testFlag={}",
param, syncRange.getStartDateText(), syncRange.getEndDateText(), syncRange.isTestFlag());
JSONArray sourceRows = pullAllCorpUserChangeRows(param, syncRange);
if (sourceRows.isEmpty()) { if (sourceRows.isEmpty()) {
log.info("未获取到人资人员变更数据"); log.info("未获取到人资人员变更数据startDate={}endDate={}",
syncRange.getStartDateText(), syncRange.getEndDateText());
return "同步完成:未获取到人资人员变更数据"; return "同步完成:未获取到人资人员变更数据";
} }
log.info("拉取到 {} 条人员变更数据", sourceRows.size()); log.info("拉取到 {} 条人员变更数据startDate={}endDate={}",
sourceRows.size(), syncRange.getStartDateText(), syncRange.getEndDateText());
int[] syncResult = saveCorpUserChangeRows(sourceRows); int[] syncResult = saveCorpUserChangeRows(sourceRows);
String message = String.format( String message = String.format(
"同步完成:拉取 %d 条人员变更数据,新增变更记录 %d 条,更新本地人员 %d 条,更新统一用户 %d 条,跳过 %d 条,失败 %d 条", "同步完成:时间范围[%s,%s],拉取 %d 条人员变更数据,新增变更记录 %d 条,处理本地人员 %d 条,处理统一用户 %d 条,跳过 %d 条,失败 %d 条",
syncRange.getStartDateText(), syncRange.getEndDateText(),
sourceRows.size(), syncResult[0], syncResult[1], syncResult[2], syncResult[3], syncResult[4]); sourceRows.size(), syncResult[0], syncResult[1], syncResult[2], syncResult[3], syncResult[4]);
log.info(message); log.info(message);
log.info("结束同步人资人员变更数据"); log.info("结束同步人资人员变更数据");
return message; return message;
} }
private JSONArray pullAllCorpUserChangeRows(String param) { private JSONArray pullAllCorpUserChangeRows(String param, UserChangeSyncRange syncRange) {
if (useTestCorpUserData(param)) { if (syncRange.isTestFlag() || useTestCorpUserData(param)) {
log.info("人资人员变更同步使用测试JSON数据param={}", param); log.info("人资人员变更同步使用测试JSON数据param={}filePath={}", param, HUMAN_RESOURCE_USER_CHANGE_TEST_FILE_PATH);
return getTestCorpUserChangeRows(); return getTestCorpUserChangeRows();
} }
return pullCorpUserChangeRows();
JSONArray allRows = new JSONArray();
int pageNum = 1;
while (true) {
JSONArray pageRows = pullCorpUserChangeRows(syncRange, pageNum);
log.info("人资人员变更接口分页拉取完成pageNum={}pageSize={}pageCount={}",
pageNum, HUMAN_RESOURCE_USER_CHANGE_PAGE_SIZE, pageRows.size());
if (pageRows.isEmpty()) {
break;
}
allRows.addAll(pageRows);
if (pageRows.size() < HUMAN_RESOURCE_USER_CHANGE_PAGE_SIZE) {
break;
}
pageNum++;
}
return allRows;
} }
private JSONArray pullCorpUserChangeRows() { private JSONArray pullCorpUserChangeRows(UserChangeSyncRange syncRange, int pageNum) {
SignUtil signUtil = buildUserChangeSignUtil(); SignUtil signUtil = buildUserChangeSignUtil(syncRange, pageNum);
JSONObject requestBody = buildCorpUserChangeRequest(signUtil); JSONObject requestBody = buildCorpUserChangeRequest(signUtil);
log.info("开始调用人资人员变更接口"); log.info("开始调用人资人员变更接口pageNum={}requestBody={}", pageNum, requestBody);
String body = HttpRequest.post(HUMAN_RESOURCE_USER_CHANGE_URL) String body = HttpRequest.post(HUMAN_RESOURCE_USER_CHANGE_URL)
.timeout(30000) .timeout(30000)
.header("Content-Type", "application/json") .header("Content-Type", "application/json")
@ -805,15 +892,22 @@ public class HumanUserSyncExe {
return extractRemoteRows(body, "人资人员变更接口"); return extractRemoteRows(body, "人资人员变更接口");
} }
private SignUtil buildUserChangeSignUtil() { private SignUtil buildUserChangeSignUtil(UserChangeSyncRange syncRange, int pageNum) {
SignUtil signUtil = new SignUtil(); SignUtil signUtil = new SignUtil();
signUtil.setAppKey(getAppKey()); signUtil.setAppKey(getAppKey());
signUtil.setAppSecret(getAppSecret()); signUtil.setAppSecret(getAppSecret());
signUtil.setEnvType("online"); signUtil.setEnvType("online");
signUtil.setPageNum(pageNum);
signUtil.setPageSize(HUMAN_RESOURCE_USER_CHANGE_PAGE_SIZE);
signUtil.setNonce(RandomStringUtils.randomAlphanumeric(5)); signUtil.setNonce(RandomStringUtils.randomAlphanumeric(5));
signUtil.setTimeStamp(System.currentTimeMillis()); signUtil.setTimeStamp(System.currentTimeMillis());
signUtil.setParamMap(new HashMap<>()); Map<String, String> paramMap = new HashMap<>();
signUtil.setOrderByList(new ArrayList<>()); paramMap.put("start_date", syncRange.getStartDateText());
paramMap.put("end_date", syncRange.getEndDateText());
signUtil.setParamMap(paramMap);
List<String> orderByList = new ArrayList<>();
orderByList.add("id_card_number,DESC");
signUtil.setOrderByList(orderByList);
signUtil.buildSignatureParam(); signUtil.buildSignatureParam();
return signUtil; return signUtil;
} }
@ -827,8 +921,11 @@ public class HumanUserSyncExe {
.set("signature", signature) .set("signature", signature)
.set("signatureParam", null) .set("signatureParam", null)
.set("apiid", HUMAN_RESOURCE_USER_CHANGE_API_ID) .set("apiid", HUMAN_RESOURCE_USER_CHANGE_API_ID)
.set("pageNum", signUtil.getPageNum())
.set("pageSize", signUtil.getPageSize())
.set("paramMap", signUtil.getParamMap()) .set("paramMap", signUtil.getParamMap())
.set("orderByList", signUtil.getOrderByList()) .set("orderByList", signUtil.getOrderByList())
.set("hasTotal", "Y")
.set("envType", signUtil.getEnvType()) .set("envType", signUtil.getEnvType())
.set("empNo", "10262589") .set("empNo", "10262589")
.set("invokeLogId", null) .set("invokeLogId", null)
@ -838,6 +935,67 @@ public class HumanUserSyncExe {
.set("accessIp", null); .set("accessIp", null);
} }
private UserChangeSyncRange resolveUserChangeSyncRange(String param) {
LocalDate defaultDate = LocalDate.now().minusDays(1);
LocalDate startDate = defaultDate;
LocalDate endDate = defaultDate;
boolean testFlag = false;
if (StringUtils.isEmpty(param)) {
return new UserChangeSyncRange(startDate, endDate, false);
}
String trimmedParam = param.trim();
if (HUMAN_RESOURCE_USER_TEST_FLAG.equalsIgnoreCase(trimmedParam)) {
return new UserChangeSyncRange(startDate, endDate, true);
}
try {
if (trimmedParam.startsWith("{")) {
JSONObject jsonObject = JSONUtil.parseObj(trimmedParam);
startDate = parseSyncDate(jsonObject.getStr("start_date"), startDate);
endDate = parseSyncDate(jsonObject.getStr("end_date"), endDate);
String testValue = jsonObject.getStr("test");
if (StringUtils.isEmpty(testValue)) {
testValue = jsonObject.getStr("mode");
}
testFlag = HUMAN_RESOURCE_USER_TEST_FLAG.equalsIgnoreCase(testValue);
} else {
String[] values = trimmedParam.split(",");
if (values.length >= 1) {
startDate = parseSyncDate(values[0], startDate);
}
if (values.length >= 2) {
endDate = parseSyncDate(values[1], endDate);
} else {
endDate = startDate;
}
}
} catch (Exception e) {
log.warn("解析用户状态同步时间范围失败param={},改用默认昨天", param, e);
startDate = defaultDate;
endDate = defaultDate;
}
if (startDate.isAfter(endDate)) {
LocalDate temp = startDate;
startDate = endDate;
endDate = temp;
}
return new UserChangeSyncRange(startDate, endDate, testFlag);
}
private LocalDate parseSyncDate(String value, LocalDate defaultDate) {
if (StringUtils.isEmpty(value)) {
return defaultDate;
}
try {
return LocalDate.parse(value.trim(), CHANGE_SYNC_DATE_FORMATTER);
} catch (DateTimeParseException e) {
log.warn("同步日期格式非法value={},按默认值处理={}", value, defaultDate);
return defaultDate;
}
}
private JSONArray extractRemoteRows(String body, String scene) { private JSONArray extractRemoteRows(String body, String scene) {
JSONObject returnJson = JSONUtil.parseObj(body, jsonConfig); JSONObject returnJson = JSONUtil.parseObj(body, jsonConfig);
String code = returnJson.getStr("code"); String code = returnJson.getStr("code");
@ -885,31 +1043,87 @@ public class HumanUserSyncExe {
int userUpdateCount = 0; int userUpdateCount = 0;
int skipCount = 0; int skipCount = 0;
int failCount = 0; int failCount = 0;
log.info("开始循环对比人员变更数据,{}",JSONUtil.toJsonStr(sourceRows)); log.info("开始处理用户状态同步数据count={}", sourceRows.size());
for (Object item : sourceRows) { for (Object item : sourceRows) {
try { try {
JSONObject jsonObject = JSONUtil.parseObj(item); JSONObject jsonObject = JSONUtil.parseObj(item);
String employeeName = jsonObject.getStr("employee_name"); String employeeName = jsonObject.getStr("employee_name");
String idCardNumber = jsonObject.getStr("id_card_number"); String idCardNumber = jsonObject.getStr("id_card_number");
String corporationName = jsonObject.getStr("corporation_name"); String corporationName = jsonObject.getStr("corporation_name");
if (StringUtils.isEmpty(employeeName) || StringUtils.isEmpty(idCardNumber)) { String phoneNumber = jsonObject.getStr("phone_number");
log.info("跳过无效人员变更数据:姓名或身份证号为空,原始数据:{}", jsonObject); if (!isValidMainlandIdCard(idCardNumber)) {
log.info("跳过无效身份证数据,身份证号={},原始数据={}", idCardNumber, jsonObject);
skipCount++;
continue;
}
if (StringUtils.isEmpty(employeeName) || StringUtils.isEmpty(idCardNumber)|| StringUtils.isEmpty(phoneNumber)) {
log.info("跳过无效人员变更数据:姓名或身份证号或手机号为空,原始数据={}", jsonObject);
skipCount++; skipCount++;
continue; continue;
} }
HumanUserE existingHumanUser = humanUserGateway.getByIdCardNumber(idCardNumber);
if (existingHumanUser == null) {
log.info("跳过人员变更数据:本地未找到身份证号为 {} 的人员,原始数据:{}", idCardNumber, jsonObject);
skipCount++;
continue;
}
Long corpId = getTargetCorpId(corporationName); Long corpId = getTargetCorpId(corporationName);
log.info("目标企业ID{}", corpId); if (corpId == null) {
log.info("未找到目标企业:{},跳过同步", corporationName);
skipCount++;
continue;
}
Map<String, Long> deptNameIdMap = corpId == null ? Collections.emptyMap() : getTargetCorpDeptNameIdMap(corpId); Map<String, Long> deptNameIdMap = corpId == null ? Collections.emptyMap() : getTargetCorpDeptNameIdMap(corpId);
String deptName = jsonObject.getStr("dept_name");
Long deptId = StringUtils.isEmpty(deptName) || deptNameIdMap == null ? null : deptNameIdMap.get(deptName);
if (deptId == null) {
log.info("未找到目标部门:{},跳过同步", deptName);
skipCount++;
continue;
}
String postName = resolvePostName(jsonObject);
Map<String, Long> postNameIdMap = getDeptPostNameIdMap(corpId, deptId);
Long postId = postNameIdMap.get(normalizeLookupName(postName));
if (corpId == null || deptId == null || postId == null) {
log.info("跳过用户状态同步:企业、部门或岗位未匹配,身份证号={}corpId={}deptId={}postName={}postId={},原始数据={}",
idCardNumber, corpId, deptId, postName, postId, jsonObject);
skipCount++;
continue;
}
HumanUserE existingHumanUser = humanUserGateway.getByIdCardNumber(idCardNumber);
if (existingHumanUser == null) {
Long linkedUserId = resolveZcloudUserId(idCardNumber, phoneNumber);
if (linkedUserId == null && canCreateZcloudUser(corpId, deptId, postId)) {
linkedUserId = addThirdPartyUser(jsonObject, corpId, deptId, postId);
if (linkedUserId != null) {
userUpdateCount++;
log.info("用户状态同步新增统一用户成功,身份证号={}userId={}", idCardNumber, linkedUserId);
} else {
log.warn("用户状态同步新增统一用户失败,身份证号={},原始数据={}", idCardNumber, jsonObject);
}
}
existingHumanUser = buildHumanUser(jsonObject);
existingHumanUser.setUserId(linkedUserId);
humanUserGateway.add(existingHumanUser);
localUpdateCount++;
log.info("用户状态同步新增本地human_user成功身份证号={}userId={}", idCardNumber, linkedUserId);
if (linkedUserId != null) {
HumanUserRecordE record = buildHumanUserRecord(jsonObject, linkedUserId);
humanUserRecordGateway.add(record);
recordCount++;
}
continue;
}
if (existingHumanUser.getUserId() == null) {
Long linkedUserId = resolveZcloudUserId(idCardNumber, phoneNumber);
if (linkedUserId == null) {
linkedUserId = addThirdPartyUser(jsonObject, corpId, deptId, postId);
}
existingHumanUser.setUserId(linkedUserId);
if (linkedUserId != null) {
userUpdateCount++;
}
}
log.info("开始处理本地用户信息,{}",JSONUtil.toJsonStr(existingHumanUser));
HumanUserRecordE record = buildHumanUserRecord(jsonObject, existingHumanUser.getUserId()); HumanUserRecordE record = buildHumanUserRecord(jsonObject, existingHumanUser.getUserId());
humanUserRecordGateway.add(record); humanUserRecordGateway.add(record);
recordCount++; recordCount++;
@ -918,18 +1132,16 @@ public class HumanUserSyncExe {
humanUserGateway.update(existingHumanUser); humanUserGateway.update(existingHumanUser);
localUpdateCount++; localUpdateCount++;
String deptName = jsonObject.getStr("dept_name"); if (existingHumanUser.getUserId() != null) {
Long deptId = StringUtils.isEmpty(deptName) || deptNameIdMap == null ? null : deptNameIdMap.get(deptName); log.info("开始统一用户更新userId={}", existingHumanUser.getUserId());
// if (existingHumanUser.getUserId() != null) { if (updateBasicInfodUser(existingHumanUser, deptId, corpId, postId, postName)) {
log.info("开始统一用户更新,userId={}",existingHumanUser.getUserId() );
if (updateBasicInfodUser(existingHumanUser, deptId,corpId)) {
userUpdateCount++; userUpdateCount++;
} else { } else {
log.warn("统一用户更新未成功userId={},身份证号={}", existingHumanUser.getUserId(), idCardNumber); log.warn("统一用户更新未成功userId={},身份证号={}", existingHumanUser.getUserId(), idCardNumber);
} }
// } }
} catch (Exception e) { } catch (Exception e) {
log.error("处理人员变更数据失败,原始数据{}", item, e); log.error("处理人员变更数据失败,原始数据={}", item, e);
failCount++; failCount++;
} }
} }
@ -937,9 +1149,40 @@ public class HumanUserSyncExe {
return new int[]{recordCount, localUpdateCount, userUpdateCount, skipCount, failCount}; return new int[]{recordCount, localUpdateCount, userUpdateCount, skipCount, failCount};
} }
private boolean updateBasicInfodUser(HumanUserE humanUser, Long deptId, Long corpId) { private String resolvePostName(JSONObject jsonObject) {
String jobName = normalizeLookupName(jsonObject.getStr("job_name"));
if (StringUtils.isNotEmpty(jobName)) {
return jobName;
}
return normalizeLookupName(jsonObject.getStr("position_name"));
}
private String normalizeLookupName(String value) {
if (StringUtils.isEmpty(value)) {
return null;
}
return value.replace("\t", "").trim();
}
private boolean isValidMainlandIdCard(String idCardNumber) {
if (StringUtils.isEmpty(idCardNumber)) {
return false;
}
String trimmedValue = idCardNumber.trim();
return trimmedValue.matches("^\\d{17}[0-9Xx]$");
}
private boolean canCreateZcloudUser(Long corpId, Long deptId, Long postId) {
return corpId != null && deptId != null && postId != null;
}
private Long resolveZcloudUserId(String idCardNumber, String phoneNumber) {
String encodedIdCardNumber = StringUtils.isNotEmpty(idCardNumber) ? Base64.encodeToString(idCardNumber) : null;
return isUserExists(encodedIdCardNumber, phoneNumber);
}
private boolean updateBasicInfodUser(HumanUserE humanUser, Long deptId, Long corpId, Long postId, String postName) {
// SingleResponse<UserDetailCO> detailResponse = userFacade.getDetail(humanUser.getUserId());
String phoneNumber = StringUtils.isNotEmpty(humanUser.getPhoneNumber()) ? humanUser.getPhoneNumber() : null; String phoneNumber = StringUtils.isNotEmpty(humanUser.getPhoneNumber()) ? humanUser.getPhoneNumber() : null;
String idCardNumber = StringUtils.isNotEmpty(humanUser.getIdCardNumber()) ? Base64.encodeToString(humanUser.getIdCardNumber()) :null; String idCardNumber = StringUtils.isNotEmpty(humanUser.getIdCardNumber()) ? Base64.encodeToString(humanUser.getIdCardNumber()) :null;
Long existingUserId = isUserExists(idCardNumber,phoneNumber); Long existingUserId = isUserExists(idCardNumber,phoneNumber);
@ -952,7 +1195,6 @@ public class HumanUserSyncExe {
ZcloudUserCo detail = infoByUserId.getData(); ZcloudUserCo detail = infoByUserId.getData();
String employeeName = StringUtils.isNotEmpty(humanUser.getEmployeeName()) ? humanUser.getEmployeeName() : detail.getName(); String employeeName = StringUtils.isNotEmpty(humanUser.getEmployeeName()) ? humanUser.getEmployeeName() : detail.getName();
String postName = StringUtils.isNotEmpty(humanUser.getPositionName()) ? humanUser.getPositionName() : humanUser.getJobName();
ZcloudUserUpdateCmd cmd = new ZcloudUserUpdateCmd(); ZcloudUserUpdateCmd cmd = new ZcloudUserUpdateCmd();
cmd.setId(existingUserId); cmd.setId(existingUserId);
@ -965,6 +1207,9 @@ public class HumanUserSyncExe {
if (deptId != null) { if (deptId != null) {
cmd.setDepartmentId(deptId); cmd.setDepartmentId(deptId);
} }
if (postId != null) {
cmd.setPostId(postId);
}
if (StringUtils.isNotEmpty(postName)) { if (StringUtils.isNotEmpty(postName)) {
cmd.setPostName(postName); cmd.setPostName(postName);
} }
@ -1036,53 +1281,49 @@ public class HumanUserSyncExe {
} }
private JSONArray getTestCorpUserChangeRows() { private JSONArray getTestCorpUserChangeRows() {
try {
Path path = Paths.get(HUMAN_RESOURCE_USER_CHANGE_TEST_FILE_PATH);
String content = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
if (StringUtils.isEmpty(content)) {
log.warn("用户状态同步测试文件为空filePath={}", HUMAN_RESOURCE_USER_CHANGE_TEST_FILE_PATH);
return new JSONArray();
}
String trimmedContent = content.trim();
if (trimmedContent.startsWith("[")) {
return JSONUtil.parseArray(trimmedContent);
}
return extractRemoteRows(trimmedContent, "用户状态同步测试文件");
} catch (Exception e) {
log.error("读取用户状态同步测试文件失败filePath={}", HUMAN_RESOURCE_USER_CHANGE_TEST_FILE_PATH, e);
HumanUserDO byId = humanUserRepository.getById(1); HumanUserDO byId = humanUserRepository.getById(1);
String remark = byId.getRemarks(); String remark = byId.getRemarks();
return JSONUtil.parseArray(remark); return JSONUtil.parseArray(remark);
}
}
private static final class UserChangeSyncRange {
private final LocalDate startDate;
private final LocalDate endDate;
private final boolean testFlag;
/* JSONArray array = new JSONArray(); private UserChangeSyncRange(LocalDate startDate, LocalDate endDate, boolean testFlag) {
this.startDate = startDate;
this.endDate = endDate;
this.testFlag = testFlag;
}
JSONObject first = new JSONObject(); private String getStartDateText() {
first.set("dept_code", "132588b1871341acb51c5638a735dbe7"); return CHANGE_SYNC_DATE_FORMATTER.format(startDate);
first.set("corporation_code", "28f4eed3300b431c958bea4d93e49434"); }
first.set("entry_time", "2011-07-05 00:00:00");
first.set("employee_gender", "MALE");
first.set("position_name", "开发岗位");
first.set("dept_name", "开发部门");
first.set("employee_images_code", "a101bf6d844b43b9b85aeba419ff0458");
first.set("employee_name", "TEST_USER_B");
first.set("corporation_name", "zhk分公司");
first.set("employee_images", "");
first.set("employee_age", 45);
first.set("job_name", "TEST_JOB_A");
first.set("phone_number", "18700000009");
first.set("employee_status", "在职");
first.set("job_level", "M9");
first.set("id_card_number", "654201197901154618");
array.add(first);
*//*
JSONObject second = new JSONObject();
second.set("dept_code", "3cb898c954b947e3acfb8161d23103f7");
second.set("corporation_code", "5a472a9d94f84832bc83b93133832f55");
second.set("entry_time", "2024-11-01 00:00:00");
second.set("employee_gender", "FEMALE");
second.set("position_name", "TEST_POSITION_B");
second.set("dept_name", "TEST_DEPT_B");
second.set("employee_images_code", "de475a7601a9450fb4a1109f70d1f3be");
second.set("employee_name", "TEST_USER_B");
second.set("corporation_name", "TEST_CORP_B");
second.set("employee_images", "");
second.set("employee_age", 54);
second.set("job_name", "TEST_JOB_B");
second.set("phone_number", "16603390000");
second.set("employee_status", "劳务派遣");
second.set("id_card_number", "E64056788");
array.add(second);*//*
return array;*/ private String getEndDateText() {
return CHANGE_SYNC_DATE_FORMATTER.format(endDate);
}
private boolean isTestFlag() {
return testFlag;
}
} }
private String getAppKey() { private String getAppKey() {

View File

@ -1,9 +1,11 @@
package com.zcloud.human.user.gatewayimpl; package com.zcloud.human.user.gatewayimpl;
import com.zcloud.gbscommon.utils.Tools;
import com.zcloud.human.user.domain.gateway.HumanUserGateway; import com.zcloud.human.user.domain.gateway.HumanUserGateway;
import com.zcloud.human.user.domain.model.HumanUserE; import com.zcloud.human.user.domain.model.HumanUserE;
import com.zcloud.human.user.persistence.dataobject.HumanUserDO; import com.zcloud.human.user.persistence.dataobject.HumanUserDO;
import com.zcloud.human.user.persistence.repository.HumanUserRepository; import com.zcloud.human.user.persistence.repository.HumanUserRepository;
import jodd.util.StringUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -45,6 +47,9 @@ public class HumanUserGatewayImpl implements HumanUserGateway {
@Override @Override
public boolean add(HumanUserE humanUserE) { public boolean add(HumanUserE humanUserE) {
if(StringUtil.isEmpty(humanUserE.getHumanUserId())){
humanUserE.setHumanUserId(Tools.get32UUID());
}
HumanUserDO humanUserDO = convertToDO(humanUserE); HumanUserDO humanUserDO = convertToDO(humanUserE);
humanUserRepository.save(humanUserDO); humanUserRepository.save(humanUserDO);
humanUserE.setId(humanUserDO.getId()); humanUserE.setId(humanUserDO.getId());