import { overseasHttp } from '@/shared/api/overseasHttp' import { unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http' export interface OverseasPageResult { records: T[] page: number size: number total: number pages: number } export type OverseasPagePayload = Omit, 'page' | 'size' | 'total' | 'pages'> & { page: number | string size: number | string total: number | string pages: number | string } export function normalizeOverseasPage(value: OverseasPagePayload): OverseasPageResult { return { ...value, page: Number(value.page), size: Number(value.size), total: Number(value.total), pages: Number(value.pages) } } export interface LastMileOrderQuery { page: number size: number orderNo?: string orderType?: string inboundCode?: string containerNo?: string currentStatus?: string status?: string warehouse?: string sourceOrderNo?: string transferWarehouseCode?: string abnormal?: boolean detained?: boolean createdFrom?: string createdTo?: string } export interface LastMileOrderSummaryDto { id: string customerId: string orderNo: string orderType?: string | null orderTypeName?: string | null inboundCode?: string | null sourceOrderNo?: string | null sourceInboundId?: string | null customerName?: string | null overseasWarehouseName?: string | null transferWarehouseName?: string | null transferWarehouseId?: string | null transferWarehouseCode?: string | null fbaWarehouseCode?: string | null containerNo?: string | null containerStatus?: string | null abnormal?: boolean | null detained?: boolean | null palletCount?: number | null packageCount?: number | null volumeCbm?: number | null productQuantity?: number | null volumeWeightKg?: number | null estimatedArrivalAt?: string | null actualArrivalAt?: string | null estimatedWarehouseAt?: string | null inboundOrderNo?: string | null /** Legacy read-only association retained for compatibility; absent from current service DTO. */ deliveryOrderNo?: string | null outboundOrderNo?: string | null relabelOrderNo?: string | null relabelStatus?: string | null palletMergeFlag?: string | null currentStatus?: string | null privateRemark?: string | null customerRemark?: string | null warehouseRemark?: string | null createdAt?: string | null } export interface LastMileOrderDto extends LastMileOrderSummaryDto { customerId: string sourceOrderNo?: string | null subOrderStatus?: string | null updatedAt?: string | null } export interface LastMileCargoDto { id: string skuCode?: string | null productNameZh?: string | null productNameEn?: string | null packageCount?: number | null productQuantity?: number | null palletCount?: number | null grossWeightKg?: number | null dimensionalWeightKg?: number | null volumeCbm?: number | null destinationWarehouseName?: string | null fbaTrackingNo?: string | null shipmentNo?: string | null } export interface LastMileStatusHistoryDto { id: string fromStatus?: string | null toStatus?: string | null remark?: string | null createdAt?: string | null } export interface LastMileFeeDto { id: string customerId: string orderId: string feeItem: string currency: string amount: number status: string supplierDescription?: string | null createdBy: string createdAt: string updatedAt: string } export interface LastMileOperationDto { id: string operationNode: string operatorName: string result: string createdAt: string } export interface CreateLastMileFeePayload { feeItem: string currency: string amount: number status: string supplierDescription?: string } export interface TransferDestinationPayload { orderIds: string[] warehouseId: string warehouseCode: string warehouseName: string remark?: string } export interface ConvertInboundPlanPayload { orderId: string } export interface LastMileOrderDetailDto { order: LastMileOrderDto cargo: LastMileCargoDto[] statusHistory: LastMileStatusHistoryDto[] fees: LastMileFeeDto[] operationHistory: LastMileOperationDto[] } export async function listLastMileOrders(query: LastMileOrderQuery) { const response = await overseasHttp.get>, ApiEnvelope>>( '/platform/v1/last-leg/orders', { params: query }, ) return normalizeOverseasPage(unwrapApiResponse(response)) } export async function getLastMileOrder(orderId: string) { const response = await overseasHttp.get, ApiEnvelope>( `/platform/v1/last-leg/orders/${encodeURIComponent(orderId)}`, ) return unwrapApiResponse(response) } export async function createLastMileOrderFee(orderId: string, payload: CreateLastMileFeePayload) { const response = await overseasHttp.post, ApiEnvelope>( `/platform/v1/last-leg/orders/${encodeURIComponent(orderId)}/fees`, payload, ) return unwrapApiResponse(response) } export async function transferLastMileOrders(payload: TransferDestinationPayload) { const response = await overseasHttp.put, ApiEnvelope>( '/platform/v1/last-leg/orders/destination', payload, ) return unwrapApiResponse(response) } export async function convertLastMileOrderToInboundPlan(payload: ConvertInboundPlanPayload) { const response = await overseasHttp.post, ApiEnvelope>( '/platform/v1/last-leg/inbound-plans/convert', payload, ) return unwrapApiResponse(response) }