Merge remote-tracking branch 'base-version/main' into dev

This commit is contained in:
chenbowen
2025-12-18 13:21:03 +08:00
3 changed files with 112 additions and 1047 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -84,20 +84,13 @@ public class DeptServiceImpl implements DeptService {
validateParentDept(null, createReqVO.getParentId()); validateParentDept(null, createReqVO.getParentId());
// 校验部门名的唯一性 // 校验部门名的唯一性
validateDeptNameUnique(null, createReqVO.getParentId(), createReqVO.getName()); validateDeptNameUnique(null, createReqVO.getParentId(), createReqVO.getName());
// 生成并校验部门编码 // 生成并校验部门编码所有来源统一走生成逻辑iWork 不再豁免)
boolean isIWorkSource = Objects.equals(createReqVO.getDeptSource(), DeptSourceEnum.IWORK.getSource()); if (Boolean.TRUE.equals(createReqVO.getDelayCodeGeneration())) {
if (isIWorkSource) { createReqVO.setCode(null);
// iWork 来源直接使用提供的编码,不再生成
String providedCode = StrUtil.blankToDefault(createReqVO.getCode(), null);
createReqVO.setCode(providedCode);
} else { } else {
if (Boolean.TRUE.equals(createReqVO.getDelayCodeGeneration())) { String resolvedCode = generateDeptCode(createReqVO.getParentId(), createReqVO.getDeptSource());
createReqVO.setCode(null); validateDeptCodeUnique(null, resolvedCode);
} else { createReqVO.setCode(resolvedCode);
String resolvedCode = generateDeptCode(createReqVO.getParentId(), createReqVO.getDeptSource());
validateDeptCodeUnique(null, resolvedCode);
createReqVO.setCode(resolvedCode);
}
} }
// 插入部门 // 插入部门
@@ -127,28 +120,21 @@ public class DeptServiceImpl implements DeptService {
validateParentDept(updateReqVO.getId(), updateReqVO.getParentId()); validateParentDept(updateReqVO.getId(), updateReqVO.getParentId());
// 校验部门名的唯一性 // 校验部门名的唯一性
validateDeptNameUnique(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getName()); validateDeptNameUnique(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getName());
boolean isIWorkSource = Objects.equals(originalDept.getDeptSource(), DeptSourceEnum.IWORK.getSource()); Integer source = ObjectUtil.defaultIfNull(updateReqVO.getDeptSource(), originalDept.getDeptSource());
if (isIWorkSource) { if (source == null) {
// iWork 来源直接使用提供的编码,不再生成 source = DeptSourceEnum.EXTERNAL.getSource();
String providedCode = StrUtil.blankToDefault(updateReqVO.getCode(), originalDept.getCode()); }
updateReqVO.setCode(providedCode); String existingCode = originalDept.getCode();
} else { if (StrUtil.isBlank(existingCode)) {
Integer source = ObjectUtil.defaultIfNull(updateReqVO.getDeptSource(), originalDept.getDeptSource()); if (Boolean.TRUE.equals(updateReqVO.getDelayCodeGeneration())) {
if (source == null) { updateReqVO.setCode(null);
source = DeptSourceEnum.EXTERNAL.getSource();
}
String existingCode = originalDept.getCode();
if (StrUtil.isBlank(existingCode)) {
if (Boolean.TRUE.equals(updateReqVO.getDelayCodeGeneration())) {
updateReqVO.setCode(null);
} else {
String newCode = generateDeptCode(updateReqVO.getParentId(), source);
validateDeptCodeUnique(updateReqVO.getId(), newCode);
updateReqVO.setCode(newCode);
}
} else { } else {
updateReqVO.setCode(existingCode); String newCode = generateDeptCode(updateReqVO.getParentId(), source);
validateDeptCodeUnique(updateReqVO.getId(), newCode);
updateReqVO.setCode(newCode);
} }
} else {
updateReqVO.setCode(existingCode);
} }
// 更新部门 // 更新部门

View File

@@ -105,7 +105,7 @@ public class DeptServiceImplTest extends BaseDbUnitTest {
childReq.setName("事业部"); childReq.setName("事业部");
childReq.setSort(1); childReq.setSort(1);
childReq.setStatus(CommonStatusEnum.ENABLE.getStatus()); childReq.setStatus(CommonStatusEnum.ENABLE.getStatus());
childReq.setDeptSource(1); childReq.setDeptSource(DeptSourceEnum.SYNC.getSource());
Long childId = deptService.createDept(childReq); Long childId = deptService.createDept(childReq);
DeptDO childDept = deptMapper.selectById(childId); DeptDO childDept = deptMapper.selectById(childId);
@@ -240,6 +240,74 @@ public class DeptServiceImplTest extends BaseDbUnitTest {
assertEquals("ZT001001", syncChildDept.getCode()); assertEquals("ZT001001", syncChildDept.getCode());
} }
@Test
public void testCreateDept_iWorkFollowsGenerationAndIgnoresCustomCode() {
// iWork 顶级也应走 ZT 序列,忽略自定义 code
DeptSaveReqVO iworkTop = new DeptSaveReqVO();
iworkTop.setParentId(DeptDO.PARENT_ID_ROOT);
iworkTop.setName("iWork 顶级");
iworkTop.setSort(1);
iworkTop.setStatus(CommonStatusEnum.ENABLE.getStatus());
iworkTop.setDeptSource(DeptSourceEnum.IWORK.getSource());
iworkTop.setCode("CUSTOM-ZT999");
Long topId = deptService.createDept(iworkTop);
DeptDO top = deptMapper.selectById(topId);
assertEquals("ZT001", top.getCode());
// 子级继承序列递增
DeptSaveReqVO childReq = new DeptSaveReqVO();
childReq.setParentId(topId);
childReq.setName("iWork 子");
childReq.setSort(1);
childReq.setStatus(CommonStatusEnum.ENABLE.getStatus());
childReq.setDeptSource(DeptSourceEnum.IWORK.getSource());
Long childId = deptService.createDept(childReq);
DeptDO child = deptMapper.selectById(childId);
assertEquals("ZT001001", child.getCode());
}
@Test
public void testUpdateDept_iWorkGeneratesOnceWhenMissingCode() {
// 先创建一个 iWork 顶级但延迟生成编码
DeptSaveReqVO createReq = new DeptSaveReqVO();
createReq.setParentId(DeptDO.PARENT_ID_ROOT);
createReq.setName("iWork 延迟");
createReq.setSort(1);
createReq.setStatus(CommonStatusEnum.ENABLE.getStatus());
createReq.setDeptSource(DeptSourceEnum.IWORK.getSource());
createReq.setDelayCodeGeneration(true);
Long deptId = deptService.createDept(createReq);
DeptDO created = deptMapper.selectById(deptId);
assertNull(created.getCode());
// 更新时生成一次编码
DeptSaveReqVO updateReq = new DeptSaveReqVO();
updateReq.setId(deptId);
updateReq.setParentId(DeptDO.PARENT_ID_ROOT);
updateReq.setName("iWork 延迟");
updateReq.setSort(1);
updateReq.setStatus(CommonStatusEnum.ENABLE.getStatus());
updateReq.setDeptSource(DeptSourceEnum.IWORK.getSource());
updateReq.setDelayCodeGeneration(false);
deptService.updateDept(updateReq);
DeptDO updated = deptMapper.selectById(deptId);
assertEquals("ZT001", updated.getCode());
// 再次更新(父级不变)保持编码不变
DeptSaveReqVO updateReq2 = new DeptSaveReqVO();
updateReq2.setId(deptId);
updateReq2.setParentId(DeptDO.PARENT_ID_ROOT);
updateReq2.setName("iWork 延迟2");
updateReq2.setSort(2);
updateReq2.setStatus(CommonStatusEnum.ENABLE.getStatus());
updateReq2.setDeptSource(DeptSourceEnum.IWORK.getSource());
deptService.updateDept(updateReq2);
DeptDO updated2 = deptMapper.selectById(deptId);
assertEquals("ZT001", updated2.getCode());
}
@Test @Test
public void testCreateDept_topLevelAutoCode_ignoreCustomInput() { public void testCreateDept_topLevelAutoCode_ignoreCustomInput() {
String customCode = "ROOT-001"; String customCode = "ROOT-001";
@@ -579,7 +647,7 @@ public class DeptServiceImplTest extends BaseDbUnitTest {
@Test @Test
public void testGetDept() { public void testGetDept() {
// mock 数据 // mock 数据
DeptDO deptDO = randomPojo(DeptDO.class).setDeptSource(1); DeptDO deptDO = randomPojo(DeptDO.class).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(deptDO); deptMapper.insert(deptDO);
// 准备参数 // 准备参数
Long id = deptDO.getId(); Long id = deptDO.getId();
@@ -593,9 +661,9 @@ public class DeptServiceImplTest extends BaseDbUnitTest {
@Test @Test
public void testGetDeptList_ids() { public void testGetDeptList_ids() {
// mock 数据 // mock 数据
DeptDO deptDO01 = randomPojo(DeptDO.class).setDeptSource(1); DeptDO deptDO01 = randomPojo(DeptDO.class).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(deptDO01); deptMapper.insert(deptDO01);
DeptDO deptDO02 = randomPojo(DeptDO.class).setDeptSource(1); DeptDO deptDO02 = randomPojo(DeptDO.class).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(deptDO02); deptMapper.insert(deptDO02);
// 准备参数 // 准备参数
List<Long> ids = Arrays.asList(deptDO01.getId(), deptDO02.getId()); List<Long> ids = Arrays.asList(deptDO01.getId(), deptDO02.getId());
@@ -616,7 +684,7 @@ public class DeptServiceImplTest extends BaseDbUnitTest {
o.setStatus(CommonStatusEnum.ENABLE.getStatus()); o.setStatus(CommonStatusEnum.ENABLE.getStatus());
o.setParentId(DeptDO.PARENT_ID_ROOT); o.setParentId(DeptDO.PARENT_ID_ROOT);
o.setSort(1); o.setSort(1);
}).setDeptSource(1); }).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(dept); deptMapper.insert(dept);
// 测试 name 不匹配 // 测试 name 不匹配
deptMapper.insert(ObjectUtils.cloneIgnoreId(dept, o -> { deptMapper.insert(ObjectUtils.cloneIgnoreId(dept, o -> {
@@ -647,14 +715,14 @@ public class DeptServiceImplTest extends BaseDbUnitTest {
o.setStatus(CommonStatusEnum.ENABLE.getStatus()); o.setStatus(CommonStatusEnum.ENABLE.getStatus());
o.setParentId(DeptDO.PARENT_ID_ROOT); o.setParentId(DeptDO.PARENT_ID_ROOT);
o.setSort(1); o.setSort(1);
}).setDeptSource(1); }).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(dept1); deptMapper.insert(dept1);
DeptDO dept2 = randomPojo(DeptDO.class, o -> { DeptDO dept2 = randomPojo(DeptDO.class, o -> {
o.setName("集团二部"); o.setName("集团二部");
o.setStatus(CommonStatusEnum.ENABLE.getStatus()); o.setStatus(CommonStatusEnum.ENABLE.getStatus());
o.setParentId(DeptDO.PARENT_ID_ROOT); o.setParentId(DeptDO.PARENT_ID_ROOT);
o.setSort(2); o.setSort(2);
}).setDeptSource(1); }).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(dept2); deptMapper.insert(dept2);
DeptDO otherDept = randomPojo(DeptDO.class, o -> { DeptDO otherDept = randomPojo(DeptDO.class, o -> {
o.setName("其他部门"); o.setName("其他部门");
@@ -678,14 +746,14 @@ public class DeptServiceImplTest extends BaseDbUnitTest {
@Test @Test
public void testGetChildDeptList() { public void testGetChildDeptList() {
// mock 数据1 级别子节点) // mock 数据1 级别子节点)
DeptDO dept1 = randomPojo(DeptDO.class, o -> o.setName("1")).setDeptSource(1); DeptDO dept1 = randomPojo(DeptDO.class, o -> o.setName("1")).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(dept1); deptMapper.insert(dept1);
DeptDO dept2 = randomPojo(DeptDO.class, o -> o.setName("2")).setDeptSource(1); DeptDO dept2 = randomPojo(DeptDO.class, o -> o.setName("2")).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(dept2); deptMapper.insert(dept2);
// mock 数据2 级子节点) // mock 数据2 级子节点)
DeptDO dept1a = randomPojo(DeptDO.class, o -> o.setName("1-a").setParentId(dept1.getId())).setDeptSource(1); DeptDO dept1a = randomPojo(DeptDO.class, o -> o.setName("1-a").setParentId(dept1.getId())).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(dept1a); deptMapper.insert(dept1a);
DeptDO dept2a = randomPojo(DeptDO.class, o -> o.setName("2-a").setParentId(dept2.getId())).setDeptSource(1); DeptDO dept2a = randomPojo(DeptDO.class, o -> o.setName("2-a").setParentId(dept2.getId())).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(dept2a); deptMapper.insert(dept2a);
// 准备参数 // 准备参数
Long id = dept1.getParentId(); Long id = dept1.getParentId();
@@ -701,14 +769,14 @@ public class DeptServiceImplTest extends BaseDbUnitTest {
@Test @Test
public void testGetChildDeptListFromCache() { public void testGetChildDeptListFromCache() {
// mock 数据1 级别子节点) // mock 数据1 级别子节点)
DeptDO dept1 = randomPojo(DeptDO.class, o -> o.setName("1")).setDeptSource(1); DeptDO dept1 = randomPojo(DeptDO.class, o -> o.setName("1")).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(dept1); deptMapper.insert(dept1);
DeptDO dept2 = randomPojo(DeptDO.class, o -> o.setName("2")).setDeptSource(1); DeptDO dept2 = randomPojo(DeptDO.class, o -> o.setName("2")).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(dept2); deptMapper.insert(dept2);
// mock 数据2 级子节点) // mock 数据2 级子节点)
DeptDO dept1a = randomPojo(DeptDO.class, o -> o.setName("1-a").setParentId(dept1.getId())).setDeptSource(1); DeptDO dept1a = randomPojo(DeptDO.class, o -> o.setName("1-a").setParentId(dept1.getId())).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(dept1a); deptMapper.insert(dept1a);
DeptDO dept2a = randomPojo(DeptDO.class, o -> o.setName("2-a").setParentId(dept2.getId())).setDeptSource(1); DeptDO dept2a = randomPojo(DeptDO.class, o -> o.setName("2-a").setParentId(dept2.getId())).setDeptSource(DeptSourceEnum.SYNC.getSource());
deptMapper.insert(dept2a); deptMapper.insert(dept2a);
// 准备参数 // 准备参数
Long id = dept1.getParentId(); Long id = dept1.getParentId();