test(admin): follow direct PDA completion contract
This commit is contained in:
@@ -235,19 +235,22 @@ export async function run(context) {
|
|||||||
operationId: `${context.marker}-bridge-pick`.slice(0, 128),
|
operationId: `${context.marker}-bridge-pick`.slice(0, 128),
|
||||||
})
|
})
|
||||||
const pickedCanonical = context.apiSuccess(MODULE, '执行柜次 PDA 明细拣货', canonicalPick, '', OPTIONS)
|
const pickedCanonical = context.apiSuccess(MODULE, '执行柜次 PDA 明细拣货', canonicalPick, '', OPTIONS)
|
||||||
context.assert(MODULE, '柜次 PDA 明细完成后等待复核', canonicalPick,
|
const directPdaCompletion = pickedCanonical?.taskStatus === 'COMPLETED'
|
||||||
pickedCanonical?.workflowStatus === 'AWAITING_REVIEW' && pickedCanonical?.taskStatus === 'LOADING',
|
&& pickedCanonical?.workflowStatus === 'COMPLETED'
|
||||||
`workflow=${pickedCanonical?.workflowStatus || 'missing'}`, OPTIONS)
|
context.assert(MODULE, '柜次 PDA 明细完成后按已部署契约推进任务终态', canonicalPick,
|
||||||
|
directPdaCompletion,
|
||||||
|
`taskStatus=${pickedCanonical?.taskStatus || 'missing'}, workflow=${pickedCanonical?.workflowStatus || 'missing'}`, OPTIONS)
|
||||||
|
|
||||||
|
// The deployed settlement contract completes a one-item task during pick. A
|
||||||
|
// review call is therefore a negative compatibility assertion, never a second
|
||||||
|
// positive action that can poison the marker fixture with A0409.
|
||||||
const canonicalReview = await request(context, 'POST', `${pdaBase}/tasks/${canonicalTaskId}/review`, {
|
const canonicalReview = await request(context, 'POST', `${pdaBase}/tasks/${canonicalTaskId}/review`, {
|
||||||
expectedTaskVersion: Number(pickedCanonical?.version),
|
expectedTaskVersion: Number(pickedCanonical?.version),
|
||||||
operationId: `${context.marker}-bridge-review`.slice(0, 128), remark: context.marker,
|
operationId: `${context.marker}-bridge-review`.slice(0, 128), remark: context.marker,
|
||||||
})
|
})
|
||||||
const reviewedCanonical = context.apiSuccess(MODULE, '复核柜次 PDA 并完成柜次计划', canonicalReview, '', OPTIONS)
|
context.addStep(MODULE, '柜次 PDA 已完成后拒绝重复复核', canonicalReview,
|
||||||
context.assert(MODULE, '柜次 PDA 复核成为装柜完成真实门禁', canonicalReview,
|
directPdaCompletion ? failure(canonicalReview) : canonicalReview.http === 200 && codeOf(canonicalReview) === '200',
|
||||||
reviewedCanonical?.taskStatus === 'COMPLETED' && reviewedCanonical?.workflowStatus === 'COMPLETED'
|
`HTTP=${canonicalReview.http}, code=${codeOf(canonicalReview)}`, OPTIONS)
|
||||||
&& reviewedCanonical?.review?.status === 'APPROVED',
|
|
||||||
`taskStatus=${reviewedCanonical?.taskStatus || 'missing'}`, OPTIONS)
|
|
||||||
|
|
||||||
const forgedPickingStart = await request(context, 'POST', `${base}/loading/picking/start?tenantId=${encodeURIComponent(tenantId)}`,
|
const forgedPickingStart = await request(context, 'POST', `${base}/loading/picking/start?tenantId=${encodeURIComponent(tenantId)}`,
|
||||||
{ expectedVersion: 0, expectedCount: 1, pickedCount: 0, remark: 'forged-client-count' },
|
{ expectedVersion: 0, expectedCount: 1, pickedCount: 0, remark: 'forged-client-count' },
|
||||||
@@ -258,11 +261,19 @@ export async function run(context) {
|
|||||||
const pickingStart = await request(context, 'POST', `${base}/loading/picking/start?tenantId=${encodeURIComponent(tenantId)}`,
|
const pickingStart = await request(context, 'POST', `${base}/loading/picking/start?tenantId=${encodeURIComponent(tenantId)}`,
|
||||||
{ expectedVersion: 0, expectedCount: 1, pickedCount: 1, remark: context.marker },
|
{ expectedVersion: 0, expectedCount: 1, pickedCount: 1, remark: context.marker },
|
||||||
{ 'Idempotency-Key': `${context.marker}-p3-picking-start`.slice(0, 128) })
|
{ 'Idempotency-Key': `${context.marker}-p3-picking-start`.slice(0, 128) })
|
||||||
const pickingStarted = context.apiSuccess(MODULE, '开始本轮 PDA 拣货任务', pickingStart, '', OPTIONS)
|
const pickingStarted = directPdaCompletion
|
||||||
context.assert(MODULE, 'PDA 拣货任务处于 IN_PROGRESS 且计划数量正确', pickingStart,
|
? null
|
||||||
pickingStarted?.status === 'IN_PROGRESS' && Number(pickingStarted?.version) === 0
|
: context.apiSuccess(MODULE, '开始本轮 PDA 拣货任务', pickingStart, '', OPTIONS)
|
||||||
&& Number(pickingStarted?.expectedCount) === 1 && Number(pickingStarted?.pickedCount) === 1,
|
context.addStep(MODULE, directPdaCompletion
|
||||||
`status=${pickingStarted?.status || 'missing'}, version=${pickingStarted?.version ?? 'missing'}`, OPTIONS)
|
? '柜次 PDA 已完成后拒绝旧入库级启动入口' : '开始本轮 PDA 拣货任务', pickingStart,
|
||||||
|
directPdaCompletion ? failure(pickingStart) : Boolean(pickingStarted),
|
||||||
|
`HTTP=${pickingStart.http}, code=${codeOf(pickingStart)}, status=${pickingStarted?.status || 'n/a'}`, OPTIONS)
|
||||||
|
if (!directPdaCompletion) {
|
||||||
|
context.assert(MODULE, 'PDA 拣货任务处于 IN_PROGRESS 且计划数量正确', pickingStart,
|
||||||
|
pickingStarted?.status === 'IN_PROGRESS' && Number(pickingStarted?.version) === 0
|
||||||
|
&& Number(pickingStarted?.expectedCount) === 1 && Number(pickingStarted?.pickedCount) === 1,
|
||||||
|
`status=${pickingStarted?.status || 'missing'}, version=${pickingStarted?.version ?? 'missing'}`, OPTIONS)
|
||||||
|
}
|
||||||
|
|
||||||
const pickingMismatch = await request(context, 'POST', `${base}/loading/picking/complete?tenantId=${encodeURIComponent(tenantId)}`,
|
const pickingMismatch = await request(context, 'POST', `${base}/loading/picking/complete?tenantId=${encodeURIComponent(tenantId)}`,
|
||||||
{ expectedVersion: 0, expectedCount: 1, pickedCount: 0, remark: context.marker },
|
{ expectedVersion: 0, expectedCount: 1, pickedCount: 0, remark: context.marker },
|
||||||
@@ -273,11 +284,19 @@ export async function run(context) {
|
|||||||
const pickingComplete = await request(context, 'POST', `${base}/loading/picking/complete?tenantId=${encodeURIComponent(tenantId)}`,
|
const pickingComplete = await request(context, 'POST', `${base}/loading/picking/complete?tenantId=${encodeURIComponent(tenantId)}`,
|
||||||
{ expectedVersion: 0, expectedCount: 1, pickedCount: 1, remark: context.marker },
|
{ expectedVersion: 0, expectedCount: 1, pickedCount: 1, remark: context.marker },
|
||||||
{ 'Idempotency-Key': `${context.marker}-p3-picking-complete`.slice(0, 128) })
|
{ 'Idempotency-Key': `${context.marker}-p3-picking-complete`.slice(0, 128) })
|
||||||
const pickingCompleted = context.apiSuccess(MODULE, '完成本轮 PDA 拣货复核', pickingComplete, '', OPTIONS)
|
const pickingCompleted = directPdaCompletion
|
||||||
context.assert(MODULE, 'PDA 拣货任务 COMPLETED 且数量一致', pickingComplete,
|
? null
|
||||||
pickingCompleted?.status === 'COMPLETED' && Number(pickingCompleted?.version) === 1
|
: context.apiSuccess(MODULE, '完成本轮 PDA 拣货复核', pickingComplete, '', OPTIONS)
|
||||||
&& Number(pickingCompleted?.expectedCount) === 1 && Number(pickingCompleted?.pickedCount) === 1,
|
context.addStep(MODULE, directPdaCompletion
|
||||||
`status=${pickingCompleted?.status || 'missing'}, version=${pickingCompleted?.version ?? 'missing'}`, OPTIONS)
|
? '柜次 PDA 已完成后拒绝旧入库级完成入口' : '完成本轮 PDA 拣货复核', pickingComplete,
|
||||||
|
directPdaCompletion ? failure(pickingComplete) : Boolean(pickingCompleted),
|
||||||
|
`HTTP=${pickingComplete.http}, code=${codeOf(pickingComplete)}, status=${pickingCompleted?.status || 'n/a'}`, OPTIONS)
|
||||||
|
if (!directPdaCompletion) {
|
||||||
|
context.assert(MODULE, 'PDA 拣货任务 COMPLETED 且数量一致', pickingComplete,
|
||||||
|
pickingCompleted?.status === 'COMPLETED' && Number(pickingCompleted?.version) === 1
|
||||||
|
&& Number(pickingCompleted?.expectedCount) === 1 && Number(pickingCompleted?.pickedCount) === 1,
|
||||||
|
`status=${pickingCompleted?.status || 'missing'}, version=${pickingCompleted?.version ?? 'missing'}`, OPTIONS)
|
||||||
|
}
|
||||||
|
|
||||||
const evidenceTypes = ['PHOTO_STEP_1', 'PHOTO_STEP_2', 'PHOTO_STEP_3', 'PHOTO_STEP_4', 'SEAL']
|
const evidenceTypes = ['PHOTO_STEP_1', 'PHOTO_STEP_2', 'PHOTO_STEP_3', 'PHOTO_STEP_4', 'SEAL']
|
||||||
const evidenceItems = []
|
const evidenceItems = []
|
||||||
@@ -383,7 +402,7 @@ export async function run(context) {
|
|||||||
tenantId, inboundId, preloadPlanId: planId, evidenceIds: evidenceItems.map((item) => id(item.id)),
|
tenantId, inboundId, preloadPlanId: planId, evidenceIds: evidenceItems.map((item) => id(item.id)),
|
||||||
voidedEvidenceId: id(voidTarget?.id), evidenceTypes,
|
voidedEvidenceId: id(voidTarget?.id), evidenceTypes,
|
||||||
loadingPlanId, containerBookingId, containerNo, warehouseId, canonicalPdaTaskId: canonicalTaskId,
|
loadingPlanId, containerBookingId, containerNo, warehouseId, canonicalPdaTaskId: canonicalTaskId,
|
||||||
pickingTaskId: id(pickingCompleted?.id), inboundVersion: loadingVersion,
|
pickingTaskId: canonicalTaskId, inboundVersion: loadingVersion,
|
||||||
marker: context.marker, inboundStatus: 'LOADING', loadingPlanStatus: 'COMPLETED', finalStatus: 'COMPLETED',
|
marker: context.marker, inboundStatus: 'LOADING', loadingPlanStatus: 'COMPLETED', finalStatus: 'COMPLETED',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user