From 2aa20b7172a6005f137814738c8a9183efca038d Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 8 Oct 2026 20:18:39 +0800 Subject: [PATCH] test(client): verify return labels preserve server print templates --- .../views/ReturnOrdersView.test.mjs | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/src/modules/overseas-warehouse/views/ReturnOrdersView.test.mjs b/src/modules/overseas-warehouse/views/ReturnOrdersView.test.mjs index 14b21f5..651ddc1 100644 --- a/src/modules/overseas-warehouse/views/ReturnOrdersView.test.mjs +++ b/src/modules/overseas-warehouse/views/ReturnOrdersView.test.mjs @@ -74,13 +74,68 @@ test('退货签收详情使用独立路由和紧凑连续页面', () => { assert.doesNotMatch(view, /class="return-detail-dialog"/) }) -test('退货箱唛打印复用统一的紧凑单页模板并按箱分页', () => { - assert.match(view, /@page\{size:100mm 100mm;margin:8mm\}/) - assert.match(view, /\.label\{width:84mm;height:84mm;padding:8mm/) - assert.match(view, /html\.slice\(contentStart, bodyEnd\)/) +// ReturnInventoryService supplies the 100 mm template; the client must preserve +// its page margin (8 mm) and content padding (4 mm), including barcode markup. +const labelStyle = '' +const labelHtml = mark => `${labelStyle}

${mark}

` + +function printHarness() { + const source = view.slice(view.indexOf('async function printReturnLabel('), view.indexOf('\nfunction openDetail(')) + .replace('receipt: ReturnReceipt', 'receipt') + const calls = { opened: 0, printed: 0, html: '', warnings: [], errors: [], fetched: [] } + const popup = { + document: { open() {}, write(html) { calls.html = html }, close() {} }, + focus() {}, print() { calls.printed += 1 }, close() {}, + } + const print = new Function('window', 'ElMessage', 'getReturnInventoryLabel', `${source}; return printReturnLabel`)( + { open() { calls.opened += 1; return popup } }, + { warning(message) { calls.warnings.push(message) }, error(message) { calls.errors.push(message) } }, + async mark => { calls.fetched.push(mark); return { printableHtml: labelHtml(mark) } }, + ) + return { print, calls } +} + +test('退货箱唛打印保留服务端整份模板,不另行覆盖纸张或条码', async () => { + const { print, calls } = printHarness() + const printableHtml = labelHtml('RETURN-TEST-1') + await print({ cartonMark: 'RETURN-TEST-1', printableHtml }) + assert.equal(calls.html, printableHtml) + assert.equal(calls.printed, 1) + assert.deepEqual(calls.fetched, []) + assert.deepEqual(calls.errors, []) +}) + +test('退货多箱打印保留统一模板尺寸和每箱条码,并按箱分页', async () => { + const { print, calls } = printHarness() + const labels = ['RETURN-TEST-1', 'RETURN-TEST-2'].map(cartonMark => ({ cartonMark, printableHtml: labelHtml(cartonMark) })) + await print({ cartonMark: labels[0].cartonMark, labels }) + assert.equal(calls.html.split(labelStyle).length - 1, 1) + assert.equal((calls.html.match(//g) || []).length, 1) + assert.equal((calls.html.match(/
/g) || []).length, 2) + for (const label of labels) assert.ok(calls.html.includes(``)) + assert.match(calls.html, /\.return-label\{break-after:page\}/) + assert.match(calls.html, /\.return-label:last-child\{break-after:auto\}/) + assert.match(calls.html, /\.return-label \.label\{page-break-after:auto\}/) + assert.equal(calls.printed, 1) + assert.deepEqual(calls.fetched, []) + assert.deepEqual(calls.errors, []) assert.match(view, /打印全部箱唛(\{\{ receipt\.labels\?\.length \|\| receipt\.boxCount \|\| 1 \}\} 箱)/) }) +test('缺少内嵌模板时读取鉴权箱唛模板,待修复箱记录禁止打印', async () => { + const { print, calls } = printHarness() + await print({ cartonMark: 'RETURN-TEST-1' }) + assert.deepEqual(calls.fetched, ['RETURN-TEST-1']) + assert.ok(calls.html.includes(labelStyle)) + assert.equal(calls.printed, 1) + await print({ cartonMark: 'RETURN-TEST-2', labelRepairRequired: true }) + assert.equal(calls.opened, 1) + assert.equal(calls.printed, 1) + assert.deepEqual(calls.fetched, ['RETURN-TEST-1']) + assert.equal(calls.warnings.length, 1) + assert.deepEqual(calls.errors, []) +}) + test('待审核退货可编辑,完成入库后从独立新增页发起贴标', () => { assert.match(view, /row\.status === 'PENDING_REVIEW'.*key: 'edit'/) assert.match(view, /if \(editingReturnNo\.value\) await updateReturnOrder\(editingReturnNo\.value, payload\)/)