# 项目结果总览排除可疑实施记录

## 基本信息

- 实施日期：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` 统一过滤已排除预警。
- 本期不提供恢复入口；需要恢复时需后续单独设计恢复接口和入口。
