migration_20260408_biz_order_status_backfill.sql 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. -- 历史订单状态回填脚本
  2. -- 适用场景:
  3. -- 1) 已执行以下脚本,新增了三状态与取消审核字段
  4. -- - migration_20260408_biz_order_three_status.sql
  5. -- - migration_20260408_biz_order_cancel_status.sql
  6. -- 2) 需要把历史旧 status 映射回新字段
  7. --
  8. -- 说明:
  9. -- - 本脚本会回填 biz_order 与 biz_order_his
  10. -- - 回填规则以旧 status 为主,金额字段为辅
  11. -- - 可重复执行(幂等)
  12. START TRANSACTION;
  13. -- =========================
  14. -- 1) 回填主表 biz_order
  15. -- =========================
  16. UPDATE `biz_order`
  17. SET
  18. -- 订单主状态
  19. `order_status` = CASE
  20. WHEN `status` = 'cancelled' THEN 'cancelled'
  21. WHEN `status` = 'completed' THEN 'completed'
  22. ELSE 'pending'
  23. END,
  24. -- 配送状态
  25. `delivery_status` = CASE
  26. WHEN `status` IN ('pending_payment', 'pending_delivery', 'pending_review_cancel') THEN 'pending_delivery'
  27. WHEN `status` = 'delivering' THEN 'delivering'
  28. WHEN `status` = 'partial_delivered' THEN 'partial_delivered'
  29. WHEN `status` IN ('pending_confirm', 'completed') THEN 'delivered'
  30. WHEN `status` = 'cancelled' THEN
  31. CASE
  32. WHEN IFNULL(`delivery_assign_time`, NULL) IS NOT NULL THEN 'pending_delivery'
  33. ELSE 'pending_delivery'
  34. END
  35. ELSE 'pending_delivery'
  36. END,
  37. -- 支付状态
  38. `pay_status` = CASE
  39. WHEN `status` = 'refunding' THEN 'refunding'
  40. WHEN IFNULL(`refund_amount`, 0) > 0 AND IFNULL(`paid_amount`, 0) <= 0 THEN 'refunded'
  41. WHEN IFNULL(`paid_amount`, 0) > 0 THEN 'paid'
  42. ELSE 'pending_payment'
  43. END,
  44. -- 取消审核状态
  45. `cancel_status` = CASE
  46. WHEN `status` = 'pending_review_cancel' THEN 'pending_review'
  47. WHEN `status` = 'cancelled' AND `cancel_review_time` IS NOT NULL THEN 'approved'
  48. WHEN `status` IN ('pending_delivery', 'delivering', 'partial_delivered') AND `cancel_review_time` IS NOT NULL THEN 'rejected'
  49. ELSE 'none'
  50. END;
  51. -- =========================
  52. -- 2) 回填历史表 biz_order_his
  53. -- =========================
  54. UPDATE `biz_order_his`
  55. SET
  56. `order_status` = CASE
  57. WHEN `status` = 'cancelled' THEN 'cancelled'
  58. WHEN `status` = 'completed' THEN 'completed'
  59. ELSE 'pending'
  60. END,
  61. `delivery_status` = CASE
  62. WHEN `status` IN ('pending_payment', 'pending_delivery', 'pending_review_cancel') THEN 'pending_delivery'
  63. WHEN `status` = 'delivering' THEN 'delivering'
  64. WHEN `status` = 'partial_delivered' THEN 'partial_delivered'
  65. WHEN `status` IN ('pending_confirm', 'completed') THEN 'delivered'
  66. ELSE 'pending_delivery'
  67. END,
  68. `pay_status` = CASE
  69. WHEN `status` = 'refunding' THEN 'refunding'
  70. WHEN IFNULL(`refund_amount`, 0) > 0 AND IFNULL(`paid_amount`, 0) <= 0 THEN 'refunded'
  71. WHEN IFNULL(`paid_amount`, 0) > 0 THEN 'paid'
  72. ELSE 'pending_payment'
  73. END,
  74. `cancel_status` = CASE
  75. WHEN `status` = 'pending_review_cancel' THEN 'pending_review'
  76. WHEN `status` = 'cancelled' AND `cancel_review_time` IS NOT NULL THEN 'approved'
  77. WHEN `status` IN ('pending_delivery', 'delivering', 'partial_delivered') AND `cancel_review_time` IS NOT NULL THEN 'rejected'
  78. ELSE 'none'
  79. END;
  80. COMMIT;