From bb9673358dfb0088585736c1441ad6ff4fc5db4d Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Fri, 28 Aug 2026 13:58:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../container-inbound-plan-batch-contract.mjs | 7 +++++- .../phase4-container-inbound-plan-batch.mjs | 22 ++++++++++++++++++- ...ainer-inbound-plan-batch-contract.test.mjs | 14 +++++++----- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/scripts/admin-test-env-modules/container-inbound-plan-batch-contract.mjs b/scripts/admin-test-env-modules/container-inbound-plan-batch-contract.mjs index a2520a32c..6b19a525c 100644 --- a/scripts/admin-test-env-modules/container-inbound-plan-batch-contract.mjs +++ b/scripts/admin-test-env-modules/container-inbound-plan-batch-contract.mjs @@ -39,8 +39,13 @@ export function validContainerSummaryPage(data, expected) { === String(expected?.sourceContainerBookingId ?? '')) return Number(data.page) >= 1 && Number(data.size) >= 1 && Number(data.total) >= 1 && Number(data.pages) >= 1 && String(row?.containerNo ?? '') === String(expected?.containerNo ?? '') - && Number(row?.orderCount) === Number(expected?.orderCount) + && Number(row?.totalOrderCount) === Number(expected?.totalOrderCount) && Number(row?.inboundCodeCount) === Number(expected?.inboundCodeCount) + && Number(row?.missingInboundCodeCount) === Number(expected?.missingInboundCodeCount) + && Number(row?.planCount) === Number(expected?.planCount) + && Number(row?.plannedInboundCodeCount) === Number(expected?.plannedInboundCodeCount) + && Number(row?.pendingPlanCount) === Number(expected?.pendingPlanCount) + && Boolean(row?.allPlansReady) === Boolean(expected?.allPlansReady) } export function zeroDrift(before, after) { diff --git a/scripts/admin-test-env-modules/phase4-container-inbound-plan-batch.mjs b/scripts/admin-test-env-modules/phase4-container-inbound-plan-batch.mjs index 5784a027d..1abc83093 100644 --- a/scripts/admin-test-env-modules/phase4-container-inbound-plan-batch.mjs +++ b/scripts/admin-test-env-modules/phase4-container-inbound-plan-batch.mjs @@ -80,8 +80,13 @@ export async function run(context) { success(summaryResponse) && validContainerSummaryPage(summaryResponse.body?.data, { sourceContainerBookingId: data.normal.sourceContainerBookingId, containerNo: data.normal.containerNo, - orderCount: CONTAINER_CONVERT_EXPECTED_ORDERS, + totalOrderCount: CONTAINER_CONVERT_EXPECTED_ORDERS, inboundCodeCount: CONTAINER_CONVERT_EXPECTED_ORDERS, + missingInboundCodeCount: 0, + planCount: 0, + plannedInboundCodeCount: 0, + pendingPlanCount: CONTAINER_CONVERT_EXPECTED_ORDERS, + allPlansReady: false, }), `orderPageSize=10, expectedOrderCount=15; ${trace(summaryResponse)}`, OPTIONS) const normalList = await listOrders(context, data.normal.containerNo) context.assert(MODULE, 'P1同柜15票列表前置', normalList.response, @@ -127,4 +132,19 @@ export async function run(context) { && after.rows.every((row) => row.currentStatus === 'INBOUND_PLANNED' && row.inboundOrderNo), `planned=${after.rows.filter((row) => row.currentStatus === 'INBOUND_PLANNED').length}; ${trace(after.response)}`, OPTIONS) + const readySummary = await context.requestOverseas('GET', + `${CONTAINER_SUMMARY_ENDPOINT}?page=1&size=10&containerNo=${encodeURIComponent(data.normal.containerNo)}`) + context.assert(MODULE, 'P0全柜每票独立计划完成后allPlansReady', readySummary, + success(readySummary) && validContainerSummaryPage(readySummary.body?.data, { + sourceContainerBookingId: data.normal.sourceContainerBookingId, + containerNo: data.normal.containerNo, + totalOrderCount: CONTAINER_CONVERT_EXPECTED_ORDERS, + inboundCodeCount: CONTAINER_CONVERT_EXPECTED_ORDERS, + missingInboundCodeCount: 0, + planCount: CONTAINER_CONVERT_EXPECTED_ORDERS, + plannedInboundCodeCount: CONTAINER_CONVERT_EXPECTED_ORDERS, + pendingPlanCount: 0, + allPlansReady: true, + }), trace(readySummary), OPTIONS) + } diff --git a/scripts/admin-test-env-modules/test-container-inbound-plan-batch-contract.test.mjs b/scripts/admin-test-env-modules/test-container-inbound-plan-batch-contract.test.mjs index eb6c1a80c..61d75e712 100644 --- a/scripts/admin-test-env-modules/test-container-inbound-plan-batch-contract.test.mjs +++ b/scripts/admin-test-env-modules/test-container-inbound-plan-batch-contract.test.mjs @@ -44,9 +44,13 @@ test('semantic contract creates one independent plan per order even for the same test('server container summary remains complete when the order page would contain only ten rows', () => { assert.equal(CONTAINER_SUMMARY_ENDPOINT, '/api/platform/v1/last-leg/orders/container-summaries') assert.equal(validContainerSummaryPage({ - records: [{ sourceContainerBookingId: 'CB-1', containerNo: 'C1', orderCount: '15', inboundCodeCount: '15' }], + records: [{ sourceContainerBookingId: 'CB-1', containerNo: 'C1', totalOrderCount: '15', inboundCodeCount: '15', + missingInboundCodeCount: 0, planCount: 0, plannedInboundCodeCount: 0, pendingPlanCount: 15, + allPlansReady: false }], page: '1', size: '10', total: '1', pages: '1', - }, { sourceContainerBookingId: 'CB-1', containerNo: 'C1', orderCount: 15, inboundCodeCount: 15 }), true) + }, { sourceContainerBookingId: 'CB-1', containerNo: 'C1', totalOrderCount: 15, inboundCodeCount: 15, + missingInboundCodeCount: 0, planCount: 0, plannedInboundCodeCount: 0, pendingPlanCount: 15, + allPlansReady: false }), true) }) test('atomic failure and replay helpers reject drift', () => { @@ -75,7 +79,7 @@ test('container API uses one stable long string identity', () => { assert.match(endpoint, /sourceContainerBookingId:\s*\{ type: string/) assert.match(controller, /convertContainer/) assert.match(adminApi, /sourceContainerBookingId: string/) - assert.match(adminView, /sourceContainerBookingId: row\.sourceContainerBookingId/) + assert.match(adminView, /sourceContainerBookingId: container\.sourceContainerBookingId/) }) test('backend batch conversion is one transaction and never merges same-customer orders', () => { @@ -89,9 +93,9 @@ test('backend batch conversion is one transaction and never merges same-customer }) test('Admin consumes a server-paged container summary and never derives 15 from the current order page', () => { - assert.match(adminApi, /(?:listLastMileContainerSummaries|listContainerSummaries)/) + assert.match(adminApi, /listContainerPlanProgress/) assert.match(adminApi, /container-summaries/) - assert.match(adminView, /(?:listLastMileContainerSummaries|listContainerSummaries)\(/) + assert.match(adminView, /listContainerPlanProgress\(/) assert.match(adminView, /containerRows\.value\s*=\s*result\.records/) assert.doesNotMatch(adminView, /(?:rows|result\.records)\.value?\.(?:reduce|filter|forEach)[\s\S]{0,300}containerNo/) })