feat: add phase 5 overseas PDA fulfillment

This commit is contained in:
2026-09-01 14:23:55 +08:00
parent 49aad23098
commit fc8a52bc4b
15 changed files with 712 additions and 7 deletions
+111
View File
@@ -0,0 +1,111 @@
import { overseasRequest } from './overseas.js'
const DISPATCH_BASE = '/pda/v1/last-leg/dispatches'
const OUTBOUND_BASE = '/pda/v1/last-leg/outbound-tasks'
const encoded = (value) => encodeURIComponent(String(value || '').trim())
function asList(value) {
if (Array.isArray(value)) return value
if (Array.isArray(value?.records)) return value.records
if (Array.isArray(value?.items)) return value.items
return []
}
function count(value) {
const number = Number(value || 0)
return Number.isFinite(number) ? Math.max(0, number) : 0
}
export function normalizeDispatchTask(value) {
return {
...value,
taskNo: String(value?.taskNo || ''),
dispatchNo: String(value?.dispatchNo || ''),
vehiclePlate: String(value?.vehiclePlate || ''),
status: String(value?.status || ''),
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),
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)
}))
}))
}
}
export function normalizeOutboundTask(value) {
const header = value?.task || value || {}
return {
...header,
taskNo: String(header?.taskNo || ''),
outboundNo: String(header?.outboundNo || ''),
status: String(header?.status || ''),
items: asList(value?.items).map((item) => ({
...item,
outboundPalletItemId: String(item?.outboundPalletItemId || ''),
palletNo: String(item?.palletNo || ''),
plannedPackages: count(item?.packageCount),
pickedPackages: count(item?.pickedPackageCount),
positions: asList(item?.positions).map((position) => ({
...position,
inventoryPositionId: String(position?.inventoryPositionId || ''),
palletNo: String(position?.palletNo || item?.palletNo || ''),
cartonMark: String(position?.cartonMark || ''),
skuCode: String(position?.skuCode || position?.sku || ''),
inboundCode: String(position?.inboundCode || ''),
availablePackages: count(position?.availablePackages),
pickedPackages: count(position?.pickedPackages)
}))
}))
}
}
export async function listDispatchTasks(status = '') {
const suffix = status ? `?status=${encoded(status)}` : ''
return asList(await overseasRequest('GET', `${DISPATCH_BASE}${suffix}`)).map(normalizeDispatchTask)
}
export async function getDispatchTask(dispatchNo) {
return normalizeDispatchTask(await overseasRequest('GET', `${DISPATCH_BASE}/${encoded(dispatchNo)}`))
}
export function pickDispatchItem(dispatchNo, dispatchItemId, request) {
return overseasRequest('POST', `${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 departDispatch(dispatchNo, request) {
return overseasRequest('POST', `${DISPATCH_BASE}/${encoded(dispatchNo)}/depart`, request)
}
export async function listOutboundTasks(status = '') {
const suffix = status ? `?status=${encoded(status)}` : ''
return asList(await overseasRequest('GET', `${OUTBOUND_BASE}${suffix}`)).map(normalizeOutboundTask)
}
export async function getOutboundTask(taskNo) {
return normalizeOutboundTask(await overseasRequest('GET', `${OUTBOUND_BASE}/${encoded(taskNo)}`))
}
export function pickOutboundTask(taskNo, request) {
return overseasRequest('POST', `${OUTBOUND_BASE}/${encoded(taskNo)}/pick`, request)
}
export function completeOutboundTask(taskNo, request) {
return overseasRequest('POST', `${OUTBOUND_BASE}/${encoded(taskNo)}/complete`, request)
}