Merge remote-tracking branch 'base-version/main' into dev
This commit is contained in:
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user