158 lines
10 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.

# Implementation Plan: sw-business-bank 银行代扣文件传输配置能力
**Branch**: `010-bank-transfer-config` | **Date**: 2026-03-23 | **Spec**: [/Volumes/Dpan/github/water-workspace/water-docs/specs/010-bank-transfer-config/spec.md](./spec.md)
**Input**: Feature specification from `/Volumes/Dpan/github/water-workspace/water-docs/specs/010-bank-transfer-config/spec.md`
**Note**: This template is filled in by the `/speckit.plan` command. For this project, planning is document-first and multi-repo aware.
## Summary
在既有 `REV-008 / SYS-009` 银行代扣能力基础上,为 `sw-business-bank` 增加文件传输配置能力最小闭环:将送盘、回盘、对账、归档、本地临时五类目录从 `BankWithholdingServiceImpl` 的硬编码路径中抽离,支持 `SFTP / FTP` 双协议配置选择,支持“默认规则 + 银行通道覆盖 + 租户覆盖 + 租户-银行通道覆盖”的统一解析,明确配置变更仅影响新发起文件动作、已开始或已落库批次继续沿用原解析结果,并将正式结论回写既有主文档与治理台账,不新增平行正式稿。
## Repository Scope
- **Formal workflow home**: `water-docs`
- **Target repos in scope**:
- `water-docs`: Yes
- `water-backend`: Yes
- `water-frontend`: No
- **Primary delivery mode**: Mixed
## Code Baseline
- **Backend baseline**: `water-backend` branch `develop` @ `b540f1f48bf2d6c28aa183749ca61231071c0942`
- **Frontend baseline**: N/A
- **Baseline capture plan**: 所有“当前已支持 / 本轮新增支持 / 仍待补证”的判断均绑定上述 backend baseline并在 `baseline.md``backend-validation.md``final-verdict.md` 中固定 branch 与 commit确保文档结论始终锚定到可追溯实现版本。
## Technical Context
**Primary Work Product**: 正式设计文档修订、`specs/010-bank-transfer-config/` 计划工件、backend 配置承接与路径解析增强、最小编译/测试验证
**Source of Truth Documents**: `docs/design/02_Detailed_Design/12_REV_Detailed.md``docs/design/03_Technical_Design/03_Interface_Design.md``docs/design/03_Technical_Design/04_Security_Design.md``docs/design/03_Technical_Design/05_Deployment_Design.md``.specify/memory/constitution.md`
**Reference Sources**: `docs/guides/BACKEND_CURRENT_STATUS.md`、Archive 历史资料(只读核对)、`../water-backend/sw-business-bank/sw-business-bank-server/src/main/resources/application.yaml``../water-backend/sw-business-bank/sw-business-bank-server/src/main/java/cn/com/emsoft/sw/bankbusiness/service/bankwithholding/BankWithholdingServiceImpl.java``../water-backend/sw-business-bank/sw-business-bank-server/src/main/java/cn/com/emsoft/sw/bankbusiness/dal/dataobject/channelapiconfig/ChannelApiConfigDO.java`
**Validation Commands**: `make validate-file FILE=<目标文档>``make check-links``mvn -f /Volumes/Dpan/github/water-workspace/water-backend/sw-business-bank/pom.xml -pl sw-business-bank-server -am -DskipTests compile``mvn -f /Volumes/Dpan/github/water-workspace/water-backend/sw-business-bank/pom.xml -pl sw-business-bank-server -am -Dtest=BankTransferPathResolverTest,BankWithholdingTransferConfigTest -Dsurefire.failIfNoSpecifiedTests=false test`
**Target Scope**: 正式文档中的 `REV-008` 详设、接口设计、安全设计、部署设计、项目进度台账、任务清单台账backend 中 `BankWithholding` 送盘/回盘/对账路径解析与审计承接、`ARCHIVE` / `LOCAL_TEMP` 的目录解析能力、`ChannelApiConfigDO.extParams` 的通道级覆盖能力、沿用 Spring profile + Nacos 的配置加载
**Project Type**: 文档治理仓库 + 多仓实现协作
**Constraints**: 不新增平行正式文档;不把真实密钥、密码、证书写入仓库;仅允许固定变量模板;配置缺失或连接信息不完整时立即阻断;配置切换仅影响新动作;审计只保留最终解析结果,不保留完整配置快照
**Scale/Scope**: cross-document + backend focused + validation-light
## Constitution Check
*GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.*
- [x] **主文档归属已确认**:正式结论回写既有主文档与治理台账,不新增平行正式稿。
- [x] **多仓范围已确认**:本轮涉及 `water-docs``water-backend``water-frontend` 不在范围内。
- [x] **代码基线已确认**backend 基线固定为 `develop @ b540f1f48bf2d6c28aa183749ca61231071c0942`
- [x] **Archive 使用方式合规**Archive 仅作来源核对,不替代正式口径。
- [x] **一致性影响已列出**:影响 `REV-008` 能力边界、接口说明、安全口径、部署口径、审计字段与验证工件。
- [x] **校验与台账动作已规划**已规划文档校验、backend 编译/测试、`01_Project_Progress.md``03_Task_Checklist.md` 更新。
## Project Structure
### Feature Artifacts
```text
specs/010-bank-transfer-config/
├── spec.md
├── plan.md
├── research.md
├── data-model.md
├── quickstart.md
├── contracts/
│ ├── bank-transfer-config-contract.md
│ └── bank-transfer-resolution-contract.md
├── tasks.md
├── baseline.md
├── backend-validation.md
├── docs-validation.md
└── final-verdict.md
```
### Repository Touchpoints
```text
water-docs/
├── docs/design/02_Detailed_Design/12_REV_Detailed.md
├── docs/design/03_Technical_Design/03_Interface_Design.md
├── docs/design/03_Technical_Design/04_Security_Design.md
├── docs/design/03_Technical_Design/05_Deployment_Design.md
├── docs/design/00_Management/01_Project_Progress.md
└── docs/design/00_Management/03_Task_Checklist.md
water-backend/
└── sw-business-bank/sw-business-bank-server/
├── src/main/java/.../service/bankwithholding/
├── src/main/java/.../dal/dataobject/channelapiconfig/
├── src/main/java/.../dal/dataobject/withholdingbatch/
├── src/main/java/.../dal/dataobject/reconcilebatch/
├── src/main/resources/
└── src/test/java/...
```
**Structure Decision**: 正式设计只更新既有主文档backend 只做配置承接、统一解析、审计字段补齐、最小测试;不扩展 frontend不把真实 SFTP/FTP 凭据写入仓库。
## Phase 0: Research & Alignment
### Research Inputs
- 当前硬编码路径分别在哪些方法生成,哪些 DO 已落库保存
- `ChannelApiConfigDO.extParams` 是否足以承接“通道/租户覆盖”
- 统一解析上下文是否需要显式包含业务类型(`businessType`),以及它在本轮 `BankWithholding` 场景下的最小承接方式
- 默认规则与覆盖规则的最小优先级模型如何表达
- 审计字段最少需要新增到哪些现有 DO / 表
- 非法模板变量、配置缺失、连接信息不完整与已落库批次配置切换等场景中,哪些验证必须自动化,哪些仅需文档声明为 deferred
### Deliverables
- `research.md`
- `baseline.md`
## Phase 1: Design & Contracts
### Planned Artifacts
- `data-model.md`
- `contracts/bank-transfer-config-contract.md`
- `contracts/bank-transfer-resolution-contract.md`
- `quickstart.md`
- `backend-validation.md`
- `docs-validation.md`
- `final-verdict.md`
### Design Decisions
- 默认配置来源采用 Spring profile + Nacos
- 通道/租户覆盖优先复用 `bk_channel_api_config.ext_params`
-`bk_channel_api_config` 中使用专用 `apiType` 表示“文件传输配置”,避免与单笔交易 API 混用
- 新增统一解析器,输入至少包含 `tenantId/companyId/channelId/businessType/stage/businessDate/batchNo/fileName`,其中 `businessType` 对应业务类型,输出 `protocol/dir/path/fileName/sourceScope`
- 统一解析器必须覆盖 `SEND``BACK``RECONCILE``ARCHIVE``LOCAL_TEMP` 五类目录;其中 `ARCHIVE` / `LOCAL_TEMP` 本轮至少要求具备解析能力与测试覆盖,不强制新增独立持久化审计对象
- 路径模板只支持固定变量集合:`{tenantId}``{companyId}``{channelCode}``{yyyyMMdd}``{yyyyMM}``{batchNo}``{fileName}`
- 使用未声明变量时,解析器必须立即失败并返回可诊断错误
- 更具体配置覆盖更通用配置;上层不完整时逐字段回退
- `BankWithholdingServiceImpl` 只接入解析结果,不再自行拼接路径
- 配置变更仅影响新发起文件动作;已开始或已落库批次继续沿用原解析结果
- 审计只记录最终协议、目录、路径、文件名,不记录配置版本号或完整配置快照
- 缺失配置、缺失必要连接信息或命中错误作用域时直接失败,不回退到错误通道
## Validation Plan
- **Document validation**: `make validate-file FILE=docs/design/02_Detailed_Design/12_REV_Detailed.md``make validate-file FILE=docs/design/03_Technical_Design/03_Interface_Design.md``make validate-file FILE=docs/design/03_Technical_Design/04_Security_Design.md``make validate-file FILE=docs/design/03_Technical_Design/05_Deployment_Design.md``make validate-file FILE=docs/design/00_Management/01_Project_Progress.md``make validate-file FILE=docs/design/00_Management/03_Task_Checklist.md`;如有跨文档链接更新再执行 `make check-links`
- **Backend validation**: 目标单元测试与服务级验证至少覆盖默认规则、租户覆盖、通道覆盖、租户-通道覆盖、字段级回退、协议切换、非法模板变量失败、配置缺失失败,以及“配置切换仅影响新动作、已落库批次不漂移”等场景;同时通过最小编译校验
- **Frontend validation**: N/A
- **Evidence output**: `baseline.md``backend-validation.md``docs-validation.md``final-verdict.md`
- **Conditional diagram validation**: 若本轮修改 `docs/design/` 中的 Mermaid 图表,必须执行 `make validate-mermaid` 并将结果记录到 `docs-validation.md`
## Ledger Sync Plan
- **Project progress update required**: Yes
- **Task checklist update required**: Yes
- **Evidence or verification summary update required**: Yes
- **Result summary requirement**: 完成重要变更后,结果摘要必须说明修改文件、校验结果、剩余风险与后续建议
## Complexity Tracking
> **Fill ONLY if Constitution Check has violations that must be justified**
| Violation | Why Needed | Simpler Alternative Rejected Because |
|-----------|------------|-------------------------------------|
| 无 | 本次 Constitution Check 已通过 | 无 |