This commit is contained in:
2026-08-11 11:41:41 +08:00
parent 9f455b6c0b
commit 9b3ff06a90
17 changed files with 429 additions and 76 deletions
@@ -88,23 +88,27 @@ export async function run(context) {
const slicesResponse = await context.request('GET', slicesPath)
const slices = context.apiSuccess(MODULE, '读取柜次真实履约分片以确定报关订单', slicesResponse,
`containerBookingId=${containerBookingId}, tenantId=${tenantId}`, OPTIONS)
const loadedSlices = Array.isArray(slices)
const carryingSlices = Array.isArray(slices)
? slices.filter((item) => id(item?.tenantId) === tenantId
&& id(item?.containerBookingId) === containerBookingId
&& id(item?.parentOrderId) === parentOrderId
&& item?.splitRole === 'LOADED'
&& (!loadingPlanId || id(item?.loadingPlanId) === loadingPlanId))
: []
const loadedSlice = loadedSlices.length === 1 ? loadedSlices[0] : null
const orderId = id(loadedSlice?.childOrderId)
context.assert(MODULE, '报关绑定柜次实际承载的唯一 LOADED 子订单', slicesResponse,
loadedSlices.length === 1 && Boolean(orderId) && orderId !== parentOrderId
&& id(loadedSlice?.parentOrderId) === parentOrderId
&& id(loadedSlice?.containerBookingId) === containerBookingId
&& id(loadedSlice?.tenantId) === tenantId
&& (!loadingPlanId || id(loadedSlice?.loadingPlanId) === loadingPlanId),
`parentOrderId=${parentOrderId}, childOrderId=${orderId || 'missing'}, containerBookingId=${containerBookingId}, loadingPlanId=${id(loadedSlice?.loadingPlanId) || 'missing'}, matches=${loadedSlices.length}`, OPTIONS)
if (!orderId || loadedSlices.length !== 1 || orderId === parentOrderId) return
const carryingSlice = carryingSlices.length === 1 ? carryingSlices[0] : null
const actualOrderId = id(carryingSlice?.childOrderId)
const sourceOrderId = id(carryingSlice?.sourceOrderId)
const sourceCarriesLoaded = Boolean(actualOrderId) && actualOrderId === sourceOrderId
context.assert(MODULE, '报关绑定柜次实际承载的唯一 LOADED 来源分片', slicesResponse,
carryingSlices.length === 1 && sourceCarriesLoaded
&& id(carryingSlice?.parentOrderId) === parentOrderId
&& id(carryingSlice?.containerBookingId) === containerBookingId
&& id(carryingSlice?.tenantId) === tenantId
&& Number.isInteger(Number(carryingSlice?.packageCount)) && Number(carryingSlice.packageCount) > 0
&& (!loadingPlanId || id(carryingSlice?.loadingPlanId) === loadingPlanId),
`parentOrderId=${parentOrderId}, sourceOrderId=${sourceOrderId || 'missing'}, actualOrderId=${actualOrderId || 'missing'}, packageCount=${carryingSlice?.packageCount ?? 'missing'}, sourceCarriesLoaded=${sourceCarriesLoaded}, containerBookingId=${containerBookingId}, loadingPlanId=${id(carryingSlice?.loadingPlanId) || 'missing'}, matches=${carryingSlices.length}`, OPTIONS)
if (carryingSlices.length !== 1 || !sourceCarriesLoaded
|| !Number.isInteger(Number(carryingSlice?.packageCount)) || Number(carryingSlice.packageCount) <= 0) return
const loginResponse = await request(context, 'POST', '/api/auth/login', {
username: MERCHANT_USERNAME, password: MERCHANT_PASSWORD,
@@ -131,18 +135,18 @@ export async function run(context) {
`checklistVersionId=${checklistVersionId || 'missing'}, items=${checklist?.items?.length ?? 'n/a'}`, OPTIONS)
if (!checklistVersionId) return
const casePayload = { customerId: tenantId, orderId, inboundId, containerBookingId,
const casePayload = { customerId: tenantId, orderId: actualOrderId, inboundId, containerBookingId,
checklistVersionId, remark: context.marker, expectedVersion: 0 }
const caseResponse = await request(context, 'POST', `${PLATFORM}/cases`, casePayload, context.token,
{ 'Idempotency-Key': key(context, 'case') })
const created = context.apiSuccess(MODULE, '创建客户订单柜次关联报关协同单', caseResponse, '', OPTIONS)
const caseId = id(created?.customsCase?.id)
context.assert(MODULE, '报关单绑定本轮 LOADED 子订单、入库单、柜次和清单版本', caseResponse,
Boolean(caseId) && id(created?.customsCase?.tenantId) === tenantId && id(created?.customsCase?.orderId) === orderId
context.assert(MODULE, '报关单绑定本轮实际承载来源分片、入库单、柜次和清单版本', caseResponse,
Boolean(caseId) && id(created?.customsCase?.tenantId) === tenantId && id(created?.customsCase?.orderId) === actualOrderId
&& id(created?.customsCase?.inboundId) === inboundId && id(created?.customsCase?.containerBookingId) === containerBookingId
&& id(created?.customsCase?.checklistVersionId) === checklistVersionId
&& created?.customsCase?.status === 'DOCUMENTS_PENDING' && Number(created?.customsCase?.version) === 0,
`caseId=${caseId || 'missing'}, parentOrderId=${parentOrderId}, childOrderId=${orderId}, status=${created?.customsCase?.status || 'missing'}`, OPTIONS)
`caseId=${caseId || 'missing'}, parentOrderId=${parentOrderId}, sourceOrderId=${sourceOrderId}, actualOrderId=${actualOrderId}, status=${created?.customsCase?.status || 'missing'}`, OPTIONS)
if (!caseId) return
const caseReplay = await request(context, 'POST', `${PLATFORM}/cases`, casePayload, context.token,
@@ -305,7 +309,7 @@ export async function run(context) {
`HTTP=${forgedReference.http}, code=${codeOf(forgedReference)}`, OPTIONS)
context.createdResources.phase3Customs = {
marker: context.marker, tenantId, parentOrderId, orderId, inboundId, containerBookingId, loadingPlanId,
marker: context.marker, tenantId, parentOrderId, orderId: actualOrderId, inboundId, containerBookingId, loadingPlanId,
customsCaseId: caseId, submissionBatchId: batchId, releasedReceiptId: releasedId,
finalStatus: 'CLEARANCE_COMPLETED',
}