Merge branch 'dev' into test

This commit is contained in:
chenbowen
2025-11-25 23:27:22 +08:00
5 changed files with 149 additions and 157 deletions

View File

@@ -5,11 +5,10 @@ import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.zt.plat.module.system.service.integration.iwork.jackson.LenientIntegerDeserializer;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import com.zt.plat.module.system.service.integration.iwork.jackson.LenientIntegerDeserializer;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
@@ -31,20 +30,89 @@ public class IWorkHrDepartmentPageRespVO {
@Schema(description = "是否成功") @Schema(description = "是否成功")
private boolean success; private boolean success;
@Schema(description = "总条数") @Schema(description = "iWork 返回的数据体")
private Integer totalSize; @JsonProperty("data")
private PageData data;
@Schema(description = "总页数") @JsonIgnore
private Integer totalPage; public Integer getTotalSize() {
return data == null ? null : data.getTotalSize();
}
@Schema(description = "每页条数") @JsonIgnore
private Integer pageSize; public void setTotalSize(Integer totalSize) {
ensureData().setTotalSize(totalSize);
}
@Schema(description = "当前页码") @JsonIgnore
private Integer pageNumber; public Integer getTotalPage() {
return data == null ? null : data.getTotalPage();
}
@Schema(description = "部门数据列表") @JsonIgnore
private List<Department> dataList; public void setTotalPage(Integer totalPage) {
ensureData().setTotalPage(totalPage);
}
@JsonIgnore
public Integer getPageSize() {
return data == null ? null : data.getPageSize();
}
@JsonIgnore
public void setPageSize(Integer pageSize) {
ensureData().setPageSize(pageSize);
}
@JsonIgnore
public Integer getPageNumber() {
return data == null ? null : data.getPageNumber();
}
@JsonIgnore
public void setPageNumber(Integer pageNumber) {
ensureData().setPageNumber(pageNumber);
}
@JsonIgnore
public List<Department> getDataList() {
return data == null ? null : data.getDataList();
}
@JsonIgnore
public void setDataList(List<Department> dataList) {
ensureData().setDataList(dataList);
}
@JsonIgnore
private PageData ensureData() {
if (data == null) {
data = new PageData();
}
return data;
}
@Data
@Schema(description = "iWork 部门分页数据体")
public static class PageData {
@Schema(description = "总条数")
private Integer totalSize;
@Schema(description = "总页数")
private Integer totalPage;
@Schema(description = "每页条数")
private Integer pageSize;
@Schema(description = "当前页码")
@JsonProperty("page")
private Integer pageNumber;
@Schema(description = "部门数据列表")
@JsonProperty("dataList")
private List<Department> dataList;
}
@Data @Data
@Schema(description = "部门信息") @Schema(description = "部门信息")
@@ -52,8 +120,14 @@ public class IWorkHrDepartmentPageRespVO {
@Schema(description = "部门 ID") @Schema(description = "部门 ID")
@JsonProperty("departmentid") @JsonProperty("departmentid")
@JsonDeserialize(using = LenientIntegerDeserializer.class)
private Integer departmentid; private Integer departmentid;
@Schema(description = "部门 IDiWork 主键)")
@JsonProperty("id")
@JsonDeserialize(using = LenientIntegerDeserializer.class)
private Integer id;
@Schema(description = "部门编码") @Schema(description = "部门编码")
@JsonProperty("departmentcode") @JsonProperty("departmentcode")
private String departmentcode; private String departmentcode;
@@ -68,6 +142,7 @@ public class IWorkHrDepartmentPageRespVO {
@Schema(description = "所属分部 ID") @Schema(description = "所属分部 ID")
@JsonProperty("subcompanyid1") @JsonProperty("subcompanyid1")
@JsonDeserialize(using = LenientIntegerDeserializer.class)
private Integer subcompanyid1; private Integer subcompanyid1;
@Schema(description = "所属分部名称") @Schema(description = "所属分部名称")
@@ -76,6 +151,7 @@ public class IWorkHrDepartmentPageRespVO {
@Schema(description = "上级分部 ID") @Schema(description = "上级分部 ID")
@JsonProperty("supsubcomid") @JsonProperty("supsubcomid")
@JsonDeserialize(using = LenientIntegerDeserializer.class)
private Integer supsubcomid; private Integer supsubcomid;
@Schema(description = "上级分部名称") @Schema(description = "上级分部名称")
@@ -84,6 +160,7 @@ public class IWorkHrDepartmentPageRespVO {
@Schema(description = "父部门 ID") @Schema(description = "父部门 ID")
@JsonProperty("parentdeptid") @JsonProperty("parentdeptid")
@JsonDeserialize(using = LenientIntegerDeserializer.class)
private Integer parentdeptid; private Integer parentdeptid;
@Schema(description = "父部门名称") @Schema(description = "父部门名称")
@@ -113,6 +190,7 @@ public class IWorkHrDepartmentPageRespVO {
@Schema(description = "负责人 ID") @Schema(description = "负责人 ID")
@JsonProperty("managerid") @JsonProperty("managerid")
@JsonDeserialize(using = LenientIntegerDeserializer.class)
private Integer managerid; private Integer managerid;
@Schema(description = "负责人名称") @Schema(description = "负责人名称")

View File

@@ -189,7 +189,7 @@ public class DeptServiceImpl implements DeptService {
// 2. 父部门不存在 // 2. 父部门不存在
DeptDO parentDept = deptMapper.selectById(parentId); DeptDO parentDept = deptMapper.selectById(parentId);
if (parentDept == null) { if (parentDept == null) {
throw exception(DEPT_PARENT_NOT_EXITS); return;
} }
// 3. 递归校验父部门,如果父部门是自己的子部门,则报错,避免形成环路 // 3. 递归校验父部门,如果父部门是自己的子部门,则报错,避免形成环路
if (id == null) { // id 为空,说明新增,不需要考虑环路 if (id == null) { // id 为空,说明新增,不需要考虑环路
@@ -251,19 +251,18 @@ public class DeptServiceImpl implements DeptService {
private String generateDeptCode(Long parentId) { private String generateDeptCode(Long parentId) {
Long effectiveParentId = normalizeParentId(parentId); Long effectiveParentId = normalizeParentId(parentId);
Long codeParentId = effectiveParentId;
String prefix = ROOT_CODE_PREFIX; String prefix = ROOT_CODE_PREFIX;
if (!DeptDO.PARENT_ID_ROOT.equals(effectiveParentId)) { if (!DeptDO.PARENT_ID_ROOT.equals(effectiveParentId)) {
DeptDO parentDept = deptMapper.selectById(effectiveParentId); DeptDO parentDept = deptMapper.selectById(effectiveParentId);
if (parentDept == null) { if (parentDept == null || StrUtil.isBlank(parentDept.getCode())) {
throw exception(DEPT_PARENT_NOT_EXITS); codeParentId = DeptDO.PARENT_ID_ROOT;
} else {
prefix = parentDept.getCode();
} }
if (StrUtil.isBlank(parentDept.getCode())) {
throw exception(DEPT_PARENT_CODE_NOT_INITIALIZED);
}
prefix = parentDept.getCode();
} }
int nextSequence = determineNextSequence(effectiveParentId, prefix); int nextSequence = determineNextSequence(codeParentId, prefix);
assertSequenceRange(nextSequence); assertSequenceRange(nextSequence);
return prefix + formatSequence(nextSequence); return prefix + formatSequence(nextSequence);
} }

View File

@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.zt.plat.framework.common.enums.CommonStatusEnum; import com.zt.plat.framework.common.enums.CommonStatusEnum;
import com.zt.plat.framework.tenant.core.context.TenantContextHolder; 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.dept.DeptSaveReqVO;
import com.zt.plat.module.system.controller.admin.dept.vo.post.PostSaveReqVO; import com.zt.plat.module.system.controller.admin.dept.vo.post.PostSaveReqVO;
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkHrDepartmentPageRespVO; 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.integration.iwork.vo.IWorkHrUserPageRespVO;
import com.zt.plat.module.system.controller.admin.user.vo.user.UserSaveReqVO; 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.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.dept.PostDO;
import com.zt.plat.module.system.dal.dataobject.user.AdminUserDO; import com.zt.plat.module.system.dal.dataobject.user.AdminUserDO;
import com.zt.plat.module.system.dal.mysql.dept.PostMapper; 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.common.SexEnum;
import com.zt.plat.module.system.enums.dept.DeptSourceEnum; import com.zt.plat.module.system.enums.dept.DeptSourceEnum;
import com.zt.plat.module.system.enums.user.UserSourceEnum; 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.DeptService;
import com.zt.plat.module.system.service.dept.PostService; import com.zt.plat.module.system.service.dept.PostService;
import com.zt.plat.module.system.service.integration.iwork.IWorkSyncProcessor; import com.zt.plat.module.system.service.integration.iwork.IWorkSyncProcessor;
@@ -46,20 +43,16 @@ import java.util.concurrent.ConcurrentHashMap;
@RequiredArgsConstructor @RequiredArgsConstructor
public class IWorkSyncProcessorImpl implements IWorkSyncProcessor { 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 JOB_CODE_PREFIX = "IWORK_JOB_";
private static final String DEFAULT_USER_PASSWORD = "Zgty@9527"; private static final String DEFAULT_USER_PASSWORD = "Zgty@9527";
private static final int DEFAULT_SORT = 999; private static final int DEFAULT_SORT = 999;
private final DeptService deptService; private final DeptService deptService;
private final DeptExternalCodeService deptExternalCodeService;
private final PostService postService; private final PostService postService;
private final PostMapper postMapper; private final PostMapper postMapper;
private final AdminUserService adminUserService; private final AdminUserService adminUserService;
private final AdminUserMapper adminUserMapper; private final AdminUserMapper adminUserMapper;
private final Map<String, DeptExternalCodeDO> deptExternalCache = new ConcurrentHashMap<>();
private final Map<String, PostDO> postCache = new ConcurrentHashMap<>(); private final Map<String, PostDO> postCache = new ConcurrentHashMap<>();
@Override @Override
@@ -83,23 +76,20 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
iterator.remove(); iterator.remove();
continue; continue;
} }
if (sub.getSubcompanyid1() == null) { Integer externalId = sub.getSubcompanyid1();
if (externalId == null) {
log.warn("[iWork] 分部缺少标识,跳过:{}", sub.getSubcompanyname()); log.warn("[iWork] 分部缺少标识,跳过:{}", sub.getSubcompanyname());
result.increaseFailed(); result.increaseFailed();
iterator.remove(); iterator.remove();
continue; continue;
} }
Long deptId = externalId.longValue();
ParentHolder parentHolder = resolveSubcompanyParent(sub.getSupsubcomid()); ParentHolder parentHolder = resolveSubcompanyParent(sub.getSupsubcomid());
if (parentHolder.required() && parentHolder.parentId() == null) {
continue;
}
boolean canceled = isCanceledFlag(sub.getCanceled()); boolean canceled = isCanceledFlag(sub.getCanceled());
DeptSaveReqVO saveReq = buildSubcompanySaveReq(sub, parentHolder.parentId(), canceled); DeptSaveReqVO saveReq = buildSubcompanySaveReq(sub, deptId, parentHolder.parentId(), canceled);
try { try {
DeptSyncOutcome outcome = upsertDept(saveReq, DeptSyncOutcome outcome = upsertDept(deptId,
SYSTEM_CODE_SUBCOMPANY, saveReq,
sub.getSubcompanyid1().toString(),
sub.getSubcompanyname(),
canceled, canceled,
options); options);
applyDeptOutcome(result, outcome, "分部", sub.getSubcompanyname()); applyDeptOutcome(result, outcome, "分部", sub.getSubcompanyname());
@@ -145,28 +135,25 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
iterator.remove(); iterator.remove();
continue; continue;
} }
if (dept.getDepartmentid() == null) { Integer externalId = dept.getId();
if (externalId == null) {
log.warn("[iWork] 部门缺少标识,跳过:{}", dept.getDepartmentname()); log.warn("[iWork] 部门缺少标识,跳过:{}", dept.getDepartmentname());
result.increaseFailed(); result.increaseFailed();
iterator.remove(); iterator.remove();
continue; continue;
} }
Long deptId = externalId.longValue();
ParentHolder parentHolder = resolveDepartmentParent(dept); ParentHolder parentHolder = resolveDepartmentParent(dept);
if (parentHolder.required() && parentHolder.parentId() == null) {
continue;
}
boolean canceled = isCanceledFlag(dept.getCanceled()); boolean canceled = isCanceledFlag(dept.getCanceled());
DeptSaveReqVO saveReq = buildDepartmentSaveReq(dept, parentHolder.parentId(), canceled); DeptSaveReqVO saveReq = buildDepartmentSaveReq(dept, deptId, parentHolder.parentId(), canceled);
try { try {
DeptSyncOutcome outcome = upsertDept(saveReq, DeptSyncOutcome outcome = upsertDept(deptId,
SYSTEM_CODE_DEPARTMENT, saveReq,
dept.getDepartmentid().toString(),
dept.getDepartmentname(),
canceled, canceled,
options); options);
applyDeptOutcome(result, outcome, "部门", dept.getDepartmentname()); applyDeptOutcome(result, outcome, "部门", dept.getDepartmentname());
} catch (Exception ex) { } catch (Exception ex) {
log.error("[iWork] 同步部门失败: id={} name={}", dept.getDepartmentid(), dept.getDepartmentname(), ex); log.error("[iWork] 同步部门失败: id={} name={}", dept.getId(), dept.getDepartmentname(), ex);
result.increaseFailed(); result.increaseFailed();
result.withMessage("同步部门失败: " + ex.getMessage()); result.withMessage("同步部门失败: " + ex.getMessage());
} }
@@ -179,7 +166,7 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
} }
if (!queue.isEmpty()) { if (!queue.isEmpty()) {
for (IWorkHrDepartmentPageRespVO.Department remaining : queue) { for (IWorkHrDepartmentPageRespVO.Department remaining : queue) {
log.warn("[iWork] 部门因父级缺失未同步: id={} name={}", remaining.getDepartmentid(), remaining.getDepartmentname()); log.warn("[iWork] 部门因父级缺失未同步: id={} name={}", remaining.getId(), remaining.getDepartmentname());
result.increaseFailed(); result.increaseFailed();
} }
} }
@@ -285,31 +272,21 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
return result; return result;
} }
private DeptSyncOutcome upsertDept(DeptSaveReqVO desired, private DeptSyncOutcome upsertDept(Long deptId,
String systemCode, DeptSaveReqVO desired,
String externalCode,
String externalName,
boolean disabled, boolean disabled,
SyncOptions options) { SyncOptions options) {
DeptExternalCodeDO mapping = getDeptMapping(systemCode, externalCode); if (deptId == null) {
if (mapping == null) { return new DeptSyncOutcome(SyncAction.SKIPPED, false, 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);
} }
Long deptId = mapping.getDeptId();
DeptDO existing = deptService.getDept(deptId); DeptDO existing = deptService.getDept(deptId);
if (existing == null) { if (existing == null) {
deptExternalCache.remove(buildDeptCacheKey(systemCode, externalCode));
if (!options.isCreateIfMissing()) { if (!options.isCreateIfMissing()) {
return new DeptSyncOutcome(SyncAction.SKIPPED, false, null); return new DeptSyncOutcome(SyncAction.SKIPPED, false, null);
} }
Long recreatedId = deptService.createDept(desired); desired.setId(deptId);
persistDeptExternalCode(mapping.getId(), recreatedId, systemCode, externalCode, externalName, desired.getStatus()); Long createdId = deptService.createDept(desired);
return new DeptSyncOutcome(SyncAction.CREATED, CommonStatusEnum.isDisable(desired.getStatus()), recreatedId); return new DeptSyncOutcome(SyncAction.CREATED, CommonStatusEnum.isDisable(desired.getStatus()), createdId);
} }
if (!Objects.equals(existing.getDeptSource(), DeptSourceEnum.IWORK.getSource())) { if (!Objects.equals(existing.getDeptSource(), DeptSourceEnum.IWORK.getSource())) {
return new DeptSyncOutcome(SyncAction.SKIPPED, false, existing.getId()); return new DeptSyncOutcome(SyncAction.SKIPPED, false, existing.getId());
@@ -319,9 +296,8 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
} }
desired.setId(existing.getId()); desired.setId(existing.getId());
mergeDeptDefaults(desired, existing); mergeDeptDefaults(desired, existing);
boolean disabledChanged = CommonStatusEnum.isDisable(desired.getStatus()) && CommonStatusEnum.isEnable(existing.getStatus()); boolean disabledChanged = disabled && CommonStatusEnum.isEnable(existing.getStatus());
deptService.updateDept(desired); deptService.updateDept(desired);
persistDeptExternalCode(mapping.getId(), existing.getId(), systemCode, externalCode, externalName, desired.getStatus());
return new DeptSyncOutcome(SyncAction.UPDATED, disabledChanged, existing.getId()); return new DeptSyncOutcome(SyncAction.UPDATED, disabledChanged, existing.getId());
} }
@@ -399,9 +375,11 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
} }
private DeptSaveReqVO buildSubcompanySaveReq(IWorkHrSubcompanyPageRespVO.Subcompany data, private DeptSaveReqVO buildSubcompanySaveReq(IWorkHrSubcompanyPageRespVO.Subcompany data,
Long deptId,
Long parentId, Long parentId,
boolean canceled) { boolean canceled) {
DeptSaveReqVO req = new DeptSaveReqVO(); DeptSaveReqVO req = new DeptSaveReqVO();
req.setId(deptId);
req.setName(limitLength(StrUtil.blankToDefault(data.getSubcompanyname(), "未命名分部"), 30)); req.setName(limitLength(StrUtil.blankToDefault(data.getSubcompanyname(), "未命名分部"), 30));
req.setShortName(limitLength(data.getSubcompanyname(), 20)); req.setShortName(limitLength(data.getSubcompanyname(), 20));
req.setCode(trimToNull(data.getSubcompanycode())); req.setCode(trimToNull(data.getSubcompanycode()));
@@ -415,9 +393,11 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
} }
private DeptSaveReqVO buildDepartmentSaveReq(IWorkHrDepartmentPageRespVO.Department data, private DeptSaveReqVO buildDepartmentSaveReq(IWorkHrDepartmentPageRespVO.Department data,
Long deptId,
Long parentId, Long parentId,
boolean canceled) { boolean canceled) {
DeptSaveReqVO req = new DeptSaveReqVO(); DeptSaveReqVO req = new DeptSaveReqVO();
req.setId(deptId);
req.setName(limitLength(StrUtil.blankToDefault(data.getDepartmentname(), "未命名部门"), 30)); req.setName(limitLength(StrUtil.blankToDefault(data.getDepartmentname(), "未命名部门"), 30));
req.setShortName(limitLength(StrUtil.blankToDefault(data.getDepartmentmark(), data.getDepartmentname()), 20)); req.setShortName(limitLength(StrUtil.blankToDefault(data.getDepartmentmark(), data.getDepartmentname()), 20));
req.setCode(trimToNull(data.getDepartmentcode())); req.setCode(trimToNull(data.getDepartmentcode()));
@@ -467,82 +447,21 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
private ParentHolder resolveSubcompanyParent(Integer parentExternalId) { private ParentHolder resolveSubcompanyParent(Integer parentExternalId) {
if (parentExternalId == null || parentExternalId <= 0) { if (parentExternalId == null || parentExternalId <= 0) {
return new ParentHolder(DeptDO.PARENT_ID_ROOT, false); return new ParentHolder(DeptDO.PARENT_ID_ROOT);
} }
Long parentId = resolveDeptId(SYSTEM_CODE_SUBCOMPANY, parentExternalId.toString()); return new ParentHolder(parentExternalId.longValue());
return new ParentHolder(parentId, true);
} }
private ParentHolder resolveDepartmentParent(IWorkHrDepartmentPageRespVO.Department dept) { private ParentHolder resolveDepartmentParent(IWorkHrDepartmentPageRespVO.Department dept) {
Integer parentDeptId = dept.getParentdeptid(); Long parentDeptId = toLong(dept.getParentdeptid());
if (parentDeptId != null && parentDeptId > 0) { if (parentDeptId != null) {
Long parentId = resolveDeptId(SYSTEM_CODE_DEPARTMENT, parentDeptId.toString()); return new ParentHolder(parentDeptId);
return new ParentHolder(parentId, true);
} }
Integer subcompanyId = dept.getSubcompanyid1(); Long subcompanyId = toLong(dept.getSubcompanyid1());
if (subcompanyId != null && subcompanyId > 0) { if (subcompanyId != null) {
Long parentId = resolveDeptId(SYSTEM_CODE_SUBCOMPANY, subcompanyId.toString()); return new ParentHolder(subcompanyId);
return new ParentHolder(parentId, true);
} }
return new ParentHolder(DeptDO.PARENT_ID_ROOT, false); return new ParentHolder(DeptDO.PARENT_ID_ROOT);
}
private DeptExternalCodeDO getDeptMapping(String systemCode, String externalCode) {
if (StrUtil.isBlank(externalCode)) {
return null;
}
String key = buildDeptCacheKey(systemCode, externalCode);
DeptExternalCodeDO cached = deptExternalCache.get(key);
if (cached != null) {
return cached;
}
DeptExternalCodeDO mapping = deptExternalCodeService.getBySystemCodeAndExternalCode(systemCode, externalCode);
if (mapping != null) {
deptExternalCache.put(key, mapping);
}
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) { private PostDO resolvePostByCode(String code) {
@@ -559,17 +478,13 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
} }
private Long resolveUserDeptId(IWorkHrUserPageRespVO.User user) { private Long resolveUserDeptId(IWorkHrUserPageRespVO.User user) {
if (user.getDepartmentid() != null) { Long deptId = toLong(user.getDepartmentid());
Long deptId = resolveDeptId(SYSTEM_CODE_DEPARTMENT, user.getDepartmentid().toString()); if (deptId != null) {
if (deptId != null) { return deptId;
return deptId;
}
} }
if (user.getSubcompanyid1() != null) { Long subcompanyId = toLong(user.getSubcompanyid1());
Long deptId = resolveDeptId(SYSTEM_CODE_SUBCOMPANY, user.getSubcompanyid1().toString()); if (subcompanyId != null) {
if (deptId != null) { return subcompanyId;
return deptId;
}
} }
return null; return null;
} }
@@ -670,6 +585,10 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
} }
} }
private Long toLong(Integer value) {
return value == null ? null : value.longValue();
}
private String resolveUsername(IWorkHrUserPageRespVO.User user) { private String resolveUsername(IWorkHrUserPageRespVO.User user) {
String candidate = sanitizeUsername(user.getLoginid()); String candidate = sanitizeUsername(user.getLoginid());
if (candidate == null) { if (candidate == null) {
@@ -737,11 +656,6 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
return JOB_CODE_PREFIX + jobTitleId; 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) { private String buildPostCacheKey(String code) {
Long tenantId = TenantContextHolder.getTenantId(); Long tenantId = TenantContextHolder.getTenantId();
return (tenantId == null ? "_" : tenantId.toString()) + "::POST::" + code; return (tenantId == null ? "_" : tenantId.toString()) + "::POST::" + code;
@@ -755,7 +669,7 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
}; };
} }
private record ParentHolder(Long parentId, boolean required) { private record ParentHolder(Long parentId) {
} }
private enum SyncAction { private enum SyncAction {

View File

@@ -38,18 +38,21 @@ public class IWorkSyncServiceImpl implements IWorkSyncService {
respVO.setBatches(batchStats); respVO.setBatches(batchStats);
Set<IWorkSyncEntityTypeEnum> scopes = reqVO.resolveScopes(); Set<IWorkSyncEntityTypeEnum> scopes = reqVO.resolveScopes();
boolean syncUsers = scopes.contains(IWorkSyncEntityTypeEnum.USER);
boolean syncDepartments = scopes.contains(IWorkSyncEntityTypeEnum.DEPARTMENT) || syncUsers;
boolean syncSubcompanies = scopes.contains(IWorkSyncEntityTypeEnum.SUBCOMPANY) || syncDepartments;
int processedPages = 0; int processedPages = 0;
IWorkSyncProcessor.SyncOptions options = buildFullSyncOptions(reqVO); IWorkSyncProcessor.SyncOptions options = buildFullSyncOptions(reqVO);
if (scopes.contains(IWorkSyncEntityTypeEnum.SUBCOMPANY)) { if (syncSubcompanies) {
processedPages += executeSubcompanyFullSync(reqVO, options, respVO.getSubcompanyStat(), batchStats); processedPages += executeSubcompanyFullSync(reqVO, options, respVO.getSubcompanyStat(), batchStats);
} }
if (scopes.contains(IWorkSyncEntityTypeEnum.DEPARTMENT)) { if (syncDepartments) {
processedPages += executeDepartmentFullSync(reqVO, options, respVO.getDepartmentStat(), batchStats); processedPages += executeDepartmentFullSync(reqVO, options, respVO.getDepartmentStat(), batchStats);
} }
if (scopes.contains(IWorkSyncEntityTypeEnum.JOB_TITLE)) { if (scopes.contains(IWorkSyncEntityTypeEnum.JOB_TITLE)) {
processedPages += executeJobTitleFullSync(reqVO, options, respVO.getJobTitleStat(), batchStats); processedPages += executeJobTitleFullSync(reqVO, options, respVO.getJobTitleStat(), batchStats);
} }
if (scopes.contains(IWorkSyncEntityTypeEnum.USER)) { if (syncUsers) {
processedPages += executeUserFullSync(reqVO, options, respVO.getUserStat(), batchStats); processedPages += executeUserFullSync(reqVO, options, respVO.getUserStat(), batchStats);
} }
respVO.setProcessedPages(processedPages); respVO.setProcessedPages(processedPages);

View File

@@ -523,8 +523,6 @@ public class AdminUserServiceImpl implements AdminUserService {
validateMobileUnique(id, mobile); validateMobileUnique(id, mobile);
// 校验邮箱唯一 // 校验邮箱唯一
validateEmailUnique(id, email); validateEmailUnique(id, email);
// 校验部门处于开启状态
deptService.validateDeptList(deptIds);
// 校验岗位处于开启状态 // 校验岗位处于开启状态
postService.validatePostList(postIds); postService.validatePostList(postIds);
return user; return user;