# 项目详情风险明细统一导出设计文档

**日期**: 2026-03-30  
**模块**: 项目详情 - 结果总览 - 风险明细  
**作者**: Codex  
**状态**: 已确认

## 1. 背景

当前项目详情页的 `结果总览 -> 风险明细` 已具备以下现状：

- `涉疑交易明细` 已接入真实分页查询，并具备单独导出能力
- `员工负面征信信息` 已接入真实分页查询，但没有导出能力
- `异常账户人员信息` 仍为占位展示，尚未开发真实查询链路

现有导出能力存在两个问题：

- 导出入口分散在区块内，语义上更像“局部导出”，不符合风险明细整体导出的业务动作
- 风险明细三个区块无法一次性导出到同一个 Excel 文件中

本次目标是在不扩展异常账户真实查询范围的前提下，为风险明细新增一个统一导出入口，将风险明细内容导出为一个包含三个 sheet 的 Excel 文件。

## 2. 目标

- 在 `风险明细` 总卡片右上角新增统一导出按钮
- 移除三个区块内已有或占位的单独导出按钮
- 点击后导出一个 Excel 文件，固定包含三个 sheet
- 导出当前项目下风险明细的全部命中记录，不受页面分页限制
- `异常账户人员信息` 本次仅保留空白 sheet，不开发真实查询链路

## 3. 范围

### 3.1 包含范围

- 风险明细区域统一导出按钮改造
- 新增结果总览统一导出接口
- 生成包含三个 sheet 的 Excel 文件
- 复用现有涉疑交易导出数据口径
- 新增员工负面征信导出数据口径
- 为异常账户预留空白 sheet 和表头

### 3.2 不包含范围

- 不开发异常账户人员信息的真实查询、分页与详情能力
- 不改造项目分析弹窗
- 不新增异步导出任务或下载中心
- 不新增筛选条件、导出类型选择或二次确认弹窗
- 不调整其他页面或其他模块的导出逻辑

## 4. 已确认口径

### 4.1 导出入口位置

- 统一导出按钮放在 `风险明细` 总卡片右上角
- `涉疑交易明细`、`员工负面征信信息`、`异常账户人员信息` 三个区块内都不再保留单独导出按钮

### 4.2 导出范围

- 导出当前项目下三类数据的全部命中记录
- 不受当前分页限制
- 不以页面当前分页页码作为导出口径

### 4.3 异常账户处理方式

- `异常账户人员信息` 本次暂不开发真实数据
- 导出文件中必须保留 `异常账户人员信息` sheet
- sheet 只保留表头，不输出数据行
- 不使用 mock 数据或伪造占位数据填充导出内容

## 5. 方案对比

### 方案 A：新增统一导出接口，由后端一次性生成 3 个 sheet

- 前端只负责触发一次下载
- 后端统一查询、统一组装 Excel
- 异常账户 sheet 直接输出空白模板

优点：

- 语义清晰，和“风险明细整体导出”完全一致
- 最短路径满足业务目标
- 前后端职责清楚，页面展示逻辑与导出逻辑边界明确

缺点：

- 需要补一个工作簿级别的导出实现

### 方案 B：保留三条独立导出链路，再额外拼统一导出

- 各区块维持独立导出能力
- 统一导出再调用多条现有导出逻辑

优点：

- 表面上复用较多

缺点：

- 职责交叉，维护复杂
- 与“移除单独导出入口”的确认结果不一致

### 方案 C：由前端分别取三份数据，再请求后端生成文件

- 前端承担更多数据编排责任

优点：

- 后端接口表面更少

缺点：

- 前端与导出逻辑耦合过深
- 不适合“导出全部命中记录”的独立口径

## 6. 最终方案

采用 **方案 A：新增统一导出接口，由后端一次性生成包含 3 个 sheet 的 Excel 文件**。

选择原因：

- 完全符合“风险明细整体导出”的操作语义
- 不把页面当前筛选或分页状态强绑到导出逻辑
- 可以在不开发异常账户真实数据的前提下先完成导出闭环

## 7. 前端设计

### 7.1 页面位置

页面改动集中在：

- `ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue`

### 7.2 交互设计

- 在 `风险明细` 总卡片右上角新增统一 `导出` 按钮
- 移除 `涉疑交易明细` 区块右上角现有导出按钮
- 移除 `异常账户人员信息` 区块右上角占位导出按钮
- `员工负面征信信息` 区块保持无局部导出按钮

### 7.3 触发规则

- 当 `projectId` 存在时允许触发导出
- 点击后直接下载 `.xlsx` 文件
- 不增加确认弹窗
- 不增加导出类型选择
- 不增加导出异步任务轮询

### 7.4 文件命名

导出文件命名建议为：

- `风险明细_<项目ID>_<时间戳>.xlsx`

## 8. 后端设计

### 8.1 接口设计

在结果总览控制器下新增统一导出接口：

- 路径：`POST /ccdi/project/overview/risk-details/export`
- 入参：
  - `projectId`
- 权限：`ccdi:project:query`
- 返回：文件流

本次接口不接收 `suspiciousType`，因为导出口径固定为当前项目的全部命中记录。

### 8.2 服务职责

统一导出服务方法负责：

1. 校验项目存在
2. 查询涉疑交易全量导出数据
3. 查询员工负面征信全量导出数据
4. 构建包含三个 sheet 的 Excel 工作簿
5. 输出到响应流

### 8.3 数据查询口径

#### 1. 涉疑交易明细

- 沿用现有项目结果总览专用查询口径
- 不使用分页
- 不受页面当前涉疑类型筛选限制
- 导出当前项目全部命中记录

#### 2. 员工负面征信信息

- 沿用现有项目员工负面征信查询口径
- 以 `ccdi_project_overview_employee_result` 中当前项目员工为范围
- 关联 `ccdi_credit_negative_info`
- 仅导出存在负面征信记录的员工
- 不使用分页

#### 3. 异常账户人员信息

- 本次不做真实查询
- 仅输出空白 sheet 表头

## 9. Excel 结构设计

### 9.1 Sheet 顺序

工作簿固定包含以下三个 sheet，顺序不能变化：

1. `涉疑交易明细`
2. `员工负面征信信息`
3. `异常账户人员信息`

### 9.2 涉疑交易明细字段

字段固定为：

1. `交易时间`
2. `可疑人员`
3. `关联人`
4. `关联员工`
5. `关系`
6. `摘要/交易类型`
7. `交易金额`

### 9.3 员工负面征信信息字段

字段固定为：

1. `员工姓名`
2. `身份证号`
3. `最近征信查询日期`
4. `民事案件笔数`
5. `民事案件金额`
6. `强制执行笔数`
7. `强制执行金额`
8. `行政处罚笔数`
9. `行政处罚金额`

### 9.4 异常账户人员信息字段

字段固定为：

1. `账号`
2. `开户人`
3. `银行`
4. `异常类型`
5. `异常发生时间`
6. `状态`

本次只输出表头，不输出数据行。

## 10. 实现建议

### 10.1 Excel 生成方式

现有 `ExcelUtil.exportExcel(response, list, sheetName)` 主要面向单 sheet 导出。本次统一导出建议采用工作簿级别写法，直接生成多 sheet 文件，而不是强行拼接多个单 sheet 导出调用。

### 10.2 复用策略

- `涉疑交易明细` 复用现有导出查询和行对象组装逻辑
- `员工负面征信信息` 新增独立 Excel 行对象和导出查询
- `异常账户人员信息` 新增仅包含表头的 sheet 构建逻辑

## 11. 异常处理

- `projectId` 为空或项目不存在时，直接返回业务错误
- 导出过程中如真实数据查询失败，则整个导出失败，不输出半成品文件
- `异常账户人员信息` sheet 为空属于正常结果
- 若三个 sheet 都无数据，仍导出一个包含三张表头的空模板文件

## 12. 测试设计

### 12.1 前端测试

- 风险明细总卡片右上角显示统一导出按钮
- 三个区块内部单独导出按钮全部移除
- 点击统一导出后触发文件下载
- 不影响涉疑交易筛选、分页和详情弹窗
- 不影响员工负面征信分页

### 12.2 后端测试

- 有效 `projectId` 可成功返回 `.xlsx` 文件
- 工作簿包含 3 个 sheet，且顺序正确
- `涉疑交易明细` sheet 数据条数与当前项目全量命中记录一致
- `员工负面征信信息` sheet 数据条数与当前项目全量命中记录一致
- `异常账户人员信息` sheet 只有表头、无数据行
- 无效 `projectId` 返回失败

### 12.3 回归验证

- 若保留原涉疑交易单独导出接口，确认项目详情页不再使用旧入口
- 若替换原入口，确认没有其他页面依赖该按钮交互

## 13. 文档落点

本需求相关文档建议落点如下：

- 设计文档：`docs/superpowers/specs/2026-03-30-project-detail-risk-details-unified-export-design.md`
- 后端实施计划：`docs/plans/backend/2026-03-30-project-detail-risk-details-unified-export-implementation-plan.md`
- 前端实施计划：`docs/plans/frontend/2026-03-30-project-detail-risk-details-unified-export-implementation-plan.md`
- 后端实施记录：`docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-backend-implementation.md`
- 前端实施记录：`docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-frontend-implementation.md`

## 14. 结论

本次按最短路径完成 `风险明细` 统一导出闭环：

- 前端收口为一个统一导出入口
- 后端输出一个 3-sheet Excel 文件
- 涉疑交易与员工负面征信导出真实数据
- 异常账户人员信息 sheet 先保留空白模板，等待后续真实能力接入

该方案不引入补丁式兼容逻辑，不扩大需求范围，且能够在当前代码结构下稳定落地。
