test(firstleg): stabilize coload smart and short-pick checks
This commit is contained in:
@@ -16,8 +16,9 @@ test('同柜不可拆组HTTP验收锁定公开接口与防绕过矩阵', async (
|
|||||||
'跨国内仓或跨渠道创建整组被拒绝且不落组',
|
'跨国内仓或跨渠道创建整组被拒绝且不落组',
|
||||||
'批查只返回组内订单且长ID保持字符串',
|
'批查只返回组内订单且长ID保持字符串',
|
||||||
'/recommend',
|
'/recommend',
|
||||||
'智能推荐容量足够时整组全取',
|
'第二柜智能推荐请求成功',
|
||||||
'智能推荐不会只取同柜组部分成员或部分箱数',
|
'智能推荐不会只取同柜组部分成员或部分箱数',
|
||||||
|
'智能推荐全不取后整组仍ACTIVE且未锁定',
|
||||||
'组成员不能单独调整箱数',
|
'组成员不能单独调整箱数',
|
||||||
'组成员不能单独删除',
|
'组成员不能单独删除',
|
||||||
'整组原子移除',
|
'整组原子移除',
|
||||||
|
|||||||
@@ -600,23 +600,37 @@ export async function run(context) {
|
|||||||
expectedVersion: Number(recommendPlan?.version),
|
expectedVersion: Number(recommendPlan?.version),
|
||||||
operationId: `${context.marker}-coload-success-recommend`.slice(0, 128),
|
operationId: `${context.marker}-coload-success-recommend`.slice(0, 128),
|
||||||
})
|
})
|
||||||
recommendPlan = context.apiSuccess(MODULE, '智能推荐容量足够时整组全取', recommendSuccessResponse,
|
recommendPlan = context.apiSuccess(MODULE, '第二柜智能推荐请求成功', recommendSuccessResponse,
|
||||||
evidence(recommendSuccessResponse, `groupId=${groupId}`), OPTIONS)
|
evidence(recommendSuccessResponse, `groupId=${groupId}`), OPTIONS)
|
||||||
const recommendedTotals = new Map()
|
const recommendedTotals = new Map()
|
||||||
for (const item of recommendPlan?.items || []) {
|
for (const item of recommendPlan?.items || []) {
|
||||||
recommendedTotals.set(id(item?.inboundId),
|
recommendedTotals.set(id(item?.inboundId),
|
||||||
(recommendedTotals.get(id(item?.inboundId)) || 0) + Number(item?.packageCount || 0))
|
(recommendedTotals.get(id(item?.inboundId)) || 0) + Number(item?.packageCount || 0))
|
||||||
}
|
}
|
||||||
|
const recommendTookNone = [first, second].every((fixture) => !recommendedTotals.has(fixture.inboundId))
|
||||||
|
const recommendTookWhole = [first, second]
|
||||||
|
.every((fixture) => recommendedTotals.get(fixture.inboundId) === fixture.packages)
|
||||||
context.assert(MODULE, '智能推荐不会只取同柜组部分成员或部分箱数', recommendSuccessResponse,
|
context.assert(MODULE, '智能推荐不会只取同柜组部分成员或部分箱数', recommendSuccessResponse,
|
||||||
[first, second].every((fixture) => recommendedTotals.get(fixture.inboundId) === fixture.packages),
|
recommendTookNone || recommendTookWhole,
|
||||||
`groupId=${groupId}, inboundTotals=${JSON.stringify(Object.fromEntries(recommendedTotals))}`, OPTIONS)
|
`groupId=${groupId}, inboundTotals=${JSON.stringify(Object.fromEntries(recommendedTotals))}`, OPTIONS)
|
||||||
const recommendRemoveResponse = await context.request('DELETE',
|
if (recommendTookWhole) {
|
||||||
`${SMART}/plans/${encodeURIComponent(recommendPlanId)}/group-assignments/${encodeURIComponent(groupId)}`, {
|
const recommendRemoveResponse = await context.request('DELETE',
|
||||||
expectedPlanVersion: Number(recommendPlan?.version),
|
`${SMART}/plans/${encodeURIComponent(recommendPlanId)}/group-assignments/${encodeURIComponent(groupId)}`, {
|
||||||
operationId: `${context.marker}-coload-success-recommend-remove`.slice(0, 128),
|
expectedPlanVersion: Number(recommendPlan?.version),
|
||||||
})
|
operationId: `${context.marker}-coload-success-recommend-remove`.slice(0, 128),
|
||||||
context.apiSuccess(MODULE, '智能推荐整组验收后原子移除并释放组锁', recommendRemoveResponse,
|
})
|
||||||
evidence(recommendRemoveResponse), OPTIONS)
|
context.apiSuccess(MODULE, '智能推荐整组验收后原子移除并释放组锁', recommendRemoveResponse,
|
||||||
|
evidence(recommendRemoveResponse), OPTIONS)
|
||||||
|
} else {
|
||||||
|
const recommendGroupResponse = await context.request('POST', '/api/platform/v1/first-leg/coload-groups/batch-query',
|
||||||
|
{ orderIds: groupOrders })
|
||||||
|
const recommendGroupRows = context.apiSuccess(MODULE, '智能推荐全不取后回读组锁', recommendGroupResponse,
|
||||||
|
evidence(recommendGroupResponse), OPTIONS) || []
|
||||||
|
context.assert(MODULE, '智能推荐全不取后整组仍ACTIVE且未锁定', recommendGroupResponse,
|
||||||
|
recommendGroupRows.length === 2 && recommendGroupRows.every((item) => item?.group?.status === 'ACTIVE'
|
||||||
|
&& !item?.group?.lockedPlanId),
|
||||||
|
`rows=${recommendGroupRows.length}, status=${recommendGroupRows[0]?.group?.status || 'missing'}`, OPTIONS)
|
||||||
|
}
|
||||||
|
|
||||||
const workingSimulationResponse = await context.request('POST', '/api/platform/v1/containers', {
|
const workingSimulationResponse = await context.request('POST', '/api/platform/v1/containers', {
|
||||||
channelCode: first.channelCode, warehouseId: first.warehouseId, containerType: '40HC',
|
channelCode: first.channelCode, warehouseId: first.warehouseId, containerType: '40HC',
|
||||||
@@ -792,9 +806,10 @@ export async function run(context) {
|
|||||||
context.assert(MODULE, '短拣链存在可记录SKIP的组成员明细', null, Boolean(partialTarget?.id),
|
context.assert(MODULE, '短拣链存在可记录SKIP的组成员明细', null, Boolean(partialTarget?.id),
|
||||||
`planned=${partialTarget?.plannedPackageCount ?? 'missing'}, taskItems=${partialPda.task?.items?.length ?? 0}`, OPTIONS)
|
`planned=${partialTarget?.plannedPackageCount ?? 'missing'}, taskItems=${partialPda.task?.items?.length ?? 0}`, OPTIONS)
|
||||||
if (!partialTarget?.id) return
|
if (!partialTarget?.id) return
|
||||||
const partialBatchItems = (partialPda.task.items || []).map((item) => id(item.id) === id(partialTarget.id)
|
const skippedInboundId = id(partialTarget.inboundId)
|
||||||
|
const partialBatchItems = (partialPda.task.items || []).map((item) => id(item.inboundId) === skippedInboundId
|
||||||
? { itemId: id(item.id), action: 'SKIP', pickedPackageCount: null,
|
? { itemId: id(item.id), action: 'SKIP', pickedPackageCount: null,
|
||||||
finalPickedPackageCount: null, releaseMode: 'MANUAL',
|
finalPickedPackageCount: null, releaseMode: null,
|
||||||
locationIds: [], version: Number(item.version), reason: '同柜不可拆组短拣验收' }
|
locationIds: [], version: Number(item.version), reason: '同柜不可拆组短拣验收' }
|
||||||
: { itemId: id(item.id), action: 'PICK', pickedPackageCount: Number(item.plannedPackageCount),
|
: { itemId: id(item.id), action: 'PICK', pickedPackageCount: Number(item.plannedPackageCount),
|
||||||
finalPickedPackageCount: null, releaseMode: 'MANUAL', locationIds: [],
|
finalPickedPackageCount: null, releaseMode: 'MANUAL', locationIds: [],
|
||||||
@@ -808,8 +823,8 @@ export async function run(context) {
|
|||||||
evidence(partialBatchResponse), OPTIONS)
|
evidence(partialBatchResponse), OPTIONS)
|
||||||
context.assert(MODULE, '短拣批次只进入待确认且保留SKIP事实', partialBatchResponse,
|
context.assert(MODULE, '短拣批次只进入待确认且保留SKIP事实', partialBatchResponse,
|
||||||
partialBatch?.taskStatus === 'LOADING' && partialBatch?.workflowStatus === 'AWAITING_REVIEW'
|
partialBatch?.taskStatus === 'LOADING' && partialBatch?.workflowStatus === 'AWAITING_REVIEW'
|
||||||
&& partialBatch?.items?.some((item) => id(item?.id) === id(partialTarget.id)
|
&& partialBatch?.items?.filter((item) => id(item?.inboundId) === skippedInboundId)
|
||||||
&& item?.itemStatus === 'SKIPPED' && Number(item?.pickedPackageCount) === 0),
|
.every((item) => item?.itemStatus === 'SKIPPED' && Number(item?.pickedPackageCount) === 0),
|
||||||
`taskStatus=${partialBatch?.taskStatus || 'missing'}, workflow=${partialBatch?.workflowStatus || 'missing'}`, OPTIONS)
|
`taskStatus=${partialBatch?.taskStatus || 'missing'}, workflow=${partialBatch?.workflowStatus || 'missing'}`, OPTIONS)
|
||||||
const partialTaskBeforeComplete = taskSignature(partialBatch)
|
const partialTaskBeforeComplete = taskSignature(partialBatch)
|
||||||
const partialCompleteResponse = await context.request('POST', `${PDA}/tasks/${partialPda.taskId}/complete`, {
|
const partialCompleteResponse = await context.request('POST', `${PDA}/tasks/${partialPda.taskId}/complete`, {
|
||||||
|
|||||||
Reference in New Issue
Block a user