This commit is contained in:
2026-09-30 15:16:39 +08:00
parent 0919a61661
commit 22584e7fde
15 changed files with 994 additions and 45 deletions
@@ -14,6 +14,27 @@ export function uniqueContainerProducer(item, index, all) {
return nonBlank(item?.containerNo)
&& all.findIndex((candidate) => candidate?.containerNo === item.containerNo) === index
}
export function crossContainerCartonProbe(producers, current) {
const currentCodes = new Set((current?.inbounds || []).map(item => id(item.inboundCode)))
if (!nonBlank(current?.containerNo) || !currentCodes.size) return null
for (const item of producers || []) {
if (!nonBlank(item?.containerNo) || item.containerNo === current?.containerNo
|| !longId(item?.containerBookingId) || !longId(item?.sourceOrderId)
|| !longId(item?.sourceInboundId) || item?.sourceStatus !== 'LOADED'
|| !nonBlank(item?.inboundCode) || currentCodes.has(item.inboundCode)) continue
const standardFba = item.destinationType === 'FBA' && item.fulfillmentType === 'STANDARD'
const marks = standardFba ? item.receivingCartonMarks
: (Array.isArray(item.cartonMarks) ? item.cartonMarks : [item.cartonMark])
const prefix = `${item.inboundCode}#PDA-CONTRACT-`
const cartonMark = (Array.isArray(marks) ? marks : []).map(id).find(value => nonBlank(value)
&& (!standardFba || (value.startsWith(prefix) && /^[1-9][0-9]*$/.test(value.slice(prefix.length)))))
if (cartonMark) return { cartonMark, containerNo:item.containerNo,
containerBookingId:id(item.containerBookingId), inboundCode:item.inboundCode,
sourceOrderId:id(item.sourceOrderId), sourceInboundId:id(item.sourceInboundId),
mode:standardFba ? 'FBA_RECEIVING_PREFIX' : 'PHYSICAL_CARTON' }
}
return null
}
function success(response) { return response?.http === 200 && String(response?.body?.code) === '200' }
function code(response) { return String(response?.body?.code ?? '') }
function traced(response) { return nonBlank(response?.requestId) && nonBlank(response?.traceId) }
@@ -525,14 +546,13 @@ async function probeCartonResolveNegatives(context, token, current) {
{ cartonMark: `UNMATCHED-${markerSuffix(context)}#ANY-SUFFIX` }, cartonResolveRejected)
const allProducers = context.createdResources?.phase4InboundProducerFixtures?.containers || []
const crossContainerMark = allProducers
.filter((item) => id(item?.containerNo) !== id(current.containerNo))
.flatMap((item) => Array.isArray(item?.cartonMarks) ? item.cartonMarks : [item?.cartonMark])
.map(id).find(nonBlank)
if (crossContainerMark) {
const crossContainerProbe = crossContainerCartonProbe(allProducers,current)
if (crossContainerProbe) {
context.addStep(MODULE,'跨柜解析反证来源为另一真实实装柜及入仓码',null,true,
JSON.stringify(crossContainerProbe),OPTIONS)
await expected(context, token, 'POST', '其他柜箱码前缀被当前锁定柜拒绝',
'/api/pda/v1/last-leg/receiving-containers/current/cartons/resolve',
{ cartonMark: crossContainerMark }, cartonResolveRejected)
{ cartonMark: crossContainerProbe.cartonMark }, cartonResolveRejected)
} else {
blockerGap(context, '箱码跨柜负向', '缺少另一真实柜的冻结箱码,不能伪造跨柜归属反证')
}