# 涉疑交易明细筛选一致性实施记录

## 修改内容

### 后端

- 涉疑交易模型命中 SQL 按预警类型隔离模型范围：
  - `MODEL_RULE` 排除 `EXTERNAL_*` 外部模型。
  - `EXTERNAL_PERSON` 仅保留 `EXTERNAL_*` 外部模型。
  - 选择具体 `modelCode` 时精确匹配模型。
- 优化外部人员分支判断：`MODEL_RULE` 和 `ALL + 员工具体模型` 不再检查或拼接外部人员分支。
- 涉疑交易分页结果直接返回本方账户、对方账户等列表展示字段。
- 分页完成后，仅针对当前页流水 ID 批量查询一次筛选范围内的标签，并返回标签 `modelCode`。
- 流水详情接口支持 `modelCode`、`suspiciousType`，详情标签与列表筛选一致。
- 风险明细统一导出接口接收当前涉疑筛选条件，涉疑交易工作表与页面口径一致。
- 涉疑交易导出标签聚合应用相同模型范围。

### 前端

- 模型或预警类型变化时立即清空旧列表、总数、详情和缓存，但不自动发起查询。
- 增加涉疑交易请求序号，只有最后一次请求可以更新列表、总数和加载状态。
- 父组件同项目数据更新时不再重置本地筛选或覆盖当前列表；仅项目切换时重新初始化。
- 删除涉疑列表当前页逐条请求流水详情的补全逻辑，直接使用列表接口返回字段和标签。
- 详情缓存键增加预警类型与模型编码，详情请求透传当前筛选条件。
- 风险明细导出透传当前涉疑交易筛选条件。

## 性能变化

- 浏览器列表加载由“1 次涉疑列表请求 + 当前页 N 次流水详情请求”降为 1 次涉疑列表请求。
- 后端每次分页固定执行分页查询和当前页标签批量查询，不按流水逐条查询标签。
- 员工具体模型查询不再执行外部人员主体判断和外部人员复杂关联分支。
- 下拉框变化不请求后端，只有点击“查询”才执行一次查询。

## 自动化验证

### 后端

执行：

```bash
mvn -pl ccdi-project -am "-Dtest=CcdiProjectOverviewServiceSuspiciousTransactionTest,CcdiProjectOverviewMapperSqlTest,CcdiBankStatementServiceImplTest,CcdiBankTagResultMapperXmlTest,CcdiBankStatementControllerTest,CcdiProjectOverviewControllerTest,CcdiProjectOverviewControllerContractTest" "-Dsurefire.failIfNoSpecifiedTests=false" test
```

结果：`Tests run: 55, Failures: 0, Errors: 0, Skipped: 0`。

同时执行 `mvn -pl ruoyi-admin -am package -DskipTests`，后端打包通过。

### 前端

项目 `.nvmrc` 对应的 Node 14.21.3 本机安装缺少 npm，因此按仓库规则使用已验证的 Node 22.22.3、npm 10.9.8。

执行以下定向脚本，全部通过：

```bash
node tests/unit/risk-detail-suspicious-filter-consistency.test.js
node tests/unit/risk-detail-suspicious-filter-linkage.test.js
node tests/unit/risk-detail-suspicious-transaction-detail-dialog.test.js
node tests/unit/preliminary-check-suspicious-transaction-load.test.js
node tests/unit/project-overview-api.test.js
```

执行 `npm run build:prod`，生产构建通过；仅保留仓库原有包体积警告。

## 真实页面验证

`browser-use` 所需的内置浏览器执行工具在当前会话不可用，按技能检查流程确认后，使用终端 Playwright 连接真实前端 `http://localhost:9528` 和真实 Java 后端 `http://localhost:62318` 验证，未使用原型或 Mock。

- 项目 42：
  - 切换模型时旧列表立即清空，未自动发起查询。
  - `ALL + SUSPICIOUS_GAMBLING` 返回空结果，未保留上一轮大额交易列表。
  - `ALL + LARGE_TRANSACTION` 返回标签全部为 `LARGE_TRANSACTION`。
  - 主动打开详情后，详情请求携带 `modelCode=LARGE_TRANSACTION&suspiciousType=ALL`。
- 项目 90629002：
  - `MODEL_RULE + 全部模型` 仅返回 2 条员工流水，标签均为员工模型。
  - `EXTERNAL_PERSON + 全部模型` 仅返回 3 条外部人员流水，标签均为 `EXTERNAL_*`。
  - `EXTERNAL_PERSON + EXTERNAL_LARGE_TRANSACTION` 仅返回外部人员大额交易标签。
  - `EXTERNAL_PERSON + EXTERNAL_SUSPICIOUS_GAMBLING` 仅返回 1 条外部人员可疑赌博流水和对应标签，未混入外部人员大额交易标签。
- 列表查询期间未产生当前页逐条详情请求；仅主动点击“详情”后发起一条详情请求。
- 浏览器控制台错误数为 0。

测试结束后已关闭本轮启动的前端、后端和浏览器进程，62318、9528 均无监听进程。
