Files
break 48c85a4916
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m35s
docs(归档): 归档已用完套餐展示与支付购包即时复机两个变更
- fix-depleted-package-display → archive/2026-09-14-fix-depleted-package-display;
  补记验证:`GetCurrentMainPackage`(package_usage_store.go:63-66)按 status IN (1,2) 读取主套餐,
  资产信息 `fillPackageInfo`(service/asset/service.go:348-349)复用该读取,
  已用完主套餐返回名称、使用记录、时间与流量指标,待生效/已过期/已失效仍不作为当前套餐;
  实现提交 ff25586,4 项任务全部完成。
- fix-immediate-package-payment-resume → archive/2026-09-14-fix-immediate-package-payment-resume;
  补记八月迭代同步验证:定点同步提交 b38b2b3 已是 Iteration/8-11 的 HEAD 祖先,
  在途支付商户装配保留(98c145f);services.go:277 `orderService.SetResumeCallback(stopResumeService)`
  在位,`go build ./cmd/api ./cmd/worker` 通过;2.1/2.2 据此勾选。
- 主 Spec 同步:personal-customer 新增「资产信息展示当前可用或已用完主套餐」;
  package-lifecycle 修改为支付成功后已生效主套餐触发一次即时自动复机检查。

openspec validate --all 为 38 passed / 0 failed;doctor healthy。
2026-09-14 09:49:03 +08:00

1.9 KiB
Raw Blame History

Context

API 与 Worker 分别创建订单服务。Worker 已为订单服务注入停复机模块API 未注入;因此支付回调调用支付后自动复机入口时没有可执行的回调。支付后自动复机入口在事务提交后查询本订单的已生效主套餐,再异步调用停复机模块。

Goals / Non-Goals

Goals:

  • 使 API 支付回调复用既有的支付后自动复机入口。
  • 保持“仅已生效主套餐触发”的现有查询语义和停复机资格判断。

Non-Goals:

  • 不改变套餐权益状态、支付事务范围、Gateway 重试和轮询调度。
  • 不让支付回调等待 Gateway 复机结果。
  • 不新增队列、端口、数据表或配置。

Decisions

在 API Composition Root 注入既有回调

在 API 创建订单服务后调用既有的 SetResumeCallback(stopResumeService)。这是 Worker 已使用的装配方式;复用同一模块可将卡/设备载体解析、有效套餐、剩余流量、实名、停机原因、分布式锁和 Gateway 调用保持在一个实现内。

不在支付回调中直接调用 Gateway也不复制资格判断。直接调用会绕过已存在的幂等锁、设备多卡处理和审计/观测写入。

以事务提交后的已生效权益为复机前置条件

保留订单服务当前的查询:仅本订单 status=Activemaster_usage_id IS NULL 的主套餐权益可触发复机。查询发生在支付与权益事务成功返回后,避免使用未提交或排队权益快照。复机模块在异步执行时重新读取卡及权益事实,防止并发状态变化导致错误复机。

Risks / Trade-offs

  • Gateway 调用仍是异步副作用;支付成功不等于复机成功。该取舍保持支付事实可靠落库,不将外部网络延迟或失败耦合到支付回调。
  • API 进程现在可发起复机;其依赖已由同一 Composition Root 配置,且执行路径与 Worker 一致。