import test from 'node:test' import assert from 'node:assert/strict' import { readFile } from 'node:fs/promises' import { fulfillment, fulfillmentIdempotencyKey, releaseFulfillmentKey, resetFulfillmentSession, restoreFulfillmentDraft, updateFulfillmentDraft } from '../src/stores/fulfillment.js' import { completeDispatchPicking, completeOutboundTask, departDispatch, getDispatchTask, getOutboundTask, listDispatchTasks, listOutboundTasks, normalizeDispatchTask, normalizeOutboundTask, pickDispatchItem, pickOutboundPallet, pickOutboundTask, resolveOutboundTask, outboundPickPayload, tripDepartureRequest } from '../src/api/fulfillment.js' import { session } from '../src/stores/session.js' import { toDispatchError } from '../src/utils/dispatch-error.js' test('dispatch network failures show recovery guidance and retain diagnostics', () => { const error = toDispatchError({ message: 'request:fail', network: true, code: 'NETWORK_ERROR', requestId: 'network-request', traceId: 'network-trace' }) assert.equal(error.message, '网络连接失败,请检查网络后重试,当前作业已保留') assert.equal(error.network, true) assert.equal(error.code, 'NETWORK_ERROR') assert.equal(error.requestId, 'network-request') assert.equal(error.traceId, 'network-trace') assert.equal(toDispatchError({ message: '业务校验失败' }).message, '业务校验失败') }) const read = (path) => readFile(new URL(path, import.meta.url), 'utf8') test('dispatch merge retains return carton picking and review gates together', async () => { const source = (await read('../src/pages/dispatch/dispatch.vue')).match(/