41 lines
1.8 KiB
JavaScript
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: '' }
|
|
}
|