diff --git a/src/modules/loading-lists/api/platformLoadingLists.ts b/src/modules/loading-lists/api/platformLoadingLists.ts index 4c409c78..6248fe26 100644 --- a/src/modules/loading-lists/api/platformLoadingLists.ts +++ b/src/modules/loading-lists/api/platformLoadingLists.ts @@ -11,6 +11,7 @@ export type PreloadConfirmationStatus = 'PENDING' | 'PARTIALLY_CONFIRMED' | 'CON export type PreloadBlockingReason = | 'LOADING_PLAN_NOT_EDITING' | 'PRELOAD_LINK_MISSING' + | 'CONTAINER_NO_MISSING' | 'OCEAN_BOOKING_NOT_LINKED' | 'OCEAN_BOOKING_NOT_RELEASED' | 'PDA_TASK_ALREADY_CREATED' diff --git a/src/modules/loading-lists/components/LoadingListDetailDrawer.vue b/src/modules/loading-lists/components/LoadingListDetailDrawer.vue index 387551fe..00c9f868 100644 --- a/src/modules/loading-lists/components/LoadingListDetailDrawer.vue +++ b/src/modules/loading-lists/components/LoadingListDetailDrawer.vue @@ -104,6 +104,7 @@ const visibleHistories = computed(() => { const blockingReasonLabels: Record = { LOADING_PLAN_NOT_EDITING: '装柜计划已不在可确认的编辑状态', PRELOAD_LINK_MISSING: '装柜明细尚未完整关联入库预装票据', + CONTAINER_NO_MISSING: '尚未录入真实集装箱号,请先补录后再确认预装', OCEAN_BOOKING_NOT_LINKED: '尚未关联真实订舱', OCEAN_BOOKING_NOT_RELEASED: '关联订舱尚未放舱', PDA_TASK_ALREADY_CREATED: 'PDA 任务已创建,无需重复确认', diff --git a/src/modules/loading-lists/pages/PreloadPlanDetailView.test.ts b/src/modules/loading-lists/pages/PreloadPlanDetailView.test.ts index 9904e3c2..dcf1e06d 100644 --- a/src/modules/loading-lists/pages/PreloadPlanDetailView.test.ts +++ b/src/modules/loading-lists/pages/PreloadPlanDetailView.test.ts @@ -63,22 +63,21 @@ describe('PreloadPlanDetailView prototype contract', () => { expect(source).toContain(':confirm-loading="remarkSaving"') }) - it('supports first entry and reasoned correction before PDA claim without blocking earlier flow', () => { + it('requires first entry before confirmation and still repairs historical tasks that were created without it', () => { expect(source).toContain("{ required: true, message: '请输入集装箱号'") - expect(source).toContain("summary?.status === 'EDITING'") - expect(source).toContain("(!pdaStatus || pdaStatus === 'PENDING')") + expect(source).toContain("['EDITING', 'LOADING'].includes(summary.status)") + expect(source).toContain('if (!summary.containerNo) return true') expect(source).not.toContain('summary?.containerNo && summary.status') expect(source).toContain('PDA 已领取或作业已开始,真实集装箱号只读。') + expect(source).toContain('该历史 PDA 任务缺少真实集装箱号;补录保存后即可进入任务。') + expect(source).toContain('确认预装前必须补录真实集装箱号。') expect(source).toContain("isContainerCorrection.value ? '纠正集装箱号 / 航次' : '补录集装箱号 / 航次'") expect(source).toContain("isContainerCorrection.value && !String(value || '').trim() ? new Error('纠错时请输入操作原因')") expect(source).toContain("String(value || '').trim().toUpperCase()") expect(source).toContain('operationReason: editForm.operationReason.trim() || null') expect(detailSource).toContain('v-if="canEditTransport"') expect(detailSource).toContain("summary.containerNo || '待补录'") - expect(source).toContain('由服务端按真实条件创建唯一 PDA 任务') - expect(source).toContain('缺号不阻断此前流程') - expect(source).toContain('PDA 确认装柜完成前由服务端执行最终门禁') - expect(source).not.toContain('真实集装箱号未录入时不能确认') + expect(detailSource).toContain("CONTAINER_NO_MISSING: '尚未录入真实集装箱号,请先补录后再确认预装'") }) it('uses a flat blocking note instead of repeated colored page alerts', () => { @@ -97,8 +96,7 @@ describe('PreloadPlanDetailView prototype contract', () => { expect(source).toContain('confirmSaving.value') expect(source).toContain('await loadDetail()') expect(source).toContain('本操作将确认整份预装计划') - expect(source).toContain('全部入库预装票据') - expect(source).toContain('当前页面不会伪造 PDA 成功') + expect(source).toContain(':confirm-disabled="!detail?.summary.readiness.canConfirm"') expect(source).not.toContain('/inbounds/') }) diff --git a/src/modules/loading-lists/pages/PreloadPlanDetailView.vue b/src/modules/loading-lists/pages/PreloadPlanDetailView.vue index cf3cf835..2b1da4fa 100644 --- a/src/modules/loading-lists/pages/PreloadPlanDetailView.vue +++ b/src/modules/loading-lists/pages/PreloadPlanDetailView.vue @@ -52,16 +52,18 @@ const canEdit = computed(() => access.can('platform:firstleg:preload:edit')) const canCorrectTransport = computed(() => { const summary = detail.value?.summary const pdaStatus = summary?.readiness.pdaTaskStatus - return Boolean(canEdit.value && summary?.status === 'EDITING' - && (!pdaStatus || pdaStatus === 'PENDING')) + if (!canEdit.value || !summary || !['EDITING', 'LOADING'].includes(summary.status)) return false + if (!summary.containerNo) return true + return !pdaStatus || pdaStatus === 'PENDING' }) const isContainerCorrection = computed(() => Boolean(detail.value?.summary.containerNo)) const transportCorrectionNote = computed(() => { const summary = detail.value?.summary if (!summary) return '' + if (!summary.containerNo && summary.readiness.pdaTaskId) return '该历史 PDA 任务缺少真实集装箱号;补录保存后即可进入任务。' if (summary.readiness.pdaTaskStatus && summary.readiness.pdaTaskStatus !== 'PENDING') return 'PDA 已领取或作业已开始,真实集装箱号只读。' if (!canCorrectTransport.value) return '当前服务端阶段不允许纠正真实集装箱号。' - if (!summary.containerNo) return '真实集装箱号待补录;可在预装详情首次录入,PDA 领取或作业开始后只读。' + if (!summary.containerNo) return '确认预装前必须补录真实集装箱号。' return '真实集装箱号仅可在 PDA 领取前纠错,纠错保存时必须填写操作原因。' }) const editDialogTitle = computed(() => isContainerCorrection.value ? '纠正集装箱号 / 航次' : '补录集装箱号 / 航次')