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
@@ -339,9 +339,9 @@ export async function run(context) {
&& closeTo(rescan?.lengthCm, replacement.length),
`sameItem=${asId(rescan?.itemId) === asId(firstScan.itemId)}, confirmedPackageCount=${rescan?.confirmedPackageCount ?? 'missing'}`, OPTIONS)
const measuredResponse = await context.request('GET', measurementPath)
const measured = context.apiSuccess(MODULE, '回查覆盖后的尺寸与体积结果', measuredResponse, '', OPTIONS)
const measuredItem = measured?.items?.find((item) => asId(item.id) === asId(firstScan.itemId))
let measuredResponse = await context.request('GET', measurementPath)
let measured = context.apiSuccess(MODULE, '回查覆盖后的尺寸与体积结果', measuredResponse, '', OPTIONS)
let measuredItem = measured?.items?.find((item) => asId(item.id) === asId(firstScan.itemId))
// The verified customer rule maps this scan to EXTRA_LARGE 60x50x50cm and adds 2cm per edge.
const weightedOuter = { length: 64, width: 54, height: 54 }
const unitVolume = halfUp(
@@ -362,6 +362,63 @@ export async function run(context) {
&& closeTo(measured.actualVolumeCbm, totalVolume) && closeTo(measured.volumeWeightKg, volumeWeight),
`weightedOuter=${weightedOuter.length}x${weightedOuter.width}x${weightedOuter.height}, unitVolume=${unitVolume}, totalVolume=${totalVolume}, volumeWeight=${volumeWeight}, girth=${girth}`, OPTIONS)
const incrementalDetailCount = Number(context.context?.phase3LoadingIncrementalDetailCount || 1)
if (incrementalDetailCount > 1) {
const packagesPerDetail = Number(context.context?.phase3LoadingIncrementalPackageCount || 1)
const expectedPackages = incrementalDetailCount * packagesPerDetail
context.assert(MODULE, '动态增量多明细箱数前置与冻结总数一致', measuredResponse,
expectedPackages === originalPackageCount,
`detailCount=${incrementalDetailCount}, packagesPerDetail=${packagesPerDetail}, frozen=${originalPackageCount}`, OPTIONS)
if (expectedPackages === originalPackageCount) {
const resetFirstCountResponse = await context.request('PUT',
`/api/platform/v1/first-leg/inbounds/${inboundId}/measurement/items/${firstScan.itemId}/confirmed-package-count?${query(tenantId)}`,
{ measurementVersion: Number(measured?.version), confirmedPackageCount: packagesPerDetail })
const resetFirstCount = context.apiSuccess(MODULE,
'增量 fixture 将首条货物确认箱数恢复为自身两箱', resetFirstCountResponse,
`itemId=${asId(firstScan.itemId)}, confirmedPackageCount=${packagesPerDetail}`, OPTIONS)
context.assert(MODULE, '增量首条货物箱数和版本更新正确', resetFirstCountResponse,
Number(resetFirstCount?.confirmedPackageCount) === packagesPerDetail
&& Number(resetFirstCount?.measurementVersion) === Number(measured?.version) + 1,
`version=${resetFirstCount?.measurementVersion ?? 'missing'}`, OPTIONS)
for (let detailIndex = 1; detailIndex < incrementalDetailCount; detailIndex += 1) {
const cartonIndex = detailIndex * packagesPerDetail + 1
const detailBoxCode = `${inboundCode}#${originalPackageCount}-${cartonIndex}`
const scanResponse = await multipartRequest(context, scanPath, {
boxCode: detailBoxCode, ...replacement,
scannedShipmentId: `FBA-${context.marker.slice(-12)}-${String(detailIndex + 2).padStart(2, '0')}`,
machineNo: `MJ-ADMIN-E2E-INC-${detailIndex + 1}`,
measuredAt: new Date().toISOString().slice(0, 19),
})
const scanned = context.apiSuccess(MODULE,
`增量 fixture 扫描第${detailIndex + 1}条独立货物箱码`, scanResponse,
`boxCode=${detailBoxCode}`, OPTIONS)
context.assert(MODULE, `增量第${detailIndex + 1}条扫描解析独立货物`, scanResponse,
scanned?.created === true && asId(scanned?.itemId)
&& asId(scanned?.itemId) !== asId(firstScan.itemId),
`itemId=${asId(scanned?.itemId) || 'missing'}, inboundDetailId=${asId(scanned?.inboundDetailId) || 'pending-query'}`, OPTIONS)
if (!scanned?.itemId) continue
const countDetailResponse = await context.request('PUT',
`/api/platform/v1/first-leg/inbounds/${inboundId}/measurement/items/${scanned.itemId}/confirmed-package-count?${query(tenantId)}`,
{ measurementVersion: Number(scanned.measurementVersion), confirmedPackageCount: packagesPerDetail })
const countDetail = context.apiSuccess(MODULE,
`增量第${detailIndex + 1}条货物确认自身箱数`, countDetailResponse,
`confirmedPackageCount=${packagesPerDetail}`, OPTIONS)
context.assert(MODULE, `增量第${detailIndex + 1}条货物箱数更新正确`, countDetailResponse,
Number(countDetail?.confirmedPackageCount) === packagesPerDetail,
`measurementVersion=${countDetail?.measurementVersion ?? 'missing'}`, OPTIONS)
}
measuredResponse = await context.request('GET', measurementPath)
measured = context.apiSuccess(MODULE, '回查增量 fixture 四条测量明细', measuredResponse, '', OPTIONS)
measuredItem = measured?.items?.find((item) => asId(item.id) === asId(firstScan.itemId))
const detailIds = new Set((measured?.items || []).map((item) => asId(item?.inboundDetailId)).filter(Boolean))
context.assert(MODULE, '增量 fixture 形成四条真实独立货物测量明细', measuredResponse,
detailIds.size >= incrementalDetailCount
&& measured.items.filter((item) => detailIds.has(asId(item?.inboundDetailId))).length >= incrementalDetailCount,
`measurementItems=${measured?.items?.length ?? 'missing'}, distinctInboundDetails=${detailIds.size}`, OPTIONS)
}
}
let inboundDetailId = measuredItem?.inboundDetailId
if (!inboundDetailId) {
const orderId = asId(frozenSummary?.orderId || context.createdResources?.orders?.orderId)
@@ -387,10 +444,18 @@ export async function run(context) {
return
}
const draftPayload = {
measurementId: measured.measurementId, version: Number(measured.version),
actualGoodsName: `墨家测量验收-${context.marker.slice(-12)}`,
items: [{
const draftItems = incrementalDetailCount > 1
? (measured?.items || []).filter((item) => asId(item?.inboundDetailId) && asId(item?.intelligentImageFileId))
.slice(0, incrementalDetailCount).map((item) => ({
inboundDetailId: item.inboundDetailId, itemNo: item.itemNo,
boxSpecification: item.boxSpecification, packageCount: Number(item.confirmedPackageCount),
lengthCm: Number(item.lengthCm), widthCm: Number(item.widthCm), heightCm: Number(item.heightCm),
intelligentImageFileId: item.intelligentImageFileId,
overLimitWarning: item.overLimitWarning ?? null,
outerLengthCm: item.outerLengthCm ?? null, outerWidthCm: item.outerWidthCm ?? null,
outerHeightCm: item.outerHeightCm ?? null, remark: context.marker,
}))
: [{
inboundDetailId, itemNo: measuredItem.itemNo,
boxSpecification: measuredItem.boxSpecification, packageCount: originalPackageCount,
lengthCm: replacement.length, widthCm: replacement.width, heightCm: replacement.height,
@@ -398,12 +463,16 @@ export async function run(context) {
overLimitWarning: measuredItem.overLimitWarning ?? null,
outerLengthCm: measuredItem.outerLengthCm ?? null, outerWidthCm: measuredItem.outerWidthCm ?? null,
outerHeightCm: measuredItem.outerHeightCm ?? null, remark: context.marker,
}],
}]
const draftPayload = {
measurementId: measured.measurementId, version: Number(measured.version),
actualGoodsName: `墨家测量验收-${context.marker.slice(-12)}`,
items: draftItems,
}
const draftResponse = await context.request('PUT',
`/api/platform/v1/first-leg/inbounds/${inboundId}/measurement/draft?${query(tenantId)}`, draftPayload)
const draft = context.apiSuccess(MODULE, '保存同一测量批次草稿', draftResponse,
`measurementId=${asId(measured.measurementId)}, items=1`, OPTIONS)
`measurementId=${asId(measured.measurementId)}, items=${draftItems.length}`, OPTIONS)
context.assert(MODULE, '草稿沿用批次并递增版本', draftResponse,
asId(draft?.measurementId) === asId(measured.measurementId)
&& Number(draft?.version) === Number(measured.version) + 1 && draft?.status === 'DRAFT',