From 28b846134a0d1af08e96838bcb426b422bb2d28b Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Mon, 30 Mar 2026 14:24:49 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E9=A3=8E=E9=99=A9=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E7=BB=9F=E4=B8=80=E5=AF=BC=E5=87=BA=E5=AE=9E=E6=96=BD?= =?UTF-8?q?=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ails-unified-export-implementation-plan.md | 385 ++++++++++++++++++ ...ails-unified-export-implementation-plan.md | 175 ++++++++ ...risk-details-unified-export-plan-record.md | 29 ++ 3 files changed, 589 insertions(+) create mode 100644 docs/plans/backend/2026-03-30-project-detail-risk-details-unified-export-implementation-plan.md create mode 100644 docs/plans/frontend/2026-03-30-project-detail-risk-details-unified-export-implementation-plan.md create mode 100644 docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-plan-record.md diff --git a/docs/plans/backend/2026-03-30-project-detail-risk-details-unified-export-implementation-plan.md b/docs/plans/backend/2026-03-30-project-detail-risk-details-unified-export-implementation-plan.md new file mode 100644 index 00000000..993cb6f6 --- /dev/null +++ b/docs/plans/backend/2026-03-30-project-detail-risk-details-unified-export-implementation-plan.md @@ -0,0 +1,385 @@ +# 项目详情风险明细统一导出后端 Implementation Plan + +> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking. +> +> 仓库约束:当前仓库明确禁止开启 subagent,执行时统一使用 `superpowers:executing-plans`。 + +**Goal:** 为项目详情风险明细新增统一后端导出能力,输出一个包含 `涉疑交易明细`、`员工负面征信信息`、`异常账户人员信息` 三个 sheet 的 Excel 文件。 + +**Architecture:** 复用现有涉疑交易导出查询口径,补充员工负面征信的非分页导出查询,再由后端统一组装工作簿并输出响应流。异常账户人员信息本轮不开发真实查询,只输出固定表头的空白 sheet,保证导出文件结构稳定。 + +**Tech Stack:** Java 21, Spring Boot 3, MyBatis XML, EasyExcel, JUnit 5, Mockito + +--- + +## File Map + +**Modify:** + +- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewController.java` + - 新增统一导出接口,保留现有查询接口不变 +- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectOverviewService.java` + - 新增统一导出方法和员工负面征信导出方法定义 +- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java` + - 组装统一导出数据、校验项目、调用工作簿导出器 +- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapper.java` + - 新增员工负面征信导出列表查询方法 +- `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml` + - 新增员工负面征信非分页导出 SQL +- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java` + - 覆盖新接口的委托行为 +- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerContractTest.java` + - 覆盖新接口路径、注解和方法签名 +- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceEmployeeCreditNegativeTest.java` + - 补充员工负面征信导出查询映射与项目校验 +- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperSqlTest.java` + - 覆盖新增导出 SQL 的表、关联和排序口径 +- `docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-backend-implementation.md` + - 记录后端实际改动与验证结果 + +**Create:** + +- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/excel/CcdiProjectEmployeeCreditNegativeExcel.java` + - 定义 `员工负面征信信息` sheet 行结构 +- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectRiskDetailWorkbookExporter.java` + - 统一负责生成 3-sheet 工作簿并写入响应流 +- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectRiskDetailWorkbookExporterTest.java` + - 断言 sheet 顺序、表头和空白异常账户 sheet + +## Task 1: 锁定统一导出接口契约 + +**Files:** + +- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerContractTest.java` +- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java` + +- [ ] **Step 1: 先写控制器契约测试** + +在 `CcdiProjectOverviewControllerContractTest` 中新增一个测试,断言新方法: + +```java +Method method = controllerClass.getMethod( + "exportRiskDetails", + HttpServletResponse.class, + Long.class +); +PostMapping postMapping = method.getAnnotation(PostMapping.class); +assertEquals("/risk-details/export", postMapping.value()[0]); +``` + +- [ ] **Step 2: 补控制器单测,先让它失败** + +在 `CcdiProjectOverviewControllerTest` 中新增测试,约束控制器只做委托: + +```java +MockHttpServletResponse response = new MockHttpServletResponse(); +controller.exportRiskDetails(response, 40L); +verify(overviewService).exportRiskDetails(same(response), same(40L)); +``` + +- [ ] **Step 3: 运行后端定向测试,确认失败点正确** + +Run: + +```bash +mvn -pl ccdi-project -Dtest=CcdiProjectOverviewControllerContractTest,CcdiProjectOverviewControllerTest test +``` + +Expected: + +- FAIL,提示控制器缺少 `exportRiskDetails` 方法或签名不匹配 + +- [ ] **Step 4: 最小化补齐控制器方法签名** + +在 `CcdiProjectOverviewController.java` 中增加方法骨架: + +```java +@PostMapping("/risk-details/export") +@Operation(summary = "导出风险明细") +@PreAuthorize("@ss.hasPermi('ccdi:project:query')") +public void exportRiskDetails(HttpServletResponse response, Long projectId) { + overviewService.exportRiskDetails(response, projectId); +} +``` + +- [ ] **Step 5: 重新运行控制器测试** + +Run: + +```bash +mvn -pl ccdi-project -Dtest=CcdiProjectOverviewControllerContractTest,CcdiProjectOverviewControllerTest test +``` + +Expected: + +- PASS + +- [ ] **Step 6: 提交本任务** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewController.java \ + ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerContractTest.java \ + ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java +git commit -m "补充风险明细统一导出接口契约" +``` + +## Task 2: 补齐员工负面征信导出数据链路 + +**Files:** + +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/excel/CcdiProjectEmployeeCreditNegativeExcel.java` +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectOverviewService.java` +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java` +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapper.java` +- Modify: `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml` +- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceEmployeeCreditNegativeTest.java` +- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperSqlTest.java` + +- [ ] **Step 1: 先写 Mapper SQL 断言** + +在 `CcdiProjectOverviewMapperSqlTest` 中新增对 `selectEmployeeCreditNegativeList` 的断言: + +```java +String exportSql = extractSelect(xml, "selectEmployeeCreditNegativeList"); +assertTrue(exportSql.contains("from ccdi_project_overview_employee_result")); +assertTrue(exportSql.contains("inner join ccdi_credit_negative_info")); +assertTrue(exportSql.contains("order by neg.query_date desc, neg.person_id asc")); +``` + +- [ ] **Step 2: 再写服务层失败测试** + +在 `CcdiProjectOverviewServiceEmployeeCreditNegativeTest` 中新增两个测试: + +- 导出时项目存在且能返回 `List` +- 项目不存在时抛出 `ServiceException` + +示例断言: + +```java +List rows = service.exportEmployeeCreditNegative(40L); +assertEquals("李四", rows.getFirst().getPersonName()); +verify(overviewMapper).selectEmployeeCreditNegativeList(40L); +``` + +- [ ] **Step 3: 运行测试确认失败** + +Run: + +```bash +mvn -pl ccdi-project -Dtest=CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceEmployeeCreditNegativeTest test +``` + +Expected: + +- FAIL,提示缺少 Mapper select 或服务方法 + +- [ ] **Step 4: 实现最小导出链路** + +按以下顺序补代码: + +1. 创建 `CcdiProjectEmployeeCreditNegativeExcel.java` +2. 在 `ICcdiProjectOverviewService` 增加: + +```java +List exportEmployeeCreditNegative(Long projectId); +``` + +3. 在 `CcdiProjectOverviewMapper.java` 增加: + +```java +List selectEmployeeCreditNegativeList(@Param("projectId") Long projectId); +``` + +4. 在 `CcdiProjectOverviewMapper.xml` 新增非分页导出 SQL +5. 在 `CcdiProjectOverviewServiceImpl` 中增加映射方法,把 `ItemVO` 转为 `Excel` 行对象 + +- [ ] **Step 5: 重新运行定向测试** + +Run: + +```bash +mvn -pl ccdi-project -Dtest=CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceEmployeeCreditNegativeTest test +``` + +Expected: + +- PASS + +- [ ] **Step 6: 提交本任务** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/excel/CcdiProjectEmployeeCreditNegativeExcel.java \ + ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectOverviewService.java \ + ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java \ + ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapper.java \ + ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml \ + ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceEmployeeCreditNegativeTest.java \ + ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperSqlTest.java +git commit -m "补充风险明细负面征信导出链路" +``` + +## Task 3: 实现统一工作簿导出器 + +**Files:** + +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectRiskDetailWorkbookExporter.java` +- Create: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectRiskDetailWorkbookExporterTest.java` + +- [ ] **Step 1: 先写工作簿测试** + +新增 `CcdiProjectRiskDetailWorkbookExporterTest`,覆盖: + +- 工作簿固定包含 3 个 sheet +- 顺序为 `涉疑交易明细`、`员工负面征信信息`、`异常账户人员信息` +- 第三个 sheet 只有表头 + +建议使用 `ByteArrayOutputStream + EasyExcel.read/POI` 读取结果验证。 + +关键断言示例: + +```java +assertEquals("涉疑交易明细", workbook.getSheetAt(0).getSheetName()); +assertEquals("员工负面征信信息", workbook.getSheetAt(1).getSheetName()); +assertEquals("异常账户人员信息", workbook.getSheetAt(2).getSheetName()); +assertEquals("账号", workbook.getSheetAt(2).getRow(0).getCell(0).getStringCellValue()); +``` + +- [ ] **Step 2: 运行测试确认失败** + +Run: + +```bash +mvn -pl ccdi-project -Dtest=CcdiProjectRiskDetailWorkbookExporterTest test +``` + +Expected: + +- FAIL,提示缺少导出器类 + +- [ ] **Step 3: 写最小工作簿导出器** + +创建 `CcdiProjectRiskDetailWorkbookExporter`,职责仅限: + +- 写入 `涉疑交易明细` sheet +- 写入 `员工负面征信信息` sheet +- 写入仅含表头的 `异常账户人员信息` sheet +- 统一设置文件名和响应头 + +不要在这个类里做项目校验或数据库查询。 + +- [ ] **Step 4: 重新运行工作簿测试** + +Run: + +```bash +mvn -pl ccdi-project -Dtest=CcdiProjectRiskDetailWorkbookExporterTest test +``` + +Expected: + +- PASS + +- [ ] **Step 5: 提交本任务** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectRiskDetailWorkbookExporter.java \ + ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectRiskDetailWorkbookExporterTest.java +git commit -m "补充风险明细多sheet导出器" +``` + +## Task 4: 串起服务实现并完成后端验证 + +**Files:** + +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectOverviewService.java` +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java` +- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java` +- Modify: `docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-backend-implementation.md` + +- [ ] **Step 1: 先写服务层失败测试** + +如果现有 `CcdiProjectOverviewServiceImplTest` 更合适,就在其中新增;否则新建一个导出专用测试类。至少覆盖: + +- 服务内部调用现有 `exportSuspiciousTransactions` +- 服务调用 `exportEmployeeCreditNegative` +- 服务把两份真实数据交给 `CcdiProjectRiskDetailWorkbookExporter` +- 项目不存在时直接失败 + +- [ ] **Step 2: 运行服务测试确认失败** + +Run: + +```bash +mvn -pl ccdi-project -Dtest=CcdiProjectOverviewServiceImplTest,CcdiProjectOverviewControllerTest test +``` + +Expected: + +- FAIL,提示 `exportRiskDetails` 尚未真正实现 + +- [ ] **Step 3: 实现统一导出主流程** + +在 `CcdiProjectOverviewServiceImpl` 中补齐: + +```java +public void exportRiskDetails(HttpServletResponse response, Long projectId) { + ensureProjectExists(projectId); + CcdiProjectSuspiciousTransactionQueryDTO queryDTO = new CcdiProjectSuspiciousTransactionQueryDTO(); + queryDTO.setProjectId(projectId); + queryDTO.setSuspiciousType("ALL"); + List suspiciousRows = exportSuspiciousTransactions(queryDTO); + List creditRows = exportEmployeeCreditNegative(projectId); + workbookExporter.export(response, projectId, suspiciousRows, creditRows); +} +``` + +- [ ] **Step 4: 跑完整后端回归** + +Run: + +```bash +mvn -pl ccdi-project -Dtest=CcdiProjectOverviewControllerTest,CcdiProjectOverviewControllerContractTest,CcdiProjectOverviewServiceEmployeeCreditNegativeTest,CcdiProjectRiskDetailWorkbookExporterTest,CcdiProjectOverviewMapperSqlTest test +``` + +Expected: + +- PASS + +可选补充: + +```bash +mvn -pl ccdi-project test +``` + +- [ ] **Step 5: 写后端实施记录** + +在 `docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-backend-implementation.md` 中记录: + +- 新增接口与方法 +- 多 sheet 工作簿实现 +- 员工负面征信导出链路 +- 异常账户空白 sheet 处理 +- 实际执行的测试命令与结果 + +- [ ] **Step 6: 提交本任务** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectOverviewService.java \ + ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java \ + ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java \ + docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-backend-implementation.md +git commit -m "完成风险明细统一导出后端实现" +``` + +## Final Verification + +- [ ] 运行: + +```bash +mvn -pl ccdi-project -Dtest=CcdiProjectOverviewControllerTest,CcdiProjectOverviewControllerContractTest,CcdiProjectOverviewServiceEmployeeCreditNegativeTest,CcdiProjectRiskDetailWorkbookExporterTest,CcdiProjectOverviewMapperSqlTest test +``` + +- [ ] 确认导出接口路径为 `POST /ccdi/project/overview/risk-details/export` +- [ ] 确认导出文件包含 3 个 sheet,第三个 sheet 只有表头 +- [ ] 确认旧的 `/suspicious-transactions/export` 仍保留,避免影响其他调用方 + diff --git a/docs/plans/frontend/2026-03-30-project-detail-risk-details-unified-export-implementation-plan.md b/docs/plans/frontend/2026-03-30-project-detail-risk-details-unified-export-implementation-plan.md new file mode 100644 index 00000000..c71a2f6e --- /dev/null +++ b/docs/plans/frontend/2026-03-30-project-detail-risk-details-unified-export-implementation-plan.md @@ -0,0 +1,175 @@ +# 项目详情风险明细统一导出前端 Implementation Plan + +> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking. +> +> 仓库约束:当前仓库明确禁止开启 subagent,执行时统一使用 `superpowers:executing-plans`。 + +**Goal:** 将项目详情风险明细的导出入口收口为总卡片右上角的统一按钮,并改为调用新的统一后端导出接口。 + +**Architecture:** 前端保持最小改动,继续复用 `RiskDetailSection.vue` 内现有 `this.download(...)` 模式,不额外新增导出页状态管理或 API 包装层。页面仅调整按钮位置、调用路径和禁用逻辑,不改变现有分页、筛选和详情弹窗行为。 + +**Tech Stack:** Vue 2, Element UI, RuoYi 前端下载工具链 + +--- + +## File Map + +**Modify:** + +- `ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue` + - 调整统一导出按钮位置,移除区块内导出按钮,切换下载路径 +- `docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-frontend-implementation.md` + - 记录前端改动与验证结果 + +**No Change Expected:** + +- `ruoyi-ui/src/api/ccdi/projectOverview.js` + - 本轮不强制新增导出 API;组件继续直接调用 `this.download` +- `ruoyi-ui/src/views/ccdiProject/components/detail/preliminaryCheck.mock.js` + - 数据结构未改,不需要为按钮位置调整补 mock 字段 + +## Task 1: 收口风险明细导出入口 + +**Files:** + +- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue` + +- [ ] **Step 1: 先记录当前页面结构和回归点** + +执行前先确认当前组件里有两处导出按钮: + +- `涉疑交易明细` 区块右上角 `导出` +- `异常账户人员信息` 区块右上角 `导出` + +同时记录这些行为后续不能回归: + +- `涉疑交易明细` 下拉筛选仍可切换 +- 涉疑交易详情弹窗仍可打开 +- 员工负面征信分页仍可切换 + +- [ ] **Step 2: 修改组件模板,先让构建暴露问题** + +把统一 `导出` 按钮移动到总卡片头部: + +```vue +
+
+
风险明细
+
展示涉疑交易与异常账户关联人员信息
+
+ + 导出 + +
+``` + +同时删除两个区块内部的导出按钮。 + +- [ ] **Step 3: 调整下载方法** + +把旧的 `handleExport` 收口成统一方法: + +```js +handleRiskDetailExport() { + if (!this.projectId) { + return + } + this.download( + "ccdi/project/overview/risk-details/export", + { projectId: this.projectId }, + `风险明细_${this.projectId}_${new Date().getTime()}.xlsx` + ) +} +``` + +注意: + +- 不再传 `suspiciousType` +- 不再依赖 `suspiciousTotal === 0` + +- [ ] **Step 4: 运行前端构建验证** + +Run: + +```bash +cd ruoyi-ui +npm run build:prod +``` + +Expected: + +- PASS + +- [ ] **Step 5: 提交本任务** + +```bash +git add ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue +git commit -m "调整风险明细统一导出入口" +``` + +## Task 2: 做前端回归检查并补实施记录 + +**Files:** + +- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue` +- Modify: `docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-frontend-implementation.md` + +- [ ] **Step 1: 做页面回归检查** + +至少验证以下 5 项: + +1. 风险明细总卡片右上角显示唯一导出按钮 +2. `涉疑交易明细` 区块内不再显示导出按钮 +3. `异常账户人员信息` 区块内不再显示导出按钮 +4. 切换涉疑交易筛选仍能正常刷新列表 +5. 点击 `详情` 仍能打开流水详情弹窗 + +如果本轮需要本地启动页面,可使用: + +```bash +cd ruoyi-ui +npm run dev +``` + +验证完成后记得关闭前端进程。 + +- [ ] **Step 2: 联调统一导出** + +在后端接口完成后,手工点击统一导出按钮,确认: + +- 请求路径为 `ccdi/project/overview/risk-details/export` +- 浏览器开始下载 `.xlsx` +- 不再请求旧的 `suspicious-transactions/export` + +- [ ] **Step 3: 写前端实施记录** + +在 `docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-frontend-implementation.md` 中记录: + +- 按钮位置调整 +- 删除的两个局部导出入口 +- 新下载路径和文件名 +- `npm run build:prod` 结果 +- 手工回归点 + +- [ ] **Step 4: 提交本任务** + +```bash +git add docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-frontend-implementation.md \ + ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue +git commit -m "完成风险明细统一导出前端实现" +``` + +## Final Verification + +- [ ] 运行: + +```bash +cd ruoyi-ui +npm run build:prod +``` + +- [ ] 确认页面只剩一个统一导出按钮 +- [ ] 确认统一导出按钮只依赖 `projectId` +- [ ] 确认旧区块按钮全部移除 +- [ ] 如启动了 `npm run dev`,验证结束后手动关闭前端进程 + diff --git a/docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-plan-record.md b/docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-plan-record.md new file mode 100644 index 00000000..dec7b403 --- /dev/null +++ b/docs/reports/implementation/2026-03-30-project-detail-risk-details-unified-export-plan-record.md @@ -0,0 +1,29 @@ +# 项目详情风险明细统一导出实施计划记录 + +**日期**: 2026-03-30 +**类型**: 实施计划记录 +**范围**: 项目详情 - 结果总览 - 风险明细统一导出 + +## 1. 本次新增计划文档 + +- `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` + +## 2. 计划拆分原则 + +- 后端计划只覆盖统一导出接口、员工负面征信导出链路、多 sheet 工作簿生成与后端验证 +- 前端计划只覆盖导出入口收口、按钮位置调整、下载路径切换与前端回归验证 +- `异常账户人员信息` 本轮仅保留空白 sheet,不进入真实数据开发计划 + +## 3. 执行约束 + +- 前端开发直接在当前分支执行,不使用 git worktree +- 仓库要求不开启 subagent,后续执行阶段统一使用当前会话串行推进 +- 若验证时启动前后端进程,结束后必须主动关闭 + +## 4. 后续交付物 + +执行实施计划时需补齐以下记录: + +- `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`