tangweijie 91f37d6622 docs: 收口 REV-005 US4 边界与验证记录
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 10:22:56 +08:00

212 lines
19 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.

# Tasks: REV-005 发票业务流实现
**Input**: Design documents from `/specs/002-rev005-invoice-flow/`
**Prerequisites**: `plan.md`, `spec.md`, `research.md`, `data-model.md`, `contracts/`
**Validation**: 正式文档修改必须执行对应 `make validate-file`;涉及跨文档引用执行 `make check-links`;涉及 Mermaid/时序图执行 `make validate-mermaid`。backend 实现阶段需补充最小编译/流程验证。
**Organization**: 任务按用户故事分组,确保每个故事都可以独立实现、独立验证、独立评审。
## Format: `[ID] [P?] [Story] Description`
- **[P]**: 可并行执行(不同文件、无未完成依赖)
- **[Story]**: 所属用户故事(`[US1]``[US2]``[US3]``[US4]`
- 每条任务都包含明确文件路径,便于直接执行
## Path Conventions
- 正式设计文档:`docs/design/02_Detailed_Design/``docs/design/03_Technical_Design/`
- 管理台账:`docs/design/00_Management/`
- planning 产物:`specs/002-rev005-invoice-flow/`
- backend 发票模块:`backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/`
---
## Phase 1: Setup共享准备
**Purpose**: 固化本轮实现边界、目标文件和 backend 触点,避免后续修改偏离单一真源。
- [x] T001 阅读 `docs/design/00_Management/01_Project_Progress.md``docs/design/00_Management/02_Delivery_Standards.md``docs/design/00_Management/03_Task_Checklist.md` 作为本轮正式文档治理前置输入
- [x] T002 阅读并锁定本轮目标文档 `docs/design/02_Detailed_Design/12_REV_Detailed.md``docs/design/03_Technical_Design/03_Interface_Design.md``docs/design/03_Technical_Design/01_Database_Design.md` 的 REV-005 相关章节
- [x] T003 确认本轮源文档边界并在 `specs/002-rev005-invoice-flow/tasks.md` 执行时以 `specs/002-rev005-invoice-flow/spec.md``plan.md``research.md``data-model.md``contracts/if-rev-008-invoice-application.md``contracts/if-rev-009-invoice-query.md` 为直接输入
- [x] T004 [P] 盘点 backend 现有发票模块触点并核对 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/invoice/InvoiceController.java``service/invoice/InvoiceService.java``service/invoice/InvoiceServiceImpl.java``dal/dataobject/invoice/InvoiceDO.java``dal/mysql/invoice/InvoiceMapper.java`
- [x] T005 [P] 盘点客户开票信息与税率依赖并核对 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/custinvoice/CustInvoiceController.java``service/custinvoice/CustInvoiceServiceImpl.java``controller/admin/invoicetaxrate/InvoiceTaxrateController.java``service/invoicetaxrate/InvoiceTaxrateServiceImpl.java`
---
## Phase 2: Foundational共享基础能力
**Purpose**: 先补齐所有用户故事共用的模型、状态、接口骨架与文档统一口径。
- [x] T006 定义共享发票状态与来源口径并更新 `docs/design/02_Detailed_Design/12_REV_Detailed.md` 中 REV-005 状态说明为 `SUBMITTED/PENDING/SUCCESS/FAIL/INVALID/RED_INK`
- [x] T007 定义共享接口编号与职责分工并更新 `docs/design/03_Technical_Design/03_Interface_Design.md``IF-REV-008``IF-REV-009` 与客户侧查询下载相关章节,同时收敛 `IF-CS-004` 与客户侧消费口径的编号/职责边界
- [x] T008 定义共享数据承接口径并更新 `docs/design/03_Technical_Design/01_Database_Design.md``biz_invoice``biz_cust_invoice``biz_invoice_taxrate`、账单-发票关系快照说明,并标明已有字段、待补字段与仅快照字段
- [x] T009 在 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/invoice/InvoiceService.java` 声明 REV-005 共用能力入口(申请、查询、结果回写、客户侧下载/推送、作废/红冲预留)
- [x] T010 在 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/invoice/InvoiceController.java` 预留 REV-005 共用接口路由入口,避免继续仅停留在配置 CRUD
- [x] T011 [P] 新增后台申请与查询基础请求/响应对象到 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/invoice/vo/InvoiceApplyReqVO.java``InvoiceApplyRespVO.java``InvoiceQueryReqVO.java``InvoiceQueryRespVO.java`
- [x] T012 [P] 新增结果回写与客户侧消费基础请求/响应对象到 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/invoice/vo/InvoiceWriteBackReqVO.java``InvoiceCustomerQueryReqVO.java``InvoicePushReqVO.java`
---
## Phase 3: User Story 1 - 发票申请与校验 (Priority: P1) 🎯 MVP
**Goal**: 实现后台单笔/批量发票申请入口,完成账单状态、客户开票信息、税率和限额校验,并生成发票申请记录。
**Independent Test**: 后台提交已收费未开票账单时能生成申请单号;未缴费、已开票、直接部分开票等场景被正确拦截;正式文档与接口合同保持一致。
### Implementation for User Story 1
- [x] T013 [US1] 更新 `docs/design/02_Detailed_Design/12_REV_Detailed.md` 中 REV-005 的后台申请入口、校验规则、批量开票和“禁止原始单账单直接任意部分开票”描述
- [x] T014 [US1] 更新 `docs/design/03_Technical_Design/03_Interface_Design.md``IF-REV-008` 的后台申请/单笔批量开票请求、响应、幂等和失败提示口径
- [x] T015 [US1] 更新 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/invoice/InvoiceController.java` 增加后台发票申请接口
- [x] T016 [US1] 更新 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/invoice/InvoiceService.java``service/invoice/InvoiceServiceImpl.java` 实现发票申请、校验、申请单生成逻辑
- [x] T017 [P] [US1] 扩展 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/invoice/vo/InvoiceApplyReqVO.java``InvoiceApplyRespVO.java` 承接 `chargeIds``custId``invoiceType``invoiceTitle``taxNo``email``mobile``sourceChannel``remark`
- [x] T018 [P] [US1] 更新 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/dal/dataobject/invoice/InvoiceDO.java``dal/mysql/invoice/InvoiceMapper.java` 承接申请单号、受理号、申请状态、限额校验所需字段映射,并与 `docs/design/03_Technical_Design/01_Database_Design.md` 标注保持一致
- [x] T019 [US1] 在 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/invoice/InvoiceServiceImpl.java` 接入 `biz_cust_invoice``biz_invoice_taxrate` 与账单对象校验,确保仅已收费未开票账单可申请
- [x] T020 [US1] 在 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/invoice/InvoiceServiceImpl.java` 实现 `applicationNo``custId + chargeIds` 幂等控制
- [x] T021 [US1] 运行 `make validate-file FILE=docs/design/02_Detailed_Design/12_REV_Detailed.md` 验证 REV-005 详细设计章节
- [x] T022 [US1] 运行 `make validate-file FILE=docs/design/03_Technical_Design/03_Interface_Design.md` 验证 `IF-REV-008` 接口文档
- [x] T023 [US1] 在 `backend/sw-business/sw-business-server/pom.xml` 所在模块执行一次最小 Maven 编译验证(例如以 invoice 相关变更为范围的编译/测试命令),确认 `controller/admin/invoice/InvoiceController.java``service/invoice/InvoiceServiceImpl.java` 的申请链路可编译
- [x] T024 [US1] 更新 `docs/design/00_Management/01_Project_Progress.md` 记录 REV-005 后台申请与校验闭环进展
- [x] T025 [US1] 更新 `docs/design/00_Management/03_Task_Checklist.md` 同步 REV-005 后台申请与校验任务状态
**Checkpoint**: 后台申请与校验链路可独立评审,`IF-REV-008` 与 REV-005 详细设计保持一致。
---
## Phase 4: User Story 2 - 调用 SYS-008 开票并查询兜底 (Priority: P1)
**Goal**: 实现提交开票申请后的异步协同、受理号记录、定时/主动查询兜底,并保证成功状态不被后续失败结果覆盖。
**Independent Test**: 发票申请成功后生成受理号与查询任务;查询接口可按申请单号/受理号返回结果;查询异常不会覆盖既有成功状态。
### Implementation for User Story 2
- [x] T026 [US2] 更新 `docs/design/02_Detailed_Design/12_REV_Detailed.md` 中 REV-005 的 `SYS-008` 异步协同、查询补偿、终态保护和异常核查流程
- [x] T027 [US2] 更新 `docs/design/03_Technical_Design/03_Interface_Design.md``IF-REV-009` 的后台查询、系统补偿查询和状态流转时序
- [x] T028 [US2] 更新 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/invoice/InvoiceController.java` 增加后台查询接口与补偿查询触发入口
- [x] T029 [US2] 更新 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/invoice/InvoiceServiceImpl.java` 实现提交 `SYS-008`、记录 `sysRequestNo`、创建查询任务、按申请单号/受理号查询结果
- [x] T030 [P] [US2] 扩展 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/invoice/vo/InvoiceQueryReqVO.java``InvoiceQueryRespVO.java` 支持 `applicationNo``sysRequestNo``querySource`
- [x] T031 [P] [US2] 扩展 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/dal/dataobject/invoice/InvoiceDO.java``dal/mysql/invoice/InvoiceMapper.java` 承接 `lastTryTime``nextTryTime``tryCount``latestResult``latestError`,并与 `docs/design/03_Technical_Design/01_Database_Design.md` 标注保持一致
- [x] T032 [US2] 在 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/invoice/InvoiceServiceImpl.java` 实现“成功状态不被失败结果覆盖”的幂等保护
- [x] T033 [US2] 在 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/invoice/InvoiceServiceImpl.java` 记录查询补偿与异常留痕到操作日志对象
- [x] T034 [US2] 运行 `make validate-file FILE=docs/design/02_Detailed_Design/12_REV_Detailed.md` 验证 REV-005 异步与补偿流程描述
- [x] T035 [US2] 运行 `make validate-file FILE=docs/design/03_Technical_Design/03_Interface_Design.md` 验证 `IF-REV-009` 查询接口文档
- [x] T036 [US2] 在 `backend/sw-business/sw-business-server/pom.xml` 所在模块执行一次最小 Maven 编译验证,并以受理号/申请单号查询场景确认查询链路可返回 `PENDING/SUCCESS/FAIL` 且保护终态
- [x] T037 [US2] 更新 `docs/design/00_Management/01_Project_Progress.md` 记录 REV-005 查询兜底与异步协同进展
- [x] T038 [US2] 更新 `docs/design/00_Management/03_Task_Checklist.md` 同步 REV-005 查询兜底与异步协同任务状态
**Checkpoint**: `SYS-008` 异步协同与查询兜底链路可独立演示,`IF-REV-009` 口径已稳定。
---
## Phase 5: User Story 3 - 结果回写、账单关联与客户侧消费 (Priority: P2)
**Goal**: 实现开票结果回写、账单-发票关联状态更新,以及客户侧查看/下载/推送已开具电子发票。
**Independent Test**: 开票成功后账单与发票建立关联;客户侧仅能查看属于当前客户且已开具的电子发票;下载/推送前必须校验 `SUCCESS + fileUrl`
### Implementation for User Story 3
- [x] T039 [US3] 更新 `docs/design/02_Detailed_Design/12_REV_Detailed.md` 中 REV-005 的结果回写、账单关联、客户侧查看/下载/推送规则
- [x] T040 [US3] 更新 `docs/design/03_Technical_Design/01_Database_Design.md``biz_invoice`、账单-发票关系快照、客户查询身份与操作留痕承接口径,并标明已有字段、待补字段与仅快照字段
- [x] T041 [US3] 更新 `docs/design/03_Technical_Design/03_Interface_Design.md` 中客户侧查看、下载、推送电子发票的请求/响应约束
- [x] T042 [US3] 更新 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/invoice/InvoiceController.java` 增加结果回写、客户侧查询、下载、推送接口
- [x] T043 [US3] 更新 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/invoice/InvoiceServiceImpl.java` 实现结果回写、账单关联状态更新、客户侧权限校验与电子票文件处理
- [x] T044 [P] [US3] 扩展 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/invoice/vo/InvoiceWriteBackReqVO.java``InvoiceCustomerQueryReqVO.java``InvoicePushReqVO.java` 承接回写与客户侧消费字段
- [x] T045 [P] [US3] 扩展 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/dal/dataobject/invoice/InvoiceDO.java``dal/mysql/invoice/InvoiceMapper.java` 承接 `invoiceCode``invoiceNumber``fileUrl``pushStatus`、关联状态字段,并与 `docs/design/03_Technical_Design/01_Database_Design.md` 标注保持一致
- [x] T046 [US3] 在 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/invoice/InvoiceServiceImpl.java` 实现客户侧仅可访问本人已开具电子发票的鉴权限制
- [x] T047 [US3] 在 `backend/sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/service/invoice/InvoiceServiceImpl.java` 实现下载/推送前校验 `SUCCESS` 状态与 `fileUrl` 存在性
- [x] T048 [US3] 运行 `make validate-file FILE=docs/design/03_Technical_Design/01_Database_Design.md` 验证数据承接口径
- [x] T049 [US3] 运行 `make validate-file FILE=docs/design/03_Technical_Design/03_Interface_Design.md` 验证客户侧查询下载推送接口文档
- [x] T050 [US3] 在 `backend/sw-business/sw-business-server/pom.xml` 所在模块执行一次最小 Maven 编译验证,并以客户侧查询/下载/推送场景确认结果回写、账单关联与电子票消费链路可调用
- [x] T051 [US3] 更新 `docs/design/00_Management/01_Project_Progress.md` 记录 REV-005 结果回写与客户侧消费进展
- [x] T052 [US3] 更新 `docs/design/00_Management/03_Task_Checklist.md` 同步 REV-005 结果回写与客户侧消费任务状态
**Checkpoint**: 发票结果回写、账单关联和客户侧电子票消费链路可以独立评审并验证。
---
## Phase 6: User Story 4 - 发票作废与红冲预留 (Priority: P3)
**Goal**: 将作废与红冲明确标注为后续阶段能力,只在正式文档和管理台账中保留边界与后续入口,不纳入一期 implement 必选交付。
**Independent Test**: 审阅 spec、plan、tasks 与正式文档后,可确认作废/红冲属于后续能力预留,不要求本轮 backend 代码实现。
### Implementation for User Story 4
- [x] T053 [US4] 更新 `docs/design/02_Detailed_Design/12_REV_Detailed.md` 标注作废与红冲为后续阶段能力,并说明其与正常开票闭环的边界
- [x] T054 [US4] 更新 `docs/design/03_Technical_Design/03_Interface_Design.md` 标注作废/红冲接口为预留能力或后续规划,不纳入一期 implement 必选范围
- [x] T055 [US4] 在 `docs/design/00_Management/01_Project_Progress.md` 记录作废与红冲转为后续阶段能力预留的决策
- [x] T056 [US4] 在 `docs/design/00_Management/03_Task_Checklist.md` 同步作废与红冲改为后续阶段任务预留的状态说明
**Checkpoint**: 作废与红冲的范围边界已稳定,不再与一期正常开票闭环交付混淆。
---
## Final Phase: Cross-Cutting Closure
**Purpose**: 完成仓库级一致性复核、统一校验、成功标准验证和交付总结。
- [x] T057 [P] 运行 `make check-links` 复核 `docs/design/02_Detailed_Design/12_REV_Detailed.md``docs/design/03_Technical_Design/03_Interface_Design.md``docs/design/03_Technical_Design/01_Database_Design.md` 的交叉引用
- [x] T058 [P] 运行 `make validate-mermaid` 复核 REV-005 相关 Mermaid/时序图在 `docs/design/02_Detailed_Design/12_REV_Detailed.md``docs/design/03_Technical_Design/03_Interface_Design.md` 中的可用性
- [x] T059 根据 `specs/002-rev005-invoice-flow/spec.md``SC-001``backend/sw-business/sw-business-server/pom.xml` 所在模块补充并执行发票申请接口响应时延验证,并将命令、样本说明与结果记录到 `specs/002-rev005-invoice-flow/verification.md`
- [x] T060 根据 `specs/002-rev005-invoice-flow/spec.md``SC-002``SC-003``SC-004``SC-005` 补充统计脚本或验证记录,明确数据来源、样本范围、统计口径,并将校验通过率、回写成功率、下载成功率、日志完整率结果写入 `specs/002-rev005-invoice-flow/verification.md`
- [x] T061 汇总最终交付说明并在 `specs/002-rev005-invoice-flow/tasks.md` 执行完成后输出修改文件、验证结果、剩余风险与下一步建议
---
## Dependencies & Execution Order
### Phase Dependencies
- **Setup**: 无依赖,但必须先完成,作为正式文档与 backend 触点的统一基线
- **Foundational**: 依赖 Setup必须在用户故事前完成
- **US1**: 依赖 Foundational是 MVP 的最小闭环入口
- **US2**: 依赖 US1需要复用申请单和受理号
- **US3**: 依赖 US2需要复用终态结果与查询补偿数据
- **US4**: 依赖 US3仅做范围预留与文档/台账标注
- **Final Phase**: 依赖所有已选择的用户故事完成
### Within Each User Story
- 先更新正式文档,再更新 backend 接口与服务
- 先补请求/响应对象和数据映射,再实现服务逻辑
- 先完成内容编辑,再运行验证命令
- 先完成验证,再更新管理台账
### Parallel Opportunities
- `T004``T005` 可并行盘点 backend 依赖
- `T011``T012` 可并行新增 VO 骨架
- US1 中 `T017``T018` 可并行
- US2 中 `T030``T031` 可并行
- US3 中 `T044``T045` 可并行
- `T057``T058` 可并行执行
---
## Implementation Strategy
### MVP First
1. 完成 Phase 1-2统一正式文档与 backend 触点基线
2. 优先交付 **US1 发票申请与校验**,形成最小可用后台入口
3. 再交付 **US2 异步协同与查询兜底**,完成 `SYS-008` 结果获取闭环
4. 再交付 **US3 结果回写、账单关联与客户侧消费**,形成一期完整业务闭环
5. **US4 作废与红冲预留** 仅保留文档与台账入口,不纳入本轮 backend 实现
### Independent Test Criteria by Story
- **US1**: 后台发票申请成功生成申请单号,非法账单/直接部分开票被拦截
- **US2**: 查询接口可按申请单号或受理号返回结果,成功终态不被失败覆盖
- **US3**: 结果回写后账单与发票关联可查,客户侧只能查看并下载/推送本人已开票电子票
- **US4**: 作废与红冲被稳定标注为后续阶段能力,不与一期实现范围冲突
### Notes
- 本任务集同时覆盖正式文档收敛与 backend 实施准备,执行时应始终以 `specs/002-rev005-invoice-flow/spec.md` 为单一需求总源
- Archive 文档仅用于校验与追溯,不作为正式交付主稿直接替代
- 仓库内未找到 `.specify/scripts/bash/check-prerequisites.sh`,本轮按现有 planning artifacts 手工推进 Speckit 任务流
- Success Criteria 已显式映射到 Final Phase 验证任务,若当前环境无法完成统计验证,应至少产出明确的验证记录与剩余风险说明