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

This commit is contained in:
chenbowen
2025-12-16 14:02:53 +08:00
2 changed files with 209 additions and 3 deletions

View File

@@ -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.framework.test.core.ut.BaseDbUnitTest;
import com.zt.plat.module.system.controller.admin.dept.vo.depexternalcode.DeptExternalCodeSaveReqVO; 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.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.DeptExternalCodeMapper;
import com.zt.plat.module.system.dal.mysql.dept.DeptMapper; import com.zt.plat.module.system.dal.mysql.dept.DeptMapper;
import com.zt.plat.module.system.dal.redis.RedisKeyConstants; 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 org.springframework.context.annotation.Import;
import java.util.List; import java.util.List;
import java.util.Objects;
import static com.zt.plat.module.system.dal.redis.RedisKeyConstants.DEPT_EXTERNAL_CODE_LIST; import static com.zt.plat.module.system.dal.redis.RedisKeyConstants.DEPT_EXTERNAL_CODE_LIST;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@@ -102,4 +104,93 @@ class DeptExternalCodeServiceImplTest extends BaseDbUnitTest {
assertEquals(firstId, secondId); assertEquals(firstId, secondId);
assertEquals("OA-002", deptExternalCodeMapper.selectById(firstId).getExternalDeptCode()); 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<DeptExternalCodeDO> 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());
}
} }

View File

@@ -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.dept.DeptSaveReqVO;
import com.zt.plat.module.system.controller.admin.dept.vo.depexternalcode.DeptExternalCodeSaveReqVO; 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.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.DeptExternalCodeMapper;
import com.zt.plat.module.system.dal.mysql.dept.DeptMapper; import com.zt.plat.module.system.dal.mysql.dept.DeptMapper;
import com.zt.plat.module.system.service.dept.DeptExternalCodeServiceImpl; import com.zt.plat.module.system.service.dept.DeptExternalCodeServiceImpl;
@@ -177,12 +178,15 @@ public class DeptServiceImplTest extends BaseDbUnitTest {
} }
@Test @Test
public void testUpdateDept_parentChangedRebuildsCodes() { public void testUpdateDept_parentChangedKeepsCodes() {
Long parentAId = createDept(DeptDO.PARENT_ID_ROOT, "A公司", 1); Long parentAId = createDept(DeptDO.PARENT_ID_ROOT, "A公司", 1);
Long parentBId = createDept(DeptDO.PARENT_ID_ROOT, "B公司", 2); Long parentBId = createDept(DeptDO.PARENT_ID_ROOT, "B公司", 2);
Long childId = createDept(parentAId, "子部门", 1); Long childId = createDept(parentAId, "子部门", 1);
Long grandChildId = createDept(childId, "子部门-一组", 1); Long grandChildId = createDept(childId, "子部门-一组", 1);
DeptDO originalChild = deptMapper.selectById(childId);
DeptDO originalGrandChild = deptMapper.selectById(grandChildId);
DeptDO parentB = deptMapper.selectById(parentBId); DeptDO parentB = deptMapper.selectById(parentBId);
DeptSaveReqVO updateReq = new DeptSaveReqVO(); DeptSaveReqVO updateReq = new DeptSaveReqVO();
@@ -196,8 +200,119 @@ public class DeptServiceImplTest extends BaseDbUnitTest {
DeptDO updatedChild = deptMapper.selectById(childId); DeptDO updatedChild = deptMapper.selectById(childId);
DeptDO updatedGrandChild = deptMapper.selectById(grandChildId); 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<DeptExternalCodeDO> 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 @Test