export const ITEM_STATUS = Object.freeze({ PENDING: 'pending', PICKED: 'picked', PARTIAL: 'partial', SKIPPED: 'skipped' }) export function createItemStates(items) { return items.reduce((states, item) => { states[item.id] = ITEM_STATUS.PENDING return states }, {}) } export function getPickSummary(items, states) { const summary = { total: items.length, picked: 0, partial: 0, skipped: 0, pending: 0 } items.forEach((item) => { const status = states[item.id] || ITEM_STATUS.PENDING summary[status] += 1 }) summary.processed = summary.picked + summary.partial + summary.skipped summary.progress = summary.total ? Math.round(summary.processed / summary.total * 100) : 0 summary.canSubmit = summary.total > 0 && ( summary.pending === 0 || summary.picked > 0 || summary.partial > 0 ) summary.buttonText = '提交拣货完成' return summary } export function submitStates(items, states) { const nextStates = { ...states } const autoSkippedIds = [] items.forEach((item) => { const status = nextStates[item.id] || ITEM_STATUS.PENDING if (status === ITEM_STATUS.PENDING) { nextStates[item.id] = ITEM_STATUS.SKIPPED autoSkippedIds.push(item.id) } }) return { states: nextStates, autoSkippedIds } } export function classifyScan(items, states, scanCode) { const item = items.find((entry) => entry.sku === scanCode) || null if (!item) return { type: 'unknown', item: null } const status = states[item.id] || ITEM_STATUS.PENDING if (status === ITEM_STATUS.PENDING) return { type: 'pending', item } return { type: 'processed', item, status } }