优化
This commit is contained in:
+45
-49
@@ -18,39 +18,35 @@ function count(value) {
|
||||
return Number.isFinite(number) ? Math.max(0, number) : 0
|
||||
}
|
||||
|
||||
export function requireDispatchVersion(value) {
|
||||
if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) return value
|
||||
if (typeof value === 'string' && /^\d+$/.test(value)) return value
|
||||
throw new Error('排车操作版本缺失或无效,请刷新任务')
|
||||
}
|
||||
|
||||
export function dispatchVersionAtLeast(current, confirmed) {
|
||||
const latest = String(requireDispatchVersion(current)).replace(/^0+(?=\d)/, '')
|
||||
const original = String(requireDispatchVersion(confirmed)).replace(/^0+(?=\d)/, '')
|
||||
return latest.length > original.length || latest.length === original.length && latest >= original
|
||||
}
|
||||
|
||||
function dispatchCount(value) {
|
||||
if (typeof value !== 'number' && (typeof value !== 'string' || !/^(?:0|[1-9]\d*)$/.test(value))) throw new Error('排车数量不是有效非负整数,请重新读取任务')
|
||||
const number = typeof value === 'number' ? value : Number(value)
|
||||
if (!Number.isSafeInteger(number) || number < 0) throw new Error('排车数量超出安全整数范围或无效,请重新读取任务')
|
||||
return number
|
||||
}
|
||||
|
||||
export function normalizeDispatchTask(value) {
|
||||
if (!value || !value.dispatchNo || !Array.isArray(value.items)) throw new Error('排车任务返回结构不完整')
|
||||
return {
|
||||
...value,
|
||||
taskNo: String(value?.taskNo || ''),
|
||||
dispatchNo: String(value?.dispatchNo || ''),
|
||||
vehiclePlate: String(value?.vehiclePlate || ''),
|
||||
tripNo: String(value?.tripNo || ''),
|
||||
tripRecordVersion: value?.tripRecordVersion == null ? null : String(value.tripRecordVersion),
|
||||
tripDispatchCount: count(value?.tripDispatchCount),
|
||||
driverWarning: String(value?.driverWarning || ''),
|
||||
status: String(value?.status || ''),
|
||||
canDepart: value?.canDepart === true,
|
||||
canPick: value?.canPick === true,
|
||||
pickBlockReason: String(value?.pickBlockReason || ''),
|
||||
departBlockReason: String(value?.departBlockReason || ''),
|
||||
items: asList(value?.items).map((item) => ({
|
||||
...item,
|
||||
dispatchItemId: String(item?.dispatchItemId || ''),
|
||||
palletNo: String(item?.palletNo || ''),
|
||||
destinationWarehouseCode: String(item?.destinationWarehouseCode || ''),
|
||||
destinationWarehouseName: String(item?.destinationWarehouseName || ''),
|
||||
fbaWarehouseCode: String(item?.fbaWarehouseCode || ''),
|
||||
warehouseRouteLabel: String(item?.warehouseRouteLabel || ''),
|
||||
scheduledPackages: count(item?.scheduledPackages),
|
||||
pickedPackages: count(item?.pickedPackages),
|
||||
returnCartons: asList(item?.returnCartons).map((carton) => ({ ...carton, id: String(carton.id || ''), cartonMark: String(carton.cartonMark || ''), productQuantity: count(carton.productQuantity) })),
|
||||
positions: asList(item?.positions).map((position) => ({
|
||||
...position,
|
||||
id: String(position?.id || ''),
|
||||
availablePackages: count(position?.availablePackages ?? (count(item?.plannedPackages ?? item?.packages ?? item?.packageCount) - count(item?.pickedPackages ?? item?.pickedPackageCount))),
|
||||
allocatedPackages: count(position?.allocatedPackages),
|
||||
pickedPackages: count(position?.pickedPackages)
|
||||
}))
|
||||
...value, taskNo: String(value.taskNo || ''), dispatchNo: String(value.dispatchNo),
|
||||
recordVersion: value.recordVersion, pickingReconciled: value.pickingReconciled === true,
|
||||
actions: Object.fromEntries(Object.entries(value.actions || {}).map(([key, gate]) => [key, { ...gate, allowed: gate?.allowed === true }])),
|
||||
items: value.items.map(item => ({ ...item, dispatchItemId: String(item.dispatchItemId || ''), palletNo: String(item.palletNo || ''),
|
||||
scheduledPackages: dispatchCount(item.scheduledPackages), pickedPackages: dispatchCount(item.pickedPackages),
|
||||
returnCartons: (item.returnCartons || []).map(carton => ({ ...carton, returnCartonId: String(carton.returnCartonId || ''), cartonMark: String(carton.cartonMark || ''), productQuantity: dispatchCount(carton.productQuantity) })),
|
||||
positions: (item.positions || []).map(position => ({ ...position, positionId: String(position.positionId || ''), balanceId: String(position.balanceId || ''), availablePackages: dispatchCount(position.availablePackages), allocatedPackages: dispatchCount(position.allocatedPackages), pickedPackages: dispatchCount(position.pickedPackages) }))
|
||||
}))
|
||||
}
|
||||
}
|
||||
@@ -83,32 +79,32 @@ export function normalizeOutboundTask(value) {
|
||||
}
|
||||
}
|
||||
|
||||
export async function listDispatchTasks(status = '') {
|
||||
const suffix = status ? `?status=${encoded(status)}` : ''
|
||||
return asList(await overseasRequest('GET', `${DISPATCH_BASE}${suffix}`)).map(normalizeDispatchTask)
|
||||
export async function listDispatchTasks() {
|
||||
const result = await overseasRequest('GET', DISPATCH_BASE)
|
||||
if (!Array.isArray(result)) throw new Error('排车任务列表返回结构无效')
|
||||
return result.map(normalizeDispatchTask)
|
||||
}
|
||||
|
||||
export async function getDispatchTask(dispatchNo) {
|
||||
return normalizeDispatchTask(await overseasRequest('GET', `${DISPATCH_BASE}/${encoded(dispatchNo)}`))
|
||||
}
|
||||
|
||||
export function getDispatchLoading(dispatchNo) {
|
||||
return overseasRequest('GET', `${DISPATCH_BASE}/${encoded(dispatchNo)}/loading`)
|
||||
}
|
||||
export function getDispatchCommand(dispatchNo, key) {
|
||||
return overseasRequest('GET', `${DISPATCH_BASE}/${encoded(dispatchNo)}/commands/${encoded(key)}`)
|
||||
}
|
||||
function dispatchWrite(path, request) {
|
||||
requireDispatchVersion(request?.recordVersion)
|
||||
return overseasRequest('POST', path, request)
|
||||
}
|
||||
export function pickDispatchItem(dispatchNo, dispatchItemId, request) {
|
||||
return overseasRequest('POST', `${DISPATCH_BASE}/${encoded(dispatchNo)}/items/${encoded(dispatchItemId)}/pick`, request)
|
||||
return dispatchWrite(`${DISPATCH_BASE}/${encoded(dispatchNo)}/items/${encoded(dispatchItemId)}/pick`, request)
|
||||
}
|
||||
|
||||
export function completeDispatchPicking(dispatchNo, request) {
|
||||
return overseasRequest('POST', `${DISPATCH_BASE}/${encoded(dispatchNo)}/complete`, request)
|
||||
export function completeDispatchLoading(dispatchNo, request) {
|
||||
return dispatchWrite(`${DISPATCH_BASE}/${encoded(dispatchNo)}/loading-complete`, request)
|
||||
}
|
||||
|
||||
export function departDispatch(dispatchNo, request) {
|
||||
return overseasRequest('POST', `${DISPATCH_BASE}/${encoded(dispatchNo)}/depart`, request)
|
||||
}
|
||||
|
||||
export function tripDepartureRequest(task, idempotencyKey) {
|
||||
if (!task?.tripNo || task.tripRecordVersion == null || !/^\d+$/.test(String(task.tripRecordVersion))) {
|
||||
throw new Error('车次信息不完整,请刷新任务后再发车')
|
||||
}
|
||||
return { recordVersion: String(task.tripRecordVersion), idempotencyKey, remark: '海外 PDA 整车核平后发车' }
|
||||
return dispatchWrite(`${DISPATCH_BASE}/${encoded(dispatchNo)}/depart`, request)
|
||||
}
|
||||
|
||||
export async function listOutboundTasks(status = '') {
|
||||
|
||||
Reference in New Issue
Block a user