Files
ccdi/docs/superpowers/specs/2026-03-30-project-detail-risk-details-unified-export-design.md

312 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目详情风险明细统一导出设计文档
**日期**: 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 先保留空白模板,等待后续真实能力接入
该方案不引入补丁式兼容逻辑,不扩大需求范围,且能够在当前代码结构下稳定落地。