From ef106169dc0a1b3376d3f86f318b21f1f524722f Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Sun, 22 Mar 2026 11:52:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=87=E6=8D=A2=E7=BB=93=E6=9E=9C=E6=80=BB?= =?UTF-8?q?=E8=A7=88=E6=9F=A5=E8=AF=A2=E5=88=B0=E5=91=98=E5=B7=A5=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...iProjectOverviewEmployeeRuleSummaryVO.java | 2 + ...iProjectOverviewEmployeeResultBuilder.java | 1 + .../project/CcdiProjectOverviewMapper.xml | 197 +++++++++++++----- ...ojectOverviewMapperRiskModelCardsTest.java | 9 +- ...jectOverviewMapperRiskModelPeopleTest.java | 21 +- .../CcdiProjectOverviewMapperSqlTest.java | 41 +++- 6 files changed, 192 insertions(+), 79 deletions(-) diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectOverviewEmployeeRuleSummaryVO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectOverviewEmployeeRuleSummaryVO.java index a7e00bd6..76553653 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectOverviewEmployeeRuleSummaryVO.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectOverviewEmployeeRuleSummaryVO.java @@ -8,6 +8,8 @@ import lombok.Data; @Data public class CcdiProjectOverviewEmployeeRuleSummaryVO { + private String modelCode; + private String ruleCode; private String ruleName; diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewEmployeeResultBuilder.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewEmployeeResultBuilder.java index a63dc75d..9794f0e8 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewEmployeeResultBuilder.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewEmployeeResultBuilder.java @@ -103,6 +103,7 @@ public class CcdiProjectOverviewEmployeeResultBuilder { .map(rows -> { CcdiProjectOverviewEmployeeRuleSummaryVO summary = new CcdiProjectOverviewEmployeeRuleSummaryVO(); CcdiProjectOverviewEmployeeHitRowVO first = rows.getFirst(); + summary.setModelCode(first.getModelCode()); summary.setRuleCode(first.getRuleCode()); summary.setRuleName(first.getRuleName()); summary.setRiskLevel(first.getRiskLevel()); diff --git a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml index 57eed98b..57b631ee 100644 --- a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml +++ b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml @@ -33,6 +33,29 @@ select="selectRiskHitTagsByScope"/> + + select 0 as digit + union all select 1 + union all select 2 + union all select 3 + union all select 4 + union all select 5 + union all select 6 + union all select 7 + union all select 8 + union all select 9 + + + + select ones.digit + tens.digit * 10 as idx + from ( + + ) ones + cross join ( + + ) tens + + select distinct tr.id, @@ -186,14 +209,60 @@ @@ -213,13 +282,18 @@ ) models left join ( select - base.model_code, - count(1) as warning_count, - count(distinct base.staff_id_card) as people_count - from ( - - ) base - group by base.model_code + json_unquote(json_extract(result.model_hit_summary_json, concat('$[', idx.idx, '].modelCode'))) as model_code, + sum(cast(json_unquote(json_extract( + result.model_hit_summary_json, + concat('$[', idx.idx, '].warningCount') + )) as unsigned)) as warning_count, + count(distinct result.staff_id_card) as people_count + from ccdi_project_overview_employee_result result + join ( + + ) idx on idx.idx < json_length(result.model_hit_summary_json) + where result.project_id = #{projectId} + group by json_unquote(json_extract(result.model_hit_summary_json, concat('$[', idx.idx, '].modelCode'))) ) stats on models.model_code = stats.model_code order by warning_count desc, model_code asc @@ -227,73 +301,88 @@ ")); + assertTrue(xml.contains("model_hit_summary_json")); + assertTrue(xml.contains("json_extract(")); assertTrue(xml.contains("coalesce(stats.warning_count, 0) as warning_count")); assertTrue(xml.contains("coalesce(stats.people_count, 0) as people_count")); - assertTrue(xml.contains("count(1) as warning_count")); + assertTrue(xml.contains(".warningCount")); assertTrue(xml.contains("order by warning_count desc, model_code asc")); } } diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperRiskModelPeopleTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperRiskModelPeopleTest.java index 9e1b6a32..46fec559 100644 --- a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperRiskModelPeopleTest.java +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperRiskModelPeopleTest.java @@ -34,18 +34,19 @@ class CcdiProjectOverviewMapperRiskModelPeopleTest { assertTrue(xml.contains("query.modelCodes != null and query.modelCodes.size() > 0")); assertTrue(xml.contains("query.matchMode == 'ALL'")); assertFalse(xml.contains("#{query.modelCodes.size}")); - assertTrue(xml.contains("count(distinct base.model_code) = #{query.modelCodesCount}")); + assertTrue(xml.contains("find_in_set(#{modelCode}, result.model_codes_csv)")); assertTrue(xml.contains("")); - assertTrue(xml.contains("base.staff_name like concat('%', trim(#{query.keyword}), '%')")); - assertTrue(xml.contains("cast(base.staff_code as char) like concat('%', trim(#{query.keyword}), '%')")); - assertTrue(xml.contains("base.dept_id = #{query.deptId}")); + assertTrue(xml.contains("result.staff_name like concat('%', trim(#{query.keyword}), '%')")); + assertTrue(xml.contains("result.staff_code like concat('%', trim(#{query.keyword}), '%')")); + assertTrue(xml.contains("result.dept_id = #{query.deptId}")); 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")); + assertTrue(xml.contains("model_hit_summary_json")); + assertTrue(xml.contains("hit_rules_json")); + assertTrue(xml.contains("json_extract(")); + assertTrue(xml.contains(".modelCode")); + assertTrue(xml.contains(".modelName")); + assertTrue(xml.contains(".ruleCode")); + assertTrue(xml.contains(".riskLevel")); } } diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperSqlTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperSqlTest.java index fcf87d5b..d1adbf44 100644 --- a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperSqlTest.java +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperSqlTest.java @@ -11,18 +11,30 @@ import static org.junit.jupiter.api.Assertions.assertTrue; class CcdiProjectOverviewMapperSqlTest { @Test - void shouldContainEmployeeRiskAggregationSql() throws Exception { + void shouldReadOverviewQueriesFromEmployeeResultTable() throws Exception { String xml = Files.readString(Path.of("src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml")); + String riskPeopleSql = extractSelect(xml, "selectRiskPeopleOverviewByProjectId"); + String topRiskPeopleSql = extractSelect(xml, "selectTopRiskPeopleByProjectId"); + String riskModelCardsSql = extractSelect(xml, "selectRiskModelCardsByProjectId"); + String riskModelPeopleSql = extractSelect(xml, "selectRiskModelPeoplePage"); - assertTrue(xml.contains("count(distinct base.rule_code)")); - assertTrue(xml.contains("count(distinct base.model_code)")); - assertTrue(xml.contains("count(1) as hit_count")); - assertTrue(xml.contains("agg.hit_count")); - assertTrue(xml.contains("when agg.rule_count >= 5 then 'HIGH'")); - assertTrue(xml.contains("when agg.rule_count between 2 and 4 then 'MEDIUM'")); - assertTrue(xml.contains("group_concat(")); - assertTrue(xml.contains("as risk_point")); - assertTrue(xml.contains("order by grouped.hit_count desc, grouped.rule_code asc")); + assertTrue(riskPeopleSql.contains("from ccdi_project_overview_employee_result")); + assertTrue(riskPeopleSql.contains("risk_level_code")); + assertTrue(riskPeopleSql.contains("model_count")); + assertTrue(riskPeopleSql.contains("risk_point")); + assertFalse(riskPeopleSql.contains("resolvedEmployeeRiskBaseSql")); + + assertTrue(topRiskPeopleSql.contains("from ccdi_project_overview_employee_result")); + assertTrue(topRiskPeopleSql.contains("risk_level_code in ('HIGH', 'MEDIUM')")); + assertFalse(topRiskPeopleSql.contains("resolvedEmployeeRiskBaseSql")); + + assertTrue(riskModelCardsSql.contains("from ccdi_project_overview_employee_result")); + assertTrue(riskModelCardsSql.contains("model_hit_summary_json")); + assertFalse(riskModelCardsSql.contains("resolvedEmployeeRiskBaseSql")); + + assertTrue(riskModelPeopleSql.contains("from ccdi_project_overview_employee_result")); + assertTrue(riskModelPeopleSql.contains("model_codes_csv")); + assertFalse(riskModelPeopleSql.contains("resolvedEmployeeRiskBaseSql")); } @Test @@ -30,6 +42,13 @@ class CcdiProjectOverviewMapperSqlTest { String xml = Files.readString(Path.of("src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml")); assertFalse(xml.contains("row_number() over"), xml); - assertTrue(xml.contains("not exists"), xml); + assertFalse(xml.contains("json_table("), xml); + } + + private String extractSelect(String xml, String selectId) { + String start = "