158 lines
10 KiB
Markdown
158 lines
10 KiB
Markdown
# 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 已通过 | 无 |
|