repair_order_amount.sql 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. -- ============================================================
  2. -- 修复订单金额 SQL 脚本
  3. -- 场景:ORC_RESULT 回调创建了订单和商品明细,但 ORDER 回调
  4. -- 因签名验证失败被拒绝,导致 total_amount / paid_amount 为空
  5. -- 逻辑:根据 order_goods 表汇总(price × product_num) 补齐金额
  6. -- 日期:2026-07-20
  7. -- ============================================================
  8. -- 第一步:预览将要修复的订单(确认无误后再执行 UPDATE)
  9. SELECT
  10. o.id,
  11. o.order_no,
  12. o.total_amount AS 当前totalAmount,
  13. o.paid_amount AS 当前paidAmount,
  14. o.pay_status,
  15. ROUND(SUM(og.price * og.product_num), 2) AS 计算金额,
  16. COUNT(og.id) AS 商品条目数
  17. FROM t_order o
  18. INNER JOIN t_order_goods og ON og.order_id = o.id
  19. WHERE (o.total_amount IS NULL OR o.total_amount <= 0)
  20. AND o.pay_status = 'UNPAID'
  21. AND o.pay_channel = 'wechat_payscore'
  22. GROUP BY o.id, o.order_no, o.total_amount, o.paid_amount, o.pay_status
  23. ORDER BY o.create_time DESC;
  24. -- ============================================================
  25. -- 第二步:确认预览结果无误后,取消注释以下语句执行更新
  26. -- ============================================================
  27. -- UPDATE t_order o
  28. -- INNER JOIN (
  29. -- SELECT
  30. -- og.order_id,
  31. -- ROUND(SUM(og.price * og.product_num), 2) AS calc_amount
  32. -- FROM t_order_goods og
  33. -- INNER JOIN t_order ord ON ord.id = og.order_id
  34. -- WHERE (ord.total_amount IS NULL OR ord.total_amount <= 0)
  35. -- AND ord.pay_status = 'UNPAID'
  36. -- AND ord.pay_channel = 'wechat_payscore'
  37. -- GROUP BY og.order_id
  38. -- ) t ON o.id = t.order_id
  39. -- SET
  40. -- o.total_amount = t.calc_amount,
  41. -- o.paid_amount = t.calc_amount,
  42. -- o.discount_amount = 0.00;
  43. -- 验证更新结果:
  44. -- SELECT id, order_no, total_amount, paid_amount, discount_amount, pay_status
  45. -- FROM t_order
  46. -- WHERE pay_channel = 'wechat_payscore' AND pay_status = 'UNPAID'
  47. -- ORDER BY create_time DESC;