import { overseasRequest } from './overseas.js' const DISPATCH_BASE = '/pda/v1/last-leg/dispatches' const OUTBOUND_BASE = '/pda/v1/last-leg/outbound-tasks' const CARGO_DISCARD_BASE = '/pda/v1/last-leg/cargo-discards' 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 || ''), canDepart: value?.canDepart === true, 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), 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 resolveOutboundTask(businessNo) { return overseasRequest('GET', `${OUTBOUND_BASE}/resolve/${encoded(businessNo)}`) } export function pickOutboundTask(taskNo, request) { return overseasRequest('POST', `${OUTBOUND_BASE}/${encoded(taskNo)}/pick`, request) } export function pickOutboundPallet(taskNo, palletNo, request) { return overseasRequest('POST', `${OUTBOUND_BASE}/${encoded(taskNo)}/pallets/${encoded(palletNo)}/pick`, request) } export function outboundPickPayload(item, position, packages) { return { outboundPalletItemId: item.outboundPalletItemId, inventoryPositionId: position.inventoryPositionId, packages: Number(packages), cartonMarks: position.cartonMark ? [position.cartonMark] : [] } } export function completeOutboundTask(taskNo, request) { return overseasRequest('POST', `${OUTBOUND_BASE}/${encoded(taskNo)}/complete`, request) } export function normalizeCargoDiscardTask(value) { const task = value || {} return { ...task, discardNo: String(task?.discardNo || ''), palletNo: String(task?.palletNo || ''), status: String(task?.status || 'PENDING'), skus: asList(task?.skus).map((sku) => ({ ...sku, itemId: String(sku?.itemId || ''), skuCode: String(sku?.skuCode || ''), productName: String(sku?.productName || ''), plannedPackages: count(sku?.plannedPackages), actualPackages: sku?.actualPackages == null ? null : count(sku.actualPackages), status: String(sku?.status || 'PENDING') })) } } export async function listCargoDiscardTasks() { return asList(await overseasRequest('GET', CARGO_DISCARD_BASE)).map(normalizeCargoDiscardTask) } export async function resolveCargoDiscardPallet(palletNo) { return normalizeCargoDiscardTask(await overseasRequest('POST', `${CARGO_DISCARD_BASE}/resolve`, { palletNo })) } export async function confirmCargoDiscard(discardNo, palletNo, lines) { return normalizeCargoDiscardTask(await overseasRequest('POST', `${CARGO_DISCARD_BASE}/${encoded(discardNo)}/pallets/${encoded(palletNo)}/confirm`, { lines })) }