整批提交原子性的方案

This commit is contained in:
2026-09-11 18:14:35 +08:00
parent 1b45a4f2ec
commit 28c574ae36
7 changed files with 114 additions and 19 deletions
+22
View File
@@ -5,6 +5,12 @@ export const ITEM_STATUS = Object.freeze({
SKIPPED: 'skipped'
})
export function isSealedPalletItem(item) {
return item?.unitType === 'SEALED_PALLET'
|| item?.palletId !== null && item?.palletId !== undefined
|| item?.indivisible === true
}
export function createItemStates(items) {
return items.reduce((states, item) => {
states[item.id] = ITEM_STATUS.PENDING
@@ -61,8 +67,24 @@ export function submitStates(items, states) {
}
export function classifyScan(items, states, scanCode, scannedBoxCodes = {}) {
const palletItem = items.find((entry) => isSealedPalletItem(entry) && entry.palletNo === scanCode) || null
if (palletItem) {
const status = states[palletItem.id] || ITEM_STATUS.PENDING
if (scannedBoxCodes[scanCode] || status === ITEM_STATUS.PICKED) {
return { type: 'processed', item: palletItem, status }
}
return { type: 'pallet', item: palletItem }
}
const item = items.find((entry) => (entry.boxCodes || []).includes(scanCode)) || null
if (!item) return { type: 'unknown', item: null }
if (isSealedPalletItem(item)) {
const status = states[item.id] || ITEM_STATUS.PENDING
if (scannedBoxCodes[scanCode] || status === ITEM_STATUS.PICKED) {
return { type: 'processed', item, status }
}
return { type: 'pallet', item, matchedBy: 'carton' }
}
if (scannedBoxCodes[scanCode]) return { type: 'processed', item, status: states[item.id] || ITEM_STATUS.PARTIAL }
const status = states[item.id] || ITEM_STATUS.PENDING