diff --git a/app/Console/Commands/SyncStoreReceiptOrderMatches.php b/app/Console/Commands/SyncStoreReceiptOrderMatches.php index 1cc6c1ea..7d726878 100644 --- a/app/Console/Commands/SyncStoreReceiptOrderMatches.php +++ b/app/Console/Commands/SyncStoreReceiptOrderMatches.php @@ -460,12 +460,20 @@ class SyncStoreReceiptOrderMatches extends Command ['ops_jst_orders', 'ops_jst_order_item'], ] as [$ordersTable, $itemsTable]) { try { + // 同一线上订单号在聚水潭可能对应多个 o_id(拆单/子单),且子单会重复包含 + // 同一批子订单商品行;先按「子订单号 + 条码」去重再求和,避免重复计算。 $result = $mirror->select( - "SELECT o.so_id as so_id, o.shop_name as shop_name, SUM(i.amount) as amount - FROM tmp_receipt_order_nos t - STRAIGHT_JOIN {$ordersTable} o ON o.so_id = t.no - STRAIGHT_JOIN {$itemsTable} i ON i.o_id = o.o_id - GROUP BY o.so_id, o.shop_name" + "SELECT so_id, shop_name, SUM(amount) as amount + FROM ( + SELECT o.so_id as so_id, o.shop_name as shop_name, + CONCAT(COALESCE(NULLIF(i.outer_oi_id, ''), CONCAT('o', o.o_id, '-', i.oi_id)), '|', i.sku_id) as dedup_key, + MAX(i.amount) as amount + FROM tmp_receipt_order_nos t + STRAIGHT_JOIN {$ordersTable} o ON o.so_id = t.no + STRAIGHT_JOIN {$itemsTable} i ON i.o_id = o.o_id + GROUP BY o.so_id, o.shop_name, dedup_key + ) d + GROUP BY so_id, shop_name" ); } catch (Throwable $exception) { $this->error('订单侧查询失败(' . $ordersTable . '):' . $exception->getMessage());