优化
This commit is contained in:
@@ -88,7 +88,8 @@ test('container loading follows push, claim, real pick, completed sequence', ()
|
||||
test('bridge loading confirms preload before creating and claiming the PDA task', () => {
|
||||
const value = source('./phase3-loading.mjs')
|
||||
assertOrder(value, [
|
||||
'无真实柜号推送预装成功并冻结柜次明细',
|
||||
'分配后自动建立预装关联且柜次计划可读',
|
||||
'无号推送后预装清单正式可见',
|
||||
'无号 push 成功后 PDA 查询明确 A0404',
|
||||
'push exact replay 对计划版本历史关联和任务零漂移',
|
||||
'无号且未关联订舱仍无 PDA 任务',
|
||||
@@ -111,7 +112,7 @@ test('bridge loading confirms preload before creating and claiming the PDA task'
|
||||
assert.match(value, /计划级确认同 key 异参返回冲突/)
|
||||
assert.match(value, /已确认计划使用新 key 重复确认返回冲突/)
|
||||
assert.doesNotMatch(value, /\/preload\/confirming|\/preload\/confirm\?tenantId=/)
|
||||
assert.doesNotMatch(value.slice(value.indexOf('无真实柜号推送预装成功并冻结柜次明细'), value.indexOf('const linkResponse')),
|
||||
assert.doesNotMatch(value.slice(value.indexOf('分配后自动建立预装关联且柜次计划可读'), value.indexOf('const linkResponse')),
|
||||
/\/transport/)
|
||||
assert.match(value, /missingContainerTaskResponse\.http === 200 && codeOf\(missingContainerTaskResponse\) === 'A0404'/)
|
||||
assert.doesNotMatch(value, /无真实柜号拒绝推送柜次计划|PDA complete后补确认/)
|
||||
@@ -159,22 +160,22 @@ test('PDA completion production and HTTP chain never call or gate on truck appoi
|
||||
assert.doesNotMatch(loading, /\/truck-appointments|completeLoadingFromPda/)
|
||||
})
|
||||
|
||||
test('push replay and both conflict modes preserve the complete pre-PDA snapshot', () => {
|
||||
test('automatic preload bridge repeated reads preserve the complete pre-PDA snapshot', () => {
|
||||
for (const file of ['./phase3-loading.mjs', './phase3-container-loading.mjs']) {
|
||||
const value = source(file)
|
||||
assert.match(value, /const pushRequest = Object\.freeze\([\s\S]*body: Object\.freeze\(\{ expectedVersion:/)
|
||||
assert.match(value, /const pushRequest = Object\.freeze\(\{ path: `\$\{(?:smartLoadingBase|SMART)\}\/plans\/\$\{(?:loadingPlanId|planId)\}` \}\)/)
|
||||
assert.equal((value.match(/request\(context, 'GET', pushRequest\.path\)/g) || []).length >= 4, true)
|
||||
assert.match(value, /push exact replay[\s\S]*零漂移/)
|
||||
assert.match(value, /同 key 异参[\s\S]*新 key 重复 push/)
|
||||
assert.match(value, /非法 push 后回查柜次计划[\s\S]*非法 push 后回查预装历史[\s\S]*非法 push 后回查 bridge/)
|
||||
assert.match(value, /两类非法 push 后计划版本历史关联(?:和)?任务仍?零漂移/)
|
||||
assert.match(value, /自动关联计划重复读取稳定[\s\S]*自动关联计划再次读取稳定/)
|
||||
assert.match(value, /重放后回查柜次计划[\s\S]*重放后回查预装历史[\s\S]*重放后回查 bridge/)
|
||||
assert.match(value, /codeOf\(rejectedTaskResponse\) === 'A0404'/)
|
||||
assert.match(value, /projectPushPreloadStability/)
|
||||
assert.match(value, /diffPushPreloadStability/)
|
||||
assert.match(value, /首次 push 后读取事务完成态柜次计划/)
|
||||
assert.match(value, /事务完成态计划版本与 bridge 一致且保持 EDITING/)
|
||||
assert.match(value, /plan: postPushPlan, detail:/)
|
||||
assert.match(value, /expectedVersion: Number\(postPushPlan\.version\)/)
|
||||
assert.match(value, /changed=\$\{(?:pushReplayDiff|replayDiff|rejectedDiff)\.join/)
|
||||
assert.doesNotMatch(value, /\/plans\/[^'`]*\/push-preload/)
|
||||
assert.doesNotMatch(value, /baselineBytes=|replayBytes=|rejectedBytes=/)
|
||||
}
|
||||
})
|
||||
@@ -215,15 +216,15 @@ test('push stability projection sorts unordered facts and reports persisted fiel
|
||||
])
|
||||
})
|
||||
|
||||
test('push orchestration is transactional and a bridge failure cannot reach PDA creation', () => {
|
||||
test('assignment transaction establishes preload and bridge before PDA synchronization', () => {
|
||||
const service = source('../../firstleg/src/main/java/com/baiyue/firstleg/service/SmartLoadingService.java')
|
||||
const serviceTest = source('../../firstleg/src/test/java/com/baiyue/firstleg/service/SmartLoadingServiceTest.java')
|
||||
const push = service.slice(service.indexOf('public Plan pushPreload'), service.indexOf('private void requirePushReplay'))
|
||||
assert.match(service, /@Transactional[\s\S]*public Plan pushPreload/)
|
||||
assert.match(push, /repository\.push[\s\S]*history\([\s\S]*loadingModelBridge\.bindAllocatedBeforeLoading/)
|
||||
assert.doesNotMatch(push, /loadingPickService\.beginIfReady/)
|
||||
assert.match(serviceTest, /bindingFailureStopsBeforePdaAndPropagatesForTransactionRollback/)
|
||||
assert.match(serviceTest, /verify\(loadingPickService, never\(\)\)\.beginIfReady/)
|
||||
const assign = service.slice(service.indexOf('public Plan assign('), service.indexOf('public Plan assignInbound('))
|
||||
assert.match(service, /@Transactional[\s\S]{0,300}public Plan assign\(/)
|
||||
assert.match(assign, /splitPreloadService\.ensure(?:Pending|ForRunning)[\s\S]*touch\(plan[\s\S]*history\([\s\S]*loadingModelBridge\.bindIncrementalAllocation[\s\S]*loadingPickService\.sync/)
|
||||
assert.match(serviceTest, /addsItemToLoadingPlanWithoutChangingStableTaskOrPlanStatus/)
|
||||
assert.match(serviceTest, /inOrder\(loadingPickService, splitPreloadService, repository, loadingModelBridge\)/)
|
||||
assert.match(serviceTest, /order\.verify\(loadingModelBridge\)\.bindIncrementalAllocation/)
|
||||
})
|
||||
|
||||
test('finalize rechecks the same unified order detail and list as LOADED', () => {
|
||||
@@ -274,9 +275,9 @@ test('container loading arranges a simulation before linking a released booking
|
||||
assertOrder(value, [
|
||||
"const simulationResponse = await request(context, 'POST', CONTAINERS",
|
||||
"const candidateResponse = await context.request('GET', `${SMART}/candidates?bookingId=",
|
||||
"const planResponse = await request(context, 'POST', `${SMART}/plans`",
|
||||
"const planResponse = await request(context, 'GET', `${SMART}/plans/by-booking/",
|
||||
"const assignResponse = await request",
|
||||
'无真实柜号推送预装计划成功',
|
||||
'分配后自动建立预装关联且计划可读',
|
||||
"const bookingCreate = await request",
|
||||
"const linkResponse = await request(context, 'POST', `${CONTAINERS}/${containerId}/ocean-booking-link`",
|
||||
])
|
||||
@@ -304,10 +305,10 @@ test('container loading arranges a simulation before linking a released booking
|
||||
assert.match(value, /bookingId=\$\{encodeURIComponent\(containerId\)\}&warehouseId=/)
|
||||
assert.match(value, /tasks\?loadingPlanId=\$\{encodeURIComponent\(planId\)\}&warehouseId=/)
|
||||
assert.match(value, /loadingPlanId: planId, containerBookingId: containerId/)
|
||||
assert.doesNotMatch(value.slice(value.indexOf('无真实柜号推送预装计划成功'), value.indexOf('const linkResponse')),
|
||||
assert.doesNotMatch(value.slice(value.indexOf('分配后自动建立预装关联且计划可读'), value.indexOf('const linkResponse')),
|
||||
/\/transport/)
|
||||
assert.match(value, /订舱放舱为 RELEASED 且不预生成真实货柜/)
|
||||
assert.match(value, /无真实柜号推送预装计划成功/)
|
||||
assert.match(value, /分配后自动建立预装关联且计划可读/)
|
||||
assert.match(value, /订舱 RELEASED 但预装未 CONFIRMED 不生成 PDA 任务/)
|
||||
assert.match(value, /计划级原子确认整份预装并触发唯一 PDA 任务/)
|
||||
assert.match(value, /confirmationStatus === 'CONFIRMED'/)
|
||||
@@ -398,7 +399,7 @@ test('container loading permits manual cross-channel allocation and keeps stable
|
||||
'手工装柜允许两个真实有效渠道之间跨渠道分配',
|
||||
'跨渠道分配验收后释放入仓码供主流程继续',
|
||||
'人工分配本轮候选货物',
|
||||
'无真实柜号推送预装计划成功',
|
||||
'分配后自动建立预装关联且计划可读',
|
||||
'无号 push 成功后 PDA 查询 A0404',
|
||||
'无号且未关联订舱不生成 PDA 任务',
|
||||
'订舱放舱为 RELEASED 且不预生成真实货柜',
|
||||
@@ -431,16 +432,18 @@ test('container loading permits manual cross-channel allocation and keeps stable
|
||||
assert.doesNotMatch(batch, /containerNo:/)
|
||||
})
|
||||
|
||||
test('preload and loading versions use immediate operation baselines and exact push replay', () => {
|
||||
test('preload and loading versions use immediate baselines and stable automatic bridge reads', () => {
|
||||
const container = source('./phase3-container-loading.mjs')
|
||||
assert.match(container, /const pushRequest = Object\.freeze\(\{[\s\S]*path:[\s\S]*body: Object\.freeze[\s\S]*headers: Object\.freeze/)
|
||||
assert.equal((container.match(/request\(context, 'POST', pushRequest\.path, pushRequest\.body, pushRequest\.headers\)/g) || []).length, 2)
|
||||
assert.match(container, /const pushRequest = Object\.freeze\(\{ path: `\$\{SMART\}\/plans\/\$\{planId\}` \}\)/)
|
||||
assert.equal((container.match(/request\(context, 'GET', pushRequest\.path\)/g) || []).length >= 4, true)
|
||||
assert.match(container, /自动关联保持 EDITING 且无需额外推送版本/)
|
||||
assert.match(container, /const beforeClaimPlanVersion = Number\(beforeClaimPlan\?\.version\)/)
|
||||
assert.match(container, /Number\(claimedPlan\?\.version\) > beforeClaimPlanVersion/)
|
||||
|
||||
const loading = source('./phase3-loading.mjs')
|
||||
assert.match(loading, /const pushRequest = Object\.freeze\(\{[\s\S]*body: Object\.freeze[\s\S]*headers: Object\.freeze/)
|
||||
assert.equal((loading.match(/request\(context, 'POST', pushRequest\.path, pushRequest\.body, pushRequest\.headers\)/g) || []).length, 2)
|
||||
assert.match(loading, /const pushRequest = Object\.freeze\(\{ path: `\$\{smartLoadingBase\}\/plans\/\$\{loadingPlanId\}` \}\)/)
|
||||
assert.equal((loading.match(/request\(context, 'GET', pushRequest\.path\)/g) || []).length >= 4, true)
|
||||
assert.match(loading, /自动关联保持 EDITING、身份稳定且无需额外推送版本/)
|
||||
assert.match(loading, /push exact replay 对计划版本历史关联和任务零漂移/)
|
||||
assert.match(loading, /Number\(claimedPlan\?\.version\) > beforeClaimPlanVersion/)
|
||||
assert.match(loading, /MATSON_SUPPLIER_NAME = 'MATSON 开发联调船司'/)
|
||||
@@ -524,18 +527,19 @@ test('phase3 loading proves stale inventory zero-write and defers final completi
|
||||
assert.match(loading, /authoritativeRemaining === authoritativeTotal - assignedPackageCount/)
|
||||
assert.match(loading, /调整箱数超过服务端权威总箱数返回A0400/)
|
||||
assert.match(loading, /超权威总箱数失败后计划和明细零写入/)
|
||||
assert.match(loading, /taskItemsSignature\(afterStaleTask\) === taskItemsSignature\(beforeMutationTask\)/)
|
||||
assert.match(loading, /taskItemsSignature\(taskAfterStale\) === taskItemsSignature\(incrementedTask\)/)
|
||||
assert.match(loading, /动态新增计划明细按 inboundDetailId 唯一定位/)
|
||||
assert.match(loading, /重新加入动态明细仍按 inboundDetailId 唯一定位/)
|
||||
assert.equal((loading.match(/id\(item\?\.inboundDetailId\) === id\(dynamicCandidate\.inboundDetailId\)/g) || []).length, 2)
|
||||
assert.doesNotMatch(loading, /items\?\.find\?\.\(\(item\) => id\(item\?\.inboundId\) === incrementalInboundId\)/)
|
||||
assertOrder(loading, [
|
||||
'旧 token 冲突对任务、明细、已拣数量和操作历史零写入',
|
||||
'库存变化后刷新 PDA 实时库存快照',
|
||||
'原子提交柜次 PDA 整批拣货',
|
||||
'PDA 原子批次同参同键重放保持待人工确认',
|
||||
'回查下游门禁前原子 Batch 审计',
|
||||
'最终确认前仅保留 CLAIM/BATCH 且无 COMPLETE_LOADING',
|
||||
'LOADING 阶段向同一 PDA task 增加入库单',
|
||||
'增量后旧 inventory token 明确 A0409 并要求刷新',
|
||||
'增量旧 token 冲突后 plan/task/items 零写入',
|
||||
'重新增量后刷新 inventory snapshot',
|
||||
'刷新后完成动态新增项拣货',
|
||||
'报关与最终完成前保持 LOADING 且不提前写 COMPLETE_LOADING',
|
||||
])
|
||||
assert.doesNotMatch(loading, /complete-before-downstream/)
|
||||
@@ -629,10 +633,11 @@ test('downstream container consumers prefer the phase3Loading fixture', () => {
|
||||
assert.match(ocean, /完整 DRAFT 放舱为 RELEASED 且冻结五项运输事实/)
|
||||
assert.match(ocean, /finalStatus: 'RELEASED', containerBookingId: null, loadingPlanId: null/)
|
||||
assert.match(source('./phase3-loading.mjs'), /oceanBookingId: bookingId, loadingPlanId, containerBookingId/)
|
||||
assert.match(serviceCenter, /if \(!allocationMatches\) return/)
|
||||
assert.match(serviceCenter, /category=TRUCKING&status=ACTIVE/)
|
||||
assert.match(serviceCenter, /oceanBookingId: ocean\.id/)
|
||||
assert.match(serviceCenter, /containerBookingId: linkContainer \? id\(containerFlow\.containerBookingId\) : null/)
|
||||
const servicePayload = serviceCenter.slice(serviceCenter.indexOf('const payload = {'),
|
||||
serviceCenter.indexOf('const response =', serviceCenter.indexOf('const payload = {')))
|
||||
assert.doesNotMatch(servicePayload, /containerBookingId:|loadingPlanId:/)
|
||||
assert.match(serviceCenter, /carrierId: id\(carrier\.id\), carrierName: carrier\.name/)
|
||||
assert.doesNotMatch(serviceCenter, /customerId:|customerName:/)
|
||||
assert.doesNotMatch(serviceCenter, /链路承运商-/)
|
||||
@@ -682,7 +687,7 @@ test('phase3 loading provisions its own marker-isolated WAIT_SPLIT fixture', asy
|
||||
const run = new AcceptanceRun({ gateway: 'http://127.0.0.1', modules: [], username: '', password: '', output: '' })
|
||||
const entry = source('../admin-test-env-acceptance.mjs')
|
||||
assert.match(entry, /module === 'phase3-loading'/)
|
||||
assert.match(entry, /preparePhase3LoadingFixture\(\)/)
|
||||
assert.match(entry, /preparePhase3LoadingFixture\('', requireSharedOverflow\)/)
|
||||
assert.match(entry, /orders-phase3-loading-fixture/)
|
||||
assert.match(entry, /inbound-measurement-phase3-loading-fixture/)
|
||||
assert.match(entry, /marker: originalMarker/)
|
||||
|
||||
Reference in New Issue
Block a user