Files
ccdi/docs/reports/implementation/2026-07-09-project-risk-exclusion-implementation.md

94 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目结果总览排除可疑实施记录
## 基本信息
- 实施日期2026-07-09
- 功能范围:项目详情 > 结果总览 > 项目分析异常明细中的单条可疑预警排除
- 需求口径:支持流水明细级预警和人员对象级预警排除;本期不做恢复入口;排除后刷新当前详情、风险人员列表、模型统计、涉疑交易明细;浏览器刷新后仍按排除记录过滤。
## 修改内容
### 后端
- 新增排除记录表 `ccdi_project_risk_exclusion` 的增量 SQL。
- 新增排除记录实体、DTO、Mapper 与 XML。
-`CcdiProjectOverviewController` 新增 `POST /ccdi/project/overview/risk-exclusions`
- 在结果总览服务中新增排除逻辑:
- 校验项目可操作状态。
- 校验排除目标必须存在于当前项目命中结果。
-`STATEMENT``OBJECT` 维度写入排除记录。
- 写入后刷新项目员工结果汇总。
- 在结果总览、风险人员、模型统计、人员详情、涉疑交易明细等 SQL 中统一过滤排除记录。
- 修复对象型排除校验 SQL 中子查询 `JOIN ON` 引用外层字段导致的 MySQL 语法错误。
### 前端
- 新增 `excludeOverviewRisk` API。
- 在项目分析异常明细中为流水标签和异常对象摘要增加小号 `排除可疑` 按钮。
- 使用 Element UI 弹窗录入排除原因并确认。
- 排除成功后刷新:
- 当前项目分析详情弹窗。
- 风险人员列表。
- 风险模型卡片和命中人员。
- 涉疑交易明细,并清空流水详情缓存后重拉。
- 外部人员详情弹窗同步支持相同排除能力。
- 对象型确认文案改为优先显示规则摘要,避免把人员名当作规则名展示。
- 修复排除成功后的用户体验:
- 父级结果总览改为静默刷新,不再触发整页 loading也不重置已打开的项目分析弹窗。
- 刷新结果回写到当前项目分析人员,弹窗侧栏异常标签与总览统计保持一致。
- 项目分析详情未加载完成前不再回退展示 mock 异常明细,避免打开 `查看详情` 时闪过旧数据。
## 验证情况
### 编译与构建
- `mvn -pl ccdi-project -am compile -DskipTests`:通过。
- `mvn -pl ruoyi-admin -am package -DskipTests`:通过。
- `npm run build:prod`:通过。
前端按本机实际可用环境执行:
- `.nvmrc` 指向 Node `14.21.3`
- 本机 Node 14 环境缺少完整 npm按项目约定切换到已验证可用的 Node `22.22.3`
- PowerShell 中 `C:\Users\20696\AppData\Local\nvm-nodejs\npm.cmd` 链接不可用,本次构建改用已验证的 `C:\Users\20696\AppData\Roaming\nvm\v22.22.3` 下 Node/npm 执行。
- 构建存在既有体积告警;未跟踪的 `ruoyi-ui/public/0uS5znL.docx` 被打入构建并触发体积提示,非本次功能改动产生。
### 接口验证
- 后端真实 Java 服务启动在 `http://127.0.0.1:62318``/swagger-ui.html` 返回 200。
- 通过 `POST /login/test` 获取测试 token。
- 对项目 `42`、人员 `330101198802020033`、对象型规则 `ANNUAL_TURNOVER` 调用排除接口:
- 排除前对象规则包含 `ANNUAL_TURNOVER,CUMULATIVE_INCOME`
- `POST /ccdi/project/overview/risk-exclusions` 返回 `code=200`
- 排除后人员详情对象规则仅剩 `CUMULATIVE_INCOME`
### 浏览器验证
- 使用真实前端开发服务 `http://127.0.0.1:8088`,代理真实后端 `http://127.0.0.1:62318`
- 进入项目 `42` 的结果总览。
- 点击风险人员的 `查看详情`,进入项目分析弹窗。
- 在异常对象摘要点击 `排除可疑` 并确认。
- 页面立即刷新:
- 当前 URL 保持在 `/ccdiProject/detail/42?tab=overview`,未回到项目列表或结果总览首页。
- 项目分析弹窗保持打开,未被父页面刷新关闭。
- 风险人员疑似违规数从 `5` 变为 `4`
- 模型统计从 `大额交易 4 次` 变为 `大额交易 3 次`
- 风险人员列表风险等级从 `高风险` 变为 `中风险`
- 命中人员异常标签去掉已排除对象规则。
- 项目分析弹窗侧栏与异常对象摘要同步去掉 `年流水交易额超限`
- 刷新浏览器后仍保持过滤结果,说明排除记录持久化生效。
- 打开 `查看详情` 的首帧只显示空/加载态,不再闪过 mock 或上一次人员的异常明细。
- 浏览器 Network 面板中本轮验收 22 个 XHR/fetch 请求均为 200未出现后端接口异常。
### 数据清理
- 验证后删除本轮写入的 `ANNUAL_TURNOVER``CUMULATIVE_INCOME` 对象型排除记录。
- 通过真实后端 `POST /ccdi/project/tags/rebuild` 重算项目 `42` 标签与结果汇总。
- 清理后确认本轮对象型排除记录剩余 `0`,项目 `42` 汇总恢复为 `模型二测试员工 / rule_count=5 / model_count=2 / hit_count=5`
## 影响范围
- 新增排除表为独立业务表,不修改原始流水、员工、模型命中明细。
- 查询层通过 `NOT EXISTS` 统一过滤已排除预警。
- 本期不提供恢复入口;需要恢复时需后续单独设计恢复接口和入口。