修复采购审核竞态并整理管理页面展示
This commit is contained in:
@@ -15,7 +15,7 @@ import { inboundProcessStatusLabels, inboundReviewStatusLabels, inboundStatusLab
|
||||
import WeightOcrPanel from '../weight/components/WeightOcrPanel.vue'
|
||||
import type { WeightResultResource } from '../weight/types'
|
||||
import { approveMeasurement, getMeasurementReviewDetail } from './api'
|
||||
import type { MeasurementReviewDetail } from './types'
|
||||
import type { MeasurementReviewDetail, MeasurementReviewItem } from './types'
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
customerId?: string
|
||||
@@ -60,6 +60,52 @@ const displayChannelName = computed(() => detail.value?.channelName?.trim() || d
|
||||
const measurementCount = computed(() => detail.value?.items.length || 0)
|
||||
const weightCount = computed(() => detail.value?.weightResults.length || 0)
|
||||
|
||||
// 实测展示只采用原始尺寸与确认箱数,规则计算后的体积仍留在服务端计费快照中。
|
||||
function measuredUnitVolumeCbm(item: MeasurementReviewItem) {
|
||||
const { lengthCm, widthCm, heightCm } = item
|
||||
if (lengthCm == null || widthCm == null || heightCm == null
|
||||
|| ![lengthCm, widthCm, heightCm].every(value => Number.isFinite(value) && value > 0)) return null
|
||||
const volume = lengthCm * widthCm * heightCm / 1_000_000
|
||||
return Number.isFinite(volume) ? volume : null
|
||||
}
|
||||
|
||||
function measuredVolumeCbm(item: MeasurementReviewItem) {
|
||||
const unitVolume = measuredUnitVolumeCbm(item)
|
||||
if (unitVolume == null || item.packageCount == null || !Number.isInteger(item.packageCount) || item.packageCount < 1) return null
|
||||
const volume = unitVolume * item.packageCount
|
||||
return Number.isFinite(volume) ? volume : null
|
||||
}
|
||||
|
||||
const measuredTotalVolumeCbm = computed(() => {
|
||||
if (!detail.value?.items.length) return null
|
||||
let total = 0
|
||||
for (const item of detail.value.items) {
|
||||
const volume = measuredVolumeCbm(item)
|
||||
if (volume == null) return null
|
||||
total += volume
|
||||
}
|
||||
return Number.isFinite(total) ? total : null
|
||||
})
|
||||
|
||||
const warehouseOuterItems = computed(() => (detail.value?.items || []).filter(item =>
|
||||
item.outerLengthCm != null || item.outerWidthCm != null || item.outerHeightCm != null))
|
||||
|
||||
function warehouseOuterTotal(key: 'packageCount' | 'totalVolumeCbm' | 'volumeWeightKg') {
|
||||
if (!warehouseOuterItems.value.length) return null
|
||||
let total = 0
|
||||
for (const item of warehouseOuterItems.value) {
|
||||
const value = item[key]
|
||||
if (value == null || !Number.isFinite(value) || value < 0) return null
|
||||
total += value
|
||||
}
|
||||
return Number.isFinite(total) ? total : null
|
||||
}
|
||||
|
||||
function warehouseOuterSummary() {
|
||||
return ['合计', '', '', '', '', formatNumber(warehouseOuterTotal('packageCount'), 0), '—',
|
||||
formatNumber(warehouseOuterTotal('totalVolumeCbm')), formatNumber(warehouseOuterTotal('volumeWeightKg'))]
|
||||
}
|
||||
|
||||
function formatNumber(value: number | null | undefined, maximumFractionDigits = 3) {
|
||||
if (value === null || value === undefined || !Number.isFinite(value)) return '—'
|
||||
return new Intl.NumberFormat('zh-CN', { maximumFractionDigits, minimumFractionDigits: 0 }).format(value)
|
||||
@@ -142,7 +188,7 @@ async function confirmApprove() {
|
||||
if (!detail.value || !isPending.value || !canReview.value || actionLoading.value || props.postApproveLoading || props.approvalCompleted) return
|
||||
try {
|
||||
await ElMessageBox.confirm(
|
||||
'审核通过后,入库单将进入待分柜',
|
||||
`审核通过后,入库单将进入${approvalTargetLabel.value}`,
|
||||
'确认测量',
|
||||
{ customClass: 'admin-density-confirm', confirmButtonText: approvalButtonLabel.value, cancelButtonText: '返回', type: 'warning' },
|
||||
)
|
||||
@@ -213,10 +259,10 @@ defineExpose({ confirmApprove, approvalButtonLabel, isPending, canReview, action
|
||||
<tbody>
|
||||
<tr><th scope="row">箱数</th><td>{{ formatNumber(detail.originalPackageCount, 0) }}</td><td>{{ formatNumber(detail.actualPackageCount, 0) }}</td><td>{{ formatDifference(detail.actualPackageCount, detail.originalPackageCount, 0) }}</td></tr>
|
||||
<tr><th scope="row">毛重(kg)</th><td>{{ formatNumber(detail.originalGrossWeightKg) }}</td><td>{{ formatNumber(detail.actualGrossWeightKg) }}</td><td>{{ formatDifference(detail.actualGrossWeightKg, detail.originalGrossWeightKg, 3, ' kg') }}</td></tr>
|
||||
<tr><th scope="row">体积(m³)</th><td>{{ formatNumber(detail.originalVolumeCbm, 3) }}</td><td>{{ formatNumber(detail.actualVolumeCbm, 3) }}</td><td>{{ formatDifference(detail.actualVolumeCbm, detail.originalVolumeCbm, 3, ' m³') }}</td></tr>
|
||||
<tr><th scope="row">体积(m³)</th><td>{{ formatNumber(detail.originalVolumeCbm, 3) }}</td><td>{{ formatNumber(measuredTotalVolumeCbm, 3) }}</td><td>{{ formatDifference(measuredTotalVolumeCbm, detail.originalVolumeCbm, 3, ' m³') }}</td></tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
<div class="review-extra-facts"><span>货物净重 <strong>{{ formatNumber(detail.actualNetWeightKg) }}</strong> kg</span><span>体积重 <strong>{{ formatNumber(detail.volumeWeightKg) }}</strong> kg</span></div>
|
||||
<div class="review-extra-facts"><span>货物净重 <strong>{{ formatNumber(detail.actualNetWeightKg) }}</strong> kg</span><span>计费体积重 <strong>{{ formatNumber(detail.volumeWeightKg) }}</strong> kg</span></div>
|
||||
</section>
|
||||
|
||||
<section class="review-items density-dialog-section" data-tone="source" aria-labelledby="review-items-title">
|
||||
@@ -249,13 +295,10 @@ defineExpose({ confirmApprove, approvalButtonLabel, isPending, canReview, action
|
||||
<template #default="{ row }">{{ formatNumber(row.packageCount, 0) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="单箱体积(m³)" width="106" align="right">
|
||||
<template #default="{ row }">{{ formatNumber(row.unitVolumeCbm, 3) }}</template>
|
||||
<template #default="{ row }">{{ formatNumber(measuredUnitVolumeCbm(row as MeasurementReviewItem), 3) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="总体积(m³)" width="96" align="right">
|
||||
<template #default="{ row }">{{ formatNumber(row.totalVolumeCbm, 3) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="体积重(kg)" width="96" align="right">
|
||||
<template #default="{ row }">{{ formatNumber(row.volumeWeightKg) }}</template>
|
||||
<template #default="{ row }">{{ formatNumber(measuredVolumeCbm(row as MeasurementReviewItem), 3) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="测量时间" width="220" class-name="review-time-cell">
|
||||
<template #default="{ row }">{{ formatDate(row.deviceMeasuredAt) }}</template>
|
||||
@@ -265,6 +308,42 @@ defineExpose({ confirmApprove, approvalButtonLabel, isPending, canReview, action
|
||||
<el-empty v-else description="暂无箱规测量明细" :image-size="48" />
|
||||
</section>
|
||||
|
||||
<section v-if="warehouseOuterItems.length" class="review-items review-outer-items density-dialog-section" aria-labelledby="review-outer-title">
|
||||
<header class="review-section-heading density-dialog-section__title">
|
||||
<h3 id="review-outer-title" class="review-detail-heading"><Ruler :size="18" aria-hidden="true" />仓库修改外箱</h3>
|
||||
<span>{{ warehouseOuterItems.length }} 条</span>
|
||||
</header>
|
||||
<div class="review-table-scroll">
|
||||
<el-table :data="warehouseOuterItems" border stripe table-layout="fixed" class="review-table" show-summary :summary-method="warehouseOuterSummary">
|
||||
<el-table-column type="index" label="#" width="54" align="center" />
|
||||
<el-table-column label="箱号" min-width="160" show-overflow-tooltip>
|
||||
<template #default="{ row }">{{ row.boxCode || row.itemNo || '—' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="仓库修改外箱(长)cm" min-width="150" align="right">
|
||||
<template #default="{ row }">{{ formatNumber(row.outerLengthCm) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="仓库修改外箱(宽)cm" min-width="150" align="right">
|
||||
<template #default="{ row }">{{ formatNumber(row.outerWidthCm) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="仓库修改外箱(高)cm" min-width="150" align="right">
|
||||
<template #default="{ row }">{{ formatNumber(row.outerHeightCm) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="箱数" width="66" align="right">
|
||||
<template #default="{ row }">{{ formatNumber(row.packageCount, 0) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="计算后单箱体积(m³)" min-width="138" align="right">
|
||||
<template #default="{ row }">{{ formatNumber(row.unitVolumeCbm, 3) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="计算后总体积(m³)" min-width="138" align="right">
|
||||
<template #default="{ row }">{{ formatNumber(row.totalVolumeCbm, 3) }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="计费体积重(kg)" min-width="120" align="right">
|
||||
<template #default="{ row }">{{ formatNumber(row.volumeWeightKg) }}</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="review-items review-weight-items density-dialog-section" data-tone="source" aria-labelledby="review-weight-title">
|
||||
<header class="review-section-heading density-dialog-section__title">
|
||||
<h3 id="review-weight-title" class="review-detail-heading"><Scale :size="18" aria-hidden="true" />称重明细</h3>
|
||||
|
||||
Reference in New Issue
Block a user