fix(dropship): preserve carton quantities and shared pallet outbound ownership
This commit is contained in:
@@ -16,6 +16,16 @@ const MODULE = 'dropship-pallet-matrix'
|
||||
const BASE = '/api/platform/v1/first-leg/pda-dropship'
|
||||
const OPTIONS = { scenario: MODULE, deploymentBlocker: true }
|
||||
|
||||
export function sameOutboundTask(left, right) {
|
||||
const databaseTime = (value) => {
|
||||
const match = typeof value === 'string' && value.match(/^(.*T\d{2}:\d{2}:\d{2})(?:\.(\d+))?$/)
|
||||
return match ? Date.parse(match[1]) + Math.round(Number(`0.${match[2] || '0'}`) * 1000) : NaN
|
||||
}
|
||||
return ['id', 'taskNo', 'outboundNo', 'status'].every((key) => left?.[key] === right?.[key])
|
||||
&& ['pushedAt', 'completedAt'].every((key) => left?.[key] == null && right?.[key] == null
|
||||
|| Number.isFinite(databaseTime(left?.[key])) && databaseTime(left[key]) === databaseTime(right?.[key]))
|
||||
}
|
||||
|
||||
// Domestic producer stage: these retained loaded fixtures must subsequently be verified
|
||||
// through overseas receipt and dedicated dropship outbound, not generic dispatch.
|
||||
export async function run(context) {
|
||||
@@ -415,12 +425,13 @@ export async function run(context) {
|
||||
const task = await call('创建一件代发专用出库', 'POST', `${base}/one-click-dropship?customerId=${customerId}`, body)
|
||||
for (const record of group) record.outbound = { task, selected, completed: false }
|
||||
const replay = await call('专用出库创建同键重放', 'POST', `${base}/one-click-dropship?customerId=${customerId}`, body)
|
||||
check(`${label}专用出库重放不重复建单`, null, JSON.stringify(replay) === JSON.stringify(task))
|
||||
check(`${label}专用出库重放不重复建单`, null, sameOutboundTask(replay, task))
|
||||
const pdaPath = `/api/pda/v1/last-leg/outbound-tasks/${task.taskNo}`
|
||||
const detail = await call('PDA读取专用出库任务', 'GET', pdaPath, undefined, true)
|
||||
check(`${label}PDA出库明细完整`, null, detail.items?.length === inputs.length)
|
||||
for (const [index, candidate] of selected.entries()) {
|
||||
const item = detail.items.find((row) => row.palletNo === candidate.palletNo && row.skuCode === candidate.skuCode)
|
||||
const item = detail.items.find((row) => row.palletNo === candidate.palletNo && row.skuCode === candidate.skuCode
|
||||
&& row.inboundCode === candidate.inboundCode)
|
||||
check(`${label}PDA拣货来源仓位和入仓码一致`, null, Boolean(item)
|
||||
&& item.positions?.some((position) => String(position.inventoryPositionId) === String(candidate.inventoryPositionId)
|
||||
&& position.inboundCode === candidate.inboundCode))
|
||||
@@ -429,16 +440,18 @@ export async function run(context) {
|
||||
cartonMarks: inputs[index].cartonMarks, idempotencyKey: `${context.marker}-outbound-pick-${index}` }
|
||||
const picked = await call('PDA专用出库拣货', 'POST', `${pdaPath}/pick`, pick, true)
|
||||
const repeated = await call('PDA出库拣货同键重放', 'POST', `${pdaPath}/pick`, pick, true)
|
||||
check(`${label}PDA出库拣货重放不重复扣减`, null, JSON.stringify(repeated) === JSON.stringify(picked))
|
||||
check(`${label}PDA出库拣货重放不重复扣减`, null, sameOutboundTask(repeated, picked))
|
||||
}
|
||||
const completion = { idempotencyKey: `${context.marker}-outbound-complete` }
|
||||
const completed = await call('PDA完成专用出库', 'POST', `${pdaPath}/complete`, completion, true)
|
||||
const repeated = await call('PDA专用出库完成重放', 'POST', `${pdaPath}/complete`, completion, true)
|
||||
check(`${label}专用出库任务完成且重放稳定`, null,
|
||||
completed.status === 'COMPLETED' && JSON.stringify(repeated) === JSON.stringify(completed))
|
||||
completed.status === 'COMPLETED' && sameOutboundTask(repeated, completed),
|
||||
JSON.stringify({ completed, repeated }))
|
||||
const outbound = await call('回查专用出库单终态', 'GET', `${base}/${task.outboundNo}`)
|
||||
check(`${label}专用出库单真实完成且箱数核平`, null,
|
||||
outbound.outbound?.status === 'OUTBOUNDED' && outbound.outbound?.outboundType === 'ONE_CLICK_DROPSHIP'
|
||||
&& Number(outbound.outbound.palletCount) === new Set(selected.map((item) => item.palletNo)).size
|
||||
&& Number(outbound.outbound.packageCount) === inputs.reduce((sum, item) => sum + item.packages, 0)
|
||||
&& outbound.pallets.every((item) => Number(item.packageCount) === Number(item.pickedPackageCount)))
|
||||
const remaining = await call('回查专用出库可用库存扣减', 'GET', candidatePath)
|
||||
|
||||
Reference in New Issue
Block a user