test: align phase3 and overseas business acceptance

This commit is contained in:
2026-08-25 13:06:09 +08:00
parent d686b05966
commit 995c1833f8
8 changed files with 269 additions and 84 deletions
@@ -248,14 +248,32 @@ async function procurementFlow(context, prerequisite) {
const rejected = await overseas(context, 'POST', '驳回本轮采购订单并进入合法终态',
query(`${BASE}/overseas-procurements/${encodeURIComponent(owned.orderNo)}/review`, { customerId }),
{ decision: 'REJECT', remark: `${context.marker}-REJECTED` })
{ version: Number(afterConflictSummary?.version), decision: 'REJECT',
idempotencyKey: `${context.marker}-procurement-review-reject`.slice(0, 255),
remark: `${context.marker}-REJECTED` })
const rejectedSummary = summary(rejected.data)
context.assert(MODULE, '采购审核正向驳回成功', rejected.response,
rejectedSummary?.status === 'REJECTED' && Number(rejectedSummary?.version) === Number(clearedSummary?.version) + 1,
`status=${rejectedSummary?.status || 'missing'}, version=${rejectedSummary?.version ?? 'missing'}; ${trace(rejected.response)}`, OPTIONS)
const rejectedReplayBody = { version: Number(afterConflictSummary?.version), decision: 'REJECT',
idempotencyKey: `${context.marker}-procurement-review-reject`.slice(0, 255),
remark: `${context.marker}-REJECTED` }
const rejectedReplay = await overseas(context, 'POST', '采购审核同键同载荷精确重放',
query(`${BASE}/overseas-procurements/${encodeURIComponent(owned.orderNo)}/review`, { customerId }),
rejectedReplayBody)
context.assert(MODULE, '采购审核重放复用终态且版本不漂移', rejectedReplay.response,
summary(rejectedReplay.data)?.status === 'REJECTED'
&& Number(summary(rejectedReplay.data)?.version) === Number(rejectedSummary?.version),
trace(rejectedReplay.response), OPTIONS)
const reviewHashConflict = await context.requestOverseas('POST',
query(`${BASE}/overseas-procurements/${encodeURIComponent(owned.orderNo)}/review`, { customerId }),
{ ...rejectedReplayBody, remark: 'DIFFERENT-DO-NOT-APPLY' })
expectedConflict(context, '采购审核同键异载荷返回冲突', reviewHashConflict)
const reverseReview = await context.requestOverseas('POST',
query(`${BASE}/overseas-procurements/${encodeURIComponent(owned.orderNo)}/review`, { customerId }),
{ decision: 'APPROVE', remark: 'REVERSE-DO-NOT-APPLY' })
{ version: Number(rejectedSummary?.version), decision: 'APPROVE',
idempotencyKey: `${context.marker}-procurement-review-terminal-reverse`.slice(0, 255),
remark: 'REVERSE-DO-NOT-APPLY' })
expectedConflict(context, '采购审核终态逆向返回冲突', reverseReview)
const final = await overseas(context, 'GET', '采购最终状态与流水回查', path)
@@ -328,8 +346,11 @@ async function cancelMarkerOrder(context, resource, base, cancellableStatuses, l
return
}
const statusPath = query(`${base}/${encodeURIComponent(resource.orderNo)}/status`, { customerId: resource.customerId })
const keyScope = label === '卡车' ? 'truck' : 'looseboard'
const cancelled = await overseas(context, 'PATCH', `取消 marker ${label}订单`, statusPath,
{ version: Number(currentSummary.version), status: 'CANCELLED', remark: `${context.marker}-acceptance-cleanup` })
{ version: Number(currentSummary.version), status: 'CANCELLED',
idempotencyKey: `${context.marker}-${keyScope}-${resource.orderNo}-cancel`.slice(0, 255),
remark: `${context.marker}-acceptance-cleanup` })
const cancelledSummary = summary(cancelled.data)
const verified = await overseas(context, 'GET', `回查 marker ${label}订单最终状态`, detailPath)
const finalSummary = summary(verified.data)
@@ -381,17 +402,29 @@ async function truckFlow(context, customerId) {
afterStaleSummary?.destination === after?.destination && Number(afterStaleSummary?.version) === Number(after?.version),
`destination=${afterStaleSummary?.destination || 'missing'}, version=${afterStaleSummary?.version ?? 'missing'}; ${trace(afterStale.response)}`, OPTIONS)
const statusPath = query(`${base}/${encodeURIComponent(orderNo)}/status`, { customerId })
const forwarded = await overseas(context, 'PATCH', '卡车状态正向推进到待入仓', statusPath,
{ version: Number(afterStaleSummary?.version), status: 'WAITING_INBOUND', remark: `${context.marker}-FORWARD` })
const reviewPath = query(`${base}/${encodeURIComponent(orderNo)}/review`, { customerId })
const reviewBody = { version: Number(afterStaleSummary?.version), decision: 'APPROVE',
idempotencyKey: `${context.marker}-truck-review-approve`.slice(0, 255),
remark: `${context.marker}-FORWARD` }
const forwarded = await overseas(context, 'POST', '卡车审核正向推进到待入仓', reviewPath, reviewBody)
const forwardedSummary = summary(forwarded.data)
context.assert(MODULE, '卡车状态正向推进成功', forwarded.response,
forwardedSummary?.status === 'WAITING_INBOUND'
&& Number(forwardedSummary?.version) === Number(afterStaleSummary?.version) + 1,
`status=${forwardedSummary?.status || 'missing'}, version=${forwardedSummary?.version ?? 'missing'}; ${trace(forwarded.response)}`, OPTIONS)
const reversed = await context.requestOverseas('PATCH', statusPath,
{ version: Number(forwardedSummary?.version), status: 'PENDING_REVIEW', remark: 'REVERSE-DO-NOT-APPLY' })
expectedConflict(context, '卡车状态逆向回退返回冲突', reversed)
const reviewReplay = await overseas(context, 'POST', '卡车审核同键同载荷精确重放', reviewPath, reviewBody)
context.assert(MODULE, '卡车审核重放复用待入仓终态且版本不漂移', reviewReplay.response,
summary(reviewReplay.data)?.status === 'WAITING_INBOUND'
&& Number(summary(reviewReplay.data)?.version) === Number(forwardedSummary?.version),
trace(reviewReplay.response), OPTIONS)
const reviewMismatch = await context.requestOverseas('POST', reviewPath,
{ ...reviewBody, remark: 'DIFFERENT-DO-NOT-APPLY' })
expectedConflict(context, '卡车审核同键异载荷返回冲突', reviewMismatch)
const reversed = await context.requestOverseas('POST', reviewPath,
{ version: Number(forwardedSummary?.version), decision: 'REJECT',
idempotencyKey: `${context.marker}-truck-review-terminal-reverse`.slice(0, 255),
remark: 'REVERSE-DO-NOT-APPLY' })
expectedConflict(context, '卡车审核终态逆向返回冲突', reversed)
const history = await overseas(context, 'GET', '卡车状态冲突后流水回查', path)
const historySummary = summary(history.data)
const histories = Array.isArray(history.data?.histories) ? history.data.histories : []
@@ -448,14 +481,30 @@ async function looseboardFlow(context, customerId) {
const statusPath = query(`${base}/${encodeURIComponent(orderNo)}/status`, { customerId })
const forwarded = await overseas(context, 'PATCH', '散板状态正向推进到已派车', statusPath,
{ version: Number(afterStaleSummary?.version), status: 'DISPATCHED', remark: `${context.marker}-FORWARD` })
{ version: Number(afterStaleSummary?.version), status: 'DISPATCHED',
idempotencyKey: `${context.marker}-looseboard-status-dispatched`.slice(0, 255),
remark: `${context.marker}-FORWARD` })
const forwardedSummary = summary(forwarded.data)
context.assert(MODULE, '散板状态正向推进成功', forwarded.response,
forwardedSummary?.status === 'DISPATCHED'
&& Number(forwardedSummary?.version) === Number(afterStaleSummary?.version) + 1,
`status=${forwardedSummary?.status || 'missing'}, version=${forwardedSummary?.version ?? 'missing'}; ${trace(forwarded.response)}`, OPTIONS)
const forwardBody = { version: Number(afterStaleSummary?.version), status: 'DISPATCHED',
idempotencyKey: `${context.marker}-looseboard-status-dispatched`.slice(0, 255),
remark: `${context.marker}-FORWARD` }
const forwardReplay = await overseas(context, 'PATCH', '散板状态同键同载荷精确重放', statusPath,
forwardBody)
context.assert(MODULE, '散板状态重放复用已派车终态且版本不漂移', forwardReplay.response,
summary(forwardReplay.data)?.status === 'DISPATCHED'
&& Number(summary(forwardReplay.data)?.version) === Number(forwardedSummary?.version),
trace(forwardReplay.response), OPTIONS)
const forwardMismatch = await context.requestOverseas('PATCH', statusPath,
{ ...forwardBody, remark: 'DIFFERENT-DO-NOT-APPLY' })
expectedConflict(context, '散板状态同键异载荷返回冲突', forwardMismatch)
const reversed = await context.requestOverseas('PATCH', statusPath,
{ version: Number(forwardedSummary?.version), status: 'PENDING_ACCEPTANCE', remark: 'REVERSE-DO-NOT-APPLY' })
{ version: Number(forwardedSummary?.version), status: 'PENDING_ACCEPTANCE',
idempotencyKey: `${context.marker}-looseboard-status-terminal-reverse`.slice(0, 255),
remark: 'REVERSE-DO-NOT-APPLY' })
expectedConflict(context, '散板状态逆向回退返回冲突', reversed)
const history = await overseas(context, 'GET', '散板状态冲突后流水回查', path)
const historySummary = summary(history.data)
@@ -501,7 +550,9 @@ async function finalizePendingPurchase(context, resource) {
const rejected = await overseas(context, 'POST', '驳回未完成的本轮采购订单',
query(`${BASE}/overseas-procurements/${encodeURIComponent(resource.orderNo)}/review`,
{ customerId: resource.customerId }),
{ decision: 'REJECT', remark: `${context.marker}-prerequisite-cleanup` })
{ version: Number(currentSummary?.version), decision: 'REJECT',
idempotencyKey: `${context.marker}-procurement-review-cleanup`.slice(0, 255),
remark: `${context.marker}-prerequisite-cleanup` })
const rejectedSummary = summary(rejected.data)
const verified = await overseas(context, 'GET', '回查未完成采购订单最终状态', path)
const finalSummary = summary(verified.data)