diff --git a/lib/__tests__/sku-barcode-detector.test.ts b/lib/__tests__/sku-barcode-detector.test.ts index 9a680e8..fdeb002 100644 --- a/lib/__tests__/sku-barcode-detector.test.ts +++ b/lib/__tests__/sku-barcode-detector.test.ts @@ -30,6 +30,9 @@ describe('detectSkuOrBarcodeName(SKU 图文件名判别)', () => { ['ZH-SZT018001-AD033501'], ['ZH-SZT018001-AD033501-BJ017603N1241V01'], ['zh-szt018001-ad033501n1256v01'], + ['MKHDNZ0409260601010+GBGJ-SJ038016N1410V01'], + ['mkhdnz0409260601010+gbgj-sj038016n1410v01'], + ['DNZ038521+AD033601+BJ017603N1241V01'], ])('%s → 组合 SKU 整串保留', (input) => { expect(detectSkuOrBarcodeName(input)).toEqual({ type: 'skuCode', value: input }) }) @@ -45,6 +48,10 @@ describe('detectSkuOrBarcodeName(SKU 图文件名判别)', () => { ['ZH--SZT018001-AD033501'], ['ZH-SZT018001-AD033501-'], ['ZH-SZT018001-组合'], + ['MKHDNZ0409260601010+'], + ['+GBGJ-SJ038016N1410V01'], + ['MKHDNZ0409260601010++GBGJ-SJ038016N1410V01'], + ['MKHDNZ0409260601010+随便起的名字'], ['随便起的名字'], [''], ])('%s → 不填(null)', (input) => { diff --git a/lib/sku-barcode-detector.ts b/lib/sku-barcode-detector.ts index 68e3c06..bb3a170 100644 --- a/lib/sku-barcode-detector.ts +++ b/lib/sku-barcode-detector.ts @@ -3,7 +3,7 @@ * * 依据生产数据的稳定结构(配合 lib/spu-parser.ts 的品类字典): * - SKU 编号: [前缀-?]品类码 + 纯数字,如 DNZ038521、AD033601、GBSFY-AD0360、MKHDNZ0409260600987 - * - 组合 SKU: ZH- 开头,后接至少两个“字母码 + 数字”的产品段;整串都属于 SKU 编号 + * - 组合 SKU: ZH- 开头,或以 + 连接多个有效产品编码;整串都属于 SKU 编号 * - 产品条码: SKU 编号 + N数字(V数字)? 段,如 DNZ038521N1280V01、CY001306N35V01 * - 其余(纯序号、02-1、复合串、含中文等)判别不出,交给人工填写 * @@ -56,7 +56,11 @@ export function detectSkuOrBarcodeName(name: string): SkuOrBarcodeDetection | nu if (!trimmed) return null // 组合 SKU 的业务语义优先于普通 N/V 条码规则。 - if (COMBINATION_SKU_PATTERN.test(trimmed)) { + const parts = trimmed.split('+') + const isJoinedSku = parts.length > 1 && parts.every(part => + SKU_CODE_PATTERN.test(part) || BARCODE_PATTERN.test(part) + ) + if (COMBINATION_SKU_PATTERN.test(trimmed) || isJoinedSku) { return { type: 'skuCode', value: trimmed } }