优化
This commit is contained in:
@@ -312,63 +312,32 @@ export async function runUntilPickupReady(context) {
|
||||
}
|
||||
|
||||
export async function run(context) {
|
||||
let pickup = context.createdResources?.phase4CarrierPickupReady
|
||||
if (pickup?.marker !== context.marker || pickup?.ready !== true) {
|
||||
await runUntilPickupReady(context)
|
||||
pickup = context.createdResources?.phase4CarrierPickupReady
|
||||
}
|
||||
if (!pickup?.queryId) return
|
||||
|
||||
const queryId = id(pickup.queryId)
|
||||
const detailResponse = await context.request('GET', `${BASE}/${encodeURIComponent(queryId)}`)
|
||||
let detail = context.apiSuccess(MODULE, 'PDA收货完成后恢复本轮船节点任务', detailResponse,
|
||||
`queryId=${queryId}`, OPTIONS)
|
||||
assertDetail(context, detailResponse, detail, '恢复任务详情DTO完整')
|
||||
const pickupTask = detail?.query?.query
|
||||
if (pickupTask?.latestActualNode !== 'PICKUP_READY' || pickupTask?.status === 'STOPPED') {
|
||||
blocker(context, 'PDA收货后船节点未停留在PICKUP_READY,禁止伪造后续节点',
|
||||
`latest=${pickupTask?.latestActualNode || 'missing'}, status=${pickupTask?.status || 'missing'}`, detailResponse)
|
||||
const pickup = context.createdResources?.phase4CarrierPickupReady
|
||||
const drayage = context.createdResources?.phase5TerminalDrayage
|
||||
if (pickup?.marker !== context.marker || pickup?.ready !== true || !pickup?.queryId
|
||||
|| drayage?.marker !== context.marker || drayage?.finalStatus !== 'EMPTY_RETURNED') {
|
||||
blocker(context, '取得本轮码头拖车还柜终态',
|
||||
`pickup=${pickup?.ready === true}, drayageMarker=${drayage?.marker || 'missing'}, drayageStatus=${drayage?.finalStatus || 'missing'}`)
|
||||
return
|
||||
}
|
||||
|
||||
let version = Number(pickupTask.version)
|
||||
const frozenLatestActualMs = Date.parse(`${pickupTask.latestActualAt}Z`)
|
||||
const baseActual = (Number.isNaN(frozenLatestActualMs) ? Date.now() : frozenLatestActualMs) + 60 * 60_000
|
||||
const remainingNodes = STANDARD_NODES.slice(STANDARD_NODES.indexOf('PICKED_UP'))
|
||||
for (let index = 0; index < remainingNodes.length; index += 1) {
|
||||
const standardNode = remainingNodes[index]
|
||||
const actualAt = localIso(new Date(baseActual + index * 60_000))
|
||||
const body = manualNodePayload({ expectedVersion: version, standardNode,
|
||||
observedAt: localIso(new Date()), actualAt, marker: context.marker,
|
||||
index: STANDARD_NODES.indexOf(standardNode) + 1 })
|
||||
const key = `${context.marker}-carrier-actual-${String(STANDARD_NODES.indexOf(standardNode) + 1).padStart(2, '0')}`.slice(0, 128)
|
||||
const response = await context.request('POST', `${BASE}/${queryId}/manual-nodes`, body,
|
||||
context.token, { 'Idempotency-Key': key })
|
||||
const updated = context.apiSuccess(MODULE, `PDA完成后补录实际节点${standardNode}`, response,
|
||||
`queryId=${queryId}`, OPTIONS)
|
||||
assertDetail(context, response, updated, `实际节点${standardNode}响应DTO完整`)
|
||||
const updatedTask = updated?.query?.query
|
||||
const isEmptyReturned = standardNode === 'EMPTY_RETURNED'
|
||||
context.assert(MODULE, `${standardNode}实际事实单调推进且停止语义正确`, response,
|
||||
updatedTask?.latestActualNode === standardNode && updatedTask?.latestActualAt === actualAt
|
||||
&& (isEmptyReturned
|
||||
? updatedTask.status === 'STOPPED' && updatedTask.stopReason === '已还柜' && updatedTask.stoppedAt != null
|
||||
: updatedTask.status !== 'STOPPED'),
|
||||
`status=${updatedTask?.status || 'missing'}, latest=${updatedTask?.latestActualNode || 'none'}`, OPTIONS)
|
||||
version = Number(updatedTask.version)
|
||||
detail = updated
|
||||
}
|
||||
const queryId = id(pickup.queryId)
|
||||
const detailResponse = await context.request('GET', `${BASE}/${encodeURIComponent(queryId)}`)
|
||||
const detail = context.apiSuccess(MODULE, '码头拖车完成后回查本轮船节点任务', detailResponse,
|
||||
`queryId=${queryId}`, OPTIONS)
|
||||
assertDetail(context, detailResponse, detail, '码头拖车回写后任务详情DTO完整')
|
||||
|
||||
const finalTask = detail.query.query
|
||||
const actualNodes = new Set(detail.nodes.filter((item) => item.actualAt != null).map((item) => item.standardNode))
|
||||
context.assert(MODULE, '最终详情覆盖十标准实际节点且只有EMPTY_RETURNED触发停止', detailResponse,
|
||||
context.assert(MODULE, '拖车业务回写后覆盖十标准实际节点且EMPTY_RETURNED停止', detailResponse,
|
||||
STANDARD_NODES.every((node) => actualNodes.has(node)) && finalTask.status === 'STOPPED'
|
||||
&& finalTask.latestActualNode === 'EMPTY_RETURNED' && finalTask.stopReason === '已还柜',
|
||||
&& finalTask.latestActualNode === 'EMPTY_RETURNED' && finalTask.stopReason === '已还柜'
|
||||
&& id(finalTask.containerBookingId) === id(drayage.containerBookingId),
|
||||
`actualNodes=${[...actualNodes].join(',')}, status=${finalTask.status}`, OPTIONS)
|
||||
|
||||
const historyResponse = await context.request('GET', `${BASE}/${queryId}/history`)
|
||||
const history = context.apiSuccess(MODULE, '查询本轮任务不可变历史', historyResponse, `queryId=${queryId}`, OPTIONS)
|
||||
context.assert(MODULE, '历史只含业务动作且人工节点完整留痕', historyResponse,
|
||||
context.assert(MODULE, '历史包含码头拖车回写节点且结构完整', historyResponse,
|
||||
Array.isArray(history) && history.every(validHistory)
|
||||
&& history.filter((item) => item.action === 'MANUAL_NODE').length >= STANDARD_NODES.length,
|
||||
`history=${Array.isArray(history) ? history.length : 'missing'}`, OPTIONS)
|
||||
|
||||
Reference in New Issue
Block a user