2026-10-15-protocol-payment-v1-to-v2-checklist.sql 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. -- 采集协议单缴费 v1→v2 迁移 · 清单与校验(只读,不改数据)
  2. -- 实际迁移请用:backend/scripts/migrate_protocol_payment_v1_to_v2.py
  3. -- MySQL 5.7 / utf8mb4
  4. SET NAMES utf8mb4;
  5. -- ---------------------------------------------------------------------------
  6. -- 1) 仍为 v1 的协议概览
  7. -- ---------------------------------------------------------------------------
  8. SELECT
  9. p.id AS protocol_id,
  10. p.protocol_no,
  11. p.tenant_no,
  12. p.payment_model_version,
  13. (
  14. SELECT COUNT(*)
  15. FROM biz_protocol_sample s
  16. WHERE s.collection_protocol_id = p.id
  17. AND s.del_flag = 0
  18. AND IFNULL(s.sample_status, '') <> 'yzf'
  19. ) AS active_sample_count,
  20. (
  21. SELECT COUNT(*)
  22. FROM biz_protocol_payment pay
  23. WHERE pay.collection_protocol_id = p.id AND pay.del_flag = 0
  24. ) AS v1_payment_count,
  25. (
  26. SELECT COUNT(*)
  27. FROM biz_protocol_sample_payment sp
  28. WHERE sp.collection_protocol_id = p.id AND sp.del_flag = 0
  29. ) AS v2_sample_payment_count
  30. FROM biz_collection_protocol p
  31. WHERE p.del_flag = 0
  32. AND p.payment_model_version = 1
  33. ORDER BY p.create_time;
  34. -- ---------------------------------------------------------------------------
  35. -- 2) 人工清单候选:多样本
  36. -- ---------------------------------------------------------------------------
  37. SELECT
  38. p.id AS protocol_id,
  39. p.protocol_no,
  40. COUNT(s.id) AS active_sample_count,
  41. 'multi_sample' AS skip_reason
  42. FROM biz_collection_protocol p
  43. INNER JOIN biz_protocol_sample s
  44. ON s.collection_protocol_id = p.id
  45. AND s.del_flag = 0
  46. AND IFNULL(s.sample_status, '') <> 'yzf'
  47. WHERE p.del_flag = 0
  48. AND p.payment_model_version = 1
  49. GROUP BY p.id, p.protocol_no
  50. HAVING COUNT(s.id) > 1;
  51. -- ---------------------------------------------------------------------------
  52. -- 3) 人工清单候选:有退费痕迹的明细
  53. -- ---------------------------------------------------------------------------
  54. SELECT DISTINCT
  55. p.id AS protocol_id,
  56. p.protocol_no,
  57. d.id AS detail_id,
  58. d.pay_status,
  59. d.refund_amount,
  60. 'has_refund' AS skip_reason
  61. FROM biz_collection_protocol p
  62. INNER JOIN biz_protocol_payment pay
  63. ON pay.collection_protocol_id = p.id AND pay.del_flag = 0
  64. INNER JOIN biz_protocol_payment_detail d
  65. ON d.payment_id = pay.id AND d.del_flag = 0
  66. WHERE p.del_flag = 0
  67. AND p.payment_model_version = 1
  68. AND (
  69. d.pay_status IN ('tfqrz', 'ytf')
  70. OR (d.refund_amount IS NOT NULL AND d.refund_amount > 0)
  71. OR IFNULL(d.refund_attachments, '') <> ''
  72. OR IFNULL(d.refund_remark, '') <> ''
  73. OR IFNULL(d.refund_finance_confirm_attachments, '') <> ''
  74. OR IFNULL(d.refund_finance_remark, '') <> ''
  75. );
  76. -- ---------------------------------------------------------------------------
  77. -- 4) 可自动迁(单样本、有 v1 缴费、尚无 v2 方案)粗筛
  78. -- 注意:退费还需用第 3 节排除,本查询仅看样本数
  79. -- ---------------------------------------------------------------------------
  80. SELECT
  81. p.id AS protocol_id,
  82. p.protocol_no,
  83. s.sample_code,
  84. pay.contract_amount,
  85. pay.pay_mode
  86. FROM biz_collection_protocol p
  87. INNER JOIN biz_protocol_payment pay
  88. ON pay.collection_protocol_id = p.id AND pay.del_flag = 0
  89. INNER JOIN biz_protocol_sample s
  90. ON s.collection_protocol_id = p.id
  91. AND s.del_flag = 0
  92. AND IFNULL(s.sample_status, '') <> 'yzf'
  93. WHERE p.del_flag = 0
  94. AND p.payment_model_version = 1
  95. AND NOT EXISTS (
  96. SELECT 1 FROM biz_protocol_sample_payment sp
  97. WHERE sp.collection_protocol_id = p.id AND sp.del_flag = 0
  98. )
  99. GROUP BY p.id, p.protocol_no, s.sample_code, pay.contract_amount, pay.pay_mode
  100. HAVING COUNT(DISTINCT s.id) = 1;
  101. -- ---------------------------------------------------------------------------
  102. -- 5) 迁移后抽样校验:某协议 v1 detail 金额合计 vs v2 transfer 金额合计
  103. -- 将 @pid 换成协议 ID
  104. -- ---------------------------------------------------------------------------
  105. -- SET @pid := 'YOUR_PROTOCOL_ID';
  106. -- SELECT 'v1_detail' AS src, COUNT(*) AS cnt, IFNULL(SUM(transfer_amount), 0) AS amt
  107. -- FROM biz_protocol_payment_detail d
  108. -- INNER JOIN biz_protocol_payment pay ON pay.id = d.payment_id AND pay.del_flag = 0
  109. -- WHERE pay.collection_protocol_id = @pid AND d.del_flag = 0
  110. -- UNION ALL
  111. -- SELECT 'v2_transfer', COUNT(*), IFNULL(SUM(transfer_amount), 0)
  112. -- FROM biz_protocol_payment_transfer t
  113. -- WHERE t.collection_protocol_id = @pid AND t.del_flag = 0;