优化
This commit is contained in:
@@ -102,12 +102,16 @@ test('picking page keeps scan, draft and risky transition contracts', async () =
|
||||
assert.match(page, /submitStatusHint\(\)[\s\S]*?提交时需选择原因/)
|
||||
assert.match(page, /onBackPress\(\)/)
|
||||
assert.doesNotMatch(page, /scanFocused|restoreScanFocus|hideKeyboard|@confirm="handleScan"/)
|
||||
assert.match(page, /<ScanTargetInput v-model="scanValue" name="sku"[\s\S]*?:active="activeScanField === 'sku'"[\s\S]*?@activate="setScanTarget"[\s\S]*?@submit="handleManualSubmit"/)
|
||||
assert.match(page, /<ScanTargetInput v-model="scanValue" name="boxCode"[\s\S]*?:active="activeScanField === 'boxCode'"[\s\S]*?@activate="setScanTarget"[\s\S]*?@submit="handleManualSubmit"/)
|
||||
assert.match(page, /beforeUnmount\(\)/)
|
||||
assert.match(page, /startScanBroadcast/)
|
||||
assert.match(page, /onHide\(\) \{ this\.stopHardwareScanner\(\) \}/)
|
||||
assert.match(page, /handleHardwareScan\(value\)[\s\S]*?this\.scanValue = value[\s\S]*?this\.processScannedValue\(value, 'broadcast'\)/)
|
||||
assert.match(page, /handleManualSubmit\(value\)[\s\S]*?\.trim\(\)\.toUpperCase\(\)[\s\S]*?this\.processScannedValue\(normalizedValue, 'manual'\)/)
|
||||
assert.match(page, /recordScanResult\(type, title, boxCode, detail\)/)
|
||||
assert.match(page, /lastScanResult\.boxCode/)
|
||||
assert.match(page, /boxCode: entry\.boxCode \?\? entry\.sku \?\? ''/)
|
||||
assert.doesNotMatch(page, /lastScanResult\.sku|entry\.sku\s*}}/)
|
||||
const processScanMethod = page.match(/processScannedValue\(scanValue, source = 'broadcast'\) \{[\s\S]*?\n\t\t\t\},\n\t\t\tpickItem/)
|
||||
assert.ok(processScanMethod)
|
||||
assert.doesNotMatch(processScanMethod[0], /this\.scanValue = ''/)
|
||||
@@ -198,7 +202,7 @@ test('picking scan results use the shared success and error audio feedback', asy
|
||||
assert.match(audio, /export function playErrorSound\(\)/)
|
||||
assert.match(picking, /import \{ playErrorSound, playSuccessSound \} from '@\/utils\/audio-feedback\.js'/)
|
||||
assert.match(picking, /result\.type === 'unknown'[\s\S]*?playErrorSound\(\)/)
|
||||
assert.match(picking, /playSuccessSound\(\)[\s\S]*?this\.pickItem\(result\.item\.id, 'scan'\)/)
|
||||
assert.match(picking, /playSuccessSound\(\)[\s\S]*?this\.pickScannedBox\(result\.item, value\)/)
|
||||
})
|
||||
|
||||
test('reusable scan target input separates field selection from page-level broadcast handling', async () => {
|
||||
@@ -209,8 +213,8 @@ test('reusable scan target input separates field selection from page-level broad
|
||||
assert.match(component, /<input[\s\S]*?:value="modelValue"[\s\S]*?@input="handleInput"[\s\S]*?@confirm="handleConfirm"/)
|
||||
assert.doesNotMatch(component, /<input[\s\S]*?disabled/)
|
||||
assert.doesNotMatch(component, /startScanBroadcast|plus\.android/)
|
||||
assert.match(picking, /activeScanField: 'sku'/)
|
||||
assert.match(picking, /handleHardwareScan\(value\)[\s\S]*?activeScanField !== 'sku'[\s\S]*?processScannedValue\(value, 'broadcast'\)/)
|
||||
assert.match(picking, /activeScanField: 'boxCode'/)
|
||||
assert.match(picking, /handleHardwareScan\(value\)[\s\S]*?activeScanField !== 'boxCode'[\s\S]*?processScannedValue\(value, 'broadcast'\)/)
|
||||
})
|
||||
|
||||
test('picking session persists per task identity and clears on logout', async () => {
|
||||
|
||||
@@ -7,7 +7,7 @@ const page = await readFile(new URL('../pages/picking/picking.vue', import.meta.
|
||||
|
||||
test('PDA loading adapter keeps C04 read and write paths', () => {
|
||||
for (const path of [
|
||||
'/orders?',
|
||||
'/first-leg/pda-loading/tasks/pending',
|
||||
'/loading/picking?tenantId=',
|
||||
'/loading/picking/start?tenantId=',
|
||||
'/loading/picking/complete?tenantId=',
|
||||
@@ -56,6 +56,7 @@ test('picking page exposes five evidence slots, retry and remote completion stat
|
||||
})
|
||||
|
||||
test('PDA cabinet picking adapter claims online and submits one atomic batch', () => {
|
||||
assert.match(source, /\/first-leg\/pda-loading\/tasks\/pending/)
|
||||
assert.match(source, /\/first-leg\/pda-loading\/tasks\?/)
|
||||
assert.match(source, /tasks\/\$\{encodeURIComponent\(taskId\)\}\/claim/)
|
||||
assert.match(source, /tasks\/\$\{encodeURIComponent\(task\.taskId\)\}\/batch/)
|
||||
|
||||
@@ -69,25 +69,25 @@ test('submitStates turns only pending items into skipped', () => {
|
||||
})
|
||||
})
|
||||
|
||||
test('classifyScan distinguishes pending, repeated, and unknown SKU codes', () => {
|
||||
const scanItems = [{ id: 1, sku: 'EL-38201' }, { id: 2, sku: 'EL-38202' }]
|
||||
test('classifyScan distinguishes pending, repeated, and unknown carton codes', () => {
|
||||
const scanItems = [{ id: 1, boxCodes: ['BOX-001'] }, { id: 2, boxCodes: ['BOX-002', 'BOX-003'] }]
|
||||
|
||||
assert.deepEqual(state.classifyScan(scanItems, {
|
||||
1: state.ITEM_STATUS.PICKED,
|
||||
2: state.ITEM_STATUS.PENDING,
|
||||
}, 'EL-38202'), {
|
||||
}, 'BOX-002'), {
|
||||
type: 'pending',
|
||||
item: scanItems[1],
|
||||
})
|
||||
assert.deepEqual(state.classifyScan(scanItems, {
|
||||
1: state.ITEM_STATUS.PARTIAL,
|
||||
2: state.ITEM_STATUS.PENDING,
|
||||
}, 'EL-38201'), {
|
||||
}, 'BOX-001', { 'BOX-001': 1 }), {
|
||||
type: 'processed',
|
||||
item: scanItems[0],
|
||||
status: state.ITEM_STATUS.PARTIAL,
|
||||
})
|
||||
assert.deepEqual(state.classifyScan(scanItems, {}, 'NO-SUCH-SKU'), {
|
||||
assert.deepEqual(state.classifyScan(scanItems, {}, 'NO-SUCH-BOX'), {
|
||||
type: 'unknown',
|
||||
item: null,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user