export const DROPSHIP_SCAN_INTENT = Object.freeze({ BLOCKED: 'BLOCKED', INVALID: 'INVALID', DUPLICATE: 'DUPLICATE', RESOLVE_CARTON: 'RESOLVE_CARTON', SELECT_PALLET: 'SELECT_PALLET', BIND_PENDING: 'BIND_PENDING' }) export const PALLET_NO_PATTERN = /^DP-[0-9]{6}-[0-9]{4}$/ function normalize(value) { return value == null ? '' : String(value).trim().toUpperCase() } export function createDropshipScanState(value = {}) { return { online: value.online !== false, activePalletNo: normalize(value.activePalletNo), pendingBoxCode: normalize(value.pendingBoxCode), lastScanCode: normalize(value.lastScanCode) } } export function planDropshipScan(currentState, rawCode, { unboundCartons = 0 } = {}) { const state = createDropshipScanState(currentState) const scanCode = normalize(rawCode) if (!state.online) return { state, intent: DROPSHIP_SCAN_INTENT.BLOCKED, message: '当前网络不可用,不能执行正式扫码' } if (!scanCode) return { state, intent: DROPSHIP_SCAN_INTENT.INVALID, message: '扫码内容不能为空' } if (scanCode === state.lastScanCode) return { state, intent: DROPSHIP_SCAN_INTENT.DUPLICATE, message: '请勿重复扫描同一码' } if (PALLET_NO_PATTERN.test(scanCode)) { const next = { ...state, activePalletNo: scanCode, lastScanCode: scanCode } return { state: next, intent: Number(unboundCartons) > 0 ? DROPSHIP_SCAN_INTENT.BIND_PENDING : DROPSHIP_SCAN_INTENT.SELECT_PALLET, palletNo: scanCode } } return { state: { ...state, pendingBoxCode: scanCode, lastScanCode: scanCode }, intent: DROPSHIP_SCAN_INTENT.RESOLVE_CARTON, boxCode: scanCode, palletNo: state.activePalletNo || null } } export function releaseDropshipScan(state, { clearBox = false } = {}) { return { ...createDropshipScanState(state), pendingBoxCode: clearBox ? '' : state.pendingBoxCode, lastScanCode: '' } }