From a06f54489c5e817a43aa5dea3222dffe460fd10e Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Fri, 23 Oct 2026 01:50:54 +0800 Subject: [PATCH] fix: import dispatch version guard for successful PDA actions --- src/pages/dispatch/dispatch.vue | 2 +- tests/dispatch-workflow.test.mjs | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/pages/dispatch/dispatch.vue b/src/pages/dispatch/dispatch.vue index 16ce99e..27fa028 100644 --- a/src/pages/dispatch/dispatch.vue +++ b/src/pages/dispatch/dispatch.vue @@ -85,7 +85,7 @@ import PortalHeader from '@/components/PortalHeader.vue' import ScanTargetInput from '@/components/ScanTargetInput.vue' import DispatchHandoverStatus from '@/components/DispatchHandoverStatus.vue' import DispatchLoadingDocuments from '@/components/DispatchLoadingDocuments.vue' -import { reviewDispatchLoading, completeDispatchLoading, getDispatchTask, getDispatchLoading, listDispatchTasks, pickDispatchItem, requireDispatchVersion } from '@/api/fulfillment.js' +import { reviewDispatchLoading, completeDispatchLoading, getDispatchTask, getDispatchLoading, listDispatchTasks, pickDispatchItem, requireDispatchVersion, dispatchVersionAtLeast } from '@/api/fulfillment.js' import { fulfillment, restoreFulfillmentDraft, updateFulfillmentDraft } from '@/stores/fulfillment.js' import { requireSession, session } from '@/stores/session.js' import { playErrorSound, playSuccessSound } from '@/utils/audio-feedback.js' diff --git a/tests/dispatch-workflow.test.mjs b/tests/dispatch-workflow.test.mjs index 34d6a43..acb6b73 100644 --- a/tests/dispatch-workflow.test.mjs +++ b/tests/dispatch-workflow.test.mjs @@ -30,7 +30,12 @@ function page(dependencies = {}) { const original = deps[api]; if (!original) continue deps[api] = (...args) => { lastCommand = { dispatchNo: args[0], action, body: args.at(-1) }; return original(...args) } } - const definition = new Function(...Object.keys(deps), source.replace(/^\s*import .*$/gm, '').replace('export default', 'return'))(...Object.values(deps)) + // Only bind dependencies actually imported by the page; injecting every mock + // would hide missing production imports behind successful workflow tests. + const importedNames = new Set([...source.matchAll(/^\s*import\s+(?:\{([^}]+)\}|(\w+))\s+from\s+/gm)] + .flatMap(match => (match[1] || match[2]).split(',').map(name => name.trim().split(/\s+as\s+/).at(-1)))) + const bindings = Object.entries(deps).filter(([name]) => importedNames.has(name)) + const definition = new Function(...bindings.map(([name]) => name), source.replace(/^\s*import .*$/gm, '').replace('export default', 'return'))(...bindings.map(([, value]) => value)) const state = { ...definition.data(), current: task() } for (const [name, method] of Object.entries(definition.methods)) state[name] = method.bind(state) for (const [name, getter] of Object.entries(definition.computed)) Object.defineProperty(state, name, { get: () => getter.call(state) })