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

94 lines
5.0 KiB
Markdown
Raw Normal View History

2026-07-09 14:49:02 +08:00
# 项目结果总览排除可疑实施记录
## 基本信息
- 实施日期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` 统一过滤已排除预警。
- 本期不提供恢复入口;需要恢复时需后续单独设计恢复接口和入口。