业绩明细取数:合并发货行不再当作单笔金额(实付与商品优先取本单非合并行)

This commit is contained in:
qiuxiang 2026-10-14 09:56:10 +08:00
parent f6497f5afc
commit e26c1e467e

View File

@ -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