Files
pda-uniapp/utils/picking-state.js
T
2026-07-30 18:04:37 +08:00

68 lines
1.6 KiB
JavaScript

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 }
}