diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkSyncProcessorImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkSyncProcessorImpl.java index 1e75bf2f..af9e37c6 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkSyncProcessorImpl.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkSyncProcessorImpl.java @@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.zt.plat.framework.common.enums.CommonStatusEnum; import com.zt.plat.framework.tenant.core.context.TenantContextHolder; -import com.zt.plat.module.system.controller.admin.dept.vo.depexternalcode.DeptExternalCodeSaveReqVO; import com.zt.plat.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO; import com.zt.plat.module.system.controller.admin.dept.vo.post.PostSaveReqVO; import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkHrDepartmentPageRespVO; @@ -13,7 +12,6 @@ import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkHrSu import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkHrUserPageRespVO; import com.zt.plat.module.system.controller.admin.user.vo.user.UserSaveReqVO; import com.zt.plat.module.system.dal.dataobject.dept.DeptDO; -import com.zt.plat.module.system.dal.dataobject.dept.DeptExternalCodeDO; import com.zt.plat.module.system.dal.dataobject.dept.PostDO; import com.zt.plat.module.system.dal.dataobject.user.AdminUserDO; import com.zt.plat.module.system.dal.mysql.dept.PostMapper; @@ -21,7 +19,6 @@ import com.zt.plat.module.system.dal.mysql.user.AdminUserMapper; import com.zt.plat.module.system.enums.common.SexEnum; import com.zt.plat.module.system.enums.dept.DeptSourceEnum; import com.zt.plat.module.system.enums.user.UserSourceEnum; -import com.zt.plat.module.system.service.dept.DeptExternalCodeService; import com.zt.plat.module.system.service.dept.DeptService; import com.zt.plat.module.system.service.dept.PostService; import com.zt.plat.module.system.service.integration.iwork.IWorkSyncProcessor; @@ -46,20 +43,17 @@ import java.util.concurrent.ConcurrentHashMap; @RequiredArgsConstructor public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { - private static final String SYSTEM_CODE_SUBCOMPANY = "IWORK_SUBCOMPANY"; - private static final String SYSTEM_CODE_DEPARTMENT = "IWORK_DEPARTMENT"; private static final String JOB_CODE_PREFIX = "IWORK_JOB_"; private static final String DEFAULT_USER_PASSWORD = "Zgty@9527"; private static final int DEFAULT_SORT = 999; private final DeptService deptService; - private final DeptExternalCodeService deptExternalCodeService; private final PostService postService; private final PostMapper postMapper; private final AdminUserService adminUserService; private final AdminUserMapper adminUserMapper; - private final Map deptExternalCache = new ConcurrentHashMap<>(); + private final Map deptPresenceCache = new ConcurrentHashMap<>(); private final Map postCache = new ConcurrentHashMap<>(); @Override @@ -83,23 +77,23 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { iterator.remove(); continue; } - if (sub.getSubcompanyid1() == null) { + Integer externalId = sub.getSubcompanyid1(); + if (externalId == null) { log.warn("[iWork] 分部缺少标识,跳过:{}", sub.getSubcompanyname()); result.increaseFailed(); iterator.remove(); continue; } + Long deptId = externalId.longValue(); ParentHolder parentHolder = resolveSubcompanyParent(sub.getSupsubcomid()); if (parentHolder.required() && parentHolder.parentId() == null) { continue; } boolean canceled = isCanceledFlag(sub.getCanceled()); - DeptSaveReqVO saveReq = buildSubcompanySaveReq(sub, parentHolder.parentId(), canceled); + DeptSaveReqVO saveReq = buildSubcompanySaveReq(sub, deptId, parentHolder.parentId(), canceled); try { - DeptSyncOutcome outcome = upsertDept(saveReq, - SYSTEM_CODE_SUBCOMPANY, - sub.getSubcompanyid1().toString(), - sub.getSubcompanyname(), + DeptSyncOutcome outcome = upsertDept(deptId, + saveReq, canceled, options); applyDeptOutcome(result, outcome, "分部", sub.getSubcompanyname()); @@ -145,23 +139,23 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { iterator.remove(); continue; } - if (dept.getDepartmentid() == null) { + Integer externalId = dept.getDepartmentid(); + if (externalId == null) { log.warn("[iWork] 部门缺少标识,跳过:{}", dept.getDepartmentname()); result.increaseFailed(); iterator.remove(); continue; } + Long deptId = externalId.longValue(); ParentHolder parentHolder = resolveDepartmentParent(dept); if (parentHolder.required() && parentHolder.parentId() == null) { continue; } boolean canceled = isCanceledFlag(dept.getCanceled()); - DeptSaveReqVO saveReq = buildDepartmentSaveReq(dept, parentHolder.parentId(), canceled); + DeptSaveReqVO saveReq = buildDepartmentSaveReq(dept, deptId, parentHolder.parentId(), canceled); try { - DeptSyncOutcome outcome = upsertDept(saveReq, - SYSTEM_CODE_DEPARTMENT, - dept.getDepartmentid().toString(), - dept.getDepartmentname(), + DeptSyncOutcome outcome = upsertDept(deptId, + saveReq, canceled, options); applyDeptOutcome(result, outcome, "部门", dept.getDepartmentname()); @@ -285,31 +279,22 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { return result; } - private DeptSyncOutcome upsertDept(DeptSaveReqVO desired, - String systemCode, - String externalCode, - String externalName, + private DeptSyncOutcome upsertDept(Long deptId, + DeptSaveReqVO desired, boolean disabled, SyncOptions options) { - DeptExternalCodeDO mapping = getDeptMapping(systemCode, externalCode); - if (mapping == null) { - if (!options.isCreateIfMissing()) { - return new DeptSyncOutcome(SyncAction.SKIPPED, false, null); - } - Long deptId = deptService.createDept(desired); - persistDeptExternalCode(null, deptId, systemCode, externalCode, externalName, desired.getStatus()); - return new DeptSyncOutcome(SyncAction.CREATED, CommonStatusEnum.isDisable(desired.getStatus()), deptId); + if (deptId == null) { + return new DeptSyncOutcome(SyncAction.SKIPPED, false, null); } - Long deptId = mapping.getDeptId(); DeptDO existing = deptService.getDept(deptId); if (existing == null) { - deptExternalCache.remove(buildDeptCacheKey(systemCode, externalCode)); if (!options.isCreateIfMissing()) { return new DeptSyncOutcome(SyncAction.SKIPPED, false, null); } - Long recreatedId = deptService.createDept(desired); - persistDeptExternalCode(mapping.getId(), recreatedId, systemCode, externalCode, externalName, desired.getStatus()); - return new DeptSyncOutcome(SyncAction.CREATED, CommonStatusEnum.isDisable(desired.getStatus()), recreatedId); + desired.setId(deptId); + Long createdId = deptService.createDept(desired); + markDeptExists(createdId); + return new DeptSyncOutcome(SyncAction.CREATED, CommonStatusEnum.isDisable(desired.getStatus()), createdId); } if (!Objects.equals(existing.getDeptSource(), DeptSourceEnum.IWORK.getSource())) { return new DeptSyncOutcome(SyncAction.SKIPPED, false, existing.getId()); @@ -319,9 +304,9 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { } desired.setId(existing.getId()); mergeDeptDefaults(desired, existing); - boolean disabledChanged = CommonStatusEnum.isDisable(desired.getStatus()) && CommonStatusEnum.isEnable(existing.getStatus()); + boolean disabledChanged = disabled && CommonStatusEnum.isEnable(existing.getStatus()); deptService.updateDept(desired); - persistDeptExternalCode(mapping.getId(), existing.getId(), systemCode, externalCode, externalName, desired.getStatus()); + markDeptExists(existing.getId()); return new DeptSyncOutcome(SyncAction.UPDATED, disabledChanged, existing.getId()); } @@ -399,9 +384,11 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { } private DeptSaveReqVO buildSubcompanySaveReq(IWorkHrSubcompanyPageRespVO.Subcompany data, + Long deptId, Long parentId, boolean canceled) { DeptSaveReqVO req = new DeptSaveReqVO(); + req.setId(deptId); req.setName(limitLength(StrUtil.blankToDefault(data.getSubcompanyname(), "未命名分部"), 30)); req.setShortName(limitLength(data.getSubcompanyname(), 20)); req.setCode(trimToNull(data.getSubcompanycode())); @@ -415,9 +402,11 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { } private DeptSaveReqVO buildDepartmentSaveReq(IWorkHrDepartmentPageRespVO.Department data, + Long deptId, Long parentId, boolean canceled) { DeptSaveReqVO req = new DeptSaveReqVO(); + req.setId(deptId); req.setName(limitLength(StrUtil.blankToDefault(data.getDepartmentname(), "未命名部门"), 30)); req.setShortName(limitLength(StrUtil.blankToDefault(data.getDepartmentmark(), data.getDepartmentname()), 20)); req.setCode(trimToNull(data.getDepartmentcode())); @@ -469,80 +458,50 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { if (parentExternalId == null || parentExternalId <= 0) { return new ParentHolder(DeptDO.PARENT_ID_ROOT, false); } - Long parentId = resolveDeptId(SYSTEM_CODE_SUBCOMPANY, parentExternalId.toString()); - return new ParentHolder(parentId, true); + Long parentId = parentExternalId.longValue(); + if (hasDept(parentId)) { + return new ParentHolder(parentId, true); + } + return new ParentHolder(null, true); } private ParentHolder resolveDepartmentParent(IWorkHrDepartmentPageRespVO.Department dept) { Integer parentDeptId = dept.getParentdeptid(); if (parentDeptId != null && parentDeptId > 0) { - Long parentId = resolveDeptId(SYSTEM_CODE_DEPARTMENT, parentDeptId.toString()); - return new ParentHolder(parentId, true); + Long parentId = parentDeptId.longValue(); + if (hasDept(parentId)) { + return new ParentHolder(parentId, true); + } + return new ParentHolder(null, true); } Integer subcompanyId = dept.getSubcompanyid1(); if (subcompanyId != null && subcompanyId > 0) { - Long parentId = resolveDeptId(SYSTEM_CODE_SUBCOMPANY, subcompanyId.toString()); - return new ParentHolder(parentId, true); + Long parentId = subcompanyId.longValue(); + if (hasDept(parentId)) { + return new ParentHolder(parentId, true); + } + return new ParentHolder(null, true); } return new ParentHolder(DeptDO.PARENT_ID_ROOT, false); } - private DeptExternalCodeDO getDeptMapping(String systemCode, String externalCode) { - if (StrUtil.isBlank(externalCode)) { - return null; + private boolean hasDept(Long deptId) { + if (deptId == null) { + return false; } - String key = buildDeptCacheKey(systemCode, externalCode); - DeptExternalCodeDO cached = deptExternalCache.get(key); + Boolean cached = deptPresenceCache.get(deptId); if (cached != null) { return cached; } - DeptExternalCodeDO mapping = deptExternalCodeService.getBySystemCodeAndExternalCode(systemCode, externalCode); - if (mapping != null) { - deptExternalCache.put(key, mapping); + boolean exists = deptService.getDept(deptId) != null; + deptPresenceCache.put(deptId, exists); + return exists; + } + + private void markDeptExists(Long deptId) { + if (deptId != null) { + deptPresenceCache.put(deptId, true); } - return mapping; - } - - private void persistDeptExternalCode(Long mappingId, - Long deptId, - String systemCode, - String externalCode, - String externalName, - Integer status) { - DeptExternalCodeSaveReqVO req = new DeptExternalCodeSaveReqVO(); - req.setDeptId(deptId); - req.setSystemCode(systemCode); - req.setExternalDeptCode(externalCode); - req.setExternalDeptName(StrUtil.blankToDefault(externalName, externalCode)); - req.setStatus(status); - req.setRemark("iWork 同步"); - DeptExternalCodeDO mapping; - if (mappingId == null) { - Long id = deptExternalCodeService.createDeptExternalCode(req); - mapping = buildMapping(id, deptId, req); - } else { - req.setId(mappingId); - deptExternalCodeService.updateDeptExternalCode(req); - mapping = buildMapping(mappingId, deptId, req); - } - deptExternalCache.put(buildDeptCacheKey(systemCode, externalCode), mapping); - } - - private DeptExternalCodeDO buildMapping(Long id, Long deptId, DeptExternalCodeSaveReqVO req) { - DeptExternalCodeDO mapping = new DeptExternalCodeDO(); - mapping.setId(id); - mapping.setDeptId(deptId); - mapping.setSystemCode(req.getSystemCode()); - mapping.setExternalDeptCode(req.getExternalDeptCode()); - mapping.setExternalDeptName(req.getExternalDeptName()); - mapping.setStatus(req.getStatus()); - mapping.setRemark(req.getRemark()); - return mapping; - } - - private Long resolveDeptId(String systemCode, String externalCode) { - DeptExternalCodeDO mapping = getDeptMapping(systemCode, externalCode); - return mapping == null ? null : mapping.getDeptId(); } private PostDO resolvePostByCode(String code) { @@ -559,17 +518,13 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { } private Long resolveUserDeptId(IWorkHrUserPageRespVO.User user) { - if (user.getDepartmentid() != null) { - Long deptId = resolveDeptId(SYSTEM_CODE_DEPARTMENT, user.getDepartmentid().toString()); - if (deptId != null) { - return deptId; - } + Long deptId = toLong(user.getDepartmentid()); + if (deptId != null && hasDept(deptId)) { + return deptId; } - if (user.getSubcompanyid1() != null) { - Long deptId = resolveDeptId(SYSTEM_CODE_SUBCOMPANY, user.getSubcompanyid1().toString()); - if (deptId != null) { - return deptId; - } + Long subcompanyId = toLong(user.getSubcompanyid1()); + if (subcompanyId != null && hasDept(subcompanyId)) { + return subcompanyId; } return null; } @@ -670,6 +625,10 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { } } + private Long toLong(Integer value) { + return value == null ? null : value.longValue(); + } + private String resolveUsername(IWorkHrUserPageRespVO.User user) { String candidate = sanitizeUsername(user.getLoginid()); if (candidate == null) { @@ -737,11 +696,6 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { return JOB_CODE_PREFIX + jobTitleId; } - private String buildDeptCacheKey(String systemCode, String externalCode) { - Long tenantId = TenantContextHolder.getTenantId(); - return (tenantId == null ? "_" : tenantId.toString()) + "::" + systemCode + "::" + externalCode; - } - private String buildPostCacheKey(String code) { Long tenantId = TenantContextHolder.getTenantId(); return (tenantId == null ? "_" : tenantId.toString()) + "::POST::" + code;