# 异常账户标签识别联调验证记录

## 1. 验证目标

- 验证异常账户模型在真实数据库中可稳定命中
- 验证页面展示结果与数据库、后端聚合结果一致

## 2. 关联文档

- 后端实施计划：`docs/plans/backend/2026-03-31-abnormal-account-bank-tag-backend-implementation-plan.md`
- 前端实施计划：`docs/plans/frontend/2026-03-31-abnormal-account-bank-tag-frontend-implementation-plan.md`

## 3. 验证环境

- 验证日期：2026-03-31
- 后端地址：`http://127.0.0.1:62318`
- 前端地址：`http://127.0.0.1:1026`
- 数据库连接：以 `ruoyi-admin/src/main/resources/application-dev.yml` 为准

说明：

- MySQL MCP 当前连接的库与应用实际使用库不一致，本次最终 SQL 校验统一使用项目配置文件解析出的真实数据库连接执行，避免出现“页面有数据、MCP 无数据”的误判。

## 4. 数据准备

执行以下脚本补齐规则元数据与最小测试样本：

```bash
bin/mysql_utf8_exec.sh sql/migration/2026-03-31-create-ccdi-account-info-and-abnormal-account-rules.sql
bin/mysql_utf8_exec.sh sql/migration/2026-03-31-add-abnormal-account-rule-test-data.sql
```

补齐后确认以下样本存在：

- 项目：`90331 / 异常账户规则测试项目`
- 员工 A：`330101199001010001`
- 员工 B：`330101199001010002`
- 员工 C：`330101199001010003`
- 员工 D：`330101199001010004`
- 账户样本：4 条
- 流水样本：7 条

## 5. SQL 校验结果

### 5.1 规则元数据

- `ABNORMAL_ACCOUNT / SUDDEN_ACCOUNT_CLOSURE / OBJECT / HIGH`
- `ABNORMAL_ACCOUNT / DORMANT_ACCOUNT_LARGE_ACTIVATION / OBJECT / HIGH`

### 5.2 原始规则 SQL 命中结果

- `SUDDEN_ACCOUNT_CLOSURE`
  - 命中员工：`330101199001010001`
  - 账户：`6222000000000001`
  - 销户日期：`2026-03-20`
  - 销户前最后交易日：`2026-03-18`
  - 窗口累计交易金额：`180000.00`
  - 单笔最大金额：`70000.00`

- `DORMANT_ACCOUNT_LARGE_ACTIVATION`
  - 命中员工：`330101199001010002`
  - 账户：`6222000000000002`
  - 开户日期：`2025-01-01`
  - 首次交易日期：`2025-08-01`
  - 沉睡月数：`7`
  - 启用后累计交易金额：`550000.00`
  - 单笔最大金额：`300000.00`

结论：

- 仅员工 A 命中 `突然销户`
- 仅员工 B 命中 `休眠账户大额启用`
- 员工 C、员工 D 未误命中

## 6. 后端接口与落库验证

### 6.1 手动重算

调用：

```bash
POST /login/test
POST /ccdi/project/tags/rebuild
```

入参：

```json
{
  "projectId": 90331,
  "modelCode": "ABNORMAL_ACCOUNT"
}
```

返回：

- `code = 200`
- `msg = 标签重算任务已提交`

### 6.2 任务与结果表

- 最新任务：`ccdi_bank_tag_task.id = 67`
- 任务状态：`SUCCESS`
- 命中数：`2`
- `ccdi_bank_statement_tag_result` 中 `ABNORMAL_ACCOUNT` 结果数：`2`
- `ccdi_project_overview_employee_result` 聚合结果数：`2`

### 6.3 总览接口返回

- 风险模型卡片返回：`异常账户 / warningCount=2 / peopleCount=2`
- 风险人员总览返回：
  - 测试员工 A：`突然销户`
  - 测试员工 B：`休眠账户大额启用`
- 项目分析详情返回：
  - 员工 A 的 `reasonDetail` 与 SQL 命中说明一致
  - 员工 B 的 `reasonDetail` 与 SQL 命中说明一致

## 7. 页面联调结果

通过前端页面 `http://127.0.0.1:1026/ccdiProject/detail/90331?tab=overview` 验证：

- 项目列表中 `异常账户规则测试项目` 显示 `已完成`
- 项目列表中目标人数显示 `4`，预警人数显示 `2`
- 结果总览风险人员区域显示：
  - `测试员工A / 突然销户`
  - `测试员工B / 休眠账户大额启用`
- 风险模型区域显示模型卡片：
  - `异常账户 / 2 / 涉及 2 人`
- 风险模型命中人员列表显示：
  - `测试员工A / 异常账户 / 突然销户`
  - `测试员工B / 异常账户 / 休眠账户大额启用`
- 点击 `测试员工A` 的 `查看详情` 后，项目分析详情弹窗展示：
  - `异常对象摘要`
  - `测试员工A`
  - `员工对象`
  - `账户6222000000000001于2026-03-20销户，销户前30天内最后交易日2026-03-18，累计交易金额180000.00元，单笔最大金额70000.00元`
- 风险详情页中的 `异常账户人员信息` 区块正常渲染占位文案，未因本轮后端接入报错

## 8. 发现与结论

### 8.1 验证结论

- 异常账户标签可以被正确识别
- 数据库原始规则命中结果、后端聚合结果、前端页面展示结果三者一致

### 8.2 联调观察

- 打开项目分析详情弹窗时，前端控制台出现 2 条 Vue 告警：
  - `Duplicate keys detected: '关联人员往来-object'`
- 该告警未阻断本次异常账户标签展示，但建议后续排查 `ProjectAnalysisAbnormalTab.vue` 中的 key 生成逻辑，避免详情弹窗在更多数据场景下出现渲染更新问题

## 9. 进程处理

- 本次验证复用了已运行的后端进程，未额外启动新的后端服务
- 本次验证启动了前端开发服务，验证结束后需主动关闭
