All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 49s
7.1 KiB
7.1 KiB
1. 数据库迁移(建新表)
- 1.1 创建迁移文件:新建
tb_recharge_order表(含所有字段和索引,参考 design.md 决策 4 的字段定义) - 1.2 创建迁移文件:新建
tb_payment表(含所有字段和索引,参考 design.md 决策 3 的字段定义)
2. Model 层
- 2.1 新建
internal/model/recharge_order.go:定义RechargeOrder模型、状态常量(1待支付 2已支付 3已关闭 4已退款)、AutoPurchaseStatus常量(pending/success/failed) - 2.2 新建
internal/model/payment.go:定义Payment模型、状态常量(1待支付 2已支付 3已失败 4已退款)、OrderType常量(package_order / recharge_order)
3. Store 层
- 3.1 新建
internal/store/postgres/recharge_order_store.go:实现 Create、GetByRechargeOrderNo、GetByID、UpdateStatus(乐观锁)、ListByCard、ListByDevice - 3.2 新建
internal/store/postgres/payment_store.go:实现 Create、GetByPaymentNo、UpdateStatus、UpdatePaymentInfo、ListByOrderID - 3.3 在
internal/bootstrap/stores.go中注册RechargeOrderStore和PaymentStore
4. 强充创建流程重写
- 4.1 修改
internal/service/client_order/service.go的createForceRechargeOrder:改为写tb_recharge_order+tb_payment,移除对rechargeRecordStore的调用 - 4.2 修改幂等键逻辑:
!claimed时 GET Redis 值,若为 recharge_order_no 则查tb_recharge_order,status=1 时返回已有充值订单(含idempotent: true标志),status≠1 时删 key 允许重建 - 4.3 调整
markClientPurchaseCreated:存入recharge_order_no(来自tb_recharge_order,不再存充值记录号) - 4.4 修改
ClientOrderService结构体:注入rechargeOrderStore和paymentStore,移除rechargeRecordStore字段 - 4.5 修改
internal/bootstrap/handlers.go:更新ClientOrderService的依赖注入
5. 支付回调链路完全重写
- 5.1 新建
internal/service/recharge_order/service.go:实现HandlePaymentCallback(ctx, paymentNo, paymentMethod, transactionID)——查tb_payment→ 乐观锁更新tb_payment.status=2→ 更新tb_recharge_order.status=2→ 事务内增加钱包余额 + 创建钱包流水 + 更新累计充值 → 触发 auto_purchase 任务(若 linked_package_ids 非空) - 5.2 修改
internal/handler/callback/payment.go:dispatchWechatCallback改为查tb_paymentby payment_no,找到则调rechargeOrderService.HandlePaymentCallback;CRCH 前缀单号不再路由到旧RechargeService - 5.3 修改
internal/bootstrap/handlers.go:注入rechargeOrderService到支付回调 Handler - 5.4 修改
internal/service/wechat_config/service.go的resolvePaymentConfigID:CRCH 前缀路由从AssetRechargeStore.GetByRechargeNo改为RechargeOrderStore.GetByRechargeOrderNo,获取payment_config_id用于微信支付回调验签 - 5.5 修改
internal/store/postgres/wechat_config_store.go的CountPendingRechargesByConfigID:SQL 从tb_asset_recharge_record改为查询tb_recharge_order(按payment_config_id统计待支付充值数,用于删除配置前检查)
6. 普通充值流程迁移
- 6.1 修改
internal/handler/app/client_wallet.go的CreateRecharge:改为调用新的充值订单创建逻辑,写tb_recharge_order+tb_payment,移除对旧RechargeService.Create的调用 - 6.2 修改
internal/handler/app/client_wallet.go的GetRechargeRecords:改为从tb_recharge_order查询
7. PayOrder 增加支付记录
- 7.1 修改
internal/service/order/service.go的WalletPay:在扣款事务中增加INSERT tb_payment(method=wallet,status=2,order_type=package_order) - 7.2 在
WalletPay中增加幂等检查:若tb_payment中已有该 order_id 且 status=2 的记录,直接返回成功,不重复扣款
8. auto_purchase 任务迁移
- 8.1 修改
internal/task/auto_purchase.go:任务 payload 改为传recharge_order_id,从tb_recharge_order读取 linked_package_ids,移除对tb_asset_recharge_record的读取 - 8.2 修改
auto_purchase.go:创建套餐订单(tb_order)的同时在同一事务内创建tb_payment(method=wallet,status=2,order_type=package_order) - 8.3 修改
auto_purchase.go:任务完成/失败后更新tb_recharge_order.auto_purchase_status,移除对tb_asset_recharge_record的写入
9. 新增充值订单独立接口
- 9.1 新增
internal/handler/app/client_recharge_order.go:实现ListRechargeOrders(GET/api/c/v1/recharge-orders,按 identifier + generation 查tb_recharge_order,支持 status 过滤)和GetRechargeOrderDetail(GET/api/c/v1/recharge-orders/:id) - 9.2 新增对应 DTO:
ClientRechargeOrderListRequest、ClientRechargeOrderListItem(含 auto_purchase_status、recharge_order_no、amount、status、status_name、created_at) - 9.3 注册路由:在 C 端路由组中注册
/api/c/v1/recharge-orders相关路由 - 9.4 修改
ClientCreateOrderResponse:recharge分支返回recharge_order_no(来自新表),增加idempotentbool 字段
10. 删除旧代码
- 10.1 删除
internal/service/recharge/service.go中全部写方法和回调处理(HandlePaymentCallback、Create 等),若无其他引用则删除整个文件 - 10.2 删除
internal/store/postgres/asset_recharge_store.go全部内容(无需保留任何方法) - 10.3 删除
internal/model/asset_wallet.go中的AssetRechargeRecord模型定义 - 10.4 从
internal/bootstrap/stores.go和handlers.go中移除AssetRechargeStore的所有注册和注入 - 10.5 从
internal/service/client_order/service.go中移除rechargeRecordStore字段和全部引用 - 10.6 运行
go build ./...,修复所有因删除旧代码引起的编译错误
11. 验证
- 11.1 用 PostgreSQL MCP 验证:发起强充后
tb_recharge_order和tb_payment均有新记录,tb_asset_recharge_record无新记录 - 11.2 用 PostgreSQL MCP 验证:微信支付回调后
tb_payment.status=2,tb_recharge_order.status=2,钱包余额正确增加 - 11.3 用 PostgreSQL MCP 验证:auto_purchase 完成后
tb_order新增套餐订单,tb_recharge_order.auto_purchase_status=success - 11.4 手动验证:GET
/api/c/v1/recharge-orders正确返回充值订单列表;GET/api/c/v1/orders仍只返回套餐订单 - 11.5 手动验证:重复发起相同参数的下单请求,返回 HTTP 200 且
idempotent=true,不报"订单正在创建中" - 11.6 手动验证:普通充值(非强充)写
tb_recharge_order,回调后钱包余额正确增加 - 11.7 手动验证:PayOrder 支付套餐后
tb_payment有对应 wallet 支付记录,重复调用幂等返回成功
12. 删除旧表(最后执行)
- 12.1 确认
tb_asset_recharge_record无任何新写入(检查该表 updated_at 最新时间是否在部署前) - 12.2 创建迁移文件:
DROP TABLE tb_asset_recharge_record - 12.3 执行迁移,确认表已删除