diff --git a/scripts/admin-test-env-modules/phase3-loading.mjs b/scripts/admin-test-env-modules/phase3-loading.mjs index a5e5357b5..b2b22f6ef 100644 --- a/scripts/admin-test-env-modules/phase3-loading.mjs +++ b/scripts/admin-test-env-modules/phase3-loading.mjs @@ -5,6 +5,7 @@ const MODULE = 'phase3-loading' const OPTIONS = { scenario: 'phase3-split-preload-loading', deploymentBlocker: true } const MERCHANT_USERNAME = process.env.MERCHANT_TEST_USERNAME || 'merchant_admin' const MERCHANT_PASSWORD = process.env.MERCHANT_TEST_PASSWORD || 'ChangeMe123!' +const MATSON_SUPPLIER_NAME = 'MATSON 开发联调船司' function id(value) { return value == null ? '' : String(value) } export function markerSuffix(marker) { @@ -22,6 +23,27 @@ function failure(response) { || (response?.http === 200 && codeOf(response) !== '200') } +async function ensureMatsonSupplier(context, records) { + const existing = records.find((value) => value?.id && value?.name === MATSON_SUPPLIER_NAME) + if (existing?.status === 'ACTIVE') return existing + if (existing?.id) { + const activatedResponse = await context.request('PATCH', + `/api/platform/v1/suppliers/${encodeURIComponent(id(existing.id))}/status?tenantId=0`, { status: 'ACTIVE' }) + const activated = context.apiSuccess(MODULE, '启用稳定MATSON船司开发夹具', activatedResponse, + `supplierId=${id(existing.id)}`, OPTIONS) + return activated?.id ? activated : null + } + const createdResponse = await context.request('POST', '/api/platform/v1/suppliers?tenantId=0', { + name: MATSON_SUPPLIER_NAME, category: 'BOOKING', region: '开发环境', legalRepresentative: '开发联调', + contactName: '开发联调', phone: '13800000000', email: 'matson-dev-fixture@example.com', + address: '开发环境稳定船司夹具', businessLicenseNo: 'DEV-CARRIER-MATSON', licenseFileId: null, + status: 'ACTIVE', settlementPeriod: 'MONTHLY_30', remark: '三四期开发环境HTTP验收稳定船司夹具', + }) + const supplierId = id(context.apiSuccess(MODULE, '创建稳定MATSON船司开发夹具', createdResponse, + `name=${MATSON_SUPPLIER_NAME}`, OPTIONS)) + return supplierId ? { id: supplierId, name: MATSON_SUPPLIER_NAME, status: 'ACTIVE' } : null +} + async function request(context, method, path, body, headers = {}) { try { const response = await fetch(`${context.options.gateway}${path}`, { @@ -132,28 +154,28 @@ export async function run(context) { const smartLoadingBase = '/api/platform/v1/first-leg/smart-loading' const pdaBase = '/api/platform/v1/first-leg/pda-loading' const supplierResponse = await context.request('GET', - '/api/platform/v1/suppliers?tenantId=0&category=BOOKING&status=ACTIVE&page=1&size=20') - const supplierPage = context.apiSuccess(MODULE, '读取 ACTIVE 订舱代理作为运输事实源', supplierResponse, '', OPTIONS) - const supplier = supplierPage?.records?.find?.((value) => value?.id && value?.name) + '/api/platform/v1/suppliers?tenantId=0&category=BOOKING&page=1&size=200') + const supplierPage = context.apiSuccess(MODULE, '读取订舱代理与船司供应商事实源', supplierResponse, '', OPTIONS) + const supplierRecords = Array.isArray(supplierPage?.records) ? supplierPage.records : [] + const supplier = supplierRecords.find((value) => value?.id && value?.name && value?.status === 'ACTIVE' + && value.name !== MATSON_SUPPLIER_NAME) context.assert(MODULE, '存在可用于发布订舱的 ACTIVE 订舱代理', supplierResponse, Boolean(supplier?.id && supplier?.name), `supplierId=${id(supplier?.id) || 'missing'}`, OPTIONS) if (!supplier?.id) return - const carrierResponse = await context.request('GET', - '/api/platform/v1/carrier-schedule-queries/carriers') - const carriers = context.apiSuccess(MODULE, '读取船节点canonical船司目录', carrierResponse, '', OPTIONS) - const shippingCarrier = Array.isArray(carriers) - ? carriers.find((value) => value?.carrierCode === 'MATSON' && value?.carrierName) - : null - context.assert(MODULE, '订舱船司与订舱代理使用各自真实事实源', carrierResponse, - Boolean(shippingCarrier?.carrierName), - `carrierCode=${shippingCarrier?.carrierCode || 'missing'}, bookingAgentId=${id(supplier.id)}`, OPTIONS) - if (!shippingCarrier?.carrierName) return + const shippingCarrier = await ensureMatsonSupplier(context, supplierRecords) + context.assert(MODULE, '订舱船司与订舱代理使用各自真实供应商事实', supplierResponse, + Boolean(shippingCarrier?.id && shippingCarrier?.name === MATSON_SUPPLIER_NAME), + `shippingCompanyId=${id(shippingCarrier?.id) || 'missing'}, bookingAgentId=${id(supplier.id)}`, OPTIONS) + if (!shippingCarrier?.id) return + context.createdResources.phase3CarrierSupplier = { + supplierId: id(shippingCarrier.id), name: shippingCarrier.name, status: 'ACTIVE', stableDevFixture: true, + } const bookingDraft = { customerId: tenantId, customerName: initial?.summary?.customerName, warehouseId, channelCode: initial?.summary?.channelCode, billOfLadingNo: `P3BL-${suffix}`.slice(0, 128), - shippingCompanyId: null, shippingCompanyName: shippingCarrier.carrierName, + shippingCompanyId: id(shippingCarrier.id), shippingCompanyName: shippingCarrier.name, bookingAgentId: id(supplier.id), bookingAgentName: supplier.name, vesselName: `P3VESSEL-${suffix}`.slice(0, 128), voyageNo: `P3V-${suffix}`.slice(0, 64), departurePortCode: 'CNSZX', departurePortName: '深圳', destinationPortCode: 'USLAX', diff --git a/scripts/admin-test-env-modules/phase3-producer-chain-contract.test.mjs b/scripts/admin-test-env-modules/phase3-producer-chain-contract.test.mjs index 84aa0b25e..735a08096 100644 --- a/scripts/admin-test-env-modules/phase3-producer-chain-contract.test.mjs +++ b/scripts/admin-test-env-modules/phase3-producer-chain-contract.test.mjs @@ -395,9 +395,10 @@ test('preload and loading versions use immediate operation baselines and exact p assert.equal((loading.match(/request\(context, 'POST', pushRequest\.path, pushRequest\.body, pushRequest\.headers\)/g) || []).length, 2) assert.match(loading, /push exact replay 对计划版本历史关联和任务零漂移/) assert.match(loading, /Number\(claimedPlan\?\.version\) > beforeClaimPlanVersion/) - assert.match(loading, /carrier-schedule-queries\/carriers/) - assert.match(loading, /carrierCode === 'MATSON'/) - assert.match(loading, /shippingCompanyId: null, shippingCompanyName: shippingCarrier\.carrierName/) + assert.match(loading, /MATSON_SUPPLIER_NAME = 'MATSON 开发联调船司'/) + assert.match(loading, /category=BOOKING&page=1&size=200/) + assert.match(loading, /ensureMatsonSupplier\(context, supplierRecords\)/) + assert.match(loading, /shippingCompanyId: id\(shippingCarrier\.id\), shippingCompanyName: shippingCarrier\.name/) assert.match(loading, /bookingAgentId: id\(supplier\.id\), bookingAgentName: supplier\.name/) assert.doesNotMatch(loading, /shippingCompanyId: id\(supplier\.id\), shippingCompanyName: supplier\.name/) })