Files
break f15a64395f
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m30s
修复反馈
2026-08-10 16:30:38 +08:00

2.2 KiB

Context

现有套餐管理列表服务于套餐管理页面,不能承载授权页面的店铺授权状态。现有低余额提醒在扣款 Outbox 消费者中派生;测试库证明一次有效跨阈值扣款已完成消费但未产生通知事件。

Goals / Non-Goals

Goals:

  • 以独立只读接口提供授权页面所需候选套餐和授权状态。
  • 将跨阈值通知事件与钱包扣款事实原子写入。

Non-Goals:

  • 不改套餐管理列表接口。
  • 不新增或替换首次创建、套餐管理的提交路由。
  • 不新增阈值配置或修改数据库 Schema。

Decisions

独立授权候选列表

新增授权域路由,输入 shop_idseries_id。查询同时执行操作者可管理店铺、上级授权链和套餐系列校验,并按目标店铺现有授权填充状态。

候选项复用套餐列表的 PackageResponse 字段集,并追加 authorized;代理操作者的价格与上架状态沿用其上级授权记录。

复用 GET /packages 会将授权上下文混入套餐管理接口,影响其既有消费者;只返回未授权项则无法支持前端明确置灰,均不采用。

扣款事务内创建通知事件

由统一主钱包扣款事件 Writer 根据扣款前后余额判断跨阈值,并在相同事务写入低余额通知 Outbox。该 Writer已被直接扣款和预占完成扣款共同调用。

保留 Worker 对通知 Outbox 的投递;移除扣款消费者中低余额通知派生,只保留扣款事实校验。这样 API 与 Worker 重启之间不会遗失派生通知。

幂等与接收人

通知事件 ID 使用订单扣款引用构成稳定值,继续使用 Outbox 幂等写入。接收人于扣款事务中解析为当前有效平台业务员;无有效业务员时不创建通知事件。

Risks / Trade-offs

  • [业务员在扣款后变更] → 通知接收人固定为扣款时有效的业务员,符合触发时的业务事实。
  • [候选查询与提交并发] → 现有部分唯一索引继续作为最终重复授权防线。

Migration Plan

  1. 发布 API 与 Worker 代码。
  2. 使用 10000 分→9900 分、低余额连续扣款、回升后再次跌破三组数据验证事件与通知。
  3. 回滚时恢复前一版本;不涉及迁移或数据回滚。