Files
pda-uniapp/utils/dropship-palletizing-state.js

41 lines
1.8 KiB
JavaScript

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