From 8afd04aa55c0c5bf8a7c6fdb87afc176d0864b91 Mon Sep 17 00:00:00 2001 From: liuyihe <2513762445@qq.com> Date: Tue, 20 Oct 2026 21:33:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InboundMeasurementPanel.test.ts | 29 ++-- .../measurement/InboundMeasurementPanel.vue | 21 ++- .../api/capacityOffers.ts | 4 + .../capacityOfferTypes.ts | 7 + .../components/CapacityInquiryDialog.test.ts | 18 +++ .../components/CapacityInquiryDialog.vue | 25 ++-- src/modules/overseas-master-data/index.ts | 4 + .../pages/CapacityOffersBehavior.test.ts | 17 ++- .../pages/CapacityOffersView.vue | 32 +++-- src/modules/overseas-master-data/tripTypes.ts | 2 +- .../overseas-warehouse/api/transportTasks.ts | 26 ++++ .../components/TransportExecutionPanel.vue | 126 ++++++++++++++++++ .../components/TransportTaskCreateDialog.vue | 72 ++++++++++ .../overseas-warehouse/dispatchContracts.ts | 4 +- .../pages/DispatchDetailView.test.ts | 9 +- .../pages/DispatchDetailView.vue | 6 +- .../pages/DispatchesView.test.ts | 11 +- .../pages/DispatchesView.vue | 10 +- .../unified-orders/api/unifiedOrders.ts | 4 +- .../UnifiedOrdersView.fulfillment.test.ts | 50 +++++++ .../pages/UnifiedOrdersView.requests.test.ts | 4 +- .../pages/UnifiedOrdersView.test.ts | 2 +- .../pages/UnifiedOrdersView.vue | 35 +++-- 23 files changed, 449 insertions(+), 69 deletions(-) create mode 100644 src/modules/overseas-warehouse/api/transportTasks.ts create mode 100644 src/modules/overseas-warehouse/components/TransportExecutionPanel.vue create mode 100644 src/modules/overseas-warehouse/components/TransportTaskCreateDialog.vue diff --git a/src/modules/inbounds/measurement/InboundMeasurementPanel.test.ts b/src/modules/inbounds/measurement/InboundMeasurementPanel.test.ts index f0efd047..e1ff7844 100644 --- a/src/modules/inbounds/measurement/InboundMeasurementPanel.test.ts +++ b/src/modules/inbounds/measurement/InboundMeasurementPanel.test.ts @@ -273,7 +273,7 @@ describe('InboundMeasurementPanel', () => { expect(text).toContain('客户申报') expect(text).toContain('平台实测') expect(text).toContain('差异 +1.5 kg') - expect(text).toContain('差异 -0.2 m³') + expect(text).toContain('差异 -0.200 m³') expect(text).toContain('平台实测箱规') expect(text).not.toContain('租户') expect(text).not.toContain('数据版本') @@ -297,7 +297,7 @@ describe('InboundMeasurementPanel', () => { const wrapper = await mountPanel() const rows = wrapper.findAll('.measurement-comparison tbody tr') expect(rows.map(row => row.findAll('td').map(cell => cell.text()))).toEqual([ - ['10', '10', '一致'], ['118.5', '120', '差异 +1.5 kg'], ['0.8', '0.6', '差异 -0.2 m³'], + ['10', '10', '一致'], ['118.5', '120', '差异 +1.5 kg'], ['0.800', '0.600', '差异 -0.200 m³'], ]) expect(wrapper.find('.measurement-summary-section .measurement-declaration').exists()).toBe(false) expect(wrapper.find('.measurement-declaration').element.parentElement).toBe(wrapper.find('.measurement-summary-section').element.parentElement) @@ -319,8 +319,8 @@ describe('InboundMeasurementPanel', () => { vi.mocked(getInboundMeasurement).mockResolvedValueOnce(measurement({ measurementId: null, items: [], weightResults: [] })) const wrapper = await mountPanel() expect(wrapper.find('.measurement-summary-header h4').text()).toBe('申报与实测对比') - expect(wrapper.find('.measurement-declaration-header').text()).toContain('DOC-001') - expect(wrapper.find('.measurement-section__heading .measurement-goods-name input').exists()).toBe(true) + expect(wrapper.find('.measurement-declaration-header').text()).not.toContain('DOC-001') + expect(wrapper.find('.measurement-section__heading .measurement-goods-name').exists()).toBe(false) expect(wrapper.find('.measurement-section__heading .measurement-section-actions').text()).toContain('手动录入箱规') expect(wrapper.findAll('.el-alert').some(alert => alert.text().includes('请先完成箱规测量'))).toBe(false) expect(wrapper.find('.measurement-panel__footer').text()).toContain('请先完成箱规测量') @@ -334,11 +334,11 @@ describe('InboundMeasurementPanel', () => { expect(comparison.text()).toContain('118.5') expect(comparison.text()).toContain('0.8') expect(comparison.findAll('tbody tr')[0].text()).toContain('10') - expect(declaration.text()).toContain('原单据号码') - expect(declaration.text()).toContain('DOC-001') - expect(declaration.findAll('.measurement-readonly-field')).toHaveLength(1) + expect(declaration.text()).not.toContain('原单据号码') + expect(declaration.text()).not.toContain('DOC-001') + expect(declaration.findAll('.measurement-readonly-field')).toHaveLength(0) expect(declaration.findAll('input')).toHaveLength(0) - expect(wrapper.find('.measurement-items-section .measurement-goods-name input').exists()).toBe(true) + expect(wrapper.find('.measurement-items-section .measurement-goods-name').exists()).toBe(false) expect(declaration.find('[aria-label="客户申报箱规明细"]').text()).toContain('蓝牙音箱') expect(declaration.find('[aria-label="客户申报箱规明细"]').text()).toContain('50 × 40 × 30') }) @@ -356,13 +356,14 @@ describe('InboundMeasurementPanel', () => { expect(declaration.find('input').exists()).toBe(false) expect(declaration.text()).toContain('蓝牙音箱') - expect(declaration.findAll('.measurement-readonly-field')).toHaveLength(1) - expect(wrapper.find('.measurement-items-section .measurement-goods-name').text()).toContain('蓝牙音箱') + expect(declaration.findAll('.measurement-readonly-field')).toHaveLength(0) + expect(wrapper.find('.measurement-items-section .measurement-goods-name').exists()).toBe(false) }) - it('saves the corrected actual goods name without overriding declaration facts', async () => { + it('preserves the hidden actual goods name without overriding declaration facts', async () => { const wrapper = await mountPanel() - await wrapper.find('.measurement-goods-name input').setValue('修正后的蓝牙音箱') + expect(wrapper.text()).not.toContain('实际品名') + await wrapper.find('input[aria-label="仓库修改外箱长"]').setValue('55') const save = wrapper.findAll('button').find((button) => button.text().includes('保存测量数据')) await save?.trigger('click') await flushPromises() @@ -370,7 +371,7 @@ describe('InboundMeasurementPanel', () => { expect(saveInboundMeasurementDraft).toHaveBeenCalledWith('10001', '7001', expect.objectContaining({ measurementId: '9001', version: 2, - actualGoodsName: '修正后的蓝牙音箱', + actualGoodsName: '蓝牙音箱', items: expect.any(Array), })) const payload = vi.mocked(saveInboundMeasurementDraft).mock.calls[0]?.[2] @@ -573,7 +574,7 @@ describe('InboundMeasurementPanel', () => { const wrapper = await mountPanel() expect(wrapper.find('.measurement-declaration input').exists()).toBe(false) expect(wrapper.find('.measurement-items-section .measurement-expected-pallets input').exists()).toBe(true) - expect(wrapper.find('.measurement-items-section .measurement-goods-name input').exists()).toBe(true) + expect(wrapper.find('.measurement-items-section .measurement-goods-name').exists()).toBe(false) }) it('requires at least one confirmed weight image before submitting for review', async () => { diff --git a/src/modules/inbounds/measurement/InboundMeasurementPanel.vue b/src/modules/inbounds/measurement/InboundMeasurementPanel.vue index 964758cd..9938094b 100644 --- a/src/modules/inbounds/measurement/InboundMeasurementPanel.vue +++ b/src/modules/inbounds/measurement/InboundMeasurementPanel.vue @@ -123,7 +123,7 @@ const confirmedPackageCount = computed(() => form.items.reduce((sum, item) => su const comparisonMetrics = computed(() => [ { label: '箱数', declared: detail.value?.originalPackageCount, actual: form.items.length ? confirmedPackageCount.value : null, digits: 0, unit: '' }, { label: '毛重(kg)', declared: detail.value?.originalGrossWeightKg, actual: detail.value?.actualGrossWeightKg, digits: 3, unit: ' kg' }, - { label: '总体积(m³)', declared: detail.value?.originalVolumeCbm, actual: detail.value?.actualVolumeCbm, digits: 4, unit: ' m³' }, + { label: '总体积(m³)', declared: detail.value?.originalVolumeCbm, actual: detail.value?.actualVolumeCbm, digits: 3, unit: ' m³' }, ]) const expectedPackageCount = computed(() => detail.value?.originalPackageCount ?? null) @@ -556,9 +556,9 @@ async function submitForReview() { } } -function formatNumber(value: number | null | undefined, maximumFractionDigits = 3) { +function formatNumber(value: number | null | undefined, maximumFractionDigits = 3, minimumFractionDigits = 0) { if (value == null || !Number.isFinite(value)) return '—' - return new Intl.NumberFormat('zh-CN', { maximumFractionDigits }).format(value) + return new Intl.NumberFormat('zh-CN', { maximumFractionDigits, minimumFractionDigits }).format(value) } function deviationRatio(actual: number | null | undefined, declared: number | null | undefined) { @@ -575,7 +575,7 @@ function formatDifference(actual: number | null | undefined, declared: number | const difference = actual - declared if (difference === 0) return null const sign = difference > 0 ? '+' : '' - return `差异 ${sign}${formatNumber(difference, maximumFractionDigits)}${unit}` + return `差异 ${sign}${formatNumber(difference, maximumFractionDigits, unit === ' m³' ? 3 : 0)}${unit}` } function releaseImagePreview() { @@ -727,8 +727,8 @@ defineExpose({ saveDraft, submitForReview, updateWeightEvidence, submissionBlock {{ metric.label }} - {{ formatNumber(metric.declared, metric.digits) }} - {{ metric.actual == null ? '未测量' : formatNumber(metric.actual, metric.digits) }} + {{ formatNumber(metric.declared, metric.digits, metric.unit === ' m³' ? 3 : 0) }} + {{ metric.actual == null ? '未测量' : formatNumber(metric.actual, metric.digits, metric.unit === ' m³' ? 3 : 0) }} {{ metric.actual == null ? '待测量' : metric.declared == null ? '—' : formatDifference(metric.actual, metric.declared, metric.digits, metric.unit) || '一致' }} @@ -745,7 +745,6 @@ defineExpose({ saveDraft, submitForReview, updateWeightEvidence, submissionBlock

客户申报明细

-
原单据号码{{ detail.originalDocumentNo || '—' }}

平台实测箱规

-
- -
实际品名{{ detail.actualGoodsName || '—' }}
+
预计托数{{ detail.expectedPalletCount ?? '—' }}
@@ -799,7 +796,7 @@ defineExpose({ saveDraft, submitForReview, updateWeightEvidence, submissionBlock
测量时间
{{ row.measuredAt ? row.measuredAt.replace('T', ' ') : '—' }}
计算方式
{{ calculationModeLabel(row.coefficientMode) }}
计算后外箱
{{ formatNumber(row.calculatedOuterLengthCm) }} × {{ formatNumber(row.calculatedOuterWidthCm) }} × {{ formatNumber(row.calculatedOuterHeightCm) }} cm
-
单箱体积
{{ formatNumber(row.serverValues.unitVolumeCbm, 4) }} m³
+
单箱体积
{{ formatNumber(row.serverValues.unitVolumeCbm, 3, 3) }} m³
箱规周长
{{ formatNumber(row.serverValues.girthCm) }} cm
总材积重
{{ formatNumber(row.serverValues.volumeWeightKg) }} kg
计算规则版本
{{ row.calculationRuleVersion || '—' }}
@@ -847,7 +844,7 @@ defineExpose({ saveDraft, submitForReview, updateWeightEvidence, submissionBlock - +