diff --git a/app/Console/Commands/SyncStoreReceiptOrderMatches.php b/app/Console/Commands/SyncStoreReceiptOrderMatches.php index e5164a41..0439bdb0 100644 --- a/app/Console/Commands/SyncStoreReceiptOrderMatches.php +++ b/app/Console/Commands/SyncStoreReceiptOrderMatches.php @@ -547,6 +547,8 @@ class SyncStoreReceiptOrderMatches extends Command // 子单的平台子订单号与主单不同时,按「子订单号 + 条码」的去重键拦不住,会把同一批 // 商品重复累加。整单没有任何主单行时退化为取全部行,避免把真实金额抹掉——与实付 // 「主单优先,无主单退化」保持同一套规则。 + // 合并发货行(merge_so_id 非空)会把组内其它订单的金额一起挂在本单号上: + // 当单号下存在「非合并行」时,商品与实付都只认非合并行,避免把合并组合计当成单笔金额。 $mirror->statement('DROP TEMPORARY TABLE IF EXISTS tmp_receipt_main_nos'); $mirror->statement('CREATE TEMPORARY TABLE tmp_receipt_main_nos (no varchar(64) NOT NULL, PRIMARY KEY(no)) ENGINE=InnoDB'); $mirror->statement( @@ -556,6 +558,15 @@ class SyncStoreReceiptOrderMatches extends Command STRAIGHT_JOIN {$ordersTable} o ON o.so_id = t.no WHERE o.link_o_id IS NULL OR o.link_o_id = 0" ); + $mirror->statement('DROP TEMPORARY TABLE IF EXISTS tmp_receipt_plain_nos'); + $mirror->statement('CREATE TEMPORARY TABLE tmp_receipt_plain_nos (no varchar(64) NOT NULL, PRIMARY KEY(no)) ENGINE=InnoDB'); + $mirror->statement( + "INSERT IGNORE INTO tmp_receipt_plain_nos (no) + SELECT DISTINCT o.so_id as no + FROM tmp_receipt_order_nos t + STRAIGHT_JOIN {$ordersTable} o ON o.so_id = t.no + WHERE COALESCE(o.merge_so_id, '') = ''" + ); // 同一线上订单号在聚水潭可能对应多个 o_id(拆单/子单),且子单会重复包含 // 同一批子订单商品行;先按「子订单号 + 条码」去重再求和,避免重复计算。 @@ -572,22 +583,26 @@ class SyncStoreReceiptOrderMatches extends Command STRAIGHT_JOIN {$ordersTable} o ON o.so_id = t.no STRAIGHT_JOIN {$itemsTable} i ON i.o_id = o.o_id LEFT JOIN tmp_receipt_main_nos m ON m.no = o.so_id + LEFT JOIN tmp_receipt_plain_nos p ON p.no = o.so_id WHERE (o.link_o_id IS NULL OR o.link_o_id = 0) - OR m.no IS NULL + OR (m.no IS NULL AND (COALESCE(o.merge_so_id, '') = '' OR p.no IS NULL)) GROUP BY o.so_id, o.shop_name, dedup_key ) d GROUP BY so_id, shop_name" ); // 订单实付:取订单级字段(明细行上的实付会重复);拆单取主单(link_o_id 为空), - // 没有主单时退化为取该单号下的最大值。 + // 其次取「非合并行」(merge_so_id 为空——合并发货行带的是组内合计金额,不能算单笔), + // 都没有时退化为取该单号下的最大值。 $paid = $mirror->select( "SELECT so_id, shop_name, COALESCE( MAX(CASE WHEN link_o_id IS NULL OR link_o_id = 0 THEN paid END), + MAX(CASE WHEN COALESCE(merge_so_id, '') = '' THEN paid END), MAX(paid) ) as paid FROM ( - SELECT o.so_id as so_id, o.shop_name as shop_name, o.link_o_id as link_o_id, o.{$paidColumn} as paid + SELECT o.so_id as so_id, o.shop_name as shop_name, o.link_o_id as link_o_id, + COALESCE(o.merge_so_id, '') as merge_so_id, o.{$paidColumn} as paid FROM tmp_receipt_order_nos t STRAIGHT_JOIN {$ordersTable} o ON o.so_id = t.no ) x