feat(退款): AUG26-006 补充当前退款套餐已用量与总量
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m33s

补齐 PRD §2.3.1「退款管理补充字段」:退款列表、详情与导出新增
「当前退款套餐已用量」与「当前退款套餐总量」两个纯展示字段。

- 套餐定位口径与退款套餐失效保持一致,按优先级取唯一一条:
  冻结的 package_usage_id(且属于该订单)→ 订单主套餐 → 订单任一套餐,
  同级按标识升序。不按当前世代或当前生效套餐推断;不按套餐状态过滤,
  使退款后套餐转已失效时仍能回看用量。
- 列表与详情用固定两次查询批量解析(按标识、按订单),查询次数不随条数增长;
  详情复用同一函数。解析不到套餐或记录已物理删除时返回 0,不阻断读取。
- 导出新增两列并改用同一优先级的 LATERAL 取法,不再依赖只按 r.package_usage_id
  的 join——生产库 1296 条退款仅 157 条带该字段,旧取法会让多数行显示零值。
- 不改变退款金额校验、冻结实收、套餐失效、接续、停机与佣金回溯任何规则。

验证:测试库 junhong_cmp_test 实测冻结记录、订单主套餐回退、记录缺失返回 0 三项
解析场景与「4 条退款固定 2 次查询」;并以同批 43 条退款对拍 Go 解析器与导出 SQL,
口径不一致 0 条;导出 43 行列数与表头一致。无迁移、无接口路径变化。
This commit is contained in:
2026-09-14 12:11:55 +08:00
parent 09abee9778
commit 67893617fe
12 changed files with 400 additions and 12 deletions

View File

@@ -1096,7 +1096,8 @@
"identity-access::数据范围拒绝",
"order-refund-exchange::订单、退款与换货状态门禁",
"order-refund-exchange::代理退款查询按所属店铺隔离",
"order-refund-exchange::退款终态事实与失败分类"
"order-refund-exchange::退款终态事实与失败分类",
"order-refund-exchange::退款展示当前退款套餐用量"
],
"classification": "behavior"
},
@@ -1108,7 +1109,8 @@
"identity-access::数据范围拒绝",
"order-refund-exchange::订单、退款与换货状态门禁",
"order-refund-exchange::代理退款查询按所属店铺隔离",
"order-refund-exchange::退款终态事实与失败分类"
"order-refund-exchange::退款终态事实与失败分类",
"order-refund-exchange::退款展示当前退款套餐用量"
],
"classification": "behavior"
},

View File

@@ -3327,5 +3327,36 @@
],
"exit_status": 0
}
},
{
"capability": "order-refund-exchange",
"requirement": "退款展示当前退款套餐用量",
"spec": "openspec/specs/order-refund-exchange/spec.md",
"entries": [
"/api/admin/refunds",
"/api/admin/refunds/{id}"
],
"handler_consumer_job": [
"internal/routes/refund.go",
"internal/handler/admin/refund.go",
"internal/exporter/refund_scene.go"
],
"application_service_query": [
"internal/service/refund/package_usage.go"
],
"domain_state_amount": [
"internal/model/dto/refund_dto.go",
"internal/model/package.go"
],
"store_migration_config": [
"internal/model/package.go"
],
"verification": {
"command": "grep -n 'func (s \\*Service) loadRefundPackageUsages' internal/service/refund/package_usage.go",
"literal_output": [
"internal/service/refund/package_usage.go:33:func (s *Service) loadRefundPackageUsages(ctx context.Context, refunds []*model.RefundRequest) (map[uint]refundPackageUsage, error) {"
],
"exit_status": 0
}
}
]