This commit is contained in:
2026-09-15 17:46:44 +08:00
parent 14e31d4679
commit ccc72be4b9
3 changed files with 33 additions and 3 deletions
@@ -199,6 +199,7 @@ describe('UnifiedOrdersView list request coordination', () => {
vi.mocked(listPlatformUnifiedOrders).mockResolvedValue({ vi.mocked(listPlatformUnifiedOrders).mockResolvedValue({
records: [{ records: [{
orderId: '2089223263733518337', orderVersion: 7, tenantId: '2089176869176389634', orderId: '2089223263733518337', orderVersion: 7, tenantId: '2089176869176389634',
internalOrderStatus: 'SUBMITTED',
inboundCode: 'NYEXX2609030001', expectedArrivalAt: '2026-09-10T08:30:00', estimatedVolumeCbm: 0.25, inboundCode: 'NYEXX2609030001', expectedArrivalAt: '2026-09-10T08:30:00', estimatedVolumeCbm: 0.25,
}], page: 1, size: 20, total: 1, pages: 1, }], page: 1, size: 20, total: 1, pages: 1,
} as never) } as never)
@@ -235,4 +236,23 @@ describe('UnifiedOrdersView list request coordination', () => {
showClose: true, showClose: true,
})) }))
}) })
it('shows planning values without editors after the order enters irreversible fulfillment', async () => {
vi.mocked(listPlatformUnifiedOrders).mockResolvedValue({
records: [{
orderId: '2099751993783402497', orderVersion: 7, tenantId: '2097708157074210818',
internalOrderStatus: 'PROCESSING', mainStatus: 'LOADED', inboundCode: 'AT0E9B5BF2839C6944CFA3',
expectedArrivalAt: '2026-10-15T00:00:00', estimatedVolumeCbm: 220,
}], page: 1, size: 20, total: 1, pages: 1,
} as never)
const wrapper = mountView()
await flushPromises()
expect(wrapper.findComponent({ name: 'ElInputNumber' }).exists()).toBe(false)
expect(wrapper.findComponent({ name: 'ElDatePicker' }).exists()).toBe(false)
expect(wrapper.text()).toContain('220')
expect(wrapper.text()).toContain('2026-10-15 00:00')
expect(updatePlatformUnifiedOrderPlanning).not.toHaveBeenCalled()
})
}) })
@@ -627,6 +627,9 @@ describe('UnifiedOrdersView contract', () => {
}) })
it('only exposes declaration editing before loading and marks channel changes', () => { it('only exposes declaration editing before loading and marks channel changes', () => {
expect(source).toContain("new Set(['DRAFT', 'REJECTED', 'SUBMITTED', 'APPROVED'])")
expect(source).toContain("planningEditableOrderStatuses.has(row.internalOrderStatus || '')")
expect(source).toContain('v-if="canEditPlanning(row as UnifiedOrderResource)"')
expect(source).toContain("new Set<UnifiedOrderMainStatus>(['PENDING_REVIEW', 'WAIT_MEASURE', 'WAIT_SPLIT'])") expect(source).toContain("new Set<UnifiedOrderMainStatus>(['PENDING_REVIEW', 'WAIT_MEASURE', 'WAIT_SPLIT'])")
expect(source).toContain('declarationEditableStatuses.has(detail.value.summary.mainStatus)') expect(source).toContain('declarationEditableStatuses.has(detail.value.summary.mainStatus)')
expect(source).not.toContain("detail.value.summary.mainStatus === 'WAIT_MEASURE'") expect(source).not.toContain("detail.value.summary.mainStatus === 'WAIT_MEASURE'")
@@ -733,7 +733,7 @@ function planningDraft(row: UnifiedOrderResource) {
async function savePlanning(row: UnifiedOrderResource) { async function savePlanning(row: UnifiedOrderResource) {
const draft = planningDraft(row) const draft = planningDraft(row)
if (!can('platform:order:declaration:edit') || draft.saving) return if (!canEditPlanning(row) || draft.saving) return
const estimatedVolumeCbm = draft.estimatedVolumeCbm ?? null const estimatedVolumeCbm = draft.estimatedVolumeCbm ?? null
draft.estimatedVolumeCbm = estimatedVolumeCbm draft.estimatedVolumeCbm = estimatedVolumeCbm
if (!Number.isInteger(row.orderVersion)) { if (!Number.isInteger(row.orderVersion)) {
@@ -777,6 +777,13 @@ async function savePlanning(row: UnifiedOrderResource) {
} }
} }
const planningEditableOrderStatuses = new Set(['DRAFT', 'REJECTED', 'SUBMITTED', 'APPROVED'])
function canEditPlanning(row: UnifiedOrderResource) {
return can('platform:order:declaration:edit')
&& planningEditableOrderStatuses.has(row.internalOrderStatus || '')
}
const declarationEditableStatuses = new Set<UnifiedOrderMainStatus>(['PENDING_REVIEW', 'WAIT_MEASURE', 'WAIT_SPLIT']) const declarationEditableStatuses = new Set<UnifiedOrderMainStatus>(['PENDING_REVIEW', 'WAIT_MEASURE', 'WAIT_SPLIT'])
const canEditDeclaration = computed(() => Boolean( const canEditDeclaration = computed(() => Boolean(
detail.value detail.value
@@ -2673,7 +2680,7 @@ onBeforeUnmount(() => {
<template #estimatedVolume="{ row }"> <template #estimatedVolume="{ row }">
<div class="planning-cell"> <div class="planning-cell">
<el-input-number <el-input-number
v-if="can('platform:order:declaration:edit')" v-if="canEditPlanning(row as UnifiedOrderResource)"
v-model="planningDraft(row as UnifiedOrderResource).estimatedVolumeCbm" v-model="planningDraft(row as UnifiedOrderResource).estimatedVolumeCbm"
class="planning-volume-input" class="planning-volume-input"
:min="0.0001" :min="0.0001"
@@ -2692,7 +2699,7 @@ onBeforeUnmount(() => {
<div class="planning-cell"> <div class="planning-cell">
<el-date-picker <el-date-picker
style="width: 100%;" style="width: 100%;"
v-if="can('platform:order:declaration:edit')" v-if="canEditPlanning(row as UnifiedOrderResource)"
v-model="planningDraft(row as UnifiedOrderResource).expectedArrivalAt" v-model="planningDraft(row as UnifiedOrderResource).expectedArrivalAt"
class="planning-arrival-input" class="planning-arrival-input"
type="datetime" type="datetime"