From b6f5649b979a627ab9eba89eb837b68c59a92660 Mon Sep 17 00:00:00 2001 From: chenbowen Date: Tue, 16 Dec 2025 14:00:52 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=96=B0=E5=A2=9E=E7=94=9F=E6=88=90?= =?UTF-8?q?=E8=87=AA=E6=9C=89=E7=BB=84=E7=BB=87=20CODE=EF=BC=8C=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=85=B6=E4=BB=96=E7=B3=BB=E7=BB=9F=E9=A2=9D=E5=A4=96?= =?UTF-8?q?=E7=94=9F=E6=88=90=E7=BC=96=E7=A0=81=E6=98=A0=E5=B0=84=E5=85=B3?= =?UTF-8?q?=E7=B3=BB=EF=BC=8C=E6=B7=BB=E5=8A=A0=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dept/DeptExternalCodeServiceImplTest.java | 91 +++++++++++++ .../service/dept/DeptServiceImplTest.java | 121 +++++++++++++++++- 2 files changed, 209 insertions(+), 3 deletions(-) diff --git a/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/dept/DeptExternalCodeServiceImplTest.java b/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/dept/DeptExternalCodeServiceImplTest.java index 1c275951..dbcc7371 100644 --- a/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/dept/DeptExternalCodeServiceImplTest.java +++ b/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/dept/DeptExternalCodeServiceImplTest.java @@ -4,6 +4,7 @@ import com.zt.plat.framework.common.enums.CommonStatusEnum; import com.zt.plat.framework.test.core.ut.BaseDbUnitTest; import com.zt.plat.module.system.controller.admin.dept.vo.depexternalcode.DeptExternalCodeSaveReqVO; 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.mysql.dept.DeptExternalCodeMapper; import com.zt.plat.module.system.dal.mysql.dept.DeptMapper; import com.zt.plat.module.system.dal.redis.RedisKeyConstants; @@ -17,6 +18,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import java.util.List; +import java.util.Objects; import static com.zt.plat.module.system.dal.redis.RedisKeyConstants.DEPT_EXTERNAL_CODE_LIST; import static org.junit.jupiter.api.Assertions.*; @@ -102,4 +104,93 @@ class DeptExternalCodeServiceImplTest extends BaseDbUnitTest { assertEquals(firstId, secondId); assertEquals("OA-002", deptExternalCodeMapper.selectById(firstId).getExternalDeptCode()); } + + @Test + void testMultiSystemCoexistenceAndCrossSystemReuse() { + Long deptId = 200L; + DeptDO dept = new DeptDO(); + dept.setId(deptId); + dept.setName("多系统部门"); + dept.setCode("ZT200"); + dept.setStatus(CommonStatusEnum.ENABLE.getStatus()); + deptMapper.insert(dept); + + deptExternalCodeService.saveOrUpdateDeptExternalCode(deptId, "ERP", "CODE-001", "ERP编码", CommonStatusEnum.ENABLE.getStatus()); + deptExternalCodeService.saveOrUpdateDeptExternalCode(deptId, "OA", "CODE-001", "OA编码", CommonStatusEnum.ENABLE.getStatus()); + + List list = deptExternalCodeService.getDeptExternalCodeListByDeptId(deptId); + assertEquals(2, list.size()); + assertTrue(list.stream().anyMatch(it -> Objects.equals("ERP", it.getSystemCode()) && Objects.equals("CODE-001", it.getExternalDeptCode()))); + assertTrue(list.stream().anyMatch(it -> Objects.equals("OA", it.getSystemCode()) && Objects.equals("CODE-001", it.getExternalDeptCode()))); + assertNotNull(cacheManager.getCache(DEPT_EXTERNAL_CODE_LIST).get(deptId)); + } + + @Test + void testConflictDisablesPreviousActiveMappingAndEvictsCache() { + Long deptAId = 201L; + Long deptBId = 202L; + + DeptDO deptA = new DeptDO(); + deptA.setId(deptAId); + deptA.setName("部门A"); + deptA.setCode("ZTA"); + deptA.setStatus(CommonStatusEnum.ENABLE.getStatus()); + deptMapper.insert(deptA); + + DeptDO deptB = new DeptDO(); + deptB.setId(deptBId); + deptB.setName("部门B"); + deptB.setCode("ZTB"); + deptB.setStatus(CommonStatusEnum.ENABLE.getStatus()); + deptMapper.insert(deptB); + + // A 先建立启用映射并预热缓存 + deptExternalCodeService.saveOrUpdateDeptExternalCode(deptAId, "ERP", "X-001", "ERP-A", CommonStatusEnum.ENABLE.getStatus()); + deptExternalCodeService.getDeptExternalCodeListByDeptId(deptAId); + assertNotNull(cacheManager.getCache(DEPT_EXTERNAL_CODE_LIST).get(deptAId)); + + // B 使用同 system+external,占用后应禁用 A 的映射并驱逐 A 缓存 + Long newId = deptExternalCodeService.saveOrUpdateDeptExternalCode(deptBId, "ERP", "X-001", "ERP-B", CommonStatusEnum.ENABLE.getStatus()); + + DeptExternalCodeDO oldRecord = deptExternalCodeMapper.selectBySystemCodeAndDeptId("ERP", deptAId); + DeptExternalCodeDO newRecord = deptExternalCodeMapper.selectById(newId); + assertNotNull(oldRecord); + assertNotNull(newRecord); + assertEquals(CommonStatusEnum.DISABLE.getStatus(), oldRecord.getStatus()); + assertEquals(CommonStatusEnum.ENABLE.getStatus(), newRecord.getStatus()); + assertNull(cacheManager.getCache(DEPT_EXTERNAL_CODE_LIST).get(deptAId)); + } + + @Test + void testDisabledConflictDoesNotBlockNewMapping() { + Long deptAId = 203L; + Long deptBId = 204L; + + DeptDO deptA = new DeptDO(); + deptA.setId(deptAId); + deptA.setName("停用部门"); + deptA.setCode("ZTDIS"); + deptA.setStatus(CommonStatusEnum.ENABLE.getStatus()); + deptMapper.insert(deptA); + + DeptDO deptB = new DeptDO(); + deptB.setId(deptBId); + deptB.setName("新部门"); + deptB.setCode("ZTNEW"); + deptB.setStatus(CommonStatusEnum.ENABLE.getStatus()); + deptMapper.insert(deptB); + + // 先插入停用态记录 + deptExternalCodeService.saveOrUpdateDeptExternalCode(deptAId, "ERP", "Z-001", "停用编码", CommonStatusEnum.DISABLE.getStatus()); + + // 新部门占用相同 system+external 应直接成功,不触发异常 + Long newId = deptExternalCodeService.saveOrUpdateDeptExternalCode(deptBId, "ERP", "Z-001", "启用编码", CommonStatusEnum.ENABLE.getStatus()); + assertNotNull(newId); + + DeptExternalCodeDO reused = deptExternalCodeMapper.selectById(newId); + assertEquals(deptBId, reused.getDeptId()); + assertEquals(CommonStatusEnum.ENABLE.getStatus(), reused.getStatus()); + DeptExternalCodeDO disabled = deptExternalCodeMapper.selectBySystemCodeAndDeptId("ERP", deptAId); + assertEquals(CommonStatusEnum.DISABLE.getStatus(), disabled.getStatus()); + } } diff --git a/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/dept/DeptServiceImplTest.java b/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/dept/DeptServiceImplTest.java index 5d322eac..1a877052 100644 --- a/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/dept/DeptServiceImplTest.java +++ b/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/dept/DeptServiceImplTest.java @@ -7,6 +7,7 @@ import com.zt.plat.module.system.controller.admin.dept.vo.dept.DeptListReqVO; import com.zt.plat.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO; import com.zt.plat.module.system.controller.admin.dept.vo.depexternalcode.DeptExternalCodeSaveReqVO; 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.mysql.dept.DeptExternalCodeMapper; import com.zt.plat.module.system.dal.mysql.dept.DeptMapper; import com.zt.plat.module.system.service.dept.DeptExternalCodeServiceImpl; @@ -177,12 +178,15 @@ public class DeptServiceImplTest extends BaseDbUnitTest { } @Test - public void testUpdateDept_parentChangedRebuildsCodes() { + public void testUpdateDept_parentChangedKeepsCodes() { Long parentAId = createDept(DeptDO.PARENT_ID_ROOT, "A公司", 1); Long parentBId = createDept(DeptDO.PARENT_ID_ROOT, "B公司", 2); Long childId = createDept(parentAId, "子部门", 1); Long grandChildId = createDept(childId, "子部门-一组", 1); + DeptDO originalChild = deptMapper.selectById(childId); + DeptDO originalGrandChild = deptMapper.selectById(grandChildId); + DeptDO parentB = deptMapper.selectById(parentBId); DeptSaveReqVO updateReq = new DeptSaveReqVO(); @@ -196,8 +200,119 @@ public class DeptServiceImplTest extends BaseDbUnitTest { DeptDO updatedChild = deptMapper.selectById(childId); DeptDO updatedGrandChild = deptMapper.selectById(grandChildId); - assertEquals(parentB.getCode() + "001", updatedChild.getCode()); - assertEquals(updatedChild.getCode() + "001", updatedGrandChild.getCode()); + // 已有编码保持不变 + assertEquals(originalChild.getCode(), updatedChild.getCode()); + assertEquals(originalGrandChild.getCode(), updatedGrandChild.getCode()); + // 父子关系按新父级变更 + assertEquals(parentB.getId(), updatedChild.getParentId()); + assertEquals(childId, updatedGrandChild.getParentId()); + // 新父级自身编码不受影响 + assertEquals(parentB.getCode(), deptMapper.selectById(parentBId).getCode()); + } + + @Test + public void testUpdateDept_addsMultiSystemMappingsWithoutChangingCode() { + Long parentId = createDept(DeptDO.PARENT_ID_ROOT, "父级", 1); + Long deptId = createDept(parentId, "多系统部门", 1); + DeptDO original = deptMapper.selectById(deptId); + + // 第一次更新:写入 ERP 外部编码 + DeptSaveReqVO updateReq1 = new DeptSaveReqVO(); + updateReq1.setId(deptId); + updateReq1.setParentId(parentId); + updateReq1.setName("多系统部门"); + updateReq1.setSort(1); + updateReq1.setStatus(CommonStatusEnum.ENABLE.getStatus()); + updateReq1.setDeptSource(1); + updateReq1.setExternalSystemCode("ERP"); + updateReq1.setExternalDeptCode("ERP-100"); + deptService.updateDept(updateReq1); + + // 第二次更新:写入 OA 外部编码 + DeptSaveReqVO updateReq2 = new DeptSaveReqVO(); + updateReq2.setId(deptId); + updateReq2.setParentId(parentId); + updateReq2.setName("多系统部门"); + updateReq2.setSort(1); + updateReq2.setStatus(CommonStatusEnum.ENABLE.getStatus()); + updateReq2.setDeptSource(1); + updateReq2.setExternalSystemCode("OA"); + updateReq2.setExternalDeptCode("OA-100"); + deptService.updateDept(updateReq2); + + DeptDO updated = deptMapper.selectById(deptId); + assertEquals(original.getCode(), updated.getCode()); + + List mappings = deptExternalCodeService.getDeptExternalCodeListByDeptId(deptId); + assertEquals(2, mappings.size()); + assertTrue(mappings.stream().anyMatch(it -> "ERP".equals(it.getSystemCode()) && "ERP-100".equals(it.getExternalDeptCode()))); + assertTrue(mappings.stream().anyMatch(it -> "OA".equals(it.getSystemCode()) && "OA-100".equals(it.getExternalDeptCode()))); + } + + @Test + public void testCreateDept_externalMappingConflictDisablesOld() { + // 首个部门创建时写入 IWORK 外部编码 + DeptSaveReqVO createA = new DeptSaveReqVO(); + createA.setParentId(DeptDO.PARENT_ID_ROOT); + createA.setName("iWork-A"); + createA.setSort(1); + createA.setStatus(CommonStatusEnum.ENABLE.getStatus()); + createA.setDeptSource(1); + createA.setExternalSystemCode("IWORK"); + createA.setExternalDeptCode("IW-001"); + Long deptAId = deptService.createDept(createA); + + // 预热缓存 + deptExternalCodeService.getDeptExternalCodeListByDeptId(deptAId); + assertNotNull(cacheManager.getCache(RedisKeyConstants.DEPT_EXTERNAL_CODE_LIST).get(deptAId)); + + // 第二个部门使用相同 system+external,应禁用旧映射 + DeptSaveReqVO createB = new DeptSaveReqVO(); + createB.setParentId(DeptDO.PARENT_ID_ROOT); + createB.setName("iWork-B"); + createB.setSort(2); + createB.setStatus(CommonStatusEnum.ENABLE.getStatus()); + createB.setDeptSource(1); + createB.setExternalSystemCode("IWORK"); + createB.setExternalDeptCode("IW-001"); + Long deptBId = deptService.createDept(createB); + + DeptExternalCodeDO oldRecord = deptExternalCodeMapper.selectBySystemCodeAndDeptId("IWORK", deptAId); + DeptExternalCodeDO newRecord = deptExternalCodeMapper.selectBySystemCodeAndDeptId("IWORK", deptBId); + assertNotNull(oldRecord); + assertNotNull(newRecord); + assertEquals(CommonStatusEnum.DISABLE.getStatus(), oldRecord.getStatus()); + assertEquals(CommonStatusEnum.ENABLE.getStatus(), newRecord.getStatus()); + // A 的缓存应被清理 + assertNull(cacheManager.getCache(RedisKeyConstants.DEPT_EXTERNAL_CODE_LIST).get(deptAId)); + } + + @Test + public void testUpdateDept_parentChangeWithExternalMappingKeepsCode() { + Long parentAId = createDept(DeptDO.PARENT_ID_ROOT, "父A", 1); + Long parentBId = createDept(DeptDO.PARENT_ID_ROOT, "父B", 2); + Long deptId = createDept(parentAId, "子", 1); + DeptDO original = deptMapper.selectById(deptId); + + DeptSaveReqVO updateReq = new DeptSaveReqVO(); + updateReq.setId(deptId); + updateReq.setParentId(parentBId); + updateReq.setName("子-更新"); + updateReq.setSort(1); + updateReq.setStatus(CommonStatusEnum.ENABLE.getStatus()); + updateReq.setDeptSource(1); + updateReq.setExternalSystemCode("IWORK"); + updateReq.setExternalDeptCode("IW-CHILD"); + + deptService.updateDept(updateReq); + + DeptDO updated = deptMapper.selectById(deptId); + assertEquals(original.getCode(), updated.getCode()); + assertEquals(parentBId, updated.getParentId()); + + DeptExternalCodeDO mapping = deptExternalCodeMapper.selectBySystemCodeAndDeptId("IWORK", deptId); + assertNotNull(mapping); + assertEquals("IW-CHILD", mapping.getExternalDeptCode()); } @Test