暂存一下,防止丢失

This commit is contained in:
2026-07-24 16:07:18 +08:00
parent 5d6e23f1a5
commit a18ed8bc8d
180 changed files with 13597 additions and 1986 deletions

View File

@@ -31,7 +31,7 @@
- 真实表达后端、前端、验证、发布四个维度,不把代码存在等同验收完成。
- 保留冻结业务规则,将全部未完成工作组织为三批可执行纵向切片,并消除悬空和模糊依赖。
- 在不削弱资金、审批、异步与外部调用可靠性的前提下,形成测试环境快速交付顺序。
- 冻结现有审计代码并解除 Audit Event 对测试环境的阻塞,同时明确生产前恢复清单
- 冻结现有审计代码并 Audit Event 移出本 Change 及本次实际上线范围,不把它作为测试环境或生产上线阻塞项
- 统一前后端契约、停机部署、回滚和延期验证边界。
**Non-Goals:**
@@ -81,13 +81,25 @@
**否决方案**:强制所有新需求继续堆入旧 Service或全仓一次性 DDD 重构;前者扩大旧 Service后者超出当前完整用例边界。
### 4. 三批实施与稳定依赖图
### 4. 审批业务与外部渠道依赖倒置
退款、线下代充等业务的 Domain/Application 使用业务侧定义的 Approval Port只依赖通用审批实例、标准决策和终态事件。WeCom Adapter 是首个渠道实现,负责 Token、账号绑定、模板/控件映射、附件副本、提交、回调、轮询和恢复,并将企微状态翻译为标准决策。未来接入钉钉或其他渠道时只新增 Adapter 和渠道配置,不修改退款、充值、钱包、佣金或套餐终结规则。
通用审批实例仅保存业务类型/业务 ID、真实提交人、`provider``external_ref`、标准状态、请求/决策快照及关联 ID。企微 `sp_no`、模板 ID、控件 ID、userid 绑定和加密回调参数只属于 WeCom Adapter 或渠道专属配置。本地业务附件仍是权威原件,外部审批附件只是副本。系统不建设 BPMN、节点编排、审批人路由或会签/或签等本地通用审批流引擎,这些仍由外部平台负责。
新提交在有效 Adapter 未装配、场景未发布或身份不可解析时,必须在写入业务单、通用审批实例和 Outbox 之前失败关闭。因此业务核心可先于企微实现与构建,但测试环境开放线下代充/退款提交入口前,必须完成 WeCom Adapter 与组合根装配。
**理由**:审批是业务决策边界,企微只是当前交付渠道;依赖倒置既允许业务核心先行,也避免未来替换渠道时重写资金和状态机。
**否决方案**:让退款/充值直接依赖企微 SDK、`sp_no` 或企微状态码;或为了渠道灵活性自建通用审批流引擎。前者锁定供应商,后者扩大了本期范围并重复外部平台能力。
### 5. 三批实施与稳定依赖图
```mermaid
flowchart TD
PF[JULY-TECH-FOUNDATION 已完成]
N[B1-01 公共通知]
W[B1-02 UR37 企微]
A[B1-02 渠道无关审批核心]
C[B1-03 UR38 信用钱包]
S[B1-04 UR94 卡状态]
G[B1-05 UR43 系列授权]
@@ -102,46 +114,51 @@ flowchart TD
R97[B2-05 UR97 余额预警]
R36[B2-06 UR36 批量订购]
R49[B2-07 UR49 设备批量]
R34[B3-01 UR34 充值]
R35[B3-02 UR35 退款]
R57[B3-03 UR57 禁止换货]
R33[B3-04 UR33 临期]
R44[B3-05 UR44 摘要]
R42[B3-06 UR42 导出]
PF --> N & W & C & S & G & L & P & O & X
R34[B3-01 UR34 充值业务核心]
R35[B3-02 UR35 退款业务核心]
W[B3-03 UR37 WeCom Adapter]
R57[B3-04 UR57 禁止换货]
R33[B3-05 UR33 临期]
R44[B3-06 UR44 摘要]
R42[B3-07 UR42 导出]
PF --> N & A & C & S & G & L & P & O & X
S --> R73 & R53 & R62
C --> R97 & R36 & R34 & R35
O --> R97 & R33
N --> R97 & R34 & R35 & R33
A --> R34 & R35
R40 --> R36 & R33
R36 --> R49
W --> R34 & R35 & R44
R34 --> W
R35 --> W
A --> W
W --> R44
R35 --> R57 & R44
R34 --> R44
R33 --> R42
R44 --> R42
```
UR46 已完成后端并作为 B3-04/B3-06 的已满足后端依赖UR55 已满足 UR46。UR45、UR46、UR60、UR86 只进入最终前端/人工/元数据收口,不重复实现后端。
UR46 已完成后端并作为 B3-05/B3-07 的已满足后端依赖UR55 已满足 UR46。UR45、UR46、UR60、UR86 只进入最终前端/人工/元数据收口,不重复实现后端。
**理由**:先交付公共写入、资金和外部系统边界,再交付依赖它们的业务,最后组合复杂业务,可消除原 `.scratch` 的悬空引用。
**否决方案**按数据库、Service、Handler 水平排期,或让下游先各自复制公共能力;两者都会制造重复实现和不可验证中间态。
### 5. 原 Tickets 保留业务粒度,但统一移除测试与 Audit Event 阻塞
### 6. 原 Tickets 保留业务粒度,但统一移除测试与 Audit Event 阻塞
已有 Tickets 的业务切片 SHALL 在对应总任务内逐项映射;原本纯自动化 Harness、验收测试真实外部门禁或 Audit Event 写入子项不在本测试环境实施。它们移动到“延期验证与生产门禁”,而不是被标记完成。不存在路径和占位符改为本 Change 的稳定任务号:
已有 Tickets 的业务切片 SHALL 在对应总任务内逐项映射;原本纯自动化 Harness、验收测试真实外部门禁移动到“延期验证与生产门禁”Audit Event 写入、审计中心与治理子项则从本 Change 及本次实际上线范围排除。不存在路径和占位符改为本 Change 的稳定任务号:
- 公共通知 04 改依赖 `B1-08.6`,不再引用不存在的 UR96 文件名。
- UR37-0113 形成可供 UR35 使用的公共能力;原 UR37-14“退款首个真实企微门禁”改映射到生产前 `6.2`不再保留“UR35 拆票后替换”的占位符,也不反向阻塞 UR35 代码实现。
- UR37-0113 各自映射为后置 WeCom Adapter 纵向任务,不成为 UR34/UR35 业务核心的编译前置;原 UR37-14“退款首个真实企微门禁”分为测试环境 Adapter 装配检查和生产前 `6.2` 真实验收,不反向阻塞 UR34/UR35 核心规则实现。
- UR48/UR49 发布依赖使用本 Change 任务号,不依赖漂移标题。
- 所有 `.scratch/tech-global-audit/issues/01``19``20``21` 等 Audit Event 阻塞边测试环境路径删除,转入生产前 `6.*` 延期清单。
- 所有 `.scratch/tech-global-audit/issues/01``19``20``21` 等 Audit Event 阻塞边测试环境和生产上线依赖图删除;未来如需恢复审计能力,另开独立 Change不在本 Change 的 `6.*` 清单中恢复
**理由**:用户已明确授权测试和审计范围调整;保留旧 blocker 会让测试环境目标不可执行。
**否决方案**:修改原 Tickets。原 Tickets 需要保留评审历史,本 Change 只提供新的执行映射。
### 6. 前后端契约以“冻结字段 + 状态矩阵 + 人工验收点”管理
### 7. 前后端契约以“冻结字段 + 状态矩阵 + 人工验收点”管理
每条涉及 API 的纵向任务记录 Endpoint、请求字段、完整 `data`、用户类型、资源所有权、分页/排序/过滤、错误码、状态/枚举、前端页面与异常状态。响应包络一律为 `{code,msg,data,timestamp}`,参数错误使用 `CodeInvalidParam`,资源不存在/越权使用 `CodeForbidden` 统一语义。
@@ -149,19 +166,19 @@ UR46 已完成后端并作为 B3-04/B3-06 的已满足后端依赖UR55 已满
**理由**:可以防止后端代码完成被误记为全链路完成,同时给前端明确实现输入。
### 7. 资金、审批、异步与外部调用保留完整异常闭环
### 8. 资金、审批、异步与外部调用保留完整异常闭环
- **资金**:钱包余额/版本/流水是 Domain Ledger扣款、冻结、入账、退款按唯一业务键、乐观锁/条件更新和同事务事实保证;支付成功与钱包入账分阶段,已收款不得因后续失败丢失。
- **审批**企微负责节点/审批人/意见/附件;本地保存业务快照、实例和终态处理。提交结果未知不盲重试;回调与轮询进入同一同步用例;通过后撤销按是否已产生资金事实分流。
- **审批**业务侧先固化申请快照并只消费 `approved/rejected/cancelled/deleted/revoked_after_approved` 标准决策Adapter 负责外部节点审批人意见附件副本,并将回调/轮询翻译到同一同步用例。提交结果未知不盲重试;通过后撤销按是否已产生资金事实分流。
- **异步**:关键副作用同事务写 OutboxRelay 投递 Asynq消费者按至少一次与处理租约设计任务五态和业务成功/失败计数分离。
- **外部调用**Integration Log 在请求/回调边界记录脱敏尝试、结果未知和恢复事实;支付、企微、Gateway、运营商状态不得由日志替代业务表。
- **外部调用**Integration Log 在请求/回调边界记录脱敏尝试、结果未知和恢复事实;支付、审批渠道、Gateway、运营商状态不得由日志替代业务表。
- **错误**Application/Domain/Query 使用 `pkg/errors`,客户端不接收底层 SDK/GORM/Validator 错误;关键错误使用中文日志并携带稳定关联 ID。
Audit Event 在本测试里程碑不接入新业务,以上 Domain Ledger、Integration Log、Outbox、事务和幂等均不得延期。
Audit Event 在本 Change 及本次实际上线范围内接入新业务,以上 Domain Ledger、Integration Log、Outbox、事务和幂等均不得因此延期。
### 8. 审计冻结对运行时无新增影响
### 9. 审计冻结对运行时无新增影响
边界保持Access Log 负责 HTTP 调试Audit Event 负责操作者治理但本轮冻结Domain Ledger 负责金额/状态事实Integration Log 负责外部交互Outbox 负责可靠投递。
边界保持Access Log 负责 HTTP 调试Audit Event 属于本 Change 范围外的操作者治理能力Domain Ledger 负责金额/状态事实Integration Log 负责外部交互Outbox 负责可靠投递。
`ff44305` 的运行时分析为:
@@ -174,7 +191,7 @@ Audit Event 在本测试里程碑不接入新业务,以上 Domain Ledger、Int
**否决方案**:回滚 `ff44305` 或删除审计迁移;没有必要且会丢失 Access Log 加固和未来恢复基线。
### 9. 测试配置冲突由用户本次里程碑决策覆盖
### 10. 测试配置冲突由用户本次里程碑决策覆盖
本测试环境里程碑不生成/运行自动化测试。每个批次只执行 `gofmt`、必要生成、`go build ./...`、迁移/路由/Worker/配置部署检查。状态使用“代码完成、验证延期”不写“PASS”。
@@ -186,12 +203,13 @@ Audit Event 在本测试里程碑不接入新业务,以上 Domain Ledger、Int
- **[无自动化回归导致状态机、资金与权限缺陷更晚暴露]** → 每批强制构建和部署检查;测试环境限制访问与资金;所有未执行验证进入生产阻塞清单,禁止沿用豁免。
- **[三批范围仍大2026-07-27 前无法全部完成]** → 依赖 frontier 可并行,但下游只在具体上游完成后启动;状态台账实时反映未开始和代码完成/验证延期,不通过改状态掩盖延期。
- **[原 Tickets 中审计与测试子项被误认为删除]** → 在任务映射中标注“测试环境豁免,转 D-*”,生产前必须恢复;原文件不修改
- **[Audit Event 未接入导致测试环境缺少操作者治理证据]** → 保留 Access Log、Domain Ledger、Integration Log 和关联 ID限制为测试环境,生产前完成审计专项
- **[原 Tickets 中审计与测试子项被混为同一延期项]** → 在任务映射中区分处理:自动化与真实验收转 `6.*`Audit Event 明确移出本 Change原文件保留历史不改写其评审记录
- **[Audit Event 未接入导致缺少统一操作者治理证据]** → 保留 Access Log、Domain Ledger、Integration Log 和关联 ID本次实际上线接受这一治理缺口,未来是否建设由独立 Change 决定
- **[Integration Log Repository 未生产装配但下游以为已可用]** → 每个真正需要外部交互的业务纵向任务显式完成 Adapter/组合根装配;不能把迁移存在等同运行时接入。
- **[前端仓库不在当前工作区导致后端状态被过度声明]** → 前端契约和人工验收独立复选框,后端无法代勾。
- **[停机迁移后存在不可逆审批/支付/资金事实]** → 开放访问前验证失败可回退;产生事实后暂停生产者、保留流水/Outbox/Integration Log并前向修复不清表、不恢复旧 Writer。
- **[原 PRD 的依赖环阻塞执行]** → UR33 先交付临期 Query/通知UR42 后接导出 SceneUR34/35 先交付状态模型UR44 再投影摘要UR42 最后接 Scene。
- **[渠道 Adapter 后置导致业务代码已完成但入口不可用]** → 业务核心以 Port 构建并保持新提交失败关闭;测试环境开放入口必须引用 WeCom Adapter 装配任务,不将“代码完成”记为“可发布”。
- **[旧配置与当前规范继续漂移]** → 本 Change 明确优先级;不在本次顺手修改 `openspec/config.yaml`,另行治理。
## Migration Plan
@@ -199,7 +217,7 @@ Audit Event 在本测试里程碑不接入新业务,以上 Domain Ledger、Int
### 规划到实施
1. 冻结本 Change 的 proposal/design/specs/tasks后续不从分散 `.scratch` 目录直接启动七月新工作。
2. 按 B1 → B2 → B3 的具体编号领取任务;同批无依赖项可并行,有依赖项顺序执行。
2. 按 B1 → B2 → B3 的具体编号领取任务;B1 先固化渠道无关 Approval PortB3 先完成 UR34/UR35 业务核心,再实现 WeCom Adapter 和组合根装配;同批无依赖项可并行,有依赖项顺序执行。
3. 每个需求先完成冻结 PRD 的业务纵向切片,再执行该批 `gofmt`、必要生成、`go build ./...` 和部署检查。
4. 完成 F1 已落地需求的元数据/前端/人工收口,再执行 F2 测试环境装配与停机部署。
5. 测试环境运行期间保留 D 组延期项未勾选;生产发布另开恢复窗口逐项完成。
@@ -224,13 +242,13 @@ flowchart LR
- 支付成功未入账、审批终态未处理、Outbox 积压必须由恢复 Worker 幂等完成,不能要求用户重复提交或重复付款。
- 信用额度一旦产生负余额,不得回退到忽略信用边界的旧扣款逻辑。
### 生产发布前恢复门禁
### 生产发布前门禁
- 自动化测试与完整构建、真实 PostgreSQL/Redis/Asynq 验证。
- 真实企微模板/绑定/附件/回调/轮询,微信/支付宝预下单/查单/回调Gateway 限速与运营商回调验收。
- 前后端全链路、历史数据抽样、存量迁移和停机演练。
- 权限、分页、N+1、性能、安全、Access Log 敏感矩阵与回滚演练。
- 恢复 Audit Event Writer、业务覆盖、审计中心/历史投影和一次性发布门禁的评审与实施;不得沿用本测试豁免
- Audit Event Writer、审计中心历史投影不属于本 Change 的生产门禁;未来如需建设,另开独立 Change不反向阻塞本次上线
## Open Questions

View File

@@ -10,20 +10,22 @@
- 按真实证据预置状态TECH 七月公共开发基础和 UR55 标记已完成UR45 标记“后端完成、原 Ticket 元数据待收口”UR46、UR60、UR86 仅标记后端完成,保留前端与人工验收未完成;其余 22 条线保持未开始。
- 将已有 Tickets 直接纳入统一执行契约;将 UR33、UR34、UR35、UR42、UR44、UR53、UR57、UR62、UR73、UR97 的冻结 PRD 转换为可独立实施和验证的纵向任务,不再创建新的 `.scratch/issues`
- 按三批实施:共享核心与独立 frontier、共享核心下游、复杂业务最终收口已落地需求的前端契约、测试环境装配、迁移和人工验收准备。
- 调整审批实施顺序:先定义由业务侧拥有的渠道无关 Approval Port 和标准决策,再完成退款、线下充值的金额、状态机与终态处理,最后接入企微作为首个 Adapter未来接入钉钉或其他审批平台时不得修改退款、充值、钱包、佣金和套餐核心规则。
- 审批公共层只统一业务引用、标准状态、提交/同步 Port、终态事件和渠道标识不建设本地通用审批流引擎审批节点、审批人、会签/或签、意见和渠道附件仍由外部平台负责。
- 将用户已确认的紧急交付决策写入契约:本里程碑目标是测试环境部署,不是生产验收;不新增 `_test.go`、不运行 `go test`、不执行真实 PostgreSQL/Redis/企微/支付/Gateway 自动验收,仅执行 `gofmt`、必要代码生成、按批次 `go build ./...` 与部署检查。
- 暂缓全局 Audit Event 专项及其七月发布阻塞边:保留提交 `ff44305` 及既有审计代码、迁移和 Access Log 脱敏不继续开发审计中心、Audit Event 写入、历史投影或一次性审计发布门禁;生产发布前必须恢复为延期治理项,不得永久标记 N/A
- 保留 Integration Log、Outbox、幂等、事务和外部调用恢复能力它们继续作为业务可靠性设施 Audit Event 暂缓而删除、回滚或绕过。
- 全局 Audit Event 专项移出本 Change 及本次实际上线范围:保留提交 `ff44305` 及既有代码、迁移和 Access Log 脱敏不继续开发审计中心、Audit Event 写入、历史投影或一次性审计发布门禁,也不把它们作为测试环境或生产上线阻塞项;未来如需恢复,必须另开独立 Change 重新评审
- 保留 Integration Log、Outbox、Domain Ledger、幂等、事务和外部调用恢复能力,它们继续作为业务可靠性设施,不 Audit Event 移出范围而删除、回滚或绕过。
- 永久排除已于 2026-07-14 移出本期的需求16不得创建分销码、代理申请、分销关系、佣金提现相关表、API、页面、领域目录或迁移。
- 统一接口与工程约束Fiber、GORM、PostgreSQL、Redis、Asynq、Viper、Zap、sonic复杂写、简单写、Query 三通道触碰式迁移;统一响应 `{code,msg,data,timestamp}`;错误使用 `pkg/errors`;列表默认 20、最大 100数据权限、幂等、无外键和文档生成器更新继续遵守项目标准。
- **BREAKING**:按冻结 PRD 和标准评审稿实施时,退款与平台线下充值将停机切换到企微审批并下线旧本地审批/入账动作接口;系列授权等明确要求同批切换的旧混合命令语义不保留长期兼容层。
- **BREAKING**:按冻结 PRD 和标准评审稿实施时,退款与平台线下充值将停机切换到渠道无关审批契约,并以企微作为本期首个交付 Adapter下线旧本地审批/入账动作接口;系列授权等明确要求同批切换的旧混合命令语义不保留长期兼容层。
## Capabilities
### New Capabilities
- `july-iteration-master-ledger`: 定义 28 条线的唯一稳定编号、来源权威、真实完成状态、具体依赖和需求16排除规则。
- `july-iteration-delivery-contract`: 定义冻结业务来源、DDD 三通道、API/权限/分页/错误契约、可靠性设施及前后端纵向交付边界。
- `july-iteration-test-release-gate`: 定义测试环境发布豁免、审计冻结边界、部署与回滚顺序、状态真实性以及生产发布前必须恢复的延期门禁。
- `july-iteration-delivery-contract`: 定义冻结业务来源、DDD 三通道、渠道无关审批 Port/Adapter、API/权限/分页/错误契约、可靠性设施及前后端纵向交付边界。
- `july-iteration-test-release-gate`: 定义测试环境发布豁免、Audit Event 排除边界、部署与回滚顺序、状态真实性以及仍需完成的生产发布门禁。
### Modified Capabilities
@@ -32,8 +34,8 @@
## Impact
- **规划与权威关系**:后续七月迭代只从本 Change 的 `tasks.md` 领取剩余工作;原 `.scratch` PRD/Tickets 保留溯源和业务细节,不废弃、不另行扩展。冲突时依次以用户本次确认、七月标准评审稿、冻结 PRD、既有 Ticket 为准。
- **后端**:后续实施将触及资产、套餐、钱包、订单、退款、充值、企微、通知、导出、Gateway、运营商回调、异步任务、系统配置及相关迁移、API/Worker 组合根;本次提案本身不修改这些业务代码。
- **后端**:后续实施将触及资产、套餐、钱包、订单、退款、充值、渠道无关审批核心、企微首个 Adapter、通知、导出、Gateway、运营商回调、异步任务、系统配置及相关迁移、API/Worker 组合根;本次提案本身不修改这些业务代码。
- **前端**:涉及后台管理端、代理端和 C 端 H5/公众号的页面、状态、上传、轮询、审批、支付、导出和人工验收契约;当前仓库无前端源码,只交付框架无关契约与联调清单。
- **外部系统**:企业微信微信支付、支付宝、Gateway、运营商回调、对象存储、PostgreSQL、Redis/Asynq本测试环境里程碑仅完成装配与人工验收准备,真实外部验收延期。
- **外部系统**:企业微信是本期首个审批 Adapter钉钉等未来渠道通过同一 Approval Port 扩展;另涉及微信支付、支付宝、Gateway、运营商回调、对象存储、PostgreSQL、Redis/Asynq本测试环境里程碑仅完成装配与人工验收准备,真实外部验收延期。
- **性能与安全**:继续要求 API P95 < 200ms、P99 < 500ms、数据库查询 < 50ms列表分页、批量查询避免 N+1Access Log 脱敏继续生效,敏感配置和底层错误不得对外泄露。
- **文档**后续每个纵向切片仍需同步中文功能文档、README 索引、OpenAPI 文档生成器及跨仓前端契约;本 Change 作为七月迭代唯一总台账和剩余实施入口。

View File

@@ -18,6 +18,28 @@
- **WHEN** 实施人员领取任一未完成纵向任务
- **THEN** 任务中的主/辅助通道 MUST 与其状态机、金额、并发、外部副作用或纯读取性质一致,并按任务声明限制迁移范围
### Requirement: 审批业务必须与具体渠道解耦
退款、线下充值及未来审批业务 MUST 只依赖渠道无关的 Approval Port、标准审批实例、标准决策和终态事件不得在业务 Domain/Application 中引用企微、钉钉等渠道 SDK、DTO、回调状态码、模板控件 ID 或外部审批编号字段。审批实例 MUST 使用 `provider` 与通用 `external_ref` 标识渠道和外部实例;企微 `sp_no` 等渠道字段只能由对应 Adapter 转换或保存在渠道专属配置/安全快照中。
#### Scenario: 先实现退款业务核心
- **WHEN** 企微 Adapter 尚未实现但退款金额、状态机和整单终结规则开始开发
- **THEN** 退款业务 MUST 能围绕 Approval Port 和标准 `approved/rejected/cancelled/deleted/revoked_after_approved` 决策完成构建,不得依赖企微包或 `sp_no`
#### Scenario: 接入企微首个 Adapter
- **WHEN** 企微提交、回调或轮询取得渠道状态
- **THEN** WeCom Adapter MUST 将其翻译为标准审批引用与决策,再调用渠道无关 Application 用例;业务模块不得解析企微状态
#### Scenario: 未来接入其他审批渠道
- **WHEN** 后续新增钉钉或其他审批平台
- **THEN** 实施 MUST 新增对应 Adapter 和渠道配置,不得修改退款、充值、钱包、佣金、套餐或换货业务不变量
### Requirement: 审批抽象不得演变为本地流程引擎
渠道无关审批层 MUST 仅管理业务引用、真实提交人快照、`provider/external_ref`、标准状态、提交与同步 Port、标准终态事件及幂等。系统不得在本期实现审批节点编排、审批人解析、组织模型、会签/或签、审批动作页面或 BPMN这些能力继续由外部审批平台负责。
#### Scenario: 外部渠道未就绪
- **WHEN** 业务代码已经完成但当前环境没有可用审批 Adapter 或场景配置
- **THEN** 新审批提交入口 MUST 在写入业务单、审批实例和 Outbox 前失败关闭,已存在实例仍按其原 provider 继续同步和处理
### Requirement: API 必须使用项目统一契约
所有新增或修改 API MUST 使用 Fiber v2、Validator、`pkg/response``{code,msg,data,timestamp}` 响应包络;不得使用 `{message}` 替代 `msg`。错误 MUST 在 `pkg/errors` 中定义或复用Handler 参数校验失败统一返回 `CodeInvalidParam`,资源不存在与越权使用不泄露存在性的 `CodeForbidden` 语义,禁止向客户端拼接底层错误。
@@ -51,7 +73,7 @@
涉及跨事务副作用或外部系统的用例 MUST 保留事务、幂等、Outbox、Asynq 至少一次投递、Integration Log 和外部调用恢复能力。关键事件 MUST 与业务事实同事务写入 Outbox消费者 MUST 使用状态条件、唯一业务键、处理租约或乐观锁保证幂等;`EnqueueTask` 载荷 MUST 传 struct 或 map不得传预序列化 `[]byte`
#### Scenario: 外部调用结果未知
- **WHEN** 企微、支付、Gateway 或其他具有副作用的请求已经发出但结果未知
- **WHEN** 任一审批渠道、支付、Gateway 或其他具有副作用的请求已经发出但结果未知
- **THEN** 系统 MUST 保存可恢复的 Integration Log 和业务状态,不得伪装为明确失败后盲目重试或重复资金动作
#### Scenario: 可靠事件投递失败
@@ -70,5 +92,4 @@
#### Scenario: 快速交付遇到复杂异常分支
- **WHEN** 某异常分支实现成本高但已被冻结 PRD 定义为资金或外部调用安全边界
- **THEN** 该分支 MUST 留在本轮业务实现范围,不能自动化测试 Audit Event 一起延期
- **THEN** 该分支 MUST 留在本轮业务实现范围,不能自动化测试延期或 Audit Event 已移出范围而被删除

View File

@@ -18,22 +18,22 @@
- **WHEN** 任务因本次豁免没有自动化或真实外部验证证据
- **THEN** 验证状态 MUST 标记“代码完成、验证延期”或“待前端/人工验收”,不得标记“验收完成”
### Requirement: Audit Event 专项不得阻塞测试环境里程碑
`.scratch/tech-global-audit/issues/01``19``20``21` 及其他 Audit Event 写入、审计中心、历史投影、敏感读取、导出、保留清理和一次性审计切换任务 MUST 不进入本轮实现任务,也不得作为其他七月需求的测试环境阻塞项。提交 `ff44305` 已存在的审计代码 MUST 原样冻结,不删除、不回滚、不继续扩展。
### Requirement: Audit Event 专项必须移出本 Change 与本次上线范围
`.scratch/tech-global-audit/issues/01``19``20``21` 及其他 Audit Event 写入、审计中心、历史投影、敏感读取、导出、保留清理和一次性审计切换任务 MUST 不进入本轮实现任务,也不得作为其他七月需求的测试环境或生产上线阻塞项。提交 `ff44305` 已存在的相关代码 MUST 原样冻结,不删除、不回滚、不继续扩展未来如需恢复审计治理MUST 另开独立 Change 重新评审
#### Scenario: 下游原 Ticket 依赖全局审计
- **WHEN** 某七月 PRD/Ticket 原先把 Audit Event 或一次性审计发布门禁列为 blocker
- **THEN** 本 Change MUST 移除测试环境阻塞边,同时保留其生产发布前恢复义务
- **THEN** 本 Change MUST 同时移除测试环境和生产上线阻塞边,不在本 Change 内保留恢复义务
#### Scenario: 审计冻结代码存在
- **WHEN** 构建包含 `integrationlog.Repository``cmd/audit-coverage``pkg/sanitizer` 或迁移 `000167_create_audit_integration_log`
- **THEN** 不得为冻结目的删除这些代码;未装配到生产组合根的审计组件不得被本轮业务主动启用
### Requirement: 可靠性日志与 Audit Event 必须保持边界清晰
Access Log SHALL 继续负责 HTTP 调试并使用现有递归脱敏Integration Log SHALL 记录外部交互及结果未知恢复事实Domain Ledger SHALL 继续作为金额、订单、退款、充值、审批和状态的业务权威Outbox SHALL 继续作为可靠副作用投递事实。Audit Event 作为“谁对什么做了什么”的治理能力暂缓,其他三类事实不得被停用或合并。
### Requirement: 可靠性事实不得因 Audit Event 排除而削弱
Access Log SHALL 继续负责 HTTP 调试并使用现有递归脱敏Integration Log SHALL 记录外部交互及结果未知恢复事实Domain Ledger SHALL 继续作为金额、订单、退款、充值、审批和状态的业务权威Outbox SHALL 继续作为可靠副作用投递事实。Audit Event 作为“谁对什么做了什么”的统一治理能力不属于本 Change,其他事实不得被停用或合并。
#### Scenario: 新业务调用外部系统
- **WHEN** 本轮新业务调用企微、支付、Gateway 或接收运营商回调
- **WHEN** 本轮新业务通过企微等审批渠道 Adapter、支付、Gateway 或运营商 Adapter 发出请求或接收回调
- **THEN** 仍 MUST 写 Integration Log 并保留幂等、事务与恢复语义,即使本次不写 Audit Event
#### Scenario: Access Log 处理敏感正文
@@ -47,6 +47,10 @@ Access Log SHALL 继续负责 HTTP 调试并使用现有递归脱敏Integrati
- **WHEN** 迁移、构建、配置、路由、Worker 注册或前后端版本一致性检查失败
- **THEN** 测试环境 MUST 保持维护或停止新入口,不得将该批标记部署完成
#### Scenario: 审批业务核心先于渠道装配完成
- **WHEN** 退款或线下代充业务代码已围绕 Approval Port 完成,但当前环境尚无有效 WeCom Adapter、场景或发起身份配置
- **THEN** 该业务只能记录“后端代码完成”,新提交入口 MUST 保持关闭或失败关闭,不得标记“测试环境可用”
### Requirement: 回滚必须保留不可逆业务事实
开放访问前失败 MAY 回滚应用和可逆迁移一旦产生审批、支付、资金流水、订单、退款、充值、Outbox、Integration Log、通知或部分成功批量任务回滚 MUST 保留这些事实,暂停异常生产者并采用前向修复。不得通过清表、恢复旧 Writer 或要求用户重复支付来回滚。
@@ -55,9 +59,8 @@ Access Log SHALL 继续负责 HTTP 调试并使用现有递归脱敏Integrati
- **THEN** 系统 MUST 保留支付与 Outbox/恢复事实,并在恢复后幂等完成入账,不得关闭原事实或要求重新支付
### Requirement: 生产发布不得继承测试豁免
生产发布前 MUST 恢复并完成自动化测试、真实 PostgreSQL/Redis/企微/支付/Gateway 验收、前后端联调、历史数据抽样与迁移演练、性能/权限/安全检查,以及 Audit Event 专项的重新评审、写入覆盖和发布门禁。延期项 MUST 保持未勾选,直至产生真实证据;不得把本测试环境豁免升级为永久 N/A
生产发布前 MUST 恢复并完成自动化测试、真实 PostgreSQL/Redis/企微/支付/Gateway 验收、前后端联调、历史数据抽样与迁移演练、性能/权限/安全检查。延期项 MUST 保持未勾选直至产生真实证据Audit Event 已明确移出本 Change不属于需要恢复的测试豁免
#### Scenario: 准备生产发布
- **WHEN** 团队从测试环境里程碑推进正式生产
- **THEN** 发布负责人 MUST 重新启用延期验证与治理清单,全部完成前不得声明生产验收通过

View File

@@ -3,31 +3,31 @@
状态口径:每条线同时记录“后端 / 前端 / 验证 / 发布”。`[x]` 只表示该行声明的范围已有仓库证据;`[ ]` 表示仍有实施、前端、人工、延期验证或发布工作。后续七月工作只从本文件领取,不再从分散 `.scratch` 目录直接启动。
- [x] 0.1 `JULY-TECH-FOUNDATION` TECH 七月公共开发基础|来源 `.scratch/tech-public-foundation/`状态已完成PRD `completed`12/12 Tickets 完成)|主通道 Infrastructure辅助 Application/Query发布本仓公共基础已交付。
- [ ] 0.2 `JULY-TECH-NOTIFICATION` TECH 公共站内通知|来源 `.scratch/tech-inapp-notifications/`8 Tickets状态未开始|主通道简单写 Application辅助 Query/Infrastructure依赖0.1。
- [x] 0.2 `JULY-TECH-NOTIFICATION` TECH 公共站内通知|来源 `.scratch/tech-inapp-notifications/`8 Tickets状态后端代码与跨仓契约完成、验证延期|主通道简单写 Application辅助 Query/Infrastructure依赖0.1。
- [ ] 0.3 `JULY-UR33` 套餐临期查询、Dashboard 与提醒|来源 `.scratch/ur33-package-expiry-reminder/PRD.md`(由 PRD 直接转任务)|状态:未开始|主通道 Query辅助 Application/Infrastructure依赖0.2、0.9、0.14、0.26。
- [ ] 0.4 `JULY-UR34` 代理在线扫码充值与平台线下代充值|来源 `.scratch/ur34-agent-recharge/PRD.md`|状态:未开始|主通道复杂写,辅助 Query/Payment/WeCom Adapter依赖0.2、0.7、0.8
- [ ] 0.5 `JULY-UR35` 退款企微审批与整单终结|来源 `.scratch/ur35-refund-wecom-approval/PRD.md`|状态:未开始|主通道复杂写,辅助 Query/WeCom Adapter依赖0.2、0.7、0.8
- [ ] 0.4 `JULY-UR34` 代理在线扫码充值与平台线下代充值|来源 `.scratch/ur34-agent-recharge/PRD.md`|状态:未开始|主通道复杂写,辅助 Query/Payment/Approval Port业务核心依赖2.8、2.29、2.57、2.92.12;测试环境开放线下代充入口另依赖 4.W14
- [ ] 0.5 `JULY-UR35` 退款审批与整单终结|来源 `.scratch/ur35-refund-wecom-approval/PRD.md`|状态:未开始|主通道复杂写,辅助 Query/Approval Port业务核心依赖2.8、2.30、2.92.12;测试环境开放提交入口另依赖 4.W14
- [ ] 0.6 `JULY-UR36` 批量订购套餐|来源 `.scratch/ur36-bulk-package-purchase/`11 Tickets状态未开始主通道 Application/Domain辅助 Query/Infrastructure依赖0.8、0.9。
- [ ] 0.7 `JULY-UR37` 企业微信审批公共能力|来源 `.scratch/ur37-wecom-approval-foundation/`14 Tickets状态未开始主通道复杂写,辅助 Query/Infrastructure依赖0.1;首个退款组合依赖 0.5
- [ ] 0.8 `JULY-UR38` 代理主钱包信用额度|来源 `.scratch/ur38-agent-main-wallet-credit/`10 Tickets状态未开始|主通道复杂写,辅助简单写/Query依赖0.1。
- [ ] 0.7 `JULY-UR37` 企业微信审批公共能力|来源 `.scratch/ur37-wecom-approval-foundation/`14 Tickets状态未开始主通道 Application + Port/Infrastructure Adapter辅助 Query顺序先完成 2.92.12 渠道无关核心UR34/UR35 业务核心完成后再执行 4.W14.W14 WeCom Adapter 与装配
- [x] 0.8 `JULY-UR38` 代理主钱包信用额度|来源 `.scratch/ur38-agent-main-wallet-credit/`10 Tickets状态后端代码与测试环境切换契约完成、自动化/真实资金验证延期|主通道复杂写,辅助简单写/Query依赖0.1。
- [ ] 0.9 `JULY-UR40` 下架套餐历史用户续费|来源 `.scratch/ur40-off-shelf-package-renewal/`8 Tickets状态未开始主通道 Domain Policy辅助 Query依赖0.1。
- [ ] 0.10 `JULY-UR42` 统一导出与字段权限|来源 `.scratch/ur42-unified-export-field-permissions/PRD.md`|状态:未开始|主通道 Query/DataSource辅助简单写 Application依赖0.3、0.4、0.5、0.12、0.14。
- [ ] 0.11 `JULY-UR43` 系列套餐批量授权|来源 `.scratch/ur43-series-package-bulk-authorization/`3 Tickets状态未开始主通道复杂写辅助 Query依赖0.1。
- [ ] 0.12 `JULY-UR44` 列表提交人与审批摘要|来源 `.scratch/ur44-list-submitter-approval-summary/PRD.md`|状态:未开始|主通道 Query辅助简单写/迁移|依赖:0.4、0.5、0.7
- [ ] 0.13 `JULY-UR45` 换货快照与新旧独立搜索|来源 `.scratch/ur45-exchange-asset-search/`2 Tickets状态后端完成、Ticket 元数据待收口;前端/人工待确认|主通道复杂写 + Query。
- [ ] 0.14 `JULY-UR46` 预计最终到期时间|来源 `.scratch/ur46-estimated-final-expiry/`4 Tickets状态后端完成、前端/人工未完成|主通道 Query依赖 0.19 已满足。
- [ ] 0.12 `JULY-UR44` 列表提交人与审批摘要|来源 `.scratch/ur44-list-submitter-approval-summary/PRD.md`|状态:未开始|主通道 Query辅助简单写/迁移|依赖:4.6、4.11、2.10、4.W9业务列表基础字段不依赖企微专属投影
- [x] 0.13 `JULY-UR45` 换货快照与新旧独立搜索|来源 `.scratch/ur45-exchange-asset-search/`2 Tickets状态后端完成、前端/人工待验收|主通道复杂写 + Query。
- [x] 0.14 `JULY-UR46` 预计最终到期时间|来源 `.scratch/ur46-estimated-final-expiry/`4 Tickets状态后端完成、前端/人工未完成|主通道 Query依赖 0.19 已满足。
- [ ] 0.15 `JULY-UR47` 卡片手动限速|来源 `.scratch/ur47-manual-card-speed-limit/`4 Tickets状态未开始主通道 Application + Port/Adapter辅助 Infrastructure依赖0.1。
- [ ] 0.16 `JULY-UR48` 按资产类型限制支付方式|来源 `.scratch/ur48-asset-payment-methods/`5 Tickets状态未开始主通道简单写 + 复杂写,辅助 Query依赖0.1。
- [ ] 0.17 `JULY-UR49` 设备 CSV 批量分配|来源 `.scratch/ur49-device-batch-allocation-csv/`5 Tickets状态未开始主通道 Application辅助 Infrastructure/Query依赖0.6 的受控上传边界。
- [ ] 0.18 `JULY-UR53` 卡和设备实名状态筛选|来源 `.scratch/ur53-asset-realname-filter/PRD.md`|状态:未开始|主通道 Query辅助投影 Application/Infrastructure依赖0.25。
- [x] 0.19 `JULY-UR55` 套餐生效条件覆盖与购买快照|来源 `.scratch/ur55-package-expiry-base/`状态5/5 Tickets 已完成PRD 顶层状态滞后不影响代码完成证据|主通道简单写 + 复杂写。
- [ ] 0.20 `JULY-UR57` 活跃退款资产禁止换货|来源 `.scratch/ur57-block-exchange-active-refund/PRD.md`|状态:未开始|主通道复杂写,辅助批量 Query依赖0.5。
- [ ] 0.21 `JULY-UR60` 店铺联系电话精确查询|来源 `.scratch/ur60-shop-phone-search/`3 Tickets状态后端完成、前端联调/人工验收未完成|主通道旧架构简单 Query。
- [x] 0.21 `JULY-UR60` 店铺联系电话精确查询|来源 `.scratch/ur60-shop-phone-search/`3 Tickets状态后端完成、前端联调/人工验收未完成|主通道旧架构简单 Query。
- [ ] 0.22 `JULY-UR62` H5 购买与实名顺序配置|来源 `.scratch/ur62-h5-realname-order/PRD.md`|状态:未开始|主通道 Domain/Application辅助简单写/Query依赖0.25。
- [ ] 0.23 `JULY-UR73` 按运营商实名能力控制复机|来源 `.scratch/ur73-resume-realname-policy/PRD.md`|状态:未开始|主通道复杂写,辅助 Gateway/Outbox依赖0.25。
- [ ] 0.24 `JULY-UR86` 资产前代/后代换货链|来源 `.scratch/ur86-asset-exchange-trace/`2 Tickets状态后端完成、前端验收与历史抽样未完成主通道 Query。
- [x] 0.24 `JULY-UR86` 资产前代/后代换货链|来源 `.scratch/ur86-asset-exchange-trace/`2 Tickets状态后端完成、前端验收与历史抽样未完成主通道 Query。
- [ ] 0.25 `JULY-UR94` 卡状态公共写入与运营商回调|来源 `.scratch/ur94-card-state-events-callbacks/`13 Tickets状态未开始主通道复杂写辅助 Adapter/Query依赖0.1。
- [ ] 0.26 `JULY-UR96` 店铺业务员归属|来源 `.scratch/ur96-shop-business-owner/`6 Tickets状态未开始|主通道简单写,辅助 Query/Port依赖0.1。
- [x] 0.26 `JULY-UR96` 店铺业务员归属|来源 `.scratch/ur96-shop-business-owner/`6 Tickets状态后端代码完成、验证延期|主通道简单写,辅助 Query/Port依赖0.1。
- [ ] 0.27 `JULY-UR97` 钱包低余额预警|来源 `.scratch/ur97-wallet-low-balance-alert/PRD.md`|状态:未开始|主通道复杂写,辅助 Query/Outbox/Notification依赖0.2、0.8、0.26。
- [ ] 0.28 `JULY-UR98` 换货新资产继承店铺|来源 `.scratch/ur98-exchange-inherit-shop/`4 Tickets状态未开始主通道复杂写辅助 Query/Infrastructure依赖0.1。
@@ -38,62 +38,52 @@
- [x] 1.1 固化 TECH 公共基础完成证据12 张 Ticket、Outbox/Relay、幂等、五态任务、受控配置、Access Log 安全能力、迁移与交接文档;明确它不等于通知、审计或业务消费者已完成。
- [x] 1.2 固化 UR55 后端完成证据:创建/编辑覆盖值、同步购买快照、自动购包快照、激活与排队只消费快照共 5 张 Ticket不重复实现后端。
- [x] 1.3 固化 UR45 后端完成证据:统一换货资产快照和新旧资产独立搜索均已有代码/文档/提交;不回填历史快照、不顺带迁移 UR86/UR98。
- [ ] 1.4 收口 UR45 原 PRD/Ticket 元数据并向前端交付新旧资产筛选契约;保持“后端完成、前端/人工待验收”,不得把元数据修正记为重新实现。
- [x] 1.4 收口 UR45 原 PRD/Ticket 元数据并向前端交付新旧资产筛选契约;保持“后端完成、前端/人工待验收”,不得把元数据修正记为重新实现。
- [x] 1.5 固化 UR46 四个后端 Query 切片完成证据后台详情、卡列表、设备列表、C 端资产信息;不写汇总表、不重复计算第二套到期字段。
- [x] 1.6 固化 UR60 后端完成证据:分页校验、联系电话 11 位精确过滤/索引、企业账号路由限制;保留前端与人工任务未完成。
- [x] 1.7 固化 UR86 后端完成证据:前代和后代 Query、权限投影与索引不新建换货关系表、不修改换货状态机。
- [x] 1.8 冻结提交 `ff44305` 现有审计代码:保留 Integration Log 基础、离线 `cmd/audit-coverage`、Access Log 敏感字段判定复用和无外键迁移 `000167`不装配 Audit Event、不继续开发审计中心,生产恢复见 6.5
- [x] 1.8 冻结提交 `ff44305` 现有相关代码:保留 Integration Log 基础、离线 `cmd/audit-coverage`、Access Log 敏感字段判定复用和无外键迁移 `000167`Audit Event 与审计中心移出本 Change不作为测试环境或生产上线门禁未来如需恢复另开独立 Change
## 2. 第一批:共享核心与独立 frontier
### B1-01 公共站内通知(`JULY-TECH-NOTIFICATION`
- [ ] 2.1 映射原通知 Ticket 01交付后台明确接收账号的通知写入、`event_id + recipient` 幂等、未读查询与单条已读完整纵向切片。【主:简单写 ApplicationQuery/Infrastructure边界通知事实与当前账号读取不迁移业务触发规则、WebSocket依赖1.1】
- [ ] 2.2 映射原 Ticket 02交付后台通知筛选、分类汇总、稳定分页和全部/按分类已读。【主Query简单写边界当前接收人数据不迁移业务列表依赖2.1】
- [ ] 2.3 映射原 Ticket 03交付个人客户通知投递、简化列表与已读 API。【主简单写 + Query边界personal_customer 接收人不迁移后台权限模型依赖2.1】
- [ ] 2.4 映射原 Ticket 04交付店铺主账号、平台业务员及其他动态接收人的 Port/Adapter 解析。【主Application + Port/Adapter边界只解析稳定接收人不复制业务触发不迁移店铺层级依赖2.1、2.63】
- [ ] 2.5 映射原 Ticket 05交付受控 `ref_type/ref_id/ref_key` 目标解析、跳转白名单与跳转后二次权限校验。【主QueryApplication边界通知目标解析不迁移任意 URL、业务权限实现依赖2.1】
- [ ] 2.6 映射原 Ticket 06交付通知保留、分批清理、失败可观测与安全日志。【主InfrastructureQuery边界通知记录生命周期不迁移Audit Event、外部消息渠道依赖2.1】
- [ ] 2.7 映射原 Ticket 07冻结后台与 C 端通知页面、30 秒轮询、铃铛/抽屉/中心、加载/空态/失败与受控跳转契约,并更新 OpenAPI/中文文档。【主Query/API 契约不迁移前端框架选择依赖2.2、2.3、2.5】
- [ ] 2.8 映射原 Ticket 08 为测试环境发布检查:完成通知 Handler/路由/文档生成器、Worker/模板注册与生产组合根装配;仅执行本批格式化、必要生成、构建和部署检查,自动化与正式发布门禁转 6.2/6.5。【主Infrastructure依赖2.2-2.7】
- [x] 2.1 映射原通知 Ticket 01交付后台明确接收账号的通知写入、`event_id + recipient` 幂等、未读查询与单条已读完整纵向切片。【主:简单写 ApplicationQuery/Infrastructure边界通知事实与当前账号读取不迁移业务触发规则、WebSocket依赖1.1】
- [x] 2.2 映射原 Ticket 02交付后台通知筛选、分类汇总、稳定分页和全部/按分类已读。【主Query简单写边界当前接收人数据不迁移业务列表依赖2.1】
- [x] 2.3 映射原 Ticket 03交付个人客户通知投递、简化列表与已读 API。【主简单写 + Query边界personal_customer 接收人不迁移后台权限模型依赖2.1】
- [x] 2.4 映射原 Ticket 04交付店铺主账号、平台业务员及其他动态接收人的 Port/Adapter 解析。【主Application + Port/Adapter边界只解析稳定接收人不复制业务触发不迁移店铺层级依赖2.1、2.63】
- [x] 2.5 映射原 Ticket 05交付受控 `ref_type/ref_id/ref_key` 目标解析、跳转白名单与跳转后二次权限校验。【主QueryApplication边界通知目标解析不迁移任意 URL、业务权限实现依赖2.1】
- [x] 2.6 映射原 Ticket 06交付通知保留、分批清理、失败可观测与安全日志。【主InfrastructureQuery边界通知记录生命周期不迁移Audit Event、外部消息渠道依赖2.1】
- [x] 2.7 映射原 Ticket 07冻结后台与 C 端通知页面、30 秒轮询、铃铛/抽屉/中心、加载/空态/失败与受控跳转契约,并更新 OpenAPI/中文文档。【主Query/API 契约不迁移前端框架选择依赖2.2、2.3、2.5】
- [x] 2.8 映射原 Ticket 08 为测试环境发布检查:完成通知 Handler/路由/文档生成器、Worker/模板注册与生产组合根装配;仅执行本批格式化、必要生成、构建和部署检查,真实外部验收转 6.2Audit Event 不属于本 Change。【主Infrastructure依赖2.2-2.7】
### B1-02 企业微信审批公共能力`JULY-UR37`
### B1-02 渠道无关审批核心`JULY-UR37` 通用部分
- [ ] 2.9 映射原 UR37-01交付企微连接状态、Token 缓存/锁、安全 Viper 配置与 WeCom Adapter所有外部尝试接入 Integration Log。【主Infrastructure Adapter不迁移业务退款/充值依赖1.1】
- [ ] 2.10 映射原 UR37-02交付平台/超管五分钟扫码绑定会话、本人查询/解绑与超管强制解绑;代理不绑定。【主:复杂写 Application/DomainQuery边界账号与 userid 一对一|不迁移:组织模型依赖2.9】
- [ ] 2.11 映射原 UR37-03交付稳定场景、不可变模板版本、控件映射校验与首次发布。【主复杂写Adapter/Query边界模板版本事实不迁移本地审批节点依赖2.9】
- [ ] 2.12 映射原 UR37-04交付业务创建前置校验、真实提交人/企微发起身份快照、审批实例与业务单/Outbox 同事务 Port。【主Application + Port边界公共审批创建事务不迁移业务金额规则依赖2.10、2.11】
- [ ] 2.13 映射原 UR37-05交付本地业务附件权威存储、企微副本上传、异步 `applyevent`、结果未知状态和 Integration Log。【主Application/Infrastructure边界一次审批技术提交不迁移业务附件权限依赖2.12】
- [ ] 2.14 映射原 UR37-06交付场景暂停、提交租约、模板换版/指纹验证、原子恢复与失效告警。【主复杂写Scheduled Job边界新提交开关不中断存量实例不迁移业务终态依赖2.11、2.13】
- [ ] 2.15 映射原 UR37-07交付加密回调验签解密、权威 `getapprovaldetail` 同步、状态条件更新与首次终态 Outbox。【主复杂写Adapter边界审批镜像状态不迁移终态业务处理依赖2.13】
- [ ] 2.16 映射原 UR37-08交付两分钟轮询补偿、回调/轮询共用同步用例、处理租约与终态事件幂等。【主ApplicationWorker不迁移退款/充值 Worker依赖2.15】
- [ ] 2.17 映射原 UR37-09交付审批运行列表/详情、业务摘要、权限主体投影和稳定分页,代理不得看到审批人/内部意见/附件。【主Query边界公共审批读取不迁移业务列表依赖2.10、2.11、2.15】
- [ ] 2.18 映射原 UR37-10交付提交结果未知的“绑定已有 sp_no”和“确认未创建后重发”受控恢复保留每次技术尝试与 Integration Log。【主复杂写Adapter不迁移新业务审批申请依赖2.13、2.15、2.17】
- [ ] 2.19 映射原 UR37-11消费首次终态事件并向真实业务提交人发送审批结果通知按实例/接收人防重。【主ApplicationNotification Adapter不迁移业务到账通知依赖2.8、2.16】
- [ ] 2.20 映射原 UR37-12交付存量审批迁移契约、`legacy` 只读投影、平台绑定/代理固定账号前置检查与异常清单。【主Application/InfrastructureQuery不迁移伪造历史企微实例依赖2.10-2.15】
- [ ] 2.21 映射原 UR37-13冻结企微配置页、个人绑定、审批运行/详情/恢复与业务摘要的跨仓契约,补 OpenAPI、文档生成器和中文文档。【主API/Query 契约不迁移前端技术栈依赖2.10、2.11、2.17、2.18】
- [ ] 2.22 完成 UR37 公共能力的测试环境装配:配置模板/回调/轮询 Worker、路由与组合根并执行构建/部署检查;原 UR37-14“退款首个真实企微门禁”整体转 6.2,不阻塞 B3 退款代码实现。【主Infrastructure依赖2.9-2.21】
- [x] 2.9 定义业务侧 Approval Port、通用审批实例与标准决策 `approved/rejected/cancelled/deleted/revoked_after_approved`;实例只持有业务类型/ID、真实提交人、`provider``external_ref`、标准状态、请求/决策快照和关联 ID。【主Application + Port/Domain边界渠道无关审批事实不迁移企微 Token、`sp_no`、模板/控件、节点、审批人、会签/或签依赖1.1】
- [x] 2.10 交付通用审批 Query 和权限投影输出稳定业务摘要、提交人、provider、标准状态与处理摘要渠道专属节点、意见和附件仅由 Adapter 可选扩展代理不得看到内部审批信息。【主Query边界通用审批读模型不迁移业务列表、实时外部查询依赖2.9】
- [x] 2.11 交付渠道回传决策的统一同步用例、状态条件更新、首次终态 Outbox、处理租约与幂等分发业务消费者不得 import 企微/钉钉 SDK、DTO、状态码、模板控件 ID 或 `sp_no`。【主Application + Outbox边界标准决策进站和终态分发不迁移退款/充值终态规则依赖2.9】
- [x] 2.12 交付新审批申请的原子创建契约:业务用例在同一事务固化业务单、通用审批实例与提交 Outbox;有效 Adapter/场景/发起身份不可用时在上述事实写入前失败关闭。【主Application + Port边界申请创建与可用性契约不迁移金额、钱包、佣金、套餐规则不建本地审批流引擎依赖2.9、2.11】
### B1-03 代理主钱包信用额度(`JULY-UR38`
- [ ] 2.23 映射原 UR38-01扩展主钱包信用字段、CHECK/索引/版本与 Wallet Domain 不变量;迁移前核对现有约束和异常数据。【主:复杂写 DomainInfrastructure不迁移员工/佣金/资产钱包依赖1.1】
- [ ] 2.24 映射原 UR38-02交付客户角色“仅新建店铺使用”的默认信用模板、权限与 API/前端契约。【主:简单写 ApplicationQuery不迁移已有钱包追溯更新依赖2.23】
- [ ] 2.25 映射原 UR38-03新建店铺事务内原子复制默认角色信用快照到代理主钱包。【主复杂写 Application边界店铺 + 钱包创建事务不迁移其他店铺创建规则依赖2.24】
- [ ] 2.26 映射原 UR38-04交付平台独立权限调整店铺实际额度、版本冲突、降低/关闭边界和变更前后投影。【主:复杂写 DomainQuery不迁移:代理自助调额|依赖2.23】
- [ ] 2.27 映射原 UR38-05统一代理订单、代购和钱包支付扣款用例使用有效信用、版本/锁、唯一流水和同事务事实。【主:复杂写 Domain不迁移无关订单创建依赖2.23】
- [ ] 2.28 映射原 UR38-06统一代理主钱包冻结/解冻,维持 `balance-frozen+credit>=0` 与幂等流水。【主:复杂写 Domain不迁移佣金冻结依赖2.23、2.27】
- [ ] 2.29 映射原 UR38-07统一充值入账与人工调整用例按唯一业务号、版本和流水幂等只提供 UR34 可复用能力。【主:复杂写 Domain不迁移支付/企微/通知依赖2.23】
- [ ] 2.30 映射原 UR38-08统一代理订单退款回充仅按原扣款流水定位原主钱包并幂等回溯。【主复杂写 Domain不迁移渠道退款/资产钱包退款依赖2.27、2.29】
- [ ] 2.31 映射原 UR38-09资金概况 Query 返回信用开关、额度、现金可用、总可用、欠款和版本前端不得自行计算。【主Query不迁移钱包写入依赖2.23、2.26】
- [ ] 2.32 映射原 UR38-10 为测试环境停机切换:完成所有主钱包写入口接入、迁移/API/前端契约/组合根装配与本批构建部署检查;并发/真实资金验收转 6.1/6.3。【主Infrastructure/Application 收口依赖2.24-2.31】
- [x] 2.23 映射原 UR38-01扩展主钱包信用字段、CHECK/索引/版本与 Wallet Domain 不变量;迁移前核对现有约束和异常数据。【主:复杂写 DomainInfrastructure不迁移员工/佣金/资产钱包依赖1.1】
- [x] 2.24 映射原 UR38-02交付客户角色“仅新建店铺使用”的默认信用模板、权限与 API/前端契约。【主:简单写 ApplicationQuery不迁移已有钱包追溯更新依赖2.23】
- [x] 2.25 映射原 UR38-03新建店铺事务内原子复制默认角色信用快照到代理主钱包。【主复杂写 Application边界店铺 + 钱包创建事务不迁移其他店铺创建规则依赖2.24】
- [x] 2.26 映射原 UR38-04交付既有店铺实际额度调整、版本冲突、降低/关闭边界和变更前后投影`shop:credit-limit:manage` 仅控制前端按钮显示,后端本期不校验该权限或账号类型。【主:复杂写 DomainQuery依赖2.23】
- [x] 2.27 映射原 UR38-05统一代理订单、代购和钱包支付扣款用例使用有效信用、版本/锁、唯一流水和同事务事实。【主:复杂写 Domain不迁移无关订单创建依赖2.23】
- [x] 2.28 映射原 UR38-06统一代理主钱包冻结/解冻,维持 `balance-frozen+credit>=0` 与幂等流水。【主:复杂写 Domain不迁移佣金冻结依赖2.23、2.27】
- [x] 2.29 映射原 UR38-07统一充值入账与人工调整用例按唯一业务号、版本和流水幂等只提供 UR34 可复用能力。【主:复杂写 Domain不迁移支付/企微/通知依赖2.23】
- [x] 2.30 映射原 UR38-08统一代理订单退款回充仅按原扣款流水定位原主钱包并幂等回溯。【主复杂写 Domain不迁移渠道退款/资产钱包退款依赖2.27、2.29】
- [x] 2.31 映射原 UR38-09资金概况 Query 返回信用开关、额度、现金可用、总可用、欠款和版本前端不得自行计算。【主Query不迁移钱包写入依赖2.23、2.26】
- [x] 2.32 映射原 UR38-10 为测试环境停机切换:完成所有主钱包写入口接入、迁移/API/前端契约/组合根装配与本批构建部署检查;并发/真实资金验收转 6.1/6.3。【主Infrastructure/Application 收口依赖2.24-2.31】
### B1-04 卡状态公共写入与运营商回调(`JULY-UR94`
- [ ] 2.33 映射原 UR94-01扫描 19 位 ICCID 冲突并交付未删除范围部分唯一索引与发布前异常清单。【主Infrastructure不迁移ICCID 归一化依赖1.1】
- [ ] 2.34 映射原 UR94-02交付实名观测的唯一 `ApplyCardObservation` 写入闭环、锁/条件更新、领域事实与 Outbox。【主复杂写 Domain/Application不迁移轮询调度依赖2.33】
- [ ] 2.35 映射原 UR94-03将流量观测收口到同一公共写入用例并保持已有周期/资格语义。【主:复杂写 Domain不迁移套餐轮询依赖2.34】
- [ ] 2.36 映射原 UR94-04将网络状态观测收口到同一用例并保持停复机业务边界。【主复杂写 Domain不迁移复机资格由 3.2 负责依赖2.34】
- [ ] 2.37 映射原 UR94-05一次性切换三个现有轮询结果写入口到公共用例保持 PostgreSQL 配置、Redis 分片、间隔、开关和失败重排不变。【主Application/Infrastructure不迁移轮询调度依赖2.34-2.36】
- [x] 2.33 映射原 UR94-01扫描 19 位 ICCID 冲突并交付未删除范围部分唯一索引与发布前异常清单。【主Infrastructure不迁移ICCID 归一化依赖1.1】
- [x] 2.34 映射原 UR94-02交付实名观测的唯一 `ApplyCardObservation` 写入闭环、锁/条件更新、领域事实与 Outbox。【主复杂写 Domain/Application不迁移轮询调度依赖2.33】
- [x] 2.35 映射原 UR94-03将流量观测收口到同一公共写入用例并保持已有周期/资格语义。【主:复杂写 Domain不迁移套餐轮询依赖2.34】
- [x] 2.36 映射原 UR94-04将网络状态观测收口到同一用例并保持停复机业务边界。【主复杂写 Domain不迁移复机资格由 3.2 负责依赖2.34】
- [x] 2.37 映射原 UR94-05一次性切换三个现有轮询结果写入口到公共用例保持 PostgreSQL 配置、Redis 分片、间隔、开关和失败重排不变。【主Application/Infrastructure不迁移轮询调度依赖2.34-2.36】
- [ ] 2.38 映射原 UR94-06交付同场景可合并的立即/3/5 分钟观测序列、单次请求互斥、最小间隔与 Integration Log。【主ApplicationAsynq/Adapter不迁移自动退避状态依赖2.34-2.36】
- [ ] 2.39 映射原 UR94-07在查询资产、获取实名链接等成功边界接入观测序列不新增显式同步 API。【主Application Adapter不迁移读取 Query 业务依赖2.38】
- [ ] 2.40 映射原 UR94-08在停复机、购包和套餐激活成功边界接入观测序列仅负责触发不复制业务资格。【主Application Adapter不迁移UR73/套餐规则依赖2.38】
@@ -110,19 +100,19 @@
- [ ] 2.48 `JULY-UR43` 映射原 Ticket 03交付首次/后续管理前端契约、三类价格语义、OpenAPI/文档生成器与同批切换部署检查。【主API/Query 契约依赖2.46、2.47】
- [ ] 2.49 `JULY-UR47` 映射原 Ticket 01修复同一设备多当前卡并建立部分唯一约束异常数据先入清单。【主Infrastructure不迁移绑定历史依赖1.1】
- [ ] 2.50 `JULY-UR47` 映射原 Ticket 02交付语义化 `speed_level` 到账号/运营商渠道 `code` 的 Gateway Adapter、能力校验与 Integration Log。【主Port/Adapter不迁移自动限速依赖2.49】
- [ ] 2.51 `JULY-UR47` 映射原 Ticket 03交付统一资产手动限速 API设备解析当前卡区分不限速与 0kbps外部结果未知可恢复Audit Event 延期到 6.5。【主ApplicationAdapter不迁移套餐限速依赖2.49、2.50】
- [ ] 2.51 `JULY-UR47` 映射原 Ticket 03交付统一资产手动限速 API设备解析当前卡区分不限速与 0kbps外部结果未知可恢复Audit Event 不属于本 Change 且不阻塞上线。【主ApplicationAdapter不迁移套餐限速依赖2.49、2.50】
- [ ] 2.52 `JULY-UR47` 映射原 Ticket 04交付卡/设备详情限速能力、固定档位、失败状态、OpenAPI/文档生成器与测试环境配置/构建检查;真实 Gateway 验收转 6.4。【主Query/API 契约依赖2.49-2.51】
- [ ] 2.53 `JULY-UR48` 映射原 Ticket 01复用受控系统配置读取/更新,向资产展示允许支付方式并提供安全默认值。【主:简单写 + Query不迁移通用配置中心依赖1.1】
- [ ] 2.54 `JULY-UR48` 映射原 Ticket 02限制普通资产钱包充值为资产允许集合与微信/支付宝交集,钱包不得作为充值渠道。【主:复杂写 Policy不迁移C 端全部充值依赖2.53】
- [ ] 2.55 `JULY-UR48` 映射原 Ticket 03订单创建时必填并固化支付方式快照强充按同一方式拉起且钱包不能给自身强充。【主复杂写 Domain不迁移其他订单状态依赖2.53】
- [ ] 2.56 `JULY-UR48` 映射原 Ticket 04支付时只执行订单快照方式并按最新资产配置二次校验需要换方式时取消旧单重建。【主复杂写 Domain不迁移支付方式替换接口依赖2.53、2.55】
- [ ] 2.57 `JULY-UR48` 映射原 Ticket 05交付后台配置、C 端支付页/强充/取消重建契约、OpenAPI/文档生成器与测试环境构建部署检查;真实支付验证转 6.3。【主API/前端契约依赖2.54-2.56】
- [ ] 2.58 `JULY-UR96` 映射原 Ticket 01为店铺增加 nullable 平台业务员字段、索引与启用平台账号约束不回填历史。【主Infrastructure不迁移店铺层级/分销依赖1.1】
- [ ] 2.59 `JULY-UR96` 映射原 Ticket 02平台创建店铺时显式设置或按规则继承业务员并在同一用例保存快照。【主简单写 Application不迁移信用模板由 UR38依赖2.58】
- [ ] 2.60 `JULY-UR96` 映射原 Ticket 03代理创建直属下级店铺时安全继承当前业务员不允许代理指定其他平台账号。【主简单写不迁移店铺权限依赖2.59】
- [ ] 2.61 `JULY-UR96` 映射原 Ticket 04交付业务员编辑权限、停用/删除后的历史保留和重绑Audit Event 延期 6.5。【主简单写不迁移账号生命周期依赖2.58】
- [ ] 2.62 `JULY-UR96` 映射原 Ticket 05店铺创建/编辑/列表/详情/筛选返回业务员投影、候选账号与手机号摘要。【主Query不迁移数据范围依赖2.58】
- [ ] 2.63 `JULY-UR96` 映射原 Ticket 06交付主账号与可用业务员接收人解析 Port、OpenAPI/前端契约与测试环境构建部署检查。【主Port/Adapter + Query不迁移通知触发规则依赖2.59-2.62】
- [x] 2.58 `JULY-UR96` 映射原 Ticket 01为店铺增加 nullable 平台业务员字段、索引与启用平台账号约束不回填历史。【主Infrastructure不迁移店铺层级/分销依赖1.1】
- [x] 2.59 `JULY-UR96` 映射原 Ticket 02平台创建店铺时显式设置或按规则继承业务员并在同一用例保存快照。【主简单写 Application不迁移信用模板由 UR38依赖2.58】
- [x] 2.60 `JULY-UR96` 映射原 Ticket 03代理创建直属下级店铺时安全继承当前业务员不允许代理指定其他平台账号。【主简单写不迁移店铺权限依赖2.59】
- [x] 2.61 `JULY-UR96` 映射原 Ticket 04交付业务员编辑权限、停用/删除后的历史保留和重绑Audit Event 不属于本 Change 且不阻塞上线。【主简单写不迁移账号生命周期依赖2.58】
- [x] 2.62 `JULY-UR96` 映射原 Ticket 05店铺创建/编辑/列表/详情/筛选返回业务员投影、候选账号与手机号摘要。【主Query不迁移数据范围依赖2.58】
- [x] 2.63 `JULY-UR96` 映射原 Ticket 06交付主账号与可用业务员接收人解析 Port、OpenAPI/前端契约与测试环境构建部署检查。【主Port/Adapter + Query不迁移通知触发规则依赖2.59-2.62】
- [ ] 2.64 `JULY-UR98` 映射原 Ticket 01建立换货分配记录与目标资产归属校正基础目标已属其他店铺时拒绝。【主Infrastructure/Domain不迁移历史回填依赖1.1】
- [ ] 2.65 `JULY-UR98` 映射原 Ticket 02换货完成事务内让新资产继承旧店铺并保留旧资产归属钱包/套餐迁移仍只受 `migrate_data` 控制。【主:复杂写 Domain/Application不迁移整个换货模块依赖2.64】
- [ ] 2.66 `JULY-UR98` 映射原 Ticket 03创建/发货/完成接口投影继承店铺和只读展示信息禁止前端提交目标店铺。【主Query/API 契约依赖2.65】
@@ -139,7 +129,7 @@
- [ ] 3.4 映射原 UR40-04历史套餐投影按真实使用资格提供续费入口。【主Query依赖3.1】
- [ ] 3.5 映射原 UR40-05C 端订单创建重新校验续费资格、资产所有权和套餐状态。【主:复杂写 Domain/Application依赖3.1】
- [ ] 3.6 映射原 UR40-06后台代购、自动购包等非个人入口统一禁止下架套餐绕过。【主复杂写 Policy 接入不迁移入口其他规则依赖3.1】
- [ ] 3.7 映射原 UR40-08交付跨入口 API/前端契约、OpenAPI/文档生成器与构建部署检查;原 Ticket 07 Audit Event 迁入 6.5,不在本轮实现。【主API/发布契约依赖3.2-3.6】
- [ ] 3.7 映射原 UR40-08交付跨入口 API/前端契约、OpenAPI/文档生成器与构建部署检查;原 Ticket 07 Audit Event 移出本 Change不阻塞上线。【主API/发布契约依赖3.2-3.6】
### B2-02B2-05 卡状态与钱包下游
@@ -179,7 +169,7 @@
- [ ] 3.35 映射原 UR49-05 为测试环境装配完成迁移、Handler、Worker、路由、对象存储用途与构建部署检查真实链路/自动化门禁转 6.1/6.3。【主Infrastructure依赖3.31-3.34】
- [ ] 3.36 第二批批次检查:执行 `gofmt`、必要代码生成、`go build ./...`核对迁移、Handler 文档生成器、Worker/Outbox/Integration Log、配置和跨批依赖不新增/运行测试。
## 4. 第三批:复杂业务与组合 Query
## 4. 第三批:审批业务先行、渠道后置与组合 Query
### B3-01 UR34 代理充值
@@ -187,32 +177,49 @@
- [ ] 4.2 交付代理当前店铺可用支付方式与在线充值创建100 元100 万元、新 request_id 新业务单/支付单、微信 Native/支付宝 PreCreate、结果未知恢复和 qr_content 原样返回。【主:复杂写 + Payment Adapter不迁移二维码图片/多通道池依赖2.29、2.57】
- [ ] 4.3 交付支付回调与受控查单共用确认用例:渠道/配置/金额/交易号/业务关联校验,迟到成功优先,支付事实与入账 Outbox 同事务。【主复杂写Integration Log/Outbox不迁移前端轮询触发查单依赖4.2】
- [ ] 4.4 交付钱包入账 Worker唯一流水、版本、处理租约、状态恢复和目标主账号/真实提交人到账通知,支付已成功时失败不得回滚收款事实。【主:复杂写 Wallet Application不迁移人工重复入账依赖2.29、2.8、4.3】
- [ ] 4.5 交付平台/超管线下代充值创建、15 付款凭证、固定金额与企微实例;审批通过入账、驳回终结、撤销分流,旧 offline-pay/reject 停机下线。【主:复杂写WeCom/Worker不迁移本地审批/操作密码依赖2.22、4.1、4.4】
- [ ] 4.6 交付充值列表/详情/payment-status、代理店铺层级权限、前端二维码/轮询/审批/处理状态、OpenAPI/文档生成器和测试环境构建部署检查;真实支付/企微验收转 6.2/6.3。【主Query/API 契约依赖4.2-4.5】
- [ ] 4.5 交付平台/超管线下代充值业务核心:后端计算固定金额、保存 15 付款凭证原件和请求快照,通过 Approval Port 创建通用审批实例;消费标准决策完成通过入账、拒绝/删除/撤销终结和通过后撤销分流,旧 offline-pay/reject 仅在渠道装配可用后停机下线。【主:复杂写 Application/DomainApproval Port/Worker边界线下代充规则和终态处理不迁移企微 SDK/DTO/`sp_no`/状态码不建本地审批流引擎或操作密码依赖2.92.12、2.29、4.1、4.4】
- [ ] 4.6 交付充值列表/详情/payment-status、代理店铺层级权限、前端二维码/轮询/标准审批/处理状态、OpenAPI/文档生成器和业务核心构建检查;渠道专属字段仅作可选扩展,线下代充入口在 4.W14 前保持关闭,真实支付/审批验收转 6.2/6.3。【主Query/API 契约依赖4.24.5】
### B3-02 UR35 退款
- [ ] 4.7 交付退款固定申请金额、业务凭证、真实提交人、唯一企微实例与三套状态迁移;创建前校验无其他活跃退款。【主:复杂写|不迁移:本地审批/旧原单重提依赖2.22】
- [ ] 4.8 交付退款创建纵向切片:后端读取实收金额、保存 15 本地凭证和审批快照、写提交 Outbox删除 approve/reject/return/resubmit/manual-complete 路由。【主:复杂写 Application不迁移渠道自动退款依赖4.7】
- [ ] 4.9 交付企微首次终态消费与退款处理租约:拒绝/撤销终结;通过后按支付类型处理资金,代理主钱包只按原扣款流水回溯,非代理资金由人工退款事实确认。【主:复杂写|不迁移:资产钱包自动回充依赖2.30、4.8】
- [ ] 4.7 交付退款固定申请金额、业务凭证、真实提交人、唯一通用审批实例与申请/审批/处理三套状态迁移;创建前校验无其他活跃退款。【主:复杂写|Approval Port边界退款申请和审批关联不迁移企微 SDK/DTO/`sp_no`/状态码,不建本地审批流引擎或旧原单重提依赖2.92.12】
- [ ] 4.8 交付退款创建纵向切片:后端读取实收金额、保存 15 本地权威凭证和申请快照,通过 Approval Port 原子写通用实例与提交 Outbox删除 approve/reject/return/resubmit/manual-complete 路由。【主:复杂写 Application不迁移渠道自动退款、外部审批附件权威化依赖4.7】
- [ ] 4.9 交付标准审批终态消费与退款处理租约:`rejected/cancelled/deleted` 终结;`approved` 后按支付类型处理资金;`revoked_after_approved` 按资金事实分流。代理主钱包只按原扣款流水回溯,非代理资金由人工退款事实确认。【主:复杂写|边界:退款决策和资金处理|不迁移:渠道状态翻译、资产钱包自动回充依赖2.11、2.30、4.8】
- [ ] 4.10 交付整单终结的订单、已发放/未发放佣金、全部有效套餐、下一套餐激活或停止资产的持久化步骤幂等与失败恢复。【主:复杂写 Domain/Application不迁移未触碰订单/佣金模块依赖4.9、2.40】
- [ ] 4.11 交付退款列表/详情、店铺层级权限、代理最小审批投影、处理失败摘要和前端只读状态;更新 OpenAPI/文档生成器。【主Query/API 契约依赖4.7-4.10】
- [ ] 4.12 完成退款/企微/Worker/迁移测试环境装配和构建部署检查;真实企微、资金/佣金/套餐人工验收及自动化转 6.1/6.2/6.3。【主Infrastructure依赖4.8-4.11】
- [ ] 4.12 完成退款业务核心、标准决策消费者、Worker/迁移和 API 的构建检查;未装配有效 Adapter 时新提交失败关闭且不写业务单/实例/Outbox测试环境开放退款入口另依赖 4.W14资金/佣金/套餐人工验收及自动化转 6.1/6.2/6.3。【主Infrastructure/Application 收口依赖4.84.11】
### B3-03B3-06 下游业务
### B3-03 UR37 WeCom Adapter 与首个渠道装配
- [ ] 4.W1 映射原 UR37-01在 UR34/UR35 业务核心已可独立构建后交付企微连接状态、Token 缓存/锁、安全 Viper 配置与 WeCom Adapter所有外部尝试接入 Integration Log。【主Infrastructure Adapter不迁移Approval Port 与退款/充值规则依赖1.1、2.9、4.6、4.12】
- [ ] 4.W2 映射原 UR37-02交付平台/超管五分钟扫码绑定会话、本人查询/解绑与超管强制解绑;代理不绑定。【主:复杂写 Application/DomainQuery边界WeCom userid 绑定不迁移组织模型、通用审批实例依赖4.W1】
- [ ] 4.W3 映射原 UR37-03交付稳定场景、不可变企微模板版本、控件映射校验与首次发布。【主复杂写Adapter/Query边界WeCom 模板配置事实|不迁移:本地审批节点/审批人/会签或签依赖4.W1】
- [ ] 4.W4 映射原 UR37-04实现 WeCom Adapter 对 Approval Port 的可用性检查和发起身份解析,将企微身份作为渠道快照,不泄漏到业务 Domain/Application。【主Infrastructure Adapter边界WeCom 发起前置不迁移业务单创建事务依赖2.12、4.W2、4.W3】
- [ ] 4.W5 映射原 UR37-05保持本地业务附件为权威原件交付企微副本上传、异步 `applyevent``external_ref=sp_no` 绑定、结果未知和 Integration Log。【主Application/Infrastructure Adapter边界一次 WeCom 技术提交不迁移业务附件权限与内容依赖2.12、4.W4】
- [ ] 4.W6 映射原 UR37-06交付场景暂停、提交租约、企微模板换版/指纹验证、原子恢复与失效告警暂停只阻断新提交不中断存量实例。【主复杂写Scheduled Job不迁移业务终态依赖4.W3、4.W5】
- [ ] 4.W7 映射原 UR37-07交付企微加密回调验签解密、权威 `getapprovaldetail` 同步和 Translator将企微状态翻译为 2.9 标准决策后调用 2.11,不直接执行退款/充值规则。【主Infrastructure AdapterApplication边界WeCom 入站防腐层不迁移终态业务处理依赖2.11、4.W5】
- [ ] 4.W8 映射原 UR37-08交付两分钟轮询补偿与回调共用 4.W7 Translator 和 2.11 同步用例按至少一次语义恢复。【主Application/InfrastructureWorker不迁移退款/充值 Worker依赖4.W7】
- [ ] 4.W9 映射原 UR37-09在 2.10 通用 Query 之上交付企微节点、审批人、内部意见和附件的受权扩展投影代理仅获取通用最小摘要。【主Query边界WeCom 详情扩展不迁移业务列表、实时调企微依赖2.10、4.W2、4.W3、4.W7】
- [ ] 4.W10 映射原 UR37-10交付提交结果未知的“绑定已有 `sp_no`”和“确认未创建后重发”受控恢复,保留每次技术尝试与 Integration Log。【主复杂写Adapter/Query不迁移新业务申请和通用决策依赖4.W5、4.W7、4.W9】
- [ ] 4.W11 映射原 UR37-11消费 2.11 首次标准终态事件,向真实业务提交人发送审批结果通知,按实例/接收人防重。【主ApplicationNotification Adapter不迁移业务到账通知依赖2.8、2.11】
- [ ] 4.W12 映射原 UR37-12交付存量审批迁移契约、`provider=legacy` 只读投影、平台绑定/代理固定账号前置检查与异常清单不伪造历史企微实例。【主Application/InfrastructureQuery不迁移历史业务规则依赖2.9、4.W24.W7】
- [ ] 4.W13 映射原 UR37-13冻结企微配置页、个人绑定、审批运行/详情/恢复与业务摘要的跨仓契约,明确通用字段和 WeCom 扩展字段,补 OpenAPI、文档生成器和中文文档。【主API/Query 契约不迁移前端技术栈与本地流程编排依赖4.W2、4.W3、4.W9、4.W10】
- [ ] 4.W14 映射原 UR37-14 的测试环境部分:在 4.6/4.12 业务核心已完成后,装配 WeCom Adapter、模板/回调/轮询 Worker、路由和组合根使线下代充/退款可用且无效 Adapter 仍失败关闭;执行本批构建/部署检查,真实企微门禁整体转 6.2。【主Infrastructure 组合根边界首个渠道接入和入口开放不迁移业务规则或其他审批渠道依赖4.6、4.12、4.W14.W13】
### B3-04B3-07 下游业务
- [ ] 4.13 `JULY-UR57` 在换货创建完整用例的任何副作用前,批量判定活跃退款(状态 1/历史 4或状态 2 且处理未成功)并以统一禁止错误拒绝;不新增预检查 API、不改退款/换货状态机。【主复杂写Query依赖4.7】
- [ ] 4.14 `JULY-UR57` 更新换货 API/前端错误契约、中文文档和构建部署检查;拒绝路径 Audit Event 延期 6.5。【主API 契约依赖4.13】
- [ ] 4.14 `JULY-UR57` 更新换货 API/前端错误契约、中文文档和构建部署检查;拒绝路径 Audit Event 不属于本 Change 且不阻塞上线。【主API 契约依赖4.13】
- [ ] 4.15 `JULY-UR33` 交付复用 UR46 的 015 天临期 Query、3 天内置顶、列表/Dashboard/C 端/续费投影只接受可准确推算事实。【主Query不迁移到期算法第二套实现依赖1.5、3.7、2.63】
- [ ] 4.16 `JULY-UR33` 交付每日扫描、15/7/3 最近节点、防重记录与 Outbox/通知消费漏跑不补多条站内通知失败不修改套餐事实。【主Application/Infrastructure不迁移短信/企微提醒依赖2.8、4.15】
- [ ] 4.17 `JULY-UR33` 接入 `expiring_asset` 导出输入契约、前端临期页/Dashboard/高亮/续费与 OpenAPI/文档生成器;实际 DataSource 实现在 4.23。【主Query/API 契约依赖4.15】
- [ ] 4.18 `JULY-UR33` 完成迁移、定时任务、Worker/模板、路由与测试环境构建部署检查;时间边界/通知真实验证转 6.1/6.6。【主Infrastructure依赖4.15-4.17】
- [ ] 4.19 `JULY-UR44` 为退款、充值、换货新增提交人不可变快照和历史回填(含软删除账号,缺失显示未知),新建时同事务冻结。【主:简单写/迁移不迁移业务状态机依赖4.1、4.7】
- [ ] 4.20 `JULY-UR44` 扩展三类列表,以本页实例批量投影 approval_source/status/current approver/processing代理当前审批人固定为空换货固定 none。【主Query不迁移实时调用企微依赖2.17、4.19】
- [ ] 4.20 `JULY-UR44` 扩展三类列表,以本页通用审批实例批量投影 approval_source/provider/status/current_approver/processing业务列表基础字段只依赖 2.10WeCom 节点摘要是 4.W9 的可选扩展,代理当前审批人固定为空,换货固定 none。【主Query不迁移实时调用企微或将业务列表绑定单一渠道依赖2.10、4.W9、4.19】
- [ ] 4.21 `JULY-UR44` 交付前端列/状态/权限、OpenAPI/文档生成器和构建部署检查。【主API 契约依赖4.20】
- [ ] 4.22 `JULY-UR42` 交付代码字段 Registry、角色 Scene 字段授权全量替换、超管全目录、普通账号并集交集和零字段拒绝。【主:简单写 ApplicationQuery不迁移菜单/行权限依赖1.1】
- [ ] 4.23 `JULY-UR42` 创建导出任务时快照字段/表头/过滤/数据范围/脱敏级别,扩展各 Scene DataSourceCount/Fetch 条件一致且无 N+1。【主Query/DataSourceApplication不迁移第二套导出框架依赖4.6、4.11、4.17、4.20、1.5】
- [ ] 4.24 `JULY-UR42` 交付稳定不可枚举 attachment_ref、前端登录恢复落地页和按当前业务权限生成短期下载 URL不得输出对象 Key/media_id/预签名 URL。【主Query/Infrastructure不迁移公开 Bucket依赖2.13、4.23】
- [ ] 4.24 `JULY-UR42` 交付稳定不可枚举 attachment_ref、前端登录恢复落地页和按当前业务权限生成短期下载 URL不得输出对象 Key/media_id/预签名 URL,导出只使用本地权威附件,不依赖企微副本。【主Query/Infrastructure不迁移公开 Bucket 或渠道附件权威化依赖4.5、4.8、4.23】
- [ ] 4.25 `JULY-UR42` 交付角色字段配置、导出入口/任务/失败/附件页面契约,更新 OpenAPI/文档生成器和中文文档。【主API/前端契约依赖4.22-4.24】
- [ ] 4.26 `JULY-UR42` 完成权限表/附件引用迁移、Export Worker/对象存储/配置装配和测试环境构建部署检查;文件内容/性能/权限自动化转 6.1/6.3。【主Infrastructure依赖4.22-4.25】
- [ ] 4.27 第三批批次检查:执行 `gofmt`、必要代码生成、`go build ./...`,核对资金/审批/支付/导出迁移、Handler 文档生成器、Worker/Outbox/Integration Log、旧路由下线与配置不新增/运行测试。
@@ -226,18 +233,18 @@
- [ ] 5.5 联合收口 UR98/UR45/UR86确认换货新资产继承店铺、旧资产保留归属、新旧搜索和双向链路契约在同一前后端版本一致。
- [ ] 5.6 冻结测试环境版本、迁移清单、API/Worker/Relay/前端版本、配置样例和回滚负责人确认需求16无代码/迁移/入口。
- [ ] 5.7 进入维护模式,停止相关写入与旧 Worker执行增量迁移和前置数据清单失败时保持维护且不开放访问。
- [ ] 5.8 发布 API、Relay/Worker、匹配前端版本装配企微、支付、Gateway、运营商、对象存储与 Redis/Asynq 测试环境配置。
- [ ] 5.8 发布 API、Relay/Worker、匹配前端版本装配企微、支付、Gateway、运营商、对象存储与 Redis/Asynq 测试环境配置;线下代充/退款入口仅在 4.W14 完成且 WeCom Adapter/场景/身份配置有效后开放
- [ ] 5.9 执行最终允许门禁:`gofmt` 检查、必要代码生成、`go build ./...`、迁移版本、路由/OpenAPI、Worker 注册、配置就绪和前后端版本一致性检查;不运行 `go test` 或真实依赖自动验收。
- [ ] 5.10 恢复 Worker 与测试环境访问,记录每条线实际状态;只能标记“测试环境已部署/待人工验收”,不得标记生产验收完成。
- [ ] 5.10 恢复 Worker 与测试环境访问,记录每条线实际状态;未完成 4.W14 时必须继续关闭线下代充/退款新提交入口,且只能标记“后端代码完成”或“测试环境已部署/待人工验收”,不得标记生产验收完成。
- [ ] 5.11 发布后若产生审批、支付、资金、Outbox、Integration Log、通知或部分成功任务事实回滚仅暂停异常入口并前向修复不清表、不恢复旧 Writer、不要求重复付款。
## 6. 延期验证与生产发布门禁(本次不得预勾选)
## 6. 延期验证与生产发布门禁
- [ ] 6.1 恢复并完成所有单元、集成、HTTP、业务流程、并发、迁移、权限、性能与回归自动化补齐本轮未新增的 `_test.go`,运行完整 `go test ./...` 并保留最终代码证据。
- [ ] 6.2 完成真实企业微信模板、平台本人绑定、代理固定成员、附件、提交、加密回调、轮询、同意/拒绝/撤销/删除/结果未知恢复,以及退款和线下充值终态验收。
- [ ] 6.3 完成真实 PostgreSQL、Redis/Asynq、对象存储、微信 Native、支付宝 PreCreate/TradeQuery/回调、支付成功未入账恢复与导出文件验收。
- [ ] 6.4 完成真实 Gateway 限速账号/运营商档位、设备当前卡、失败/结果未知,以及移动/联通/电信运营商回调和 19/20 位 ICCID 验收。
- [ ] 6.5 恢复全局 Audit Event 治理:重新评审 `.scratch/tech-global-audit/` 22 张票,完成 Writer、业务覆盖、历史投影、审计中心、系统配置/Outbox 正式 Adapter、敏感读取/导出/保留一次性发布门禁;不得把测试环境冻结改为永久 N/A
- [x] 6.5 明确全局 Audit Event 治理移出本 Change不实现 Writer、业务覆盖、历史投影、审计中心、敏感读取/导出/保留一次性切换门禁,不阻塞本次实际上线;未来如需建设另开独立 Change
- [ ] 6.6 完成后台、代理端、C 端全部页面与真实人工验收矩阵,包括异步部分成功、权限空态、通知、临期、换货历史抽样、余额预警和状态展示。
- [ ] 6.7 完成生产存量数据核对、进行中退款/充值迁移、企微模板与账号准备、支付/Gateway配置、停机发布与回滚演练、性能/安全/Access Log 脱敏门禁。
- [ ] 6.8 只有 6.16.7 全部具备真实证据后,才可把生产发布和七月迭代验收标记完成;测试环境豁免不得继承到生产。