修复结果总览模型名称排序兼容性问题
This commit is contained in:
@@ -247,7 +247,7 @@
|
||||
</select>
|
||||
|
||||
<select id="selectRiskModelNamesByScope" resultType="java.lang.String">
|
||||
select distinct scoped.model_name
|
||||
select scoped.model_name
|
||||
from (
|
||||
<include refid="resolvedEmployeeRiskBaseSql"/>
|
||||
) scoped
|
||||
@@ -256,6 +256,7 @@
|
||||
<if test="selectedModelCodes != null and selectedModelCodes != ''">
|
||||
and find_in_set(scoped.model_code, #{selectedModelCodes})
|
||||
</if>
|
||||
group by scoped.model_code, scoped.model_name
|
||||
order by scoped.model_code asc
|
||||
</select>
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import java.nio.file.Path;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
class CcdiProjectOverviewMapperRiskModelPeopleTest {
|
||||
@@ -40,6 +41,9 @@ class CcdiProjectOverviewMapperRiskModelPeopleTest {
|
||||
assertTrue(xml.contains("select=\"selectRiskModelNamesByScope\""));
|
||||
assertTrue(xml.contains("select=\"selectRiskHitTagsByScope\""));
|
||||
assertTrue(xml.contains("find_in_set(scoped.model_code, #{selectedModelCodes})"));
|
||||
assertFalse(xml.contains("select distinct scoped.model_name"));
|
||||
assertTrue(xml.contains("group by scoped.model_code, scoped.model_name"));
|
||||
assertTrue(xml.contains("order by scoped.model_code asc"));
|
||||
assertTrue(xml.contains("order by case max(scoped.risk_level)"));
|
||||
assertTrue(xml.contains("scoped.rule_code asc"));
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
- 在 [`CcdiProjectOverviewMapper.java`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapper.java) 与 [`CcdiProjectOverviewMapper.xml`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml) 新增模型卡片统计与模型人员分页 SQL。
|
||||
- 新增或扩展 [`CcdiProjectOverviewControllerContractTest.java`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerContractTest.java)、[`CcdiProjectOverviewMapperRiskModelCardsTest.java`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperRiskModelCardsTest.java)、[`CcdiProjectOverviewMapperRiskModelPeopleTest.java`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperRiskModelPeopleTest.java)、[`CcdiProjectOverviewServiceImplTest.java`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImplTest.java) 以覆盖契约、SQL 和服务封装。
|
||||
- 根据 2026-03-20 线上分页异常,在 [`CcdiProjectOverviewMapper.xml`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml) 的 `selectRiskModelPeoplePage` 增加 `<bind name="projectId" value="query.projectId"/>`,并在 [`CcdiProjectOverviewMapperRiskModelPeopleTest.java`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperRiskModelPeopleTest.java) 补充对应断言,防止再次出现参数绑定异常。
|
||||
- 根据 2026-03-20 线上 MySQL 3065 异常,将 [`CcdiProjectOverviewMapper.xml`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml) 中 `selectRiskModelNamesByScope` 从 `select distinct` 调整为 `group by scoped.model_code, scoped.model_name`,并在 [`CcdiProjectOverviewMapperRiskModelPeopleTest.java`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperRiskModelPeopleTest.java) 补充兼容性断言。
|
||||
|
||||
## 处理说明
|
||||
|
||||
@@ -17,6 +18,7 @@
|
||||
- `ANY` 模式通过模型范围过滤直接返回并集结果;`ALL` 模式通过 `having count(distinct base.model_code) = #{query.modelCodes.size}` 约束交集结果。
|
||||
- `modelNames` 与 `hitTagList` 使用同上下文子查询回填,只返回当前筛选模型范围内的数据。
|
||||
- 风险模型人员分页复用公共归并 SQL 时,必须先把 `query.projectId` 绑定到顶层 `projectId`,否则 `resolvedEmployeeRiskBaseSql` 中的 `#{projectId}` 会在 MyBatis 分页查询阶段直接报绑定异常。
|
||||
- 风险模型名称子查询需要按 `model_code` 保序返回,但不能使用 `distinct + order by 非 select 列` 组合;这里改为 `group by scoped.model_code, scoped.model_name` 后再排序,以兼容当前 MySQL 配置。
|
||||
- 服务层对 `matchMode` 缺省值统一收口为 `ANY`,并确保空列表返回空数组、分页行统一附加“查看详情”。
|
||||
|
||||
## 验证情况
|
||||
|
||||
@@ -31,11 +31,15 @@ mvn test -pl ccdi-project '-Dtest=CcdiProjectOverview*'
|
||||
- 2026-03-20 11:59 根据线上异常日志补充 `CcdiProjectOverviewMapperRiskModelPeopleTest` 红灯断言,确认 `selectRiskModelPeoplePage` 缺少 `query.projectId -> projectId` 绑定桥接。
|
||||
- 2026-03-20 11:59 在 `selectRiskModelPeoplePage` 增加 `<bind name="projectId" value="query.projectId"/>` 后重新执行 `CcdiProjectOverviewMapperRiskModelPeopleTest`,2 个测试全部通过。
|
||||
- 2026-03-20 12:00 再次执行结果总览相关总体验证命令 `mvn test -pl ccdi-project '-Dtest=CcdiProjectOverview*'`,共 22 个测试全部通过,0 failure,0 error。
|
||||
- 2026-03-20 12:05 根据线上异常日志补充 `CcdiProjectOverviewMapperRiskModelPeopleTest` 红灯断言,确认 `selectRiskModelNamesByScope` 存在 `distinct + order by 非 select 列` 的 MySQL 兼容性问题。
|
||||
- 2026-03-20 12:05 将 `selectRiskModelNamesByScope` 调整为 `group by scoped.model_code, scoped.model_name` 后重新执行 `CcdiProjectOverviewMapperRiskModelPeopleTest`,2 个测试全部通过。
|
||||
- 2026-03-20 12:05 再次执行结果总览相关总体验证命令 `mvn test -pl ccdi-project '-Dtest=CcdiProjectOverview*'`,共 22 个测试全部通过,0 failure,0 error。
|
||||
|
||||
## 结论
|
||||
|
||||
- 结果总览模型区后端已补齐两个新接口:模型卡片统计与模型命中人员分页。
|
||||
- 人员分页查询已覆盖多模型 `ANY / ALL`、姓名/工号关键字、部门筛选,以及筛选上下文内的 `modelNames`/`hitTagList` 聚合。
|
||||
- 风险模型人员分页 SQL 已补齐 `projectId` 绑定桥接,避免公共 SQL 片段在分页查询场景下触发 MyBatis `Parameter 'projectId' not found` 异常。
|
||||
- 风险模型名称子查询已移除 `distinct + 非 select 列排序` 组合,避免 MySQL 8 在 `ONLY_FULL_GROUP_BY` 兼容校验下抛出 3065 异常。
|
||||
- 服务层已统一完成项目存在性校验、空列表封装和“查看详情”动作文案赋值。
|
||||
- 本轮验证仅执行 Maven 单元测试,未启动额外前后端进程,因此无需执行进程清理。
|
||||
|
||||
Reference in New Issue
Block a user