From ee9205dca7fdd5b8c794b75aea87bd796cf34c4e Mon Sep 17 00:00:00 2001 From: chenxi Date: Fri, 23 Oct 2026 11:14:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=93=81=E6=88=90=E6=9C=AC=EF=BC=9A?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20MKH=20=E7=BB=84=E5=90=88=E8=A3=85=E6=8B=86?= =?UTF-8?q?=E5=88=86=20(#466)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commands/SyncStoreReceiptProductCost.php | 17 ++++++++++++++--- .../product-costs.blade.php | 1 + 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/Console/Commands/SyncStoreReceiptProductCost.php b/app/Console/Commands/SyncStoreReceiptProductCost.php index 0e2c7419..b23641e5 100644 --- a/app/Console/Commands/SyncStoreReceiptProductCost.php +++ b/app/Console/Commands/SyncStoreReceiptProductCost.php @@ -37,6 +37,9 @@ class SyncStoreReceiptProductCost extends Command /** 套餐 / 服务占位编码:不是实物商品,商品成本不取数。 */ private const EXCLUDED_SKUS = ['TCXJ', 'FUWU', 'AZF']; + /** 组合装条码前缀;条码结构为「前缀-组件条码-数量-组件条码-数量」。 */ + private const COMBO_PREFIXES = ['ZH-', 'MKH-']; + /** * 发货仓库黑名单:这些仓不是实际销售发货仓,整仓不参与商品成本; * 例外:常州简尚家居有限公司里商品编码以 DF- 开头的行保留。 @@ -247,7 +250,7 @@ class SyncStoreReceiptProductCost extends Command } } - // 组合装条码(ZH-条码-数量-条码-数量)按子订单拆成组件行: + // 组合装条码(ZH-/MKH-条码-数量-条码-数量)按子订单拆成组件行: // 一个订单有几个发货仓库、商品编码、数量就分开列,组件数量 = 明细数量 × 组件倍数。 // 解析不了的组合条码(条码被截断等)保持原样,避免丢行。 foreach (self::expandComboSku($sku, $qty) as [$code, $codeQty, $isComponent]) { @@ -487,6 +490,7 @@ class SyncStoreReceiptProductCost extends Command /** * 组合装条码拆组件:聚水潭的组合装 sku 形如 * ZH-<条码>-<数量>[-<条码>-<数量>...] + * MKH-<条码>-<数量>[-<条码>-<数量>...] * 条码本身含横杠,所以按「纯数字段」识别数量,再按组件展开。 * * 返回 [条码, 数量, 是否组件];非组合装或解析失败时返回原条码 / 原数量。 @@ -495,11 +499,18 @@ class SyncStoreReceiptProductCost extends Command */ private static function expandComboSku(string $sku, float $quantity): array { - if (! str_starts_with(mb_strtoupper($sku), 'ZH-')) { + $prefix = null; + foreach (self::COMBO_PREFIXES as $candidate) { + if (str_starts_with(mb_strtoupper($sku), $candidate)) { + $prefix = $candidate; + break; + } + } + if ($prefix === null) { return [[$sku, $quantity, false]]; } - $parts = explode('-', substr($sku, 3)); + $parts = explode('-', substr($sku, strlen($prefix))); $components = []; $buffer = []; foreach ($parts as $part) { diff --git a/resources/views/business/pages/financial-operations/product-costs.blade.php b/resources/views/business/pages/financial-operations/product-costs.blade.php index e88f224e..f43487a2 100644 --- a/resources/views/business/pages/financial-operations/product-costs.blade.php +++ b/resources/views/business/pages/financial-operations/product-costs.blade.php @@ -113,6 +113,7 @@ (采购单价优先、其次钉钉代发单价),仍匹配不到时用「普通商品资料」里的商品成本价兜底;商品成本 = 商品数量 × 商品单价。 拆单只取最末级订单行(没有任何下级的叶子行),主单和中间汇总层不参与、避免重复计数; 同一单分多仓发货的按末级实际仓库分行;虚拟条码(X0000x)不计入; + ZH-、MKH- 开头的组合装按「组件条码 + 数量」拆分,无法解析的组合装保留原编码; 套餐/服务占位编码 TCXJ、FUWU、AZF 不取数(组合装里拆出的这些编码同样剔除)。 发货仓库默认排除「常州简尚家居有限公司」「简尚-苏州福利品仓」「简尚-自动发货仓」, 其中常州简尚家居有限公司的「DF-」商品行例外保留;先排除 TCXJ/FU WU/AZF,再执行仓库过滤。