28 lines
2.0 KiB
JavaScript
28 lines
2.0 KiB
JavaScript
const MODULE = 'phase3-dispatch-gate'
|
|
const OPTIONS = { scenario: 'domestic-dispatch-gate', deploymentBlocker: true }
|
|
const BASE = '/api/platform/v1/first-leg/outbound-dispatches'
|
|
|
|
export async function run(context) {
|
|
const fixture = context.createdResources?.phase3OutboundDispatch
|
|
if (!fixture?.inboundId || !fixture?.containerBookingId || fixture.marker !== context.marker) {
|
|
context.addStep(MODULE, '取得同 marker 的国内出仓门禁前置', null, false,
|
|
`inboundId=${fixture?.inboundId || 'missing'}, containerBookingId=${fixture?.containerBookingId || 'missing'}, fixtureMarker=${fixture?.marker || 'missing'}, runMarker=${context.marker}`,
|
|
OPTIONS)
|
|
context.addCoverageGap(MODULE, OPTIONS.scenario, '订舱/拖车/报关/PDA/五类证据统一硬门禁',
|
|
'本轮未取得 phase3-outbound-dispatch 的 marker 隔离聚合,未使用历史资源', 'fixture')
|
|
return
|
|
}
|
|
const response = await context.request('GET', `${BASE}/${encodeURIComponent(fixture.containerBookingId)}/gate`)
|
|
const gate = context.apiSuccess(MODULE, '复核国内出仓柜级统一硬门禁', response,
|
|
`containerBookingId=${fixture.containerBookingId}`, OPTIONS)
|
|
const items = Array.isArray(gate?.inbounds)
|
|
? gate.inbounds.flatMap((item) => Array.isArray(item?.gate?.items) ? item.gate.items : []) : []
|
|
const required = ['INBOUND_LOADED', 'LOADING_PLAN_COMPLETED', 'PDA_PICK_COMPLETED',
|
|
'OCEAN_BOOKING_RELEASED', 'LOADING_EVIDENCE_COMPLETE', 'CUSTOMS_CLEARANCE']
|
|
context.assert(MODULE, '六项硬门禁全部由服务端真实判定并通过', response,
|
|
gate?.passed === true && required.every((code) => items.some((item) => item.code === code
|
|
&& item.passed === true && item.actual !== 'MODULE_UNAVAILABLE' && item.actual !== 'ASSESSMENT_ERROR'))
|
|
&& items.every((item) => !['TRUCK_DEPARTED', 'SAILING_SCHEDULE'].includes(item.code)),
|
|
`passed=${gate?.passed ?? 'missing'}, gates=${items.map((item) => `${item.code}:${item.passed}`).join(',')}`, OPTIONS)
|
|
}
|