test: extend eight-business acceptance flows and offline contracts
This commit is contained in:
@@ -7,8 +7,17 @@ const count = value => /^\d+$/.test(String(value)) && Number.isSafeInteger(Numbe
|
||||
const stable = value => JSON.stringify(value, (_, item) => item && typeof item === 'object' && !Array.isArray(item)
|
||||
? Object.fromEntries(Object.keys(item).sort().map(key => [key, item[key]])) : item)
|
||||
|
||||
/** 客户原申请的单箱贴标作业链;只准备真实待排车结果,不借其他换标样本。 */
|
||||
export async function verifyClientRelabelFulfillment(context, { proof, merchantToken, pdaToken, checkpoint, delay = () => new Promise(resolve => setTimeout(resolve, 1000)) }) {
|
||||
/** 原申请单箱贴标作业链;独立贴标准备排车,关联转运恢复原单预留。 */
|
||||
export async function verifyClientRelabelFulfillment(context, { proof, transferProof, merchantToken, pdaToken, checkpoint, delay = () => new Promise(resolve => setTimeout(resolve, 1000)) }) {
|
||||
// 已有库存转运的换标必须回到原转运预留,不进入普通贴标排车链。
|
||||
if (transferProof && (context.createdResources?.phase4OverseasClientServices?.transferFulfillment !== transferProof
|
||||
|| transferProof.relabelFulfillment !== proof || transferProof.marker !== context.marker
|
||||
|| transferProof.status !== 'WAIT_RELABEL' || transferProof.allocation?.status !== 'ALLOCATED_WAIT_RELABEL'
|
||||
|| transferProof.relabelNo !== proof?.relabelNo || transferProof.transferNo !== proof?.sourceOrderNo
|
||||
|| transferProof.customerId !== proof?.customerId || transferProof.warehouseId !== proof?.warehouseId
|
||||
|| transferProof.sourcePositionId !== proof?.sourcePositionId || transferProof.sourcePalletNo !== proof?.sourcePalletNo)) {
|
||||
throw new Error('转运关联换标缺少原分配证据')
|
||||
}
|
||||
if (proof?.marker !== context.marker || !proof?.relabelNo || !merchantToken || !pdaToken
|
||||
|| proof.customerId !== String(context.context?.merchantQualificationFixture?.tenantId)
|
||||
|| !validId(proof.warehouseId) || !validId(proof.sourcePositionId) || !proof.sourcePalletNo) {
|
||||
@@ -18,10 +27,10 @@ export async function verifyClientRelabelFulfillment(context, { proof, merchantT
|
||||
if (!/^[A-Za-z0-9_-]{1,100}$/.test(context.marker)) throw new Error('贴标批次标识不合法')
|
||||
const evidence = proof.execution = { status: 'RUNNING', requests: [] }
|
||||
let initialized = false
|
||||
const directory = new URL('../../reports/client-relabel-checkpoints/', import.meta.url)
|
||||
const directory = new URL(transferProof ? '../../reports/transfer-relabel-checkpoints/' : '../../reports/client-relabel-checkpoints/', import.meta.url)
|
||||
const persist = checkpoint || (async () => {
|
||||
await mkdir(directory, { recursive: true })
|
||||
await writeFile(new URL(`${context.marker}.json`, directory), JSON.stringify(proof, null, 2),
|
||||
await writeFile(new URL(`${context.marker}.json`, directory), JSON.stringify(transferProof || proof, null, 2),
|
||||
{ encoding: 'utf8', flag: initialized ? 'w' : 'wx' })
|
||||
initialized = true
|
||||
})
|
||||
@@ -61,7 +70,11 @@ export async function verifyClientRelabelFulfillment(context, { proof, merchantT
|
||||
require('贴标原申请客户、仓库、来源仓位与待审核状态一致', sameApplication(original)
|
||||
&& original.application.status === 'PENDING_REVIEW' && original.items?.length === 1
|
||||
&& String(original.items[0].sourceInventoryPositionId) === proof.sourcePositionId)
|
||||
const reviewed = await command('PUT', `${platform}/status`, { status: 'PENDING_PROCESSING', remark: context.marker }, context.token)
|
||||
require('贴标审核渠道与业务来源一致', original.application.reviewChannel === (transferProof ? 'RELABEL_ORDER' : 'TAIL_ORDER')
|
||||
&& validId(original.application.lastlegOrderId))
|
||||
const reviewPath = transferProof ? `${platform}/status`
|
||||
: `/api/platform/v1/last-leg/orders/${original.application.lastlegOrderId}/relabel-review?customerId=${encodeURIComponent(proof.customerId)}`
|
||||
const reviewed = await command('PUT', reviewPath, { status: 'PENDING_PROCESSING', remark: context.marker }, context.token)
|
||||
require('贴标审核推进同一申请', sameApplication(reviewed) && reviewed.application.status === 'PENDING_PROCESSING')
|
||||
let funded
|
||||
for (let attempt = 0; attempt < 31; attempt++) {
|
||||
@@ -120,12 +133,25 @@ export async function verifyClientRelabelFulfillment(context, { proof, merchantT
|
||||
const confirm = { idempotencyKey: key('confirm'), remark: context.marker }
|
||||
const confirmed = await command('POST', `${merchant}/confirm-completion`, confirm, merchantToken)
|
||||
const finalReplay = await command('POST', `${merchant}/confirm-completion`, confirm, merchantToken)
|
||||
require('客户确认原申请进入待排车且原键重放零漂移', sameApplication(confirmed)
|
||||
&& confirmed.application.status === 'READY_FOR_OUTBOUND' && confirmed.application.fulfillmentStatus === 'WAIT_PRE_DISPATCH'
|
||||
require('客户确认原申请进入对应出库流程且原键重放零漂移', sameApplication(confirmed)
|
||||
&& confirmed.application.status === 'READY_FOR_OUTBOUND'
|
||||
&& confirmed.application.fulfillmentStatus === (transferProof ? 'WAIT_TRANSFER_OUTBOUND' : 'WAIT_PRE_DISPATCH')
|
||||
&& stable(confirmed) === stable(finalReplay))
|
||||
if (transferProof) {
|
||||
const transfer = await command('GET', `/api/platform/v1/last-leg/warehouse-transfers/${encodeURIComponent(transferProof.transferNo)}?customerId=${encodeURIComponent(proof.customerId)}`, undefined, context.token)
|
||||
const active = transfer?.allocations?.filter(row => row.status === 'RESERVED') || []
|
||||
require('关联换标完成后原转运保留新SKU实托唯一预留', transfer?.transferNo === transferProof.transferNo
|
||||
&& transfer.status === 'ALLOCATED' && transfer.relabelNo === proof.relabelNo
|
||||
&& String(transfer.relabelApplicationId) === transferProof.relabelApplicationId
|
||||
&& active.length === 1 && active[0].packageCount === 1 && String(active[0].palletId) === String(target.palletId)
|
||||
&& active[0].inboundCode === transferProof.inboundCode && validId(active[0].inventoryPositionId)
|
||||
&& active[0].skuCode === item.skuItems[0].newSkuCode)
|
||||
Object.assign(transferProof, { status: 'ALLOCATED', outboundAllocations: active })
|
||||
}
|
||||
Object.assign(proof, { status: 'READY_FOR_OUTBOUND', targetPalletIds: [String(target.palletId)],
|
||||
sourceCartonMarks: [item.cartonMark], relabelCartonMarks: [item.fbaCartonMark].filter(Boolean) })
|
||||
evidence.status = 'HTTP_VERIFIED_READY_FOR_DISPATCH'; await persist(); return proof
|
||||
evidence.status = transferProof ? 'HTTP_VERIFIED_READY_FOR_TRANSFER_OUTBOUND' : 'HTTP_VERIFIED_READY_FOR_DISPATCH'
|
||||
await persist(); return proof
|
||||
} catch (error) {
|
||||
evidence.status = 'FAILED'; evidence.failure = error.message; await persist(); throw error
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user