-- 汇付「延时分账待交易确认」与商城分账记录对账 -- 用法:在 MySQL 执行(表前缀 fa_ 请按实际修改) -- 图1 汇付控台「商品描述=商城订单{order_sn}」可与 order_sn 直接对应 SELECT '=== 1. 当前分账配置(是否支付即分账)===' AS section; SELECT name, value, description FROM fa_shopro_split_config WHERE name IN ( 'split_enable', 'split_mode', 'split_provider', 'split_timing', 'split_amount_source', 'delay_acct_enable', 'platform_huifu_id' ); -- 汇付控台截图中的 8 笔订单号(可按需增删) SET @huifu_pending_sns = '202605495163454091004900,202609215157744091003800,202604274596990091003800,202606500438103091004500,202608341834105091004400,202607585392320091004300,202602490038750091003800,202602385010837091001400'; SELECT '=== 2. 汇付待确认列表 vs 商城分账/支付扩展(核心对账)===' AS section; SELECT o.id AS order_id, o.order_sn, o.status AS order_status, o.pay_fee, FROM_UNIXTIME(o.paytime) AS pay_time, FROM_UNIXTIME( NULLIF(CAST(JSON_UNQUOTE(JSON_EXTRACT(o.ext, '$.confirm_time')) AS UNSIGNED), 0) ) AS buyer_confirm_time, pe.delay_acct_flag, pe.confirm_status, pe.confirm_hf_seq_id, pe.hf_seq_id, so.id AS split_order_id, so.status AS split_status, CASE so.status WHEN 0 THEN '待分账' WHEN 1 THEN '分账中' WHEN 2 THEN '成功' WHEN 3 THEN '部分成功' WHEN 4 THEN '失败' ELSE IF(so.id IS NULL, '无分账记录', so.status) END AS split_status_label, so.split_source, so.split_amount, LEFT(so.wx_result, 160) AS split_fail_hint, CASE WHEN pe.delay_acct_flag IS NULL OR pe.delay_acct_flag = '' THEN '⚠ 无 pay_ext 或未记录 delay 标记' WHEN UPPER(pe.delay_acct_flag) <> 'Y' THEN '✗ 非延时分账单,控台待确认需单独核对' WHEN pe.confirm_status = 'S' OR so.status = 2 THEN '✓ 已交易确认/分账成功' WHEN so.id IS NULL THEN '✗ 从未生成分账记录(常见:split_timing≠当前订单状态,或支付时未开分账)' WHEN so.status = 4 THEN '✗ 分账失败,未 confirm 成功(资金仍可能卡在汇付)' WHEN so.status IN (0, 1) THEN '… 分账处理中' ELSE '请人工核对' END AS reconcile_hint FROM fa_shopro_order o LEFT JOIN fa_shopro_huifu_pay_ext pe ON pe.order_id = o.id LEFT JOIN ( SELECT t.* FROM fa_shopro_split_order t INNER JOIN ( SELECT order_id, MAX(id) AS max_id FROM fa_shopro_split_order WHERE channel = 'huifu' GROUP BY order_id ) x ON x.max_id = t.id ) so ON so.order_id = o.id WHERE FIND_IN_SET(o.order_sn, REPLACE(@huifu_pending_sns, ' ', '')) ORDER BY o.paytime DESC; SELECT '=== 3. 近90天:延时分账(Y)但未 confirm 成功(与控台待释放资金相关)===' AS section; SELECT o.id AS order_id, o.order_sn, o.pay_fee, FROM_UNIXTIME(o.paytime) AS pay_time, pe.confirm_status, pe.confirm_hf_seq_id, IFNULL(so.status, -1) AS split_status, LEFT(so.wx_result, 120) AS fail_msg FROM fa_shopro_order o INNER JOIN fa_shopro_huifu_pay_ext pe ON pe.order_id = o.id LEFT JOIN ( SELECT order_id, MAX(status) AS status, MAX(wx_result) AS wx_result FROM fa_shopro_split_order WHERE channel = 'huifu' GROUP BY order_id ) so ON so.order_id = o.id WHERE o.pay_type = 'huifu_wechat' AND o.paytime >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 90 DAY)) AND UPPER(IFNULL(pe.delay_acct_flag, '')) = 'Y' AND IFNULL(pe.confirm_status, '') <> 'S' AND IFNULL(so.status, 0) <> 2 ORDER BY o.paytime DESC LIMIT 100; SELECT '=== 4. 有延时分账标记但从未出现分账记录(高概率未触发 split)===' AS section; SELECT o.id, o.order_sn, FROM_UNIXTIME(o.paytime) AS pay_time, o.status AS order_status, pe.delay_acct_flag, (SELECT value FROM fa_shopro_split_config WHERE name = 'split_timing' LIMIT 1) AS split_timing FROM fa_shopro_order o INNER JOIN fa_shopro_huifu_pay_ext pe ON pe.order_id = o.id LEFT JOIN fa_shopro_split_order so ON so.order_id = o.id AND so.channel = 'huifu' WHERE o.pay_type = 'huifu_wechat' AND o.paytime >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 90 DAY)) AND UPPER(pe.delay_acct_flag) = 'Y' AND so.id IS NULL ORDER BY o.id DESC LIMIT 50; SELECT '=== 5. 分账失败(status=4) 汇付延时分账单 ===' AS section; SELECT so.order_id, so.order_sn, so.split_amount, so.retry_count, FROM_UNIXTIME(so.createtime) AS split_at, LEFT(so.wx_result, 200) AS fail_reason FROM fa_shopro_split_order so INNER JOIN fa_shopro_order o ON o.id = so.order_id INNER JOIN fa_shopro_huifu_pay_ext pe ON pe.order_id = o.id WHERE so.channel = 'huifu' AND so.status = 4 AND UPPER(IFNULL(pe.delay_acct_flag, '')) = 'Y' ORDER BY so.id DESC LIMIT 50; SELECT '=== 6. 本地标记已 confirm 但可能未真正释放(需 CLI audit-delay --live 核实)===' AS section; SELECT o.order_sn, o.pay_fee, pe.confirm_status, pe.confirm_hf_seq_id, so.status AS split_status, so.confirm_hf_seq_id AS split_confirm_seq, FROM_UNIXTIME(so.createtime) AS split_at FROM fa_shopro_order o INNER JOIN fa_shopro_huifu_pay_ext pe ON pe.order_id = o.id LEFT JOIN ( SELECT order_id, MAX(id) AS max_id FROM fa_shopro_split_order WHERE channel = 'huifu' GROUP BY order_id ) x ON x.order_id = o.id LEFT JOIN fa_shopro_split_order so ON so.id = x.max_id WHERE o.pay_type = 'huifu_wechat' AND UPPER(pe.delay_acct_flag) = 'Y' AND (pe.confirm_status = 'S' OR so.status = 2) ORDER BY o.paytime DESC LIMIT 50;