Merge remote-tracking branch 'base-version/main' into dev
This commit is contained in:
@@ -5,11 +5,10 @@ import com.fasterxml.jackson.annotation.JsonAnySetter;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
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 lombok.Data;
|
||||
|
||||
import com.zt.plat.module.system.service.integration.iwork.jackson.LenientIntegerDeserializer;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
@@ -31,20 +30,89 @@ public class IWorkHrDepartmentPageRespVO {
|
||||
@Schema(description = "是否成功")
|
||||
private boolean success;
|
||||
|
||||
@Schema(description = "总条数")
|
||||
private Integer totalSize;
|
||||
@Schema(description = "iWork 返回的数据体")
|
||||
@JsonProperty("data")
|
||||
private PageData data;
|
||||
|
||||
@Schema(description = "总页数")
|
||||
private Integer totalPage;
|
||||
@JsonIgnore
|
||||
public Integer getTotalSize() {
|
||||
return data == null ? null : data.getTotalSize();
|
||||
}
|
||||
|
||||
@Schema(description = "每页条数")
|
||||
private Integer pageSize;
|
||||
@JsonIgnore
|
||||
public void setTotalSize(Integer totalSize) {
|
||||
ensureData().setTotalSize(totalSize);
|
||||
}
|
||||
|
||||
@Schema(description = "当前页码")
|
||||
private Integer pageNumber;
|
||||
@JsonIgnore
|
||||
public Integer getTotalPage() {
|
||||
return data == null ? null : data.getTotalPage();
|
||||
}
|
||||
|
||||
@Schema(description = "部门数据列表")
|
||||
private List<Department> dataList;
|
||||
@JsonIgnore
|
||||
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
|
||||
@Schema(description = "部门信息")
|
||||
@@ -52,8 +120,14 @@ public class IWorkHrDepartmentPageRespVO {
|
||||
|
||||
@Schema(description = "部门 ID")
|
||||
@JsonProperty("departmentid")
|
||||
@JsonDeserialize(using = LenientIntegerDeserializer.class)
|
||||
private Integer departmentid;
|
||||
|
||||
@Schema(description = "部门 ID(iWork 主键)")
|
||||
@JsonProperty("id")
|
||||
@JsonDeserialize(using = LenientIntegerDeserializer.class)
|
||||
private Integer id;
|
||||
|
||||
@Schema(description = "部门编码")
|
||||
@JsonProperty("departmentcode")
|
||||
private String departmentcode;
|
||||
@@ -68,6 +142,7 @@ public class IWorkHrDepartmentPageRespVO {
|
||||
|
||||
@Schema(description = "所属分部 ID")
|
||||
@JsonProperty("subcompanyid1")
|
||||
@JsonDeserialize(using = LenientIntegerDeserializer.class)
|
||||
private Integer subcompanyid1;
|
||||
|
||||
@Schema(description = "所属分部名称")
|
||||
@@ -76,6 +151,7 @@ public class IWorkHrDepartmentPageRespVO {
|
||||
|
||||
@Schema(description = "上级分部 ID")
|
||||
@JsonProperty("supsubcomid")
|
||||
@JsonDeserialize(using = LenientIntegerDeserializer.class)
|
||||
private Integer supsubcomid;
|
||||
|
||||
@Schema(description = "上级分部名称")
|
||||
@@ -84,6 +160,7 @@ public class IWorkHrDepartmentPageRespVO {
|
||||
|
||||
@Schema(description = "父部门 ID")
|
||||
@JsonProperty("parentdeptid")
|
||||
@JsonDeserialize(using = LenientIntegerDeserializer.class)
|
||||
private Integer parentdeptid;
|
||||
|
||||
@Schema(description = "父部门名称")
|
||||
@@ -113,6 +190,7 @@ public class IWorkHrDepartmentPageRespVO {
|
||||
|
||||
@Schema(description = "负责人 ID")
|
||||
@JsonProperty("managerid")
|
||||
@JsonDeserialize(using = LenientIntegerDeserializer.class)
|
||||
private Integer managerid;
|
||||
|
||||
@Schema(description = "负责人名称")
|
||||
|
||||
@@ -189,7 +189,7 @@ public class DeptServiceImpl implements DeptService {
|
||||
// 2. 父部门不存在
|
||||
DeptDO parentDept = deptMapper.selectById(parentId);
|
||||
if (parentDept == null) {
|
||||
throw exception(DEPT_PARENT_NOT_EXITS);
|
||||
return;
|
||||
}
|
||||
// 3. 递归校验父部门,如果父部门是自己的子部门,则报错,避免形成环路
|
||||
if (id == null) { // id 为空,说明新增,不需要考虑环路
|
||||
@@ -251,19 +251,18 @@ public class DeptServiceImpl implements DeptService {
|
||||
|
||||
private String generateDeptCode(Long parentId) {
|
||||
Long effectiveParentId = normalizeParentId(parentId);
|
||||
Long codeParentId = effectiveParentId;
|
||||
String prefix = ROOT_CODE_PREFIX;
|
||||
if (!DeptDO.PARENT_ID_ROOT.equals(effectiveParentId)) {
|
||||
DeptDO parentDept = deptMapper.selectById(effectiveParentId);
|
||||
if (parentDept == null) {
|
||||
throw exception(DEPT_PARENT_NOT_EXITS);
|
||||
if (parentDept == null || StrUtil.isBlank(parentDept.getCode())) {
|
||||
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);
|
||||
return prefix + formatSequence(nextSequence);
|
||||
}
|
||||
|
||||
@@ -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,16 @@ 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<String, DeptExternalCodeDO> deptExternalCache = new ConcurrentHashMap<>();
|
||||
private final Map<String, PostDO> postCache = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
@@ -83,23 +76,20 @@ 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,28 +135,25 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
|
||||
iterator.remove();
|
||||
continue;
|
||||
}
|
||||
if (dept.getDepartmentid() == null) {
|
||||
Integer externalId = dept.getId();
|
||||
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());
|
||||
} 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.withMessage("同步部门失败: " + ex.getMessage());
|
||||
}
|
||||
@@ -179,7 +166,7 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
|
||||
}
|
||||
if (!queue.isEmpty()) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
@@ -285,31 +272,21 @@ 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);
|
||||
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 +296,8 @@ 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());
|
||||
return new DeptSyncOutcome(SyncAction.UPDATED, disabledChanged, existing.getId());
|
||||
}
|
||||
|
||||
@@ -399,9 +375,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 +393,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()));
|
||||
@@ -467,82 +447,21 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
|
||||
|
||||
private ParentHolder resolveSubcompanyParent(Integer parentExternalId) {
|
||||
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(parentId, true);
|
||||
return new ParentHolder(parentExternalId.longValue());
|
||||
}
|
||||
|
||||
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 parentDeptId = toLong(dept.getParentdeptid());
|
||||
if (parentDeptId != null) {
|
||||
return new ParentHolder(parentDeptId);
|
||||
}
|
||||
Integer subcompanyId = dept.getSubcompanyid1();
|
||||
if (subcompanyId != null && subcompanyId > 0) {
|
||||
Long parentId = resolveDeptId(SYSTEM_CODE_SUBCOMPANY, subcompanyId.toString());
|
||||
return new ParentHolder(parentId, true);
|
||||
Long subcompanyId = toLong(dept.getSubcompanyid1());
|
||||
if (subcompanyId != null) {
|
||||
return new ParentHolder(subcompanyId);
|
||||
}
|
||||
return new ParentHolder(DeptDO.PARENT_ID_ROOT, false);
|
||||
}
|
||||
|
||||
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();
|
||||
return new ParentHolder(DeptDO.PARENT_ID_ROOT);
|
||||
}
|
||||
|
||||
private PostDO resolvePostByCode(String code) {
|
||||
@@ -559,17 +478,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) {
|
||||
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) {
|
||||
return subcompanyId;
|
||||
}
|
||||
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) {
|
||||
String candidate = sanitizeUsername(user.getLoginid());
|
||||
if (candidate == null) {
|
||||
@@ -737,11 +656,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;
|
||||
@@ -755,7 +669,7 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
|
||||
};
|
||||
}
|
||||
|
||||
private record ParentHolder(Long parentId, boolean required) {
|
||||
private record ParentHolder(Long parentId) {
|
||||
}
|
||||
|
||||
private enum SyncAction {
|
||||
|
||||
@@ -38,18 +38,21 @@ public class IWorkSyncServiceImpl implements IWorkSyncService {
|
||||
respVO.setBatches(batchStats);
|
||||
|
||||
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;
|
||||
IWorkSyncProcessor.SyncOptions options = buildFullSyncOptions(reqVO);
|
||||
if (scopes.contains(IWorkSyncEntityTypeEnum.SUBCOMPANY)) {
|
||||
if (syncSubcompanies) {
|
||||
processedPages += executeSubcompanyFullSync(reqVO, options, respVO.getSubcompanyStat(), batchStats);
|
||||
}
|
||||
if (scopes.contains(IWorkSyncEntityTypeEnum.DEPARTMENT)) {
|
||||
if (syncDepartments) {
|
||||
processedPages += executeDepartmentFullSync(reqVO, options, respVO.getDepartmentStat(), batchStats);
|
||||
}
|
||||
if (scopes.contains(IWorkSyncEntityTypeEnum.JOB_TITLE)) {
|
||||
processedPages += executeJobTitleFullSync(reqVO, options, respVO.getJobTitleStat(), batchStats);
|
||||
}
|
||||
if (scopes.contains(IWorkSyncEntityTypeEnum.USER)) {
|
||||
if (syncUsers) {
|
||||
processedPages += executeUserFullSync(reqVO, options, respVO.getUserStat(), batchStats);
|
||||
}
|
||||
respVO.setProcessedPages(processedPages);
|
||||
|
||||
@@ -523,8 +523,6 @@ public class AdminUserServiceImpl implements AdminUserService {
|
||||
validateMobileUnique(id, mobile);
|
||||
// 校验邮箱唯一
|
||||
validateEmailUnique(id, email);
|
||||
// 校验部门处于开启状态
|
||||
deptService.validateDeptList(deptIds);
|
||||
// 校验岗位处于开启状态
|
||||
postService.validatePostList(postIds);
|
||||
return user;
|
||||
|
||||
Reference in New Issue
Block a user