From baa69e66a17488f913b61de475d3636b8aad248e Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sun, 11 Oct 2026 11:17:08 +0800 Subject: [PATCH] fix(fleet): keep capacity fields readable in publish dialog --- .../CapacityOfferSettingsDialog.test.ts | 8 ++++++-- .../components/TripLoadingPanel.vue | 20 ++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/modules/overseas-master-data/components/CapacityOfferSettingsDialog.test.ts b/src/modules/overseas-master-data/components/CapacityOfferSettingsDialog.test.ts index a9518832..6f175466 100644 --- a/src/modules/overseas-master-data/components/CapacityOfferSettingsDialog.test.ts +++ b/src/modules/overseas-master-data/components/CapacityOfferSettingsDialog.test.ts @@ -19,7 +19,7 @@ function mount(realPlanner = false) { const wrapper = shallowMount(Dialog, { props: { modelValue: true, trip }, global: { plugins: [createPinia()], stubs: { AppDialog: { name: 'AppDialog', props: ['confirmText'], emits: ['confirm'], template: '
' }, TripLoadingPanel: realPlanner ? false : defineComponent({ name: 'TripLoadingPanel', setup(_, { expose }) { expose({ save: state.plan }); return {} }, template: '
' }), - DataTable: { name: 'DataTable', props: ['data'], template: '
' }, + DataTable: { name: 'DataTable', props: ['data', 'columns'], template: '
' }, ElInputNumber: { name: 'ElInputNumber', props: ['modelValue'], emits: ['update:modelValue'], template: '' }, ElForm: { template: '
' }, ElFormItem: { template: '
' }, ElButton: { template: '' }, ElDatePicker: true, ElInput: true, LoadErrorState: true, ApiErrorMeta: true, @@ -61,10 +61,14 @@ it('retries only the uncertain publish command with the original key', async () }) it('submits measurements from the embedded panel before saving and publishing', async () => { - const basis = { tripNo: 'TR-1', recordVersion: 5, cargo: [{ dispatchNo: 'DP-1', customerId: '1', dispatchItemId: '2', warehousePalletId: '3', palletNo: 'PLT-1', packages: 1, destinationKey: 'FBA:ACY2', destinationLabel: 'ACY2' }], manifestHash: 'hash', capacityPlan: null, planValid: false, blockReason: null, availableSegments: [] } + const basis = { tripNo: 'TR-1', recordVersion: 5, cargo: [{ dispatchNo: 'DP-1', customerId: '1', dispatchItemId: '2', warehousePalletId: '3', palletNo: 'PLT-USLAX01-261010-G0RD3LYHGD8H', packages: 1, destinationKey: 'FBA:ACY2', destinationLabel: 'ACY2' }], manifestHash: 'hash', capacityPlan: null, planValid: false, blockReason: null, availableSegments: [] } vi.mocked(trips.getTripCapacityPlan).mockResolvedValue(basis) vi.mocked(trips.confirmTripCapacityPlan).mockResolvedValue({ ...basis, recordVersion: 6, planValid: true }) const wrapper = mount(true); await flushPromises() + expect(wrapper.text()).toContain('PLT-USLAX01-261010-G0RD3LYHGD8H') + const columns = wrapper.findComponent({ name: 'DataTable' }).props('columns') as { key: string; singleLine?: boolean; width?: number; minWidth?: number }[] + expect(columns.filter(column => ['palletNo', 'spaces', 'weight', 'volume', 'stop'].includes(column.key)).every(column => column.singleLine === false)).toBe(true) + expect(columns.reduce((sum, column) => sum + (column.width || column.minWidth || 0), 0)).toBeLessThanOrEqual(1048) const fields = wrapper.findAllComponents({ name: 'ElInputNumber' }) fields[0]!.vm.$emit('update:modelValue', 100); fields[1]!.vm.$emit('update:modelValue', 2); await flushPromises() wrapper.findComponent({ name: 'AppDialog' }).vm.$emit('confirm'); await flushPromises() diff --git a/src/modules/overseas-master-data/components/TripLoadingPanel.vue b/src/modules/overseas-master-data/components/TripLoadingPanel.vue index 6b59ffa6..441a6a3c 100644 --- a/src/modules/overseas-master-data/components/TripLoadingPanel.vue +++ b/src/modules/overseas-master-data/components/TripLoadingPanel.vue @@ -15,10 +15,14 @@ const info = ref(null), rows = ref emit('changed', JSON.stringify(value)), { deep: true }) -const columns = computed(() => [{ key: 'palletNo', prop: 'palletNo', label: '实物托盘', minWidth: 150 }, - { key: 'destinations', prop: 'destinations', label: '货物目的地', minWidth: 160 }, { key: 'spaces', label: '占用标准托位', slotName: 'spaces', width: 175 }, - { key: 'weight', label: props.planning ? '预计重量(kg)' : '实测重量(kg)', slotName: 'weight', width: 190 }, { key: 'volume', label: props.planning ? '预计体积(m³)' : '实测体积(m³)', slotName: 'volume', width: 190 }, - { key: 'stop', label: '卸货站', slotName: 'stop', minWidth: 200 }]) +const columns = computed(() => [ + { key: 'palletNo', label: '实物托盘', slotName: 'palletNo', minWidth: 210, singleLine: false }, + { key: 'destinations', prop: 'destinations', label: '货物目的地', minWidth: 140, singleLine: false }, + { key: 'spaces', label: '占用标准托位', slotName: 'spaces', width: 160, singleLine: false }, + { key: 'weight', label: props.planning ? '预计重量(kg)' : '实测重量(kg)', slotName: 'weight', width: 180, singleLine: false }, + { key: 'volume', label: props.planning ? '预计体积(m³)' : '实测体积(m³)', slotName: 'volume', width: 180, singleLine: false }, + { key: 'stop', label: '卸货站', slotName: 'stop', minWidth: 160, singleLine: false }, +]) const savedLoad = computed(() => info.value && ('capacityPlan' in info.value ? info.value.capacityPlan : info.value.confirmedLoad)) const segments = computed(() => info.value && 'availableSegments' in info.value ? info.value.availableSegments : savedLoad.value?.segments || []) const stalePlan = computed(() => info.value && 'planValid' in info.value && !!info.value.capacityPlan && !info.value.planValid) @@ -91,7 +95,8 @@ onBeforeUnmount(() => { sequence++ })

{{ info.blockReason }}

已确认实际装载;车辆、司机或计划调整后需要重新确认。

按实物托盘核对,同一托盘中的多客户货物只计一次。发车仍由海外 PDA 完成。

- + + @@ -101,3 +106,8 @@ onBeforeUnmount(() => { sequence++ })
行驶区间占用托位重量(kg)体积(m³)剩余托位 / kg / m³
{{ trip.stops[segment.fromIndex]?.name }} → {{ trip.stops[segment.toIndex]?.name }}{{ segment.occupied.palletSpaces }} / {{ trip.maxPalletSpaces }}{{ segment.occupied.weightKg }} / {{ trip.maxLoadKg }}{{ segment.occupied.volumeCbm }} / {{ trip.maxVolumeCbm }}{{ segment.remaining.palletSpaces }} / {{ segment.remaining.weightKg }} / {{ segment.remaining.volumeCbm }}
+ +