diff --git a/src/modules/container-loading/pages/ContainerDetailView.vue b/src/modules/container-loading/pages/ContainerDetailView.vue index 05580c31..989caa49 100644 --- a/src/modules/container-loading/pages/ContainerDetailView.vue +++ b/src/modules/container-loading/pages/ContainerDetailView.vue @@ -697,7 +697,7 @@ onMounted(async () => {

船名航次信息

船公司
{{ detail.shippingCompanyName || '—' }}
船名 / 航次
{{ [detail.vesselName, detail.voyageNo].filter(Boolean).join(' / ') || '—' }}
预计开船
{{ formatTime(detail.estimatedSailingAt) }}
预计到港
{{ formatTime(detail.estimatedPortArrivalAt) }}
-
+
diff --git a/src/modules/container-loading/pages/GlobalSmartLoadingView.test.ts b/src/modules/container-loading/pages/GlobalSmartLoadingView.test.ts index d27dae8a..bf9a1ff6 100644 --- a/src/modules/container-loading/pages/GlobalSmartLoadingView.test.ts +++ b/src/modules/container-loading/pages/GlobalSmartLoadingView.test.ts @@ -10,6 +10,7 @@ import { listPlatformTenants, type PlatformTenantResource } from '@/modules/iam' import GlobalSmartLoadingView from './GlobalSmartLoadingView.vue' import AppDialog from '@/shared/components/AppDialog.vue' import SmartLoadingDialog from '../components/SmartLoadingDialog.vue' +import { loadSmartLoadingPlanCoLoadGroups } from '../smartLoadingPlanGroups' import type { ContainerBookingResource } from '../types' import { assignPendingReviewSmartLoadingOrder, @@ -210,9 +211,9 @@ describe('GlobalSmartLoadingView', () => { wrapper.unmount() }) - it('uses one-line shared text clamps for co-load and assigned-count summaries', () => { + it('uses one-line shared text clamps for block reasons and assigned-count summaries', () => { const source = readFileSync(resolve(process.cwd(), 'src/modules/container-loading/pages/GlobalSmartLoadingView.vue'), 'utf8') - expect(source).toContain('') + expect(source).toContain('') expect(source).toContain('') expect(source).toContain("row.unitType === 'SEALED_PALLET'") expect(source).toContain('.candidate-group { display: grid; width: 100%; min-width: 0;') @@ -608,9 +609,11 @@ describe('GlobalSmartLoadingView', () => { const wrapper = mount(GlobalSmartLoadingView, { attachTo: document.body, global: { plugins: [ElementPlus] } }) await flushPromises() - expect(wrapper.text()).toContain('CLG-2093539779795795969 · 2 票') - expect(wrapper.text()).toContain('3 个入仓片段') - expect(wrapper.text()).toContain('ORD-201:NYEXX2608290051、NYEXX2608290051-B') + const candidatePane = wrapper.get('.candidate-pane') + expect(candidatePane.get('.candidate-group').text()).toBe('合柜报关 · 2票整组不可拆') + expect(candidatePane.text()).toContain('NYEXX2608290051、NYEXX2608290051-B、NYEXX2608290052') + expect(candidatePane.text()).not.toContain('CLG-2093539779795795969') + expect(candidatePane.text()).not.toContain('ORD-201') const buttons = wrapper.findAll('.el-table__body-wrapper button').filter((button) => button.text() === '加入') expect(buttons).toHaveLength(1) await buttons[0].trigger('click') @@ -623,6 +626,8 @@ describe('GlobalSmartLoadingView', () => { expect(contextRows[1]!.findAll('td').map(cell => cell.text())).toEqual(['义乌仓', '美森正班']) await assignmentDialog().get('[aria-label="展开全屏"]').trigger('click') expect(assignmentDialog().get('table[aria-label="全局装柜同柜组成员"]').text()).toContain('NYEXX2608290051-B') + expect(assignmentDialog().get('table[aria-label="全局装柜同柜组成员"]').text()).toContain('ORD-201:NYEXX2608290051、NYEXX2608290051-B') + expect(assignmentDialog().text()).toContain('3 个入仓片段') expect(document.body.textContent).not.toContain('本次分配箱数') ;([...document.body.querySelectorAll('button')].find((button) => button.textContent?.includes('确认整组分配')) as HTMLButtonElement).click() await flushPromises() @@ -684,7 +689,7 @@ describe('GlobalSmartLoadingView', () => { const wrapper = mount(GlobalSmartLoadingView, { global: { plugins: [ElementPlus] } }) await flushPromises() - expect(wrapper.text()).toContain('CLG-9900 · 3 票') + expect(wrapper.text()).toContain('合柜报关 · 3票') expect(wrapper.text()).toContain('同柜不可拆组成员候选不齐,缺少 1 票') const button = wrapper.findAll('.el-table__body-wrapper button').find((item) => item.text() === '加入')! expect(button.attributes('disabled')).toBeDefined() @@ -749,16 +754,36 @@ describe('GlobalSmartLoadingView', () => { wrapper.unmount() }) - it('uses one loading-rule column and expandable group details in both workbenches', () => { + it('uses one loading-rule column in both workbenches and keeps global list summaries compact', () => { for (const page of ['GlobalSmartLoadingView.vue', 'SmartLoadingWorkbenchView.vue']) { const source = readFileSync(resolve(process.cwd(), `src/modules/container-loading/pages/${page}`), 'utf8') expect(source.match(/label: '装柜规则'/g)).toHaveLength(2) expect(source).not.toContain("label: '分配单位'") expect(source).not.toContain(' - + - + @@ -828,9 +834,15 @@ onMounted(() => { void load(); void loadCustomers() })
- + - + diff --git a/src/modules/ocean-bookings/components/OceanBookingDocumentsPanel.test.ts b/src/modules/ocean-bookings/components/OceanBookingDocumentsPanel.test.ts index d2d48bca..f5ff1f7a 100644 --- a/src/modules/ocean-bookings/components/OceanBookingDocumentsPanel.test.ts +++ b/src/modules/ocean-bookings/components/OceanBookingDocumentsPanel.test.ts @@ -61,7 +61,7 @@ describe('OceanBookingDocumentsPanel contract', () => { it('makes released booking files permanently read-only and preserves traced errors', () => { expect(source).toContain("props.bookingStatus === 'DRAFT' && props.canManage") - expect(source).toContain('已放舱 · 永久只读') + expect(source).not.toContain('已放舱 · 永久只读') expect(source).toContain('manageReason') expect(source).toContain('') expect(source).toContain('订舱资料上传失败,请稍后重试') diff --git a/src/modules/ocean-bookings/components/OceanBookingDocumentsPanel.vue b/src/modules/ocean-bookings/components/OceanBookingDocumentsPanel.vue index e561253b..ebd28f9a 100644 --- a/src/modules/ocean-bookings/components/OceanBookingDocumentsPanel.vue +++ b/src/modules/ocean-bookings/components/OceanBookingDocumentsPanel.vue @@ -111,7 +111,7 @@ async function selectFile(event: Event, type: OceanBookingDocumentType) {