From 8c9f4468af2ebcbc79146d2d66fec04d2720d3fa Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 10 Sep 2026 11:38:38 +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 --- src/modules/inbounds/index.ts | 2 +- src/modules/inbounds/measurement/api.test.ts | 18 ++++- src/modules/inbounds/measurement/api.ts | 16 +++++ src/modules/inbounds/measurement/types.ts | 12 ++++ .../pages/UnifiedOrdersView.test.ts | 4 +- .../pages/UnifiedOrdersView.vue | 71 ++++++++----------- 6 files changed, 78 insertions(+), 45 deletions(-) diff --git a/src/modules/inbounds/index.ts b/src/modules/inbounds/index.ts index aca45480..ba2c231d 100644 --- a/src/modules/inbounds/index.ts +++ b/src/modules/inbounds/index.ts @@ -1,4 +1,4 @@ -export { getInboundMeasurement, saveInboundMeasurementDraft, updateMeasurementCalculationStrategy } from './measurement/api' +export { getInboundMeasurement, saveInboundMeasurementDraft, updateMeasurementCalculationStrategy, updateMeasurementOuterDimensions } from './measurement/api' export { createInboundHoldIdempotencyKey, downloadInboundCartonLabelsBatch, downloadPlatformInboundHoldEvidence, getPlatformInboundHold, holdPlatformInbound, releasePlatformInbound, uploadPlatformInboundHoldEvidence } from './core/api' export { default as InboundMeasurementPanel } from './measurement/InboundMeasurementPanel.vue' export { default as InboundMeasurementDialog } from './measurement/InboundMeasurementDialog.vue' diff --git a/src/modules/inbounds/measurement/api.test.ts b/src/modules/inbounds/measurement/api.test.ts index 9437524f..04fc059e 100644 --- a/src/modules/inbounds/measurement/api.test.ts +++ b/src/modules/inbounds/measurement/api.test.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { http } from '@/shared/api/http' -import { createManualCartonScan, downloadInboundMeasurementImage, getInboundMeasurement, saveInboundMeasurementDraft, submitInboundMeasurement, updateConfirmedPackageCount, updateMeasurementCalculationStrategy } from './api' +import { createManualCartonScan, downloadInboundMeasurementImage, getInboundMeasurement, saveInboundMeasurementDraft, submitInboundMeasurement, updateConfirmedPackageCount, updateMeasurementCalculationStrategy, updateMeasurementOuterDimensions } from './api' import type { SaveInboundMeasurementDraftRequest } from './types' vi.mock('@/shared/api/http', () => ({ @@ -89,6 +89,22 @@ describe('inbound measurement API', () => { ) }) + it('updates one warehouse outer dimension row without resaving the frozen measurement batch', async () => { + const payload = { + measurementId: '9001', version: 4, + outerLengthCm: 30, outerWidthCm: 20, outerHeightCm: 20, + } + const saved = { measurementId: '9001', version: 5, status: 'SUBMITTED', itemId: '81' } + vi.mocked(http.put).mockResolvedValue({ code: '200', message: 'success', data: saved }) + + await expect(updateMeasurementOuterDimensions('10001', '7001', '81', payload)).resolves.toEqual(saved) + expect(http.put).toHaveBeenCalledWith( + '/platform/v1/first-leg/inbounds/7001/measurement/items/81/outer-dimensions', + payload, + { params: { tenantId: '10001' } }, + ) + }) + it('downloads the current measurement image using the scoped file route', async () => { const image = new Blob(['image-data'], { type: 'image/jpeg' }) vi.mocked(http.get).mockResolvedValue(image) diff --git a/src/modules/inbounds/measurement/api.ts b/src/modules/inbounds/measurement/api.ts index 779e04ce..bbf33f12 100644 --- a/src/modules/inbounds/measurement/api.ts +++ b/src/modules/inbounds/measurement/api.ts @@ -9,6 +9,8 @@ import type { SubmitInboundMeasurementRequest, UpdateMeasurementCalculationStrategyRequest, MeasurementCalculationStrategyUpdated, + UpdateMeasurementOuterDimensionsRequest, + MeasurementOuterDimensionsUpdated, ManualCartonScanRequest, } from './types' @@ -72,6 +74,20 @@ export async function updateMeasurementCalculationStrategy( return unwrapApiResponse(response) } +export async function updateMeasurementOuterDimensions( + customerId: string, + inboundId: string, + itemId: string, + payload: UpdateMeasurementOuterDimensionsRequest, +) { + const response = await http.put, ApiEnvelope>( + `${measurementPath(inboundId)}/items/${segment(itemId)}/outer-dimensions`, + payload, + { params: { tenantId: customerId } }, + ) + return unwrapApiResponse(response) +} + export async function submitInboundMeasurement( customerId: string, inboundId: string, diff --git a/src/modules/inbounds/measurement/types.ts b/src/modules/inbounds/measurement/types.ts index 560f585c..7d9c2630 100644 --- a/src/modules/inbounds/measurement/types.ts +++ b/src/modules/inbounds/measurement/types.ts @@ -175,6 +175,18 @@ export interface MeasurementCalculationStrategyUpdated extends InboundMeasuremen chargeRuleId: MeasurementIdentifier | null } +export interface UpdateMeasurementOuterDimensionsRequest { + measurementId: MeasurementIdentifier + version: number + outerLengthCm: number | null + outerWidthCm: number | null + outerHeightCm: number | null +} + +export interface MeasurementOuterDimensionsUpdated extends InboundMeasurementDraftSaved { + itemId: MeasurementIdentifier +} + export interface ConfirmedPackageCountRequest { measurementVersion: number confirmedPackageCount: number diff --git a/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts b/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts index 6a4520b2..34b320db 100644 --- a/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts +++ b/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts @@ -350,7 +350,9 @@ describe('UnifiedOrdersView contract', () => { expect(source).toContain('仓库修改外箱(高)') expect(source).toContain('saveWarehouseOuterDimensions') expect(source).toContain("'PREPARING', 'WAIT_MEASURE', 'MEASURING', 'MEASURE_REJECTED'") - expect(source).toContain('v-if="measurementDraftEditable"') + expect(source.match(/v-if="measurementStrategyEditable"/g)).toHaveLength(4) + expect(source).toContain('updateMeasurementOuterDimensions') + expect(source).not.toContain('await saveInboundMeasurementDraft(String(summary.tenantId), String(summary.inboundId)') expect(source).not.toContain('请至少输入一项需要修改的外箱尺寸') expect(source).toContain(".map((value) => value == null || value === '' ? null : Number(value))") expect(source).toContain('相关数值已重新计算') diff --git a/src/modules/unified-orders/pages/UnifiedOrdersView.vue b/src/modules/unified-orders/pages/UnifiedOrdersView.vue index 41ae16db..6e4b639a 100644 --- a/src/modules/unified-orders/pages/UnifiedOrdersView.vue +++ b/src/modules/unified-orders/pages/UnifiedOrdersView.vue @@ -73,8 +73,8 @@ import { holdPlatformInbound, releasePlatformInbound, uploadPlatformInboundHoldEvidence, - saveInboundMeasurementDraft, updateMeasurementCalculationStrategy, + updateMeasurementOuterDimensions, InboundFeePanel, InboundMeasurementDialog, MeasurementEvidenceThumbnail, @@ -1066,56 +1066,43 @@ async function updateMeasurementCalculationMode(row: Record | n async function saveWarehouseOuterDimensions(row: Record) { const summary = detail.value?.summary const measurement = measurementDetail.value - const currentStatus = measurement?.processStatus || summary?.mainStatus || '' - if (measurement && !measurementDraftEditableStatuses.has(currentStatus)) { - const statusLabel = orderStatusLabel(summary?.mainStatus) || measurementStatusLabel(currentStatus) - ElMessage.warning(`当前状态为“${statusLabel}”,该状态不可以修改测量数据`) - return - } if (!summary?.inboundId || !measurement?.measurementId || measurement.version == null - || !measurementDraftEditable.value) return + || !measurementStrategyEditable.value) return const dimensions = [row.outerLengthCm, row.outerWidthCm, row.outerHeightCm] .map((value) => value == null || value === '' ? null : Number(value)) if (dimensions.some((value) => value != null && (!Number.isFinite(value) || value <= 0))) { ElMessage.warning('仓库修改外箱尺寸必须大于 0') return } - const selectedMode: MeasurementCalculationMode = measurementSectionModes.outer - const selectedChargeRuleId = selectedMode === 'MULTIPLY' - ? activeMeasurementChargeRule.value?.id || null - : null measurementOuterSavingId.value = String(row.id) try { - await saveInboundMeasurementDraft(String(summary.tenantId), String(summary.inboundId), { + const saved = await updateMeasurementOuterDimensions( + String(summary.tenantId), String(summary.inboundId), String(row.id), { measurementId: String(measurement.measurementId), version: measurement.version, - actualGoodsName: measurement.actualGoodsName, - items: measurement.items.filter((item) => Number(item.packageCount) > 0).map((item) => ({ - inboundDetailId: item.inboundDetailId ?? undefined, - boxCode: item.boxCode, - itemNo: item.itemNo, - boxSpecification: item.boxSpecification, - packageCount: item.packageCount, - lengthCm: item.lengthCm, - widthCm: item.widthCm, - heightCm: item.heightCm, - unitWeightKg: item.unitWeightKg, - intelligentImageFileId: item.intelligentImageFileId, - machineNo: item.machineNo, - measuredAt: item.deviceMeasuredAt, - overLimitWarning: item.overLimitWarning, - outerLengthCm: String(item.id) === String(row.id) ? dimensions[0] : item.outerLengthCm, - outerWidthCm: String(item.id) === String(row.id) ? dimensions[1] : item.outerWidthCm, - outerHeightCm: String(item.id) === String(row.id) ? dimensions[2] : item.outerHeightCm, - chargeRuleId: String(item.id) === String(row.id) ? selectedChargeRuleId : item.chargeRuleId, - coefficientMode: String(item.id) === String(row.id) - ? selectedMode - : item.coefficientMode || 'ACTUAL', - remark: item.remark, - })), + outerLengthCm: dimensions[0], + outerWidthCm: dimensions[1], + outerHeightCm: dimensions[2], }) + measurementDetail.value = { + ...measurement, + version: saved.version, + measurementStatus: saved.status, + items: measurement.items.map((item) => String(item.id) === String(row.id) ? { + ...item, + outerLengthCm: dimensions[0], + outerWidthCm: dimensions[1], + outerHeightCm: dimensions[2], + calculatedOuterLengthCm: dimensions[0], + calculatedOuterWidthCm: dimensions[1], + calculatedOuterHeightCm: dimensions[2], + } : item), + } + const refreshed = await waitForSavedMeasurementVersion( + String(summary.tenantId), String(summary.inboundId), saved.version, + ) + if (refreshed) measurementDetail.value = refreshed measurementLoadedKey.value = '' - await loadMeasurementDetails() ElMessage.success(`序号 ${row.itemNo || '—'} 的外箱规已更新,相关数值已重新计算`) } catch (error) { measurementLoadedKey.value = '' @@ -2470,15 +2457,15 @@ onBeforeUnmount(() => { - + - + - + - +