|
|
|
@@ -170,6 +170,7 @@ export async function run(context) {
|
|
|
|
|
id(linked?.id) === containerBookingId && linked?.cabinetNo === simulation.cabinetNo
|
|
|
|
|
&& id(linked?.oceanBookingId) === bookingId,
|
|
|
|
|
`containerBookingId=${containerBookingId}, cabinetNo=${linked?.cabinetNo || 'missing'}`, OPTIONS)
|
|
|
|
|
if (id(linked?.id) !== containerBookingId) return
|
|
|
|
|
|
|
|
|
|
const candidateResponse = await context.request('GET', `${smartLoadingBase}/candidates?bookingId=${encodeURIComponent(containerBookingId)}&warehouseId=${encodeURIComponent(warehouseId)}`)
|
|
|
|
|
const candidates = context.apiSuccess(MODULE, '查询本轮入库单柜次装柜候选', candidateResponse, '', OPTIONS)
|
|
|
|
@@ -233,29 +234,55 @@ export async function run(context) {
|
|
|
|
|
`linkId=${id(link?.id) || 'missing'}, preloadVersion=${link?.preloadVersion ?? 'missing'}, loadingVersion=${link?.loadingPlanVersion ?? 'missing'}`, OPTIONS)
|
|
|
|
|
if (!link?.id) return
|
|
|
|
|
|
|
|
|
|
const missingContainerPushResponse = await request(context, 'POST',
|
|
|
|
|
`${smartLoadingBase}/plans/${loadingPlanId}/push-preload`,
|
|
|
|
|
{ expectedVersion: Number(link.loadingPlanVersion) },
|
|
|
|
|
{ 'Idempotency-Key': `${context.marker}-bridge-push-without-container-no`.slice(0, 128) })
|
|
|
|
|
const missingContainerPushRejected = failure(missingContainerPushResponse)
|
|
|
|
|
context.addStep(MODULE, '无真实柜号拒绝推送柜次计划', missingContainerPushResponse,
|
|
|
|
|
missingContainerPushRejected,
|
|
|
|
|
`HTTP=${missingContainerPushResponse.http}, code=${codeOf(missingContainerPushResponse)}, requestId=${missingContainerPushResponse.requestId || 'missing'}, traceId=${missingContainerPushResponse.traceId || 'missing'}`, OPTIONS)
|
|
|
|
|
if (!missingContainerPushRejected) return
|
|
|
|
|
|
|
|
|
|
const missingContainerTaskResponse = await context.request('GET',
|
|
|
|
|
`${pdaBase}/tasks?loadingPlanId=${encodeURIComponent(loadingPlanId)}&warehouseId=${encodeURIComponent(warehouseId)}`)
|
|
|
|
|
const missingContainerTaskAbsent = failure(missingContainerTaskResponse)
|
|
|
|
|
|| !id(missingContainerTaskResponse?.body?.id || missingContainerTaskResponse?.body?.data?.id)
|
|
|
|
|
context.addStep(MODULE, '无真实柜号推送失败后不生成 PDA 任务', missingContainerTaskResponse,
|
|
|
|
|
missingContainerTaskAbsent,
|
|
|
|
|
`HTTP=${missingContainerTaskResponse.http}, code=${codeOf(missingContainerTaskResponse)}, task=${id(missingContainerTaskResponse?.body?.id || missingContainerTaskResponse?.body?.data?.id) || 'none'}`, OPTIONS)
|
|
|
|
|
if (!missingContainerTaskAbsent) return
|
|
|
|
|
|
|
|
|
|
const containerBeforeTransportResponse = await context.request('GET',
|
|
|
|
|
`/api/platform/v1/containers/${containerBookingId}`)
|
|
|
|
|
const containerBeforeTransport = context.apiSuccess(MODULE, '读取补真实柜号前柜次最新版本',
|
|
|
|
|
containerBeforeTransportResponse, '', OPTIONS)
|
|
|
|
|
const transportVersion = Number(containerBeforeTransport?.version)
|
|
|
|
|
context.assert(MODULE, '补真实柜号使用订舱关联后的最新柜次版本', containerBeforeTransportResponse,
|
|
|
|
|
id(containerBeforeTransport?.id) === containerBookingId && Number.isInteger(transportVersion),
|
|
|
|
|
`containerBookingId=${id(containerBeforeTransport?.id) || 'missing'}, version=${containerBeforeTransport?.version ?? 'missing'}`, OPTIONS)
|
|
|
|
|
if (!Number.isInteger(transportVersion)) return
|
|
|
|
|
const transportResponse = await request(context, 'PATCH',
|
|
|
|
|
`/api/platform/v1/containers/${containerBookingId}/transport`, {
|
|
|
|
|
containerNo, voyageNo: `P3V-${suffix}`, version: transportVersion,
|
|
|
|
|
reason: `${context.marker}-bind-container-no`,
|
|
|
|
|
})
|
|
|
|
|
const transported = context.apiSuccess(MODULE, '绑定真实柜号后开放三期 PDA 推送门禁', transportResponse, '', OPTIONS)
|
|
|
|
|
context.assert(MODULE, '真实柜号绑定到稳定柜次且计划身份不变', transportResponse,
|
|
|
|
|
transported?.containerNo === containerNo && id(transported?.id) === containerBookingId
|
|
|
|
|
&& transported?.cabinetNo === linked.cabinetNo,
|
|
|
|
|
`containerNo=${transported?.containerNo || 'missing'}, containerBookingId=${id(transported?.id) || 'missing'}, loadingPlanId=${loadingPlanId}`, OPTIONS)
|
|
|
|
|
if (transported?.containerNo !== containerNo) return
|
|
|
|
|
|
|
|
|
|
const pushResponse = await request(context, 'POST', `${smartLoadingBase}/plans/${loadingPlanId}/push-preload`,
|
|
|
|
|
{ expectedVersion: Number(link.loadingPlanVersion) },
|
|
|
|
|
{ 'Idempotency-Key': `${context.marker}-bridge-push`.slice(0, 128) })
|
|
|
|
|
const pushedLoadingPlan = context.apiSuccess(MODULE, '桥接后推送柜次计划并生成真实 PDA 任务', pushResponse, '', OPTIONS)
|
|
|
|
|
const pushedLoadingPlan = context.apiSuccess(MODULE, '绑定真实柜号后推送柜次计划并生成 PDA 任务', pushResponse, '', OPTIONS)
|
|
|
|
|
context.assert(MODULE, '推送后柜次计划保持 EDITING 且版本递增', pushResponse,
|
|
|
|
|
pushedLoadingPlan?.status === 'EDITING'
|
|
|
|
|
&& Number(pushedLoadingPlan?.version) === Number(link.loadingPlanVersion) + 1,
|
|
|
|
|
`status=${pushedLoadingPlan?.status || 'missing'}, version=${pushedLoadingPlan?.version ?? 'missing'}`, OPTIONS)
|
|
|
|
|
|
|
|
|
|
const containerBeforeTransportResponse = await context.request('GET',
|
|
|
|
|
`/api/platform/v1/containers/${containerBookingId}`)
|
|
|
|
|
const containerBeforeTransport = context.apiSuccess(MODULE, '读取补真实柜号前柜次版本',
|
|
|
|
|
containerBeforeTransportResponse, '', OPTIONS)
|
|
|
|
|
const transportResponse = await request(context, 'PATCH',
|
|
|
|
|
`/api/platform/v1/containers/${containerBookingId}/transport`, {
|
|
|
|
|
containerNo, voyageNo: `P3V-${suffix}`, version: Number(containerBeforeTransport?.version),
|
|
|
|
|
reason: `${context.marker}-bind-container-no`,
|
|
|
|
|
})
|
|
|
|
|
const transported = context.apiSuccess(MODULE, '补真实柜号并开放三期 PDA 任务', transportResponse, '', OPTIONS)
|
|
|
|
|
context.assert(MODULE, '真实柜号绑定到稳定柜次且计划身份不变', transportResponse,
|
|
|
|
|
transported?.containerNo === containerNo && id(transported?.id) === containerBookingId,
|
|
|
|
|
`containerNo=${transported?.containerNo || 'missing'}, containerBookingId=${id(transported?.id) || 'missing'}`, OPTIONS)
|
|
|
|
|
|
|
|
|
|
const blockedBeforePreloadConfirm = await request(context, 'POST', `${base}/loading/complete?tenantId=${encodeURIComponent(tenantId)}`,
|
|
|
|
|
{ expectedVersion: initialVersion, remark: 'must confirm preload first' },
|
|
|
|
|
{ 'Idempotency-Key': `${context.marker}-p3-complete-before-preload-confirm`.slice(0, 128) })
|
|
|
|
|