# 结果总览风险人员区块收口设计文档 **模块**: 初核项目详情 - 结果总览 **日期**: 2026-03-20 ## 一、背景 当前结果总览页面的人员相关信息拆分为两个区块: - 风险人员总览 - 中高风险人员TOP10 现状问题是: 1. 风险等级、命中模型数只在 `中高风险人员TOP10` 中展示。 2. 风险人员总览与 TOP10 在页面上存在信息拆散,用户需要跨区块比对。 3. 本轮需求要求移除独立的 TOP10 区块,并把关键风险字段收拢到风险人员总览中。 ## 二、目标 本次设计目标如下: 1. 移除结果总览页面中的 `中高风险人员TOP10` 区块。 2. 保留 `风险人员总览` 作为唯一人员榜单区块。 3. 在风险人员总览现有列基础上新增: - `风险等级` - `命中模型数` 4. 保持当前风险人员总览的排序逻辑不变。 ## 三、范围 ### 3.1 本次范围 - 调整结果总览页面人员区块结构 - 扩展风险人员总览接口返回字段 - 移除结果总览页面对 TOP10 接口的依赖 - 更新前端静态断言测试 - 补充本次设计文档、后续前后端实施计划与实施记录 ### 3.2 不在本次范围 - 不调整风险仪表盘区块 - 不调整风险模型区和风险明细区 - 不修改风险等级计算规则 - 不修改风险人员总览当前排序口径 - 不在本轮删除后端独立 TOP10 接口 ## 四、现状分析 ### 4.1 页面现状 当前 `RiskPeopleSection.vue` 中包含两个 block: 1. `风险人员总览` 2. `中高风险人员TOP10` 风险人员总览当前展示字段为: - 姓名 - 身份证号 - 所属部门 - 疑似违规数 - 核心异常点 - 操作 TOP10 当前展示字段为: - 姓名 - 身份证号 - 所属部门 - 风险等级 - 命中模型数 - 操作 ### 4.2 后端现状 后端员工聚合结果 `CcdiProjectEmployeeRiskAggregateVO` 已经包含以下字段: - `modelCount` - `riskLevelCode` - `riskLevelName` - `riskLevelSort` 这说明本轮需求不需要新增新的统计口径,后端已有聚合结果足以支撑风险人员总览增加两列展示。 ## 五、方案对比 ### 5.1 方案 A:扩展风险人员总览接口并移除页面 TOP10 依赖 做法: - 风险人员总览接口直接补充返回 `riskLevel`、`riskLevelType`、`modelCount` - 前端页面只保留一个风险人员总览表格 - 前端不再请求 TOP10 接口 优点: - 最短路径实现 - 字段来源单一,口径一致 - 不需要前端做补丁式字段拼装 - 与本轮“移除 TOP10 页面区块”的需求完全一致 缺点: - 风险人员总览表格横向字段增加,需要适度调整列宽 ### 5.2 方案 B:前端继续请求 TOP10,再回填到风险人员总览 做法: - 风险人员总览接口不变 - 前端同时请求风险人员总览和 TOP10 - 前端根据人员信息把风险等级和命中模型数拼回总览表格 问题: - 字段来源分裂 - 口径容易漂移 - 属于补丁式方案,不符合本次最短路径和单一口径要求 ### 5.3 方案 C:只隐藏 TOP10 区块,不补真实字段 做法: - 页面隐藏 TOP10 - 风险人员总览接口和表格不扩展 问题: - 无法满足“新增风险等级和命中模型数”的需求 - 需求不完整 ### 5.4 结论 采用方案 A。 ## 六、目标页面结构 人员区块调整后,结果总览页面仍保留四大区块: 1. 风险仪表盘 2. 风险人员总览 3. 风险模型 4. 风险明细 其中人员区块收口为单表结构,风险人员总览列顺序为: 1. 序号 2. 姓名 3. 身份证号 4. 所属部门 5. 疑似违规数 6. 风险等级 7. 命中模型数 8. 核心异常点 9. 操作 说明: - `风险等级` 使用标签展示,继续直接绑定后端返回的 `riskLevelType` - `命中模型数` 直接展示后端返回的 `modelCount` - `核心异常点` 继续完整展示,不做压缩式改造 ## 七、后端设计 ### 7.1 接口边界 继续沿用现有接口: - `GET /ccdi/project/overview/risk-people` 入参不变: - `projectId` ### 7.2 返回结构调整 风险人员总览返回项新增以下字段: - `riskLevel` - `riskLevelType` - `modelCount` 调整后示例: ```json { "overviewList": [ { "name": "李四", "idNo": "330000000000000001", "department": "信息二部", "riskCount": 5, "riskLevel": "中风险", "riskLevelType": "warning", "modelCount": 4, "riskPoint": "大额单笔收入、疑似兼职", "actionLabel": "查看详情" } ] } ``` ### 7.3 聚合与映射 后端不新增新的聚合 SQL 口径,直接复用现有员工风险聚合结果: - `hitCount` 继续作为 `riskCount` - `riskLevelCode` 用于映射 `riskLevel` 和 `riskLevelType` - `modelCount` 直接透传到风险人员总览项 服务层新增映射规则: - `HIGH -> 高风险 / danger` - `MEDIUM -> 中风险 / warning` - `LOW -> 低风险 / info` ### 7.4 排序口径 风险人员总览继续沿用当前查询顺序: - `risk_level_sort asc` - `model_count desc` - `rule_count desc` - `staff_id_card asc` 本次不改成新的重点排序规则。 ## 八、前端设计 ### 8.1 页面结构调整 `RiskPeopleSection.vue` 中: - 保留风险人员总览 block - 删除中高风险人员TOP10 block - 在风险人员总览表格中新增两列: - 风险等级 - 命中模型数 ### 8.2 数据装配调整 `PreliminaryCheck.vue` 中页面加载时: - 保留 `dashboard` 请求 - 保留 `riskPeople` 请求 - 移除 `topRiskPeople` 请求 `createOverviewLoadedData` 中: - 保留 `overviewList` 注入 - 移除 `topRiskList` 对页面展示的依赖 ### 8.3 Mock 与状态数据 `preliminaryCheck.mock.js` 中: - `overviewList` 示例数据补充 `riskLevel`、`riskLevelType`、`modelCount` - 页面状态数据不再依赖 `topRiskList` ## 九、异常与空态处理 - `projectId` 为空时,继续展示现有空态 - 接口异常时,继续沿用当前结果总览页面的空态回退 - 风险人员总览无数据时,展示单表空态,不再出现第二个 TOP10 区块 - 风险等级标签由后端直接提供,不在前端新增业务推导逻辑 ## 十、验证设计 ### 10.1 后端验证 需要验证: 1. 风险人员总览接口返回新增字段: - `riskLevel` - `riskLevelType` - `modelCount` 2. 风险等级口径保持原逻辑不变 3. 疑似违规数仍然来自 `hitCount` 4. 风险人员总览排序不变 ### 10.2 前端验证 需要验证: 1. 结果总览页面不再请求 TOP10 接口 2. 人员区块只渲染一个表格 3. 风险人员总览出现新增两列: - 风险等级 - 命中模型数 4. 加载态、空态、正常态均可正常展示 ### 10.3 测试资产更新 前端静态断言测试需要同步调整: - 移除对 `中高风险人员TOP10` 文案的依赖 - 增加对 `风险等级`、`命中模型数` 的断言 ## 十一、文档沉淀 本次设计确认后,后续需补齐以下文档: 1. 后端实施计划:`docs/plans/backend/` 2. 前端实施计划:`docs/plans/frontend/` 3. 实施记录:`docs/reports/implementation/` 4. 验证记录:`docs/tests/records/` ## 十二、结论 本次改动采用“单表收口”的最短路径方案: 1. 页面移除独立的 `中高风险人员TOP10` 2. `风险人员总览` 补充 `风险等级` 与 `命中模型数` 3. 后端扩展现有风险人员总览接口返回字段 4. 前端移除对 TOP10 接口的页面依赖 5. 排序、风险等级计算和其他区块保持不变 该方案满足需求、口径单一、改动边界清晰,且不会把本轮调整扩散到结果总览其他功能块。