From b21fd625e4fc197109df6ba712e8d45dd7152c05 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 13 Aug 2026 17:14:51 +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 --- .../components/InboundTaskList.test.ts | 12 ++ .../inbounds/components/InboundTaskList.vue | 6 +- .../measurement/InboundMeasurementPanel.vue | 165 +++++++++++------- 3 files changed, 116 insertions(+), 67 deletions(-) create mode 100644 src/modules/inbounds/components/InboundTaskList.test.ts diff --git a/src/modules/inbounds/components/InboundTaskList.test.ts b/src/modules/inbounds/components/InboundTaskList.test.ts new file mode 100644 index 00000000..8ad03b12 --- /dev/null +++ b/src/modules/inbounds/components/InboundTaskList.test.ts @@ -0,0 +1,12 @@ +import { readFileSync } from 'node:fs' +import { resolve } from 'node:path' +import { describe, expect, it } from 'vitest' + +describe('InboundTaskList measurement scope', () => { + it('uses the inbound tenant isolation key for measurement and review requests', () => { + const source = readFileSync(resolve('src/modules/inbounds/components/InboundTaskList.vue'), 'utf8') + + expect(source.match(/:tenant-id="selectedInbound\.tenantId"/g)).toHaveLength(2) + expect(source).not.toContain('selectedInbound.customerId || selectedInbound.tenantId') + }) +}) diff --git a/src/modules/inbounds/components/InboundTaskList.vue b/src/modules/inbounds/components/InboundTaskList.vue index 15be1741..6cb56940 100644 --- a/src/modules/inbounds/components/InboundTaskList.vue +++ b/src/modules/inbounds/components/InboundTaskList.vue @@ -260,7 +260,7 @@ onBeforeUnmount(() => { disposed = true; requestSerial += 1 }) { disposed = true; requestSerial += 1 }) > diff --git a/src/modules/inbounds/measurement/InboundMeasurementPanel.vue b/src/modules/inbounds/measurement/InboundMeasurementPanel.vue index 0f7f61d4..4fedaba5 100644 --- a/src/modules/inbounds/measurement/InboundMeasurementPanel.vue +++ b/src/modules/inbounds/measurement/InboundMeasurementPanel.vue @@ -422,6 +422,10 @@ function processStatusLabel(status: string | undefined) { return inboundStatusLabel(status, inboundProcessStatusLabels) } +function measurementRowClassName({ row }: { row: EditableMeasurementItem }) { + return validationErrors.value[row.clientKey]?.length ? 'measurement-table__row--error' : '' +} + watch( () => [customerId.value, props.inboundId, canView.value] as const, () => { @@ -548,12 +552,12 @@ defineExpose({ saveDraft, submitForReview, mayMaintain, maySubmit, saving, submi

原单数据

原单值仅用于审核对比,不参与前端计算。

-
- - - - -
+
+
原单据号码(CKW)
{{ form.originalDocumentNo || '—' }}
+
原单据毛重(T.K.GW)
{{ formatNumber(form.originalGrossWeightKg) }}
+
原单据总体积(T.CBM)
{{ formatNumber(form.originalVolumeCbm, 4) }}
+
实际品名
{{ form.actualGoodsName || '—' }}
+
@@ -562,31 +566,72 @@ defineExpose({ saveDraft, submitForReview, mayMaintain, maySubmit, saving, submi 手动录入箱规 - - -
-
-
扫描箱 {{ index + 1 }}{{ item.boxCode || '未关联箱号' }} · {{ item.machineNo || '人工录入' }}
-
-
- - - - - - - - - -
-
-
箱规周长
{{ formatNumber(item.serverValues.girthCm) }} cm
-
单箱体积
{{ formatNumber(item.serverValues.unitVolumeCbm, 4) }} CBM
-
总毛重
{{ formatNumber(item.serverValues.totalWeightKg) }} KG
-
总体积
{{ formatNumber(item.serverValues.totalVolumeCbm, 4) }} CBM
-
总材积重
{{ formatNumber(item.serverValues.volumeWeightKg) }} KG
-
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@@ -675,10 +720,13 @@ defineExpose({ saveDraft, submitForReview, mayMaintain, maySubmit, saving, submi .measurement-section__heading { display: flex; align-items: flex-start; justify-content: space-between; gap: 18px; margin-bottom: 16px; } .measurement-section__heading > div { min-width: 0; } .measurement-form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 15px; } -.measurement-item__grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 15px; } -.measurement-form label, .measurement-item label { display: flex; min-width: 0; flex-direction: column; gap: 7px; color: #344054; font-size: 12px; font-weight: 650; } +.measurement-form label { display: flex; min-width: 0; flex-direction: column; gap: 7px; color: #344054; font-size: 12px; font-weight: 650; } .measurement-form :deep(.el-input-number), .measurement-form :deep(.el-input) { width: 100%; } -.measurement-image-field :deep(.el-button) { width: 100%; margin: 0; } +.measurement-order-summary { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 0; border: 1px solid var(--cc-border); border-radius: 6px; background: #fff; } +.measurement-order-summary > div { min-width: 0; padding: 11px 13px; border-right: 1px solid var(--cc-border); } +.measurement-order-summary > div:last-child { border-right: 0; } +.measurement-order-summary dt { color: var(--cc-muted); font-size: 11px; } +.measurement-order-summary dd { margin: 4px 0 0; overflow-wrap: anywhere; color: var(--cc-text); font-size: 13px; font-weight: 650; } .measurement-image-preview { display: grid; min-height: 240px; place-items: center; } .measurement-image-preview img { display: block; width: auto; max-width: 100%; max-height: 68vh; object-fit: contain; } .manual-entry-alert { margin-bottom: 16px; } @@ -686,35 +734,29 @@ defineExpose({ saveDraft, submitForReview, mayMaintain, maySubmit, saving, submi .manual-entry-form :deep(.el-input-number), .manual-entry-form :deep(.el-date-editor) { width: 100%; } .manual-entry-upload { width: 100%; } .measurement-items-section { background: #fafbfc; } -.measurement-item { overflow: hidden; margin-top: 14px; border: 1px solid var(--cc-border); border-radius: 9px; background: #fff; } -.measurement-item.has-error { border-color: var(--el-color-danger-light-5); } -.measurement-item > header { display: flex; align-items: center; justify-content: space-between; gap: 14px; padding: 12px 15px; border-bottom: 1px solid var(--cc-border); background: #f8fafc; } -.measurement-item > header > div { display: flex; min-width: 0; flex-direction: column; gap: 3px; } -.measurement-item > header strong { color: var(--cc-text); font-size: 13px; } -.measurement-item > header span { overflow: hidden; color: var(--cc-muted); font-size: 11px; text-overflow: ellipsis; white-space: nowrap; } -.measurement-item__grid { padding: 16px; } -.measurement-item__advanced { margin: 0 16px 16px; border-top: 1px solid var(--cc-border); } -.measurement-item__advanced summary { padding: 12px 0 0; color: var(--cc-primary); font-size: 12px; font-weight: 700; cursor: pointer; } -.measurement-item__advanced .measurement-item__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); padding: 14px 0 0; } -.measurement-item__advanced .span-two { grid-column: span 3; } -.measurement-item__results { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); margin: 0; border-top: 1px solid var(--cc-border); background: #fbfcfe; } -.measurement-item__results > div { min-width: 0; padding: 11px 14px; border-right: 1px solid var(--cc-border); } -.measurement-item__results > div:last-child { border-right: 0; } -.measurement-item__results dt { color: var(--cc-muted); font-size: 10px; } -.measurement-item__results dd { margin: 4px 0 0; overflow-wrap: anywhere; color: #344054; font-size: 12px; font-weight: 700; } +.measurement-table { width: 100%; font-size: 12px; } +.measurement-table :deep(.el-table__header th) { padding: 8px 0; background: #f6f8fa; color: #475467; font-size: 11px; font-weight: 700; } +.measurement-table :deep(.el-table__cell) { padding: 7px 0; } +.measurement-table :deep(.cell) { line-height: 1.35; } +.measurement-table :deep(.measurement-table__row--error > td.el-table__cell) { background: var(--el-color-danger-light-9); } +.measurement-box-code { font-weight: 650; } +.measurement-count-editor { width: 104px !important; } +.measurement-row-details { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px 20px; margin: 0; padding: 4px 18px 8px 62px; } +.measurement-row-details dt { color: var(--cc-muted); font-size: 11px; } +.measurement-row-details dd { margin: 3px 0 0; overflow-wrap: anywhere; color: var(--cc-text); font-size: 12px; font-weight: 600; } .measurement-panel__footer { position: sticky; bottom: 0; z-index: 2; display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 13px 20px; border-top: 1px solid var(--cc-border); background: rgba(255, 255, 255, .97); box-shadow: 0 -8px 22px rgba(15, 23, 42, .05); } .measurement-panel__footer > span { display: inline-flex; align-items: center; gap: 6px; color: var(--cc-muted); font-size: 12px; } .measurement-panel__footer > span:has(svg) { color: #b54708; font-weight: 650; } .sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; } @media (max-width: 960px) { - .measurement-form-grid, .measurement-item__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .measurement-form-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .measurement-order-summary, .measurement-row-details { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .measurement-order-summary > div:nth-child(2) { border-right: 0; } + .measurement-order-summary > div:nth-child(-n+2) { border-bottom: 1px solid var(--cc-border); } .measurement-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); } .measurement-metrics > div:nth-child(2) { border-right: 0; } .measurement-metrics > div:nth-child(-n+2) { border-bottom: 1px solid var(--cc-border); } - .measurement-item__results { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .measurement-item__results > div:nth-child(3) { border-right: 0; } - .measurement-item__results > div:nth-child(-n+3) { border-bottom: 1px solid var(--cc-border); } } @media (max-width: 720px) { @@ -724,18 +766,13 @@ defineExpose({ saveDraft, submitForReview, mayMaintain, maySubmit, saving, submi .measurement-tags { justify-content: flex-start; } .measurement-context, .measurement-section { padding-right: 14px; padding-left: 14px; } .measurement-panel > :deep(.el-alert), .measurement-alert { margin-right: 14px; margin-left: 14px; } - .measurement-form-grid, .measurement-item__grid, .measurement-item__advanced .measurement-item__grid { grid-template-columns: 1fr; } - .measurement-item__advanced .span-two { grid-column: auto; } - .measurement-item__results { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .measurement-item__results > div { border-right: 1px solid var(--cc-border); border-bottom: 1px solid var(--cc-border); } - .measurement-item__results > div:nth-child(even) { border-right: 0; } - .measurement-item__results > div:last-child { border-bottom: 0; } + .measurement-form-grid { grid-template-columns: 1fr; } + .measurement-row-details { grid-template-columns: 1fr; padding-left: 54px; } } @media (max-width: 420px) { - .measurement-metrics, .measurement-item__results { grid-template-columns: 1fr; } - .measurement-metrics > div, .measurement-item__results > div { border-right: 0; border-bottom: 1px solid var(--cc-border); } - .measurement-metrics > div:last-child, .measurement-item__results > div:last-child { border-bottom: 0; } - .measurement-item > header { align-items: flex-start; } + .measurement-metrics, .measurement-order-summary { grid-template-columns: 1fr; } + .measurement-metrics > div, .measurement-order-summary > div { border-right: 0; border-bottom: 1px solid var(--cc-border); } + .measurement-metrics > div:last-child, .measurement-order-summary > div:last-child { border-bottom: 0; } }