Files
junhong_cmp_fiber/openspec/changes/archive/2026-09-14-add-refund-package-usage-display/tasks.md
break 67893617fe
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m33s
feat(退款): AUG26-006 补充当前退款套餐已用量与总量
补齐 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 行列数与表头一致。无迁移、无接口路径变化。
2026-09-14 12:11:55 +08:00

3.8 KiB
Raw Blame History

1. 查询投影

  • 1.1 新增退款套餐用量批量读取:按「冻结套餐使用记录优先级 → 订单主套餐 → 订单任一套餐使用记录、同级按 id 升序取第一条」解析每个退款申请的当前退款套餐返回真实已用量与真实总量MB。实现为固定两次查询id INorder_id IN+ 内存择一,不得按退款条数逐条查询;套餐记录不存在或字段为空时返回 0不报错。 证据:internal/service/refund/package_usage.goloadRefundPackageUsages 两次查询 + resolveRefundPackageUsage 优先级择一)。烟测实测:冻结套餐记录返回 321/1000未冻结回退订单主套餐返回 321/1000非零套餐记录物理删除返回 0 且不报错4 条退款的套餐查询次数恒为 2不随条数增长
  • 1.2 退款列表、详情响应新增「当前退款套餐已用量」与「当前退款套餐总量」两个字段:列表批量填充、详情单条填充,字段单位与含义写入中文 description枚举与单位不得与既有套餐 DTO 冲突。 证据:internal/model/dto/refund_dto.goRefundResponse.RefundPackageUsedMB/RefundPackageTotalMB(中文 description 含单位与零值语义);internal/service/refund/service.go 列表批量填充、详情单条填充。go run cmd/gendocs/main.go 生成的 OpenAPI 已包含两个字段。

2. 导出

  • 2.1 退款导出场景新增两列「当前退款套餐已用量(MB)」与「当前退款套餐总量(MB)」,插入在既有「套餐名称」列之后;同步调整 refundExportRow、Select 列与表头,保持表头与行元素数量、顺序严格一致。该两列必须覆盖未冻结 package_usage_id 的退款,不得沿用只按 r.package_usage_id join 的取法。 证据:internal/exporter/refund_scene.go 表头与行新增「当前退款套餐已用量(MB)」「当前退款套餐总量(MB)」两列(位于「套餐名称」之后),并以 LATERAL 按同一优先级取唯一套餐记录,不再依赖 r.package_usage_id join。烟测实测导出 43 行列数与表头一致,两个新列下标为 6/743/43 行取到套餐总量(改动前仅 30/43 有 package_usage_id)。

3. 验证

  • 3.1 按 ENG-TEST-001 在维护者指定的 junhong_cmp_test PostgreSQL + Redis DB 6 验证,仅创建与删除本 Change 自有 fixture禁止重置整库冻结过套餐使用记录的退款返回该记录用量未冻结但订单存在主套餐的退款返回主套餐用量而非零套餐记录已物理删除时返回 0 且列表/详情/导出仍正常;列表与导出的套餐查询次数固定为 2 次、不随条数增长;确认退款金额校验、套餐失效、接续、停机与佣金回溯行为无变化。 证据:测试库 junhong_cmp_test 实测四项解析场景与 2 次固定查询;并以同批 43 条退款做 Go 解析器与导出 SQL 的口径对拍,不一致 0 条。未修改退款金额校验、套餐失效、接续、停机与佣金回溯相关代码。fixture 全部清理,未重置整库。
  • 3.2 运行 gofmt -wgo build ./cmd/api ./cmd/workergo run cmd/gendocs/main.goopenspec validate add-refund-package-usage-display --strictopenspec validate --allopenspec doctor --json./scripts/context-health.sh;自动化测试按项目决策为 N/A验证脚本在完成后删除不留测试文件。 证据:gofmt -l(变更集)无输出;go build ./cmd/api ./cmd/worker 退出码 0go run cmd/gendocs/main.go 退出码 0 且 OpenAPI 含新字段;openspec validate add-refund-package-usage-display --strict 有效;openspec validate --all 通过;openspec doctor --json healthy./scripts/context-health.sh 通过。验证脚本已删除,仓库内 *_test.go 计数为 0。