fix: restore phase five development acceptance chain
This commit is contained in:
@@ -68,11 +68,11 @@ test('records LOADED and clears the reason only after a real LOADED reread', ()
|
||||
assert.equal(result.notCleanedReason, null)
|
||||
})
|
||||
|
||||
test('container loading follows push, claim, real pick, completed sequence', () => {
|
||||
test('container loading follows allocation sync, claim, real pick, completed sequence', () => {
|
||||
const value = source('./phase3-container-loading.mjs')
|
||||
assert.match(value, /\['EDITING', 'WAIT_LOADING'\]\.includes\(containerDetail\?\.planStatus\)/)
|
||||
assertOrder(value, [
|
||||
"pushed?.status === 'EDITING'",
|
||||
"synchronizedPlan?.status === 'EDITING'",
|
||||
"claimedPlan?.status === 'LOADING'",
|
||||
"const pickResponse = await request",
|
||||
"const completeResponse = await request",
|
||||
@@ -87,9 +87,9 @@ 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 对计划版本历史关联和任务零漂移',
|
||||
'读取柜次创建时原子生成的智能装柜计划',
|
||||
'分配同步建立 bridge 关联',
|
||||
'无真实柜号时 PDA 查询明确 A0404',
|
||||
'无号且未关联订舱仍无 PDA 任务',
|
||||
'三期订舱 RELEASED 冻结运输快照',
|
||||
'模拟柜原地关联三期 RELEASED 订舱需求并补真实柜号',
|
||||
@@ -110,10 +110,10 @@ 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('分配同步建立 bridge 关联'), value.indexOf('const linkResponse')),
|
||||
/\/transport/)
|
||||
assert.match(value, /missingContainerTaskResponse\.http === 200 && codeOf\(missingContainerTaskResponse\) === 'A0404'/)
|
||||
assert.doesNotMatch(value, /无真实柜号拒绝推送柜次计划|PDA complete后补确认/)
|
||||
assert.doesNotMatch(value, /push-preload|无真实柜号拒绝推送柜次计划|PDA complete后补确认/)
|
||||
assert.match(value, /billOfLadingNo:[\s\S]*vesselName:[\s\S]*voyageNo:[\s\S]*estimatedSailingAt:[\s\S]*estimatedArrivalAt:/)
|
||||
assert.doesNotMatch(value, /P3-SHIPPING|P3-AGENT/)
|
||||
assert.match(value, /const frozenTransport = Object\.fromEntries\(transportFields\.map/)
|
||||
@@ -158,24 +158,13 @@ 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', () => {
|
||||
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, /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, /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, /baselineBytes=|replayBytes=|rejectedBytes=/)
|
||||
}
|
||||
test('allocation synchronizes the complete pre-PDA snapshot without a push protocol', () => {
|
||||
const value = source('./phase3-loading.mjs')
|
||||
assert.match(value, /plans\/by-booking\/\$\{encodeURIComponent\(containerBookingId\)\}/)
|
||||
assert.match(value, /分配同步建立 bridge 关联/)
|
||||
assert.match(value, /分配事务完成态计划与 bridge 一致且保持 EDITING/)
|
||||
assert.match(value, /Number\(synchronizedPlan\?\.version\) === Number\(link\?\.loadingPlanVersion\)/)
|
||||
assert.doesNotMatch(value, /push-preload|pushRequest|projectPushPreloadStability|diffPushPreloadStability/)
|
||||
})
|
||||
|
||||
test('push stability projection sorts unordered facts and reports persisted field drift', () => {
|
||||
@@ -214,15 +203,13 @@ 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('allocation orchestration is transactional and binds the preload before PDA creation', () => {
|
||||
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('private Plan assign('), service.indexOf('public Plan assignInbound'))
|
||||
assert.match(service, /@Transactional[\s\S]*public Plan assign/)
|
||||
assert.match(assign, /ensurePendingForLoadingAllocation[\s\S]*loadingModelBridge\.bindIncrementalAllocation/)
|
||||
assert.match(assign, /loadingModelBridge\.bindIncrementalAllocation[\s\S]*loadingPickService\.sync/)
|
||||
assert.doesNotMatch(source('../../firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformSmartLoadingController.java'), /push-preload/)
|
||||
})
|
||||
|
||||
test('finalize rechecks the same unified order detail and list as LOADED', () => {
|
||||
@@ -276,9 +263,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 context.request('GET', `${SMART}/plans/by-booking/",
|
||||
"const assignResponse = await request",
|
||||
'无真实柜号推送预装计划成功',
|
||||
'分配同步建立 bridge',
|
||||
"const bookingCreate = await request",
|
||||
"const linkResponse = await request(context, 'POST', `${CONTAINERS}/${containerId}/ocean-booking-link`",
|
||||
])
|
||||
@@ -306,10 +293,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('分配同步建立 bridge'), value.indexOf('const linkResponse')),
|
||||
/\/transport/)
|
||||
assert.match(value, /订舱放舱为 RELEASED 且不预生成真实货柜/)
|
||||
assert.match(value, /无真实柜号推送预装计划成功/)
|
||||
assert.match(value, /分配同步建立 bridge/)
|
||||
assert.match(value, /订舱 RELEASED 但预装未 CONFIRMED 不生成 PDA 任务/)
|
||||
assert.match(value, /计划级原子确认整份预装并触发唯一 PDA 任务/)
|
||||
assert.match(value, /confirmationStatus === 'CONFIRMED'/)
|
||||
@@ -389,8 +376,8 @@ test('container loading enforces channel isolation and stable PDA identity acros
|
||||
'新增真实异渠道模拟柜',
|
||||
'两个真实有效渠道之间拒绝跨渠道装柜',
|
||||
'人工分配本轮候选货物',
|
||||
'无真实柜号推送预装计划成功',
|
||||
'无号 push 成功后 PDA 查询 A0404',
|
||||
'分配同步建立 bridge',
|
||||
'无真实柜号时 PDA 查询 A0404',
|
||||
'无号且未关联订舱不生成 PDA 任务',
|
||||
'订舱放舱为 RELEASED 且不预生成真实货柜',
|
||||
'首次关联 RELEASED 订舱需求并补真实柜号',
|
||||
@@ -422,20 +409,21 @@ test('container loading enforces channel isolation and stable PDA identity acros
|
||||
assert.doesNotMatch(batch, /containerNo:/)
|
||||
})
|
||||
|
||||
test('preload and loading versions use immediate operation baselines and exact push replay', () => {
|
||||
test('preload and loading versions use immediate allocation and claim baselines', () => {
|
||||
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, /plans\/by-booking\/\$\{encodeURIComponent\(containerId\)\}/)
|
||||
assert.match(container, /分配同步建立 bridge/)
|
||||
assert.doesNotMatch(container, /push-preload|pushRequest/)
|
||||
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, /push exact replay 对计划版本历史关联和任务零漂移/)
|
||||
assert.match(loading, /plans\/by-booking\/\$\{encodeURIComponent\(containerBookingId\)\}/)
|
||||
assert.match(loading, /分配事务完成态计划与 bridge 一致且保持 EDITING/)
|
||||
assert.doesNotMatch(loading, /push-preload|pushRequest/)
|
||||
assert.match(loading, /Number\(claimedPlan\?\.version\) > beforeClaimPlanVersion/)
|
||||
assert.match(loading, /MATSON_SUPPLIER_NAME = 'MATSON 开发联调船司'/)
|
||||
assert.match(loading, /category=BOOKING&page=1&size=200/)
|
||||
assert.match(loading, /MATSON_SUPPLIER_NAME = 'MATSON 开发联调订舱代理'/)
|
||||
assert.match(loading, /category=BOOKING&status=ACTIVE&carrierCode=MATSON&page=1&size=200/)
|
||||
assert.match(loading, /ensureMatsonSupplier\(context, supplierRecords\)/)
|
||||
assert.match(loading, /shippingCompanyId: id\(shippingCarrier\.id\), shippingCompanyName: shippingCarrier\.name/)
|
||||
assert.match(loading, /bookingAgentId: id\(supplier\.id\), bookingAgentName: supplier\.name/)
|
||||
|
||||
Reference in New Issue
Block a user