fix(gxmu): 注册表补 has_college 与团员管理种子,接口返回 DTO 并支持 all=true
- gxmu_module_registry 增加 has_college(4 张在跑表置 1,含已有库补列与补数据语句) - 种子补 gxmu_tygl_form / gxmu_tygl(enabled=0,团员管理,sort 11/12), 同步修正末尾「执行后校验」:12 行未删除、5 行启用、has_college 4 行 - GET /api/gxmu/module-registry/list 支持 all=true(默认只返回启用), 改为返回 ModuleRegistryDTO,不再外泄 tenantId / userId / 时间戳 - ModuleRegistryService:删掉无生产调用的 titleOf(String)/allModules, 标题回退收敛成唯一的静态 titleOf(Map, module);getByModule 改由 hasCollege 使用 - listAll 只保留 SQL 排序(sort_number 升序,NULL 排最前,与 MySQL ASC 口径一致), 删掉内存二次排序 - ModuleRegistryIntegrityChecker 增加反向告警:review_flow_config 里有、注册表里没有的 module 打 warn,不阻断启动 refs #58
This commit is contained in:
@@ -2,6 +2,7 @@ package com.gxwebsoft.gxmu.module;
|
||||
|
||||
import com.gxwebsoft.gxmu.module.entity.ModuleRegistry;
|
||||
import com.gxwebsoft.gxmu.module.mapper.ModuleRegistryMapper;
|
||||
import com.gxwebsoft.gxmu.module.service.ModuleRegistryService;
|
||||
import com.gxwebsoft.gxmu.module.service.impl.ModuleRegistryServiceImpl;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
@@ -12,6 +13,7 @@ import org.mockito.junit.jupiter.MockitoSettings;
|
||||
import org.mockito.quality.Strictness;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -26,9 +28,10 @@ import static org.mockito.Mockito.when;
|
||||
/**
|
||||
* 模块注册表服务的单元测试(mock 掉 Mapper,不启 Spring、不连库)。
|
||||
*
|
||||
* <p>注册表是模块元数据的唯一来源,这里锁住三件对外可观察的事:
|
||||
* 启用清单按 sort_number 升序、标题查询在未注册时回退 module 原串、
|
||||
* 模块集合包含已停用模块(停用模块的历史数据仍要能撤回/作废)。
|
||||
* <p>注册表是模块元数据的唯一来源,这里锁住四件对外可观察的事:
|
||||
* 启用清单只留启用项且保持 SQL 的排序(排序只在 SQL 里做一次)、
|
||||
* 模块集合包含已停用模块(停用模块的历史数据仍要能撤回/作废)、
|
||||
* has_college 决定审批人解析是否读学院上下文、标题回退只有一份实现。
|
||||
*
|
||||
* @author Codex
|
||||
* @since 2026-11-10
|
||||
@@ -44,11 +47,12 @@ class ModuleRegistryServiceImplTest {
|
||||
private ModuleRegistryServiceImpl moduleRegistryService;
|
||||
|
||||
@Test
|
||||
void listEnabledReturnsOnlyEnabledModulesOrderedBySortNumber() {
|
||||
void listEnabledReturnsOnlyEnabledModulesInSqlOrder() {
|
||||
// SQL 已按 sort_number 升序返回;服务只负责过滤,不再二次排序
|
||||
when(moduleRegistryMapper.selectList(any())).thenReturn(Arrays.asList(
|
||||
module("gxmu_qmgc_form", "青马工程", 1, 8),
|
||||
module("gxmu_sjtbzbsj", "十佳团支部书记", 0, 2),
|
||||
module("gxmu_sjqn", "十佳青年岗位能手", 1, 1)));
|
||||
module("gxmu_sjqn", "十佳青年岗位能手", 1, 1, 1),
|
||||
module("gxmu_sjtbzbsj", "十佳团支部书记", 0, 2, 0),
|
||||
module("gxmu_qmgc_form", "青马工程", 1, 8, 1)));
|
||||
|
||||
List<ModuleRegistry> enabled = moduleRegistryService.listEnabled();
|
||||
|
||||
@@ -56,30 +60,11 @@ class ModuleRegistryServiceImplTest {
|
||||
enabled.stream().map(ModuleRegistry::getModule).collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
@Test
|
||||
void titleOfReturnsRegisteredTitle() {
|
||||
when(moduleRegistryMapper.selectOne(any())).thenReturn(module("gxmu_tzbcy_form", "挑战杯", 1, 7));
|
||||
|
||||
assertEquals("挑战杯", moduleRegistryService.titleOf("gxmu_tzbcy_form"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void titleOfFallsBackToModuleStringWhenNotRegistered() {
|
||||
when(moduleRegistryMapper.selectOne(any())).thenReturn(null);
|
||||
|
||||
assertEquals("cms_legacy_module", moduleRegistryService.titleOf("cms_legacy_module"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void titleOfKeepsNullModuleNull() {
|
||||
assertNull(moduleRegistryService.titleOf(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
void titleMapCoversDisabledModulesSoHistoricalRowsKeepTitles() {
|
||||
when(moduleRegistryMapper.selectList(any())).thenReturn(Arrays.asList(
|
||||
module("gxmu_sjqn", "十佳青年岗位能手", 1, 1),
|
||||
module("gxmu_yxgqty", "优秀共青团员", 0, 6)));
|
||||
module("gxmu_sjqn", "十佳青年岗位能手", 1, 1, 1),
|
||||
module("gxmu_yxgqty", "优秀共青团员", 0, 6, 0)));
|
||||
|
||||
Map<String, String> titles = moduleRegistryService.titleMap();
|
||||
|
||||
@@ -91,15 +76,49 @@ class ModuleRegistryServiceImplTest {
|
||||
@Test
|
||||
void moduleSetContainsDisabledModules() {
|
||||
when(moduleRegistryMapper.selectList(any())).thenReturn(Arrays.asList(
|
||||
module("gxmu_sjqn", "十佳青年岗位能手", 1, 1),
|
||||
module("gxmu_yxgqty", "优秀共青团员", 0, 6)));
|
||||
module("gxmu_sjqn", "十佳青年岗位能手", 1, 1, 1),
|
||||
module("gxmu_yxgqty", "优秀共青团员", 0, 6, 0)));
|
||||
|
||||
assertTrue(moduleRegistryService.containsModule("gxmu_yxgqty"));
|
||||
assertFalse(moduleRegistryService.containsModule("gxmu_unknown"));
|
||||
assertFalse(moduleRegistryService.containsModule(null));
|
||||
}
|
||||
|
||||
private ModuleRegistry module(String name, String title, int enabled, int sortNumber) {
|
||||
@Test
|
||||
void hasCollegeFollowsTheRegistryFlag() {
|
||||
when(moduleRegistryMapper.selectOne(any())).thenReturn(module("gxmu_sjqn", "十佳青年岗位能手", 1, 1, 1));
|
||||
|
||||
assertTrue(moduleRegistryService.hasCollege("gxmu_sjqn"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void hasCollegeIsFalseForDisabledOrMissingFlag() {
|
||||
when(moduleRegistryMapper.selectOne(any())).thenReturn(module("gxmu_tygl", "团员管理", 0, 12, 0));
|
||||
|
||||
assertFalse(moduleRegistryService.hasCollege("gxmu_tygl"));
|
||||
assertFalse(moduleRegistryService.hasCollege(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
void titleOfUsesRegistryTitleWhenPresent() {
|
||||
Map<String, String> titles = new HashMap<>();
|
||||
titles.put("gxmu_tzbcy_form", "挑战杯");
|
||||
|
||||
assertEquals("挑战杯", ModuleRegistryService.titleOf(titles, "gxmu_tzbcy_form"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void titleOfFallsBackToModuleStringWhenNotRegistered() {
|
||||
assertEquals("cms_legacy_module", ModuleRegistryService.titleOf(new HashMap<>(), "cms_legacy_module"));
|
||||
assertEquals("cms_legacy_module", ModuleRegistryService.titleOf(null, "cms_legacy_module"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void titleOfKeepsNullModuleNull() {
|
||||
assertNull(ModuleRegistryService.titleOf(new HashMap<>(), null));
|
||||
}
|
||||
|
||||
private ModuleRegistry module(String name, String title, int enabled, int sortNumber, int hasCollege) {
|
||||
ModuleRegistry item = new ModuleRegistry();
|
||||
item.setModule(name);
|
||||
item.setTableName(name);
|
||||
@@ -107,6 +126,7 @@ class ModuleRegistryServiceImplTest {
|
||||
item.setDetailKey(name);
|
||||
item.setEnabled(enabled);
|
||||
item.setSortNumber(sortNumber);
|
||||
item.setHasCollege(hasCollege);
|
||||
item.setDeleted(0);
|
||||
return item;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user