diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectRiskPeopleOverviewItemVO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectRiskPeopleOverviewItemVO.java index cb28c890..ea0f6746 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectRiskPeopleOverviewItemVO.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectRiskPeopleOverviewItemVO.java @@ -16,6 +16,12 @@ public class CcdiProjectRiskPeopleOverviewItemVO { private Integer riskCount; + private String riskLevel; + + private String riskLevelType; + + private Integer modelCount; + private String riskPoint; private String actionLabel; diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java index 66488fa2..99c81a68 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java @@ -106,6 +106,9 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi item.setIdNo(aggregate.getStaffIdCard()); item.setDepartment(aggregate.getDeptName()); item.setRiskCount(defaultZero(aggregate.getHitCount())); + item.setRiskLevel(resolveRiskLevelName(aggregate.getRiskLevelCode())); + item.setRiskLevelType(resolveRiskLevelType(aggregate.getRiskLevelCode())); + item.setModelCount(defaultZero(aggregate.getModelCount())); item.setRiskPoint(aggregate.getRiskPoint()); item.setActionLabel(ACTION_LABEL); return item; diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java index bd7fbd62..e9562045 100644 --- a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java @@ -1,12 +1,14 @@ package com.ruoyi.ccdi.project.controller; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewDashboardVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskPeopleOverviewItemVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskPeopleOverviewVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectTopRiskPeopleVO; import com.ruoyi.ccdi.project.service.ICcdiProjectOverviewService; import com.ruoyi.common.core.domain.AjaxResult; import io.swagger.v3.oas.annotations.Operation; import java.lang.reflect.Method; +import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -56,11 +58,21 @@ class CcdiProjectOverviewControllerTest { @Test void shouldExposeRiskPeopleEndpoint() throws Exception { - when(overviewService.getRiskPeopleOverview(40L)).thenReturn(new CcdiProjectRiskPeopleOverviewVO()); + CcdiProjectRiskPeopleOverviewItemVO item = new CcdiProjectRiskPeopleOverviewItemVO(); + item.setRiskLevel("中风险"); + item.setRiskLevelType("warning"); + item.setModelCount(4); + CcdiProjectRiskPeopleOverviewVO overview = new CcdiProjectRiskPeopleOverviewVO(); + overview.setOverviewList(List.of(item)); + when(overviewService.getRiskPeopleOverview(40L)).thenReturn(overview); AjaxResult result = controller.getRiskPeople(40L); assertEquals(200, result.get("code")); + CcdiProjectRiskPeopleOverviewVO data = (CcdiProjectRiskPeopleOverviewVO) result.get("data"); + assertEquals("中风险", data.getOverviewList().getFirst().getRiskLevel()); + assertEquals("warning", data.getOverviewList().getFirst().getRiskLevelType()); + assertEquals(4, data.getOverviewList().getFirst().getModelCount()); verify(overviewService).getRiskPeopleOverview(40L); Method method = CcdiProjectOverviewController.class.getMethod("getRiskPeople", Long.class); diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImplTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImplTest.java index 50d63a70..92e7a4a9 100644 --- a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImplTest.java +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImplTest.java @@ -64,6 +64,8 @@ class CcdiProjectOverviewServiceImplTest { aggregate.setDeptName("信息二部"); aggregate.setRuleCount(5); aggregate.setHitCount(8); + aggregate.setRiskLevelCode("HIGH"); + aggregate.setModelCount(3); aggregate.setRiskPoint("大额单笔收入、疑似兼职"); when(overviewMapper.selectRiskPeopleOverviewByProjectId(40L)).thenReturn(List.of(aggregate)); @@ -71,6 +73,9 @@ class CcdiProjectOverviewServiceImplTest { assertEquals(1, overview.getOverviewList().size()); assertEquals(8, overview.getOverviewList().getFirst().getRiskCount()); + assertEquals("高风险", overview.getOverviewList().getFirst().getRiskLevel()); + assertEquals("danger", overview.getOverviewList().getFirst().getRiskLevelType()); + assertEquals(3, overview.getOverviewList().getFirst().getModelCount()); assertEquals("大额单笔收入、疑似兼职", overview.getOverviewList().getFirst().getRiskPoint()); assertEquals("查看详情", overview.getOverviewList().getFirst().getActionLabel()); } diff --git a/docs/reports/implementation/2026-03-20-results-overview-risk-people-merge-backend-implementation.md b/docs/reports/implementation/2026-03-20-results-overview-risk-people-merge-backend-implementation.md new file mode 100644 index 00000000..2e0f1c81 --- /dev/null +++ b/docs/reports/implementation/2026-03-20-results-overview-risk-people-merge-backend-implementation.md @@ -0,0 +1,24 @@ +# 结果总览风险人员总览字段扩展后端实施记录 + +## 本次改动 + +- 为 [`CcdiProjectRiskPeopleOverviewItemVO.java`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectRiskPeopleOverviewItemVO.java) 新增 `riskLevel`、`riskLevelType`、`modelCount` 字段。 +- 调整 [`CcdiProjectOverviewServiceImpl.java`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java) 中 `buildRiskPeopleItem` 映射逻辑,风险人员总览直接返回风险等级、标签类型和命中模型数。 +- 调整 [`CcdiProjectOverviewServiceImplTest.java`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImplTest.java),锁定风险人员总览返回新字段。 +- 调整 [`CcdiProjectOverviewControllerTest.java`](/Users/wkc/Desktop/ccdi/ccdi/ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java),校验控制器返回数据中包含新字段。 + +## 处理说明 + +- 本次未新增接口,继续复用 `GET /ccdi/project/overview/risk-people`。 +- 本次未修改员工风险聚合 SQL,也未调整风险等级分级规则。 +- 本次未删除后端独立的 `top-risk-people` 接口,收口范围只限于风险人员总览接口字段扩展。 + +## 验证情况 + +- 已执行结果总览后端定向测试: + +```bash +mvn test -pl ccdi-project -Dtest=CcdiProjectOverviewServiceImplTest,CcdiProjectOverviewControllerTest,CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceStructureTest +``` + +- 上述命令执行通过,证明服务映射、控制器、SQL 结构与服务接口边界未被本次调整破坏。 diff --git a/docs/reports/implementation/2026-03-20-results-overview-risk-people-merge-frontend-implementation.md b/docs/reports/implementation/2026-03-20-results-overview-risk-people-merge-frontend-implementation.md new file mode 100644 index 00000000..f51bd099 --- /dev/null +++ b/docs/reports/implementation/2026-03-20-results-overview-risk-people-merge-frontend-implementation.md @@ -0,0 +1,32 @@ +# 结果总览风险人员区块收口前端实施记录 + +## 本次改动 + +- 调整 [`projectOverview.js`](/Users/wkc/Desktop/ccdi/ccdi/ruoyi-ui/src/api/ccdi/projectOverview.js),移除页面不再使用的 `getOverviewTopRiskPeople` 封装。 +- 调整 [`PreliminaryCheck.vue`](/Users/wkc/Desktop/ccdi/ccdi/ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue),页面并发请求从 `dashboard + riskPeople + topRiskPeople` 收口为 `dashboard + riskPeople`。 +- 调整 [`preliminaryCheck.mock.js`](/Users/wkc/Desktop/ccdi/ccdi/ruoyi-ui/src/views/ccdiProject/components/detail/preliminaryCheck.mock.js),为 `overviewList` 补充 `riskLevel`、`riskLevelType`、`modelCount`,并移除展示层对 `topRiskList` 的依赖。 +- 调整 [`RiskPeopleSection.vue`](/Users/wkc/Desktop/ccdi/ccdi/ruoyi-ui/src/views/ccdiProject/components/detail/RiskPeopleSection.vue),删除独立的 `中高风险人员TOP10` 区块,在风险人员总览单表中新增 `风险等级`、`命中模型数` 两列。 +- 调整 4 个前端静态断言脚本,锁定页面不再依赖 TOP10 接口,且风险人员总览单表直接绑定新字段。 + +## 处理说明 + +- 本次未新增页面组件,也未修改风险模型区和风险明细区。 +- 本次未增加前端拼装补丁逻辑,风险等级标签继续直接使用后端返回的 `riskLevelType`。 +- 本次未启动长期前端开发进程,因此不存在额外进程清理动作。 + +## 验证情况 + +- 已执行结果总览前端静态断言回归: + +```bash +cd ruoyi-ui +node tests/unit/project-overview-api.test.js +node tests/unit/preliminary-check-api-integration.test.js +node tests/unit/preliminary-check-summary-and-people.test.js +node tests/unit/preliminary-check-risk-people-binding.test.js +node tests/unit/preliminary-check-states.test.js +node tests/unit/preliminary-check-layout.test.js +npm run build:prod +``` + +- 上述命令全部通过;生产构建仅出现现有资源体积告警,无新增编译错误,说明页面接口依赖、单表结构、字段绑定和基础状态展示均符合本轮需求。 diff --git a/docs/tests/records/2026-03-20-results-overview-risk-people-merge-backend-verification.md b/docs/tests/records/2026-03-20-results-overview-risk-people-merge-backend-verification.md new file mode 100644 index 00000000..90f71f4e --- /dev/null +++ b/docs/tests/records/2026-03-20-results-overview-risk-people-merge-backend-verification.md @@ -0,0 +1,26 @@ +# 结果总览风险人员总览字段扩展后端验证记录 + +## 验证范围 + +- 风险人员总览服务映射 +- 风险人员总览控制器返回结构 +- 结果总览 SQL 结构回归 +- 结果总览服务接口结构回归 + +## 验证命令 + +```bash +mvn test -pl ccdi-project -Dtest=CcdiProjectOverviewServiceImplTest,CcdiProjectOverviewControllerTest,CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceStructureTest +``` + +## 验证结果 + +- 2026-03-20 09:28:10 首次执行定向测试,测试编译失败,失败原因符合预期:`CcdiProjectRiskPeopleOverviewItemVO` 尚未提供 `riskLevel`、`riskLevelType`、`modelCount` 访问器。 +- 2026-03-20 09:28:30 完成最小实现后重新执行同一命令,`CcdiProjectOverviewServiceImplTest`、`CcdiProjectOverviewControllerTest`、`CcdiProjectOverviewMapperSqlTest`、`CcdiProjectOverviewServiceStructureTest` 共 11 个测试全部通过。 +- Maven 过程仅出现 Mockito 动态 agent 的现有 JDK 警告,无新增 failure 或 error。 + +## 结论 + +- 风险人员总览接口已稳定返回 `riskLevel`、`riskLevelType`、`modelCount`。 +- 结果总览后端现有 SQL 聚合与接口结构在本轮改动后保持稳定。 +- 后端独立 TOP10 接口未受本次修改影响。 diff --git a/docs/tests/records/2026-03-20-results-overview-risk-people-merge-frontend-verification.md b/docs/tests/records/2026-03-20-results-overview-risk-people-merge-frontend-verification.md new file mode 100644 index 00000000..f39aee5a --- /dev/null +++ b/docs/tests/records/2026-03-20-results-overview-risk-people-merge-frontend-verification.md @@ -0,0 +1,39 @@ +# 结果总览风险人员区块收口前端验证记录 + +## 验证范围 + +- API 封装收口 +- 结果总览页面并发取数收口 +- 风险人员总览单表结构 +- 风险等级与命中模型数字段绑定 +- 加载态、空态与基础布局回归 + +## 验证命令 + +```bash +cd ruoyi-ui +node tests/unit/project-overview-api.test.js +node tests/unit/preliminary-check-api-integration.test.js +node tests/unit/preliminary-check-summary-and-people.test.js +node tests/unit/preliminary-check-risk-people-binding.test.js +node tests/unit/preliminary-check-states.test.js +node tests/unit/preliminary-check-layout.test.js +npm run build:prod +``` + +## 验证结果 + +- 2026-03-20 前端先按新需求更新断言后首次执行静态测试,`project-overview-api.test.js` 失败,失败点符合预期:源码仍保留 `getOverviewTopRiskPeople`。 +- 2026-03-20 完成最小实现后重新执行全部 6 个静态断言脚本,进程均 `exit 0`。 +- 2026-03-20 执行 `npm run build:prod`,构建完成,只有现有资源体积告警,无新增编译错误。 +- 验证结果覆盖: + - 页面不再依赖 `top-risk-people` 接口 + - 风险人员区块不再包含 `中高风险人员TOP10` + - 风险人员总览单表已展示 `风险等级`、`命中模型数` + - 页面空态、加载态与基础结构未被破坏 + +## 结论 + +- 前端已按设计完成人员区块收口。 +- 结果总览页面当前只依赖 `dashboard` 和 `riskPeople` 两类真实接口。 +- 风险人员总览已成为唯一人员榜单区块,新增字段展示正常。 diff --git a/ruoyi-ui/src/api/ccdi/projectOverview.js b/ruoyi-ui/src/api/ccdi/projectOverview.js index 6cd58ddb..87fa2a6e 100644 --- a/ruoyi-ui/src/api/ccdi/projectOverview.js +++ b/ruoyi-ui/src/api/ccdi/projectOverview.js @@ -15,11 +15,3 @@ export function getOverviewRiskPeople(projectId) { params: { projectId } }) } - -export function getOverviewTopRiskPeople(projectId) { - return request({ - url: '/ccdi/project/overview/top-risk-people', - method: 'get', - params: { projectId } - }) -} diff --git a/ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue b/ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue index 345aaa48..afbe1738 100644 --- a/ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue +++ b/ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue @@ -30,7 +30,6 @@ import { import { getOverviewDashboard, getOverviewRiskPeople, - getOverviewTopRiskPeople, } from "@/api/ccdi/projectOverview"; import OverviewStats from "./OverviewStats"; import RiskPeopleSection from "./RiskPeopleSection"; @@ -103,25 +102,21 @@ export default { this.pageState = "loading"; try { - const [dashboardRes, riskPeopleRes, topRiskPeopleRes] = await Promise.all([ + const [dashboardRes, riskPeopleRes] = await Promise.all([ getOverviewDashboard(this.projectId), getOverviewRiskPeople(this.projectId), - getOverviewTopRiskPeople(this.projectId), ]); const dashboardData = (dashboardRes && dashboardRes.data) || {}; const riskPeopleData = (riskPeopleRes && riskPeopleRes.data) || {}; - const topRiskPeopleData = (topRiskPeopleRes && topRiskPeopleRes.data) || {}; this.realData = createOverviewLoadedData({ dashboardData, riskPeopleData, - topRiskPeopleData, }); const hasOverviewData = Boolean( (Array.isArray(dashboardData.stats) && dashboardData.stats.length) || - (Array.isArray(riskPeopleData.overviewList) && riskPeopleData.overviewList.length) || - (Array.isArray(topRiskPeopleData.topRiskList) && topRiskPeopleData.topRiskList.length) + (Array.isArray(riskPeopleData.overviewList) && riskPeopleData.overviewList.length) ); this.pageState = hasOverviewData ? "loaded" : "empty"; diff --git a/ruoyi-ui/src/views/ccdiProject/components/detail/RiskPeopleSection.vue b/ruoyi-ui/src/views/ccdiProject/components/detail/RiskPeopleSection.vue index 6d960a6f..b5978f0c 100644 --- a/ruoyi-ui/src/views/ccdiProject/components/detail/RiskPeopleSection.vue +++ b/ruoyi-ui/src/views/ccdiProject/components/detail/RiskPeopleSection.vue @@ -16,37 +16,15 @@ - - - - - - - -
-
-
-
中高风险人员TOP10
-
按风险等级和命中数量聚焦重点对象
-
- 导出 -
- - - - - - - + - + +