This commit is contained in:
2026-08-28 13:54:44 +08:00
parent 67a1278554
commit 251645d2d8
8 changed files with 394 additions and 69 deletions
@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { overseasHttp } from '@/shared/api/overseasHttp'
import { convertLastMileContainerToInboundPlans, convertLastMileOrderToInboundPlan, getLastMileOrder, listLastMileOrders, listPendingContainerSummaries, transferLastMileOrders } from './lastMileOrders'
import { convertLastMileContainerToInboundPlans, convertLastMileOrderToInboundPlan, getContainerPlanProgress, getLastMileOrder, listContainerPlanProgress, listLastMileOrders, transferLastMileOrders } from './lastMileOrders'
vi.mock('@/shared/api/overseasHttp', () => ({ overseasHttp: { get: vi.fn(), put: vi.fn(), post: vi.fn() } }))
@@ -69,16 +69,16 @@ describe('last-mile order overseas API', () => {
})
})
it('loads server-side pending container summaries with pagination and filters', async () => {
it('loads server-side container progress with pagination and filters', async () => {
const record = {
sourceContainerBookingId: '2092873463568597001', containerNo: 'CONT-15', orderCount: 15,
inboundCodeCount: 15, customerCount: 3, totalPackageCount: 150, totalPalletCount: 30,
totalVolumeCbm: 45.5, eligible: true,
sourceContainerBookingId: '2092873463568597001', containerNo: 'CONT-15', totalOrderCount: 15,
inboundCodeCount: 13, missingInboundCodeCount: 2, planCount: 10, plannedInboundCodeCount: 10,
pendingPlanCount: 5, plannedArrivalAt: '2026-09-01T08:00:00', allPlansReady: false, blockingReason: '存在2票缺少入仓码',
}
vi.mocked(overseasHttp.get).mockResolvedValue({
code: '200', message: 'success', data: { records: [record], page: '2', size: '10', total: '21', pages: '3' },
})
await expect(listPendingContainerSummaries({
await expect(listContainerPlanProgress({
page: 2, size: 10, containerNo: 'CONT-15',
createdFrom: '2026-08-01T00:00:00', createdTo: '2026-08-31T23:59:59',
})).resolves.toEqual({ records: [record], page: 2, size: 10, total: 21, pages: 3 })
@@ -89,4 +89,11 @@ describe('last-mile order overseas API', () => {
},
})
})
it('loads one container detail with the encoded stable long id', async () => {
const detail = { summary: { sourceContainerBookingId: '2092873463568597001' }, orders: [] }
vi.mocked(overseasHttp.get).mockResolvedValue({ code: '200', message: 'success', data: detail })
await expect(getContainerPlanProgress('2092873463568597001/unsafe')).resolves.toEqual(detail)
expect(overseasHttp.get).toHaveBeenCalledWith('/platform/v1/last-leg/orders/container-summaries/2092873463568597001%2Funsafe')
})
})
@@ -155,7 +155,7 @@ export interface ConvertInboundPlanPayload {
customerId: string
}
export interface PendingContainerSummaryQuery {
export interface ContainerPlanProgressQuery {
page: number
size: number
containerNo?: string
@@ -163,17 +163,36 @@ export interface PendingContainerSummaryQuery {
createdTo?: string
}
export interface PendingContainerSummaryDto {
export interface ContainerPlanProgressSummaryDto {
sourceContainerBookingId: string
containerNo: string | null
orderCount: number
totalOrderCount: number
inboundCodeCount: number
customerCount: number
totalPackageCount: number
totalPalletCount: number
totalVolumeCbm: number
eligible: boolean
ineligibleReason?: string | null
missingInboundCodeCount: number
planCount: number
plannedInboundCodeCount: number
pendingPlanCount: number
plannedArrivalAt: string | null
allPlansReady: boolean
blockingReason: string | null
}
export interface ContainerPlanProgressItemDto {
orderId: string
customerId: string
orderNo: string | null
inboundCode: string | null
orderStatus: string
planId: string | null
planNo: string | null
planStatus: string | null
planValid: boolean
plannedArrivalAt: string | null
}
export interface ContainerPlanProgressDetailDto {
summary: ContainerPlanProgressSummaryDto
orders: ContainerPlanProgressItemDto[]
}
export interface ConvertContainerInboundPlanPayload {
@@ -224,14 +243,21 @@ export async function convertLastMileOrderToInboundPlan(payload: ConvertInboundP
return unwrapApiResponse(response)
}
export async function listPendingContainerSummaries(query: PendingContainerSummaryQuery): Promise<OverseasPageResult<PendingContainerSummaryDto>> {
const response = await overseasHttp.get<ApiEnvelope<OverseasPagePayload<PendingContainerSummaryDto>>, ApiEnvelope<OverseasPagePayload<PendingContainerSummaryDto>>>(
export async function listContainerPlanProgress(query: ContainerPlanProgressQuery): Promise<OverseasPageResult<ContainerPlanProgressSummaryDto>> {
const response = await overseasHttp.get<ApiEnvelope<OverseasPagePayload<ContainerPlanProgressSummaryDto>>, ApiEnvelope<OverseasPagePayload<ContainerPlanProgressSummaryDto>>>(
'/platform/v1/last-leg/orders/container-summaries',
{ params: query },
)
return normalizeOverseasPage(unwrapApiResponse(response))
}
export async function getContainerPlanProgress(sourceContainerBookingId: string) {
const response = await overseasHttp.get<ApiEnvelope<ContainerPlanProgressDetailDto>, ApiEnvelope<ContainerPlanProgressDetailDto>>(
`/platform/v1/last-leg/orders/container-summaries/${encodeURIComponent(sourceContainerBookingId)}`,
)
return unwrapApiResponse(response)
}
export async function convertLastMileContainerToInboundPlans(payload: ConvertContainerInboundPlanPayload) {
const response = await overseasHttp.post<ApiEnvelope<InboundPlanDetailDto[]>, ApiEnvelope<InboundPlanDetailDto[]>>(
'/platform/v1/last-leg/inbound-plans/convert-container', payload,