diff --git a/src/modules/inbounds/measurement/InboundMeasurementPanel.test.ts b/src/modules/inbounds/measurement/InboundMeasurementPanel.test.ts index dceec4bf..7907255c 100644 --- a/src/modules/inbounds/measurement/InboundMeasurementPanel.test.ts +++ b/src/modules/inbounds/measurement/InboundMeasurementPanel.test.ts @@ -321,19 +321,17 @@ describe('InboundMeasurementPanel', () => { expect(payload).not.toHaveProperty('originalVolumeCbm') }) - it('saves all three warehouse outer dimensions against the measured sequence', async () => { + it('allows saving one warehouse outer dimension against the measured sequence', async () => { const wrapper = await mountPanel() expect(wrapper.text()).toContain('001') await wrapper.find('input[aria-label="仓库修改外箱长"]').setValue('55') - await wrapper.find('input[aria-label="仓库修改外箱宽"]').setValue('45') - await wrapper.find('input[aria-label="仓库修改外箱高"]').setValue('35') const save = wrapper.findAll('button').find((button) => button.text().includes('保存测量数据')) await save?.trigger('click') await flushPromises() const payload = vi.mocked(saveInboundMeasurementDraft).mock.calls[0]?.[2] expect(payload?.items[0]).toMatchObject({ - itemNo: '001', outerLengthCm: 55, outerWidthCm: 45, outerHeightCm: 35, + itemNo: '001', outerLengthCm: 55, outerWidthCm: null, outerHeightCm: null, }) }) diff --git a/src/modules/inbounds/measurement/InboundMeasurementPanel.vue b/src/modules/inbounds/measurement/InboundMeasurementPanel.vue index 30fffcc8..eacbf090 100644 --- a/src/modules/inbounds/measurement/InboundMeasurementPanel.vue +++ b/src/modules/inbounds/measurement/InboundMeasurementPanel.vue @@ -416,7 +416,6 @@ function validateDraft() { } const outerDimensions = [item.outerLengthCm, item.outerWidthCm, item.outerHeightCm] if (outerDimensions.some((value) => value != null)) { - if (outerDimensions.some((value) => value == null)) itemErrors.push('仓库修改外箱长、宽、高必须同时填写') outerDimensions.forEach((value) => { if (value != null && (!Number.isFinite(value) || value <= 0)) itemErrors.push('仓库修改外箱尺寸必须大于 0') else if (value != null && Math.abs(value * 1000 - Math.round(value * 1000)) > 1e-6) itemErrors.push('仓库修改外箱尺寸最多保留 3 位小数') diff --git a/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts b/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts index e53dc6d4..fbc766b8 100644 --- a/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts +++ b/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts @@ -351,7 +351,7 @@ describe('UnifiedOrdersView contract', () => { expect(source).toContain("updateMeasurementSectionMode('outer', $event)") expect(source).toContain("updateMeasurementSectionMode('actual', $event)") expect(source).toContain('calculatedMeasurementRow(row, measurementSectionModes.customer, true)') - expect(source).toContain('}, measurementSectionModes.outer)') + expect(source).toContain('calculatedMeasurementRow(source, measurementSectionModes.outer)') expect(source).toContain('calculatedMeasurementRow(row as unknown as Record, measurementSectionModes.actual)') expect(source).toContain('rawDimensions.map((value) => value + rule.edgeAdditionCm)') expect(source).toContain('matchedSpecificationCoefficient(chargeRule, calculationSource)') diff --git a/src/modules/unified-orders/pages/UnifiedOrdersView.vue b/src/modules/unified-orders/pages/UnifiedOrdersView.vue index e3722bdd..15a070c4 100644 --- a/src/modules/unified-orders/pages/UnifiedOrdersView.vue +++ b/src/modules/unified-orders/pages/UnifiedOrdersView.vue @@ -333,14 +333,7 @@ function calculatedMeasurementRow( mode: MeasurementCalculationMode, customerSource = false, ) { - const calculationSource = !customerSource && mode !== 'ACTUAL' - ? { - ...source, - lengthCm: source.outerLengthCm ?? source.lengthCm, - widthCm: source.outerWidthCm ?? source.widthCm, - heightCm: source.outerHeightCm ?? source.heightCm, - } - : source + const calculationSource = source const rule = matchingDimensionRule(calculationSource) const rawDimensions = [Number(calculationSource.lengthCm), Number(calculationSource.widthCm), Number(calculationSource.heightCm)] if (!rawDimensions.every((value) => Number.isFinite(value) && value > 0)) return { ...source } @@ -352,9 +345,16 @@ function calculatedMeasurementRow( const specificationCoefficient = mode === 'MULTIPLY' && chargeRule ? matchedSpecificationCoefficient(chargeRule, calculationSource) : 1 - const [lengthCm, widthCm, heightCm] = matchedDimensions.map((value) => roundedUp(value * specificationCoefficient, 3)) + const strategyDimensions = matchedDimensions.map((value) => roundedUp(value * specificationCoefficient, 3)) + const outerOverrides = [source.outerLengthCm, source.outerWidthCm, source.outerHeightCm] + const hasOuterOverride = !customerSource && mode !== 'ACTUAL' + && outerOverrides.some((value) => value != null && value !== '') + const [lengthCm, widthCm, heightCm] = strategyDimensions.map((value, index) => { + const override = outerOverrides[index] + return hasOuterOverride && override != null && override !== '' ? Number(override) : value + }) const packageCount = Number(source.packageCount) - const unitVolumeCbm = mode === 'ADD' && rule + const unitVolumeCbm = mode === 'ADD' && rule && !hasOuterOverride ? Math.round((lengthCm * widthCm * heightCm / 1_000_000) * 1000) / 1000 : roundedUp(lengthCm * widthCm * heightCm / 1_000_000, 4) const totalVolumeCbm = Number.isFinite(packageCount) ? roundedUp(unitVolumeCbm * packageCount, 4) : null @@ -377,12 +377,7 @@ const customerMeasurementRows = computed(() => (detail.value?.order.cargoes || [ ))) const outerMeasurementRows = computed(() => (measurementDetail.value?.items || []).map((row) => { const source = row as unknown as Record - return calculatedMeasurementRow({ - ...source, - lengthCm: source.outerLengthCm ?? source.lengthCm, - widthCm: source.outerWidthCm ?? source.widthCm, - heightCm: source.outerHeightCm ?? source.heightCm, - }, measurementSectionModes.outer) + return calculatedMeasurementRow(source, measurementSectionModes.outer) })) const actualMeasurementRows = computed(() => (measurementDetail.value?.items || []).map((row) => ( calculatedMeasurementRow(row as unknown as Record, measurementSectionModes.actual) @@ -881,9 +876,14 @@ async function saveWarehouseOuterDimensions(row: Record) { } if (!summary?.inboundId || !measurement?.measurementId || measurement.version == null || !can('platform:firstleg:inbound:measure:edit')) return - const dimensions = [row.outerLengthCm, row.outerWidthCm, row.outerHeightCm].map(Number) - if (dimensions.some((value) => !Number.isFinite(value) || value <= 0)) { - ElMessage.warning('仓库修改外箱长、宽、高必须同时填写且大于 0') + const dimensions = [row.outerLengthCm, row.outerWidthCm, row.outerHeightCm] + .map((value) => value == null || value === '' ? null : Number(value)) + if (dimensions.every((value) => value == null)) { + ElMessage.warning('请至少输入一项需要修改的外箱尺寸') + return + } + if (dimensions.some((value) => value != null && (!Number.isFinite(value) || value <= 0))) { + ElMessage.warning('仓库修改外箱尺寸必须大于 0') return } measurementOuterSavingId.value = String(row.id) @@ -1993,13 +1993,13 @@ onBeforeUnmount(() => { - + - + - +