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}`
+
+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\)/)