# 未提交账户实施记录

## 修改内容

- 新增结果总览“未提交账户”后端查询与导出能力。
- 新增前端风险明细未提交账户卡片展示。
- 新增未提交账户卡片点击后的本地“流水明细”弹窗，按 `LE_ACCOUNT_NAME + CUSTOMER_ACCOUNT_NO` 当前卡片范围查询，不跳转“流水明细查询”Tab。
- 新增未提交账户流水查询接口 `GET /ccdi/project/overview/unsubmitted-accounts/flows`；原未提交账户导出接口支持可选 `subjectName/accountNo` 过滤，用于弹窗内导出当前账号流水。
- 风险明细统一导出与结果总览报告接入未提交账户流水。
- 贷款排除仅使用银行贷款/信贷高确定性关键词，未启用内部杂项账号排除。
- 本地项目 `90342（test拉取行内流水）` 补充未提交账户演示数据，统一流水号标记为 `UNSUBMITTED_ACCOUNT_SEED_90342_20260720%`。

## 影响范围

- 后端：`ccdi-project` 结果总览 Controller、Service、Mapper、DTO、VO、Excel 与导出器。
- 前端：`ruoyi-ui` 结果总览风险明细组件与 API，未提交账户卡片新增本地明细弹窗与当前账号导出。
- 文档：后端计划、前端计划、实施记录。

## 验证情况

- 后端增量测试首次执行通过：`mvn -pl ccdi-project "-Dtest=CcdiProjectOverviewMapperSqlTest,CcdiProjectRiskDetailWorkbookExporterTest,CcdiProjectOverviewServiceImplTest" test`，共 25 个测试通过。
- 执行 `mvn -pl ruoyi-admin -am clean package -DskipTests`，后端全链路依赖模块打包成功。
- Mapper XML well-formed 检查通过。
- 前端使用 Node `v22.22.3`、npm `10.9.8` 执行 `node tests/unit/risk-detail-abnormal-account-layout.test.js`，静态断言通过。
- 前端使用 Node `v22.22.3`、npm `10.9.8` 启动 `npm run dev -- --host 127.0.0.1 --port 8088`，编译成功。
- 本地补数验证：`output/sql/unsubmitted_account_seed_90342.sql` 插入 8 条流水，其中 4 个同名未提交账户聚合展示、1 个同名贷款账户通过“归还贷款/贷款还款”口径被排除；清理脚本为 `output/sql/unsubmitted_account_cleanup_90342.sql`。
- 浏览器验证：已打开 `http://127.0.0.1:8088/ccdiProject/detail/90342?tab=overview`，页面显示“未提交账户”4 个、流入总额 100.90 万元、流出总额 -1.16 万元、差额 99.74 万元。

## 2026-07-20 追加：未提交账户流水弹窗

- 后端复用未提交账户候选流水 SQL 与贷款排除口径，增加按主体名称和未提交账号过滤的流水查询能力。
- 前端未提交账户卡片支持点击/回车打开本地弹窗，弹窗标题展示日期范围、主体和账号，并提供全部/流入/流出切换。
- 弹窗内“导出流水”只导出当前主体当前未提交账号流水；页面区块右上角“导出流水”仍导出当前项目全部未提交账户流水。
- 后端验证：`mvn -pl ccdi-project -am "-Dtest=CcdiProjectOverviewMapperSqlTest,CcdiProjectRiskDetailWorkbookExporterTest,CcdiProjectOverviewServiceImplTest" "-Dsurefire.failIfNoSpecifiedTests=false" test` 通过，25 个测试通过。
- 后端打包：先执行 `mvn -pl ruoyi-admin -am clean package -DskipTests` 时因旧后端进程锁定 `ruoyi-admin.jar` 导致 clean 失败；确认 62318 旧进程结束后执行 `mvn -pl ruoyi-admin -am package -DskipTests` 成功，并重启真实 Java 后端，PID 30896，端口 62318 已监听。
- 前端验证：`.nvmrc` 指向 Node 14.21.3，但该环境缺少 npm；按项目约定使用 Node `v22.22.3`、npm `10.9.8` 执行 `node tests/unit/risk-detail-abnormal-account-layout.test.js` 通过，并启动 `npm run dev -- --host 127.0.0.1 --port 8088` 编译成功。
- 浏览器验证：打开 `http://127.0.0.1:8088/ccdiProject/detail/90342?tab=overview`，未提交账户显示 4 个；点击首个账号卡片后弹出本地“流水明细”弹窗，接口 `GET /dev-api/ccdi/project/overview/unsubmitted-accounts/flows?projectId=90342&subjectName=测试主体&accountNo=33001061559364` 返回 200，弹窗显示全部 2、流入 1、流出 1，控制台无错误。

## 2026-07-20 追加：多主体展示优化

- 前端未提交账户统计栏新增“涉及主体数”，从 `subjects.length` 计算，不改后端接口与 SQL 口径。
- 主体分组标题继续只展示主体名称，不增加“主体：”前缀；多主体时按主体名称分组列出各自账号卡片。
- 未提交账户区块右侧导出按钮调整为与本页其他明细导出一致的文字按钮“导出”；弹窗内当前账号导出仍保留“导出流水”。
- 前端验证：Node `v22.22.3`、npm `10.9.8` 下执行 `node tests/unit/risk-detail-abnormal-account-layout.test.js` 通过。
- 浏览器验证：打开 `http://127.0.0.1:8088/ccdiProject/detail/90342?tab=overview`，未提交账户区块显示“涉及主体数 1”、主体分组标题显示“测试主体”，区块右侧按钮显示“导出”，控制台无错误。

## 2026-07-20 追加：涉疑交易导出位置调整

- 移除“风险明细”区块标题右侧的综合导出按钮。
- 将导出按钮移动到“涉疑交易明细”查询条件行右侧。
- 导出接口改为 `POST /ccdi/project/overview/suspicious-transactions/export`，只导出涉疑交易明细单独 Excel，不再包含负面征信、异常账户和未提交账户等综合风险明细内容。
- “交易占比较高”仍使用后端 `highRatio` 字段，判定逻辑保持为未提交账号流入或流出占对应主体总流入/总流出达到 10%。
- 前端验证：Node `v22.22.3`、npm `10.9.8` 下执行 `node tests/unit/risk-detail-abnormal-account-layout.test.js` 通过。
- 浏览器验证：打开 `http://127.0.0.1:8088/ccdiProject/detail/90342?tab=overview`，确认“风险明细”标题右侧无导出按钮，“涉疑交易明细”筛选行右侧显示“导出”；点击后请求 `POST /dev-api/ccdi/project/overview/suspicious-transactions/export` 返回 200，控制台无错误。

## 2026-07-20 追加：文案与涉疑交易导出列顺序调整

- 未提交账户说明文案调整为“被调查主体未提交分析的同名账户”，不再在页面说明中展示“已排除银行贷款类账号”。
- 涉疑交易明细单独 Excel 导出列顺序调整为“交易金额”在“异常标签”左侧。
- 综合风险明细工作簿中的“涉疑交易明细”Sheet 同步调整列顺序，保持同类导出字段顺序一致。
- 后端验证：执行 `mvn -pl ccdi-project -am "-Dtest=CcdiProjectRiskDetailWorkbookExporterTest" "-Dsurefire.failIfNoSpecifiedTests=false" test` 通过，覆盖综合风险明细工作簿列顺序与涉疑交易单独 Excel 字段顺序。
- 前端验证：Node `v22.22.3`、npm `10.9.8` 下执行 `node tests/unit/risk-detail-abnormal-account-layout.test.js` 通过。
- 浏览器验证：刷新 `http://127.0.0.1:8088/ccdiProject/detail/90342?tab=overview`，页面显示新说明文案，未出现“已排除银行贷款类账号”；涉疑交易表格列顺序为“交易金额”在“异常标签”左侧，控制台无错误。
