优化
This commit is contained in:
@@ -106,6 +106,11 @@ function formatNumber(value: number, precision = 3) {
|
||||
return Number.isFinite(value) ? value.toLocaleString('zh-CN', { maximumFractionDigits: precision }) : '—'
|
||||
}
|
||||
|
||||
function planStatusLabel(status?: string | null) {
|
||||
return ({ EDITING: '预装柜中', LOADING: '拣货装柜中', COMPLETED: '装柜完成' } as Record<string, string>)[status || '']
|
||||
|| (status ? '未知状态' : '尚未创建')
|
||||
}
|
||||
|
||||
function routeMatches(candidate: SmartLoadingCandidate) {
|
||||
const target = container.value?.destinationWarehouseCode
|
||||
return !target || candidate.destinationWarehouseCode === target
|
||||
@@ -291,7 +296,7 @@ onMounted(() => { void load() })
|
||||
</el-alert>
|
||||
|
||||
<div v-if="container" class="smart-loading__summary">
|
||||
<div><span>计划状态</span><strong>{{ plan?.status || '尚未创建' }}</strong></div>
|
||||
<div><span>计划状态</span><strong>{{ planStatusLabel(plan?.status) }}</strong></div>
|
||||
<div><span>已装箱数</span><strong>{{ totalPackages }}</strong></div>
|
||||
<div><span>容积</span><strong>{{ formatNumber(usedVolume) }} / {{ formatNumber(container.capacityCbm || 0) }} m³</strong><small>{{ volumeRate == null ? '容量待配置' : `${volumeRate}%` }}</small></div>
|
||||
<div><span>重量</span><strong>{{ formatNumber(usedWeight) }} / {{ formatNumber(container.maxWeightKg || 0) }} kg</strong><small>{{ weightRate == null ? '承重待配置' : `${weightRate}%` }}</small></div>
|
||||
|
||||
@@ -7,6 +7,7 @@ import UnifiedOrderWorkflowPanel from './UnifiedOrderWorkflowPanel.vue'
|
||||
import {
|
||||
getEvidence,
|
||||
getOutboundDispatch,
|
||||
getPicking,
|
||||
getPreload,
|
||||
smartSplit,
|
||||
voidEvidence,
|
||||
@@ -18,6 +19,7 @@ vi.mock('../api', async (importOriginal) => {
|
||||
...original,
|
||||
getEvidence: vi.fn(),
|
||||
getOutboundDispatch: vi.fn(),
|
||||
getPicking: vi.fn(),
|
||||
getPreload: vi.fn(),
|
||||
smartSplit: vi.fn(),
|
||||
voidEvidence: vi.fn(),
|
||||
@@ -50,6 +52,7 @@ describe('UnifiedOrderWorkflowPanel preload editor', () => {
|
||||
beforeEach(() => {
|
||||
vi.mocked(getOutboundDispatch).mockReset().mockResolvedValue(null as never)
|
||||
vi.mocked(getEvidence).mockReset().mockResolvedValue({ inboundId: '2086085512165634051', evidences: [] })
|
||||
vi.mocked(getPicking).mockReset().mockResolvedValue({ id: '51', inboundId: '2086085512165634051', status: 'PICKING', version: 2, expectedCount: 10, pickedCount: 4, remark: null })
|
||||
vi.mocked(getPreload).mockReset().mockResolvedValue(preload('REF-OLD'))
|
||||
vi.mocked(smartSplit).mockReset()
|
||||
vi.mocked(voidEvidence).mockReset()
|
||||
@@ -156,4 +159,37 @@ describe('UnifiedOrderWorkflowPanel preload editor', () => {
|
||||
)
|
||||
prompt.mockRestore()
|
||||
})
|
||||
|
||||
it('renders booking, trucking and picking backend statuses as business Chinese', async () => {
|
||||
vi.mocked(getOutboundDispatch).mockResolvedValue({
|
||||
orderId: '1', orderNo: 'ORD-1', inboundId: '2', inboundCode: 'IN-2', containerBookingId: '3', containerNo: 'CONT-3',
|
||||
loadingPlanId: '4', loadingPlanStatus: 'LOADING', oceanBookingId: '5', oceanBookingStatus: 'RELEASED',
|
||||
truckAppointmentId: '6', truckAppointmentStatus: 'PICKUP_IN_PROGRESS', gate: { passed: false, items: [] },
|
||||
})
|
||||
const wrapper = mountPanel(['platform:firstleg:inbound:picking:view'], 'LOADING')
|
||||
await flushPromises()
|
||||
|
||||
expect(wrapper.text()).toContain('已放舱')
|
||||
expect(wrapper.text()).toContain('提柜中')
|
||||
expect(wrapper.text()).toContain('拣货中')
|
||||
expect(wrapper.text()).not.toContain('RELEASED')
|
||||
expect(wrapper.text()).not.toContain('PICKUP_IN_PROGRESS')
|
||||
expect(wrapper.text()).not.toContain('PICKING')
|
||||
})
|
||||
|
||||
it('does not expose unknown backend enum values', async () => {
|
||||
vi.mocked(getOutboundDispatch).mockResolvedValue({
|
||||
orderId: '1', orderNo: 'ORD-1', inboundId: '2', inboundCode: 'IN-2', containerBookingId: null, containerNo: null,
|
||||
loadingPlanId: null, loadingPlanStatus: null, oceanBookingId: '5', oceanBookingStatus: 'NEW_BOOKING_STATE',
|
||||
truckAppointmentId: '6', truckAppointmentStatus: 'NEW_TRUCK_STATE', gate: { passed: false, items: [] },
|
||||
})
|
||||
vi.mocked(getPicking).mockResolvedValue({ id: '51', inboundId: '2', status: 'NEW_PICK_STATE', version: 2, expectedCount: null, pickedCount: null, remark: null })
|
||||
const wrapper = mountPanel(['platform:firstleg:inbound:picking:view'], 'LOADING')
|
||||
await flushPromises()
|
||||
|
||||
expect(wrapper.text()).toContain('未知状态')
|
||||
expect(wrapper.text()).not.toContain('NEW_BOOKING_STATE')
|
||||
expect(wrapper.text()).not.toContain('NEW_TRUCK_STATE')
|
||||
expect(wrapper.text()).not.toContain('NEW_PICK_STATE')
|
||||
})
|
||||
})
|
||||
|
||||
@@ -9,6 +9,8 @@ import AppDialog from '@/shared/components/AppDialog.vue'
|
||||
import DataTable, { type DataTableColumn } from '@/shared/components/DataTable.vue'
|
||||
import LoadErrorState from '@/shared/components/LoadErrorState.vue'
|
||||
import SmartLoadingWorkbench from '@/modules/unified-orders/workflows/components/SmartLoadingWorkbench.vue'
|
||||
import { oceanBookingStatusLabel } from '@/modules/ocean-bookings'
|
||||
import { truckAppointmentStatusLabel } from '@/modules/trucking'
|
||||
import { sanitizePreloadItem, validatePreloadItem, validatePreloadItems } from '@/modules/unified-orders/workflows/preloadForm'
|
||||
import {
|
||||
completeLoading,
|
||||
@@ -146,7 +148,19 @@ function removeItem(index: number) {
|
||||
}
|
||||
|
||||
function preloadStatusLabel(status?: string | null) {
|
||||
return ({ PENDING: '待提交', CONFIRMING: '确认中', CONFIRMED: '已确认' } as Record<string, string>)[status || ''] || '尚未生成'
|
||||
return workflowStatusLabel(status, { PENDING: '待提交', CONFIRMING: '确认中', CONFIRMED: '已确认' }, '尚未生成')
|
||||
}
|
||||
|
||||
function workflowStatusLabel(value: string | null | undefined, labels: Record<string, string>, emptyLabel: string) {
|
||||
if (!value) return emptyLabel
|
||||
return labels[value] || '未知状态'
|
||||
}
|
||||
|
||||
function pickingStatusLabel(status?: string | null) {
|
||||
return workflowStatusLabel(status, {
|
||||
PENDING: '待拣货', PICKING: '拣货中', IN_PROGRESS: '拣货中', AWAITING_REVIEW: '待复核',
|
||||
COMPLETED: '已完成', CANCELLED: '已取消',
|
||||
}, '暂无数据')
|
||||
}
|
||||
|
||||
function formatVolume(value: number | null) {
|
||||
@@ -423,8 +437,8 @@ onMounted(() => { void refresh() })
|
||||
<el-card v-if="dispatch" shadow="never" class="workflow-card">
|
||||
<template #header><div class="card-title"><span>子流程与门禁摘要</span><el-tag :type="dispatch.gate?.passed ? 'success' : 'warning'">{{ dispatch.gate?.passed ? '已通过' : '待补齐' }}</el-tag></div></template>
|
||||
<div class="gate-grid">
|
||||
<div><span>订舱</span><strong>{{ dispatch.oceanBookingStatus || '暂无数据' }}</strong></div>
|
||||
<div><span>拖车</span><strong>{{ dispatch.truckAppointmentStatus || '暂无数据' }}</strong></div>
|
||||
<div><span>订舱</span><strong>{{ oceanBookingStatusLabel(dispatch.oceanBookingStatus, '未关联') }}</strong></div>
|
||||
<div><span>拖车</span><strong>{{ truckAppointmentStatusLabel(dispatch.truckAppointmentStatus, '未关联') }}</strong></div>
|
||||
<div><span>柜号</span><strong>{{ dispatch.containerNo || '暂无数据' }}</strong></div>
|
||||
<div v-for="item in dispatch.gate?.items || []" :key="item.code"><span>{{ gateItemName(item.code, item.name) }}</span><el-tag size="small" :type="item.passed ? 'success' : 'danger'">{{ item.passed ? '已满足' : '待补齐' }}</el-tag></div>
|
||||
</div>
|
||||
@@ -473,7 +487,7 @@ onMounted(() => { void refresh() })
|
||||
<el-card shadow="never" class="workflow-card">
|
||||
<template #header><div class="card-title"><span>拣货与装柜</span><el-tag type="warning">装柜中</el-tag></div></template>
|
||||
<el-descriptions v-if="picking" :column="2" border>
|
||||
<el-descriptions-item label="拣货状态">{{ picking.status || '—' }}</el-descriptions-item>
|
||||
<el-descriptions-item label="拣货状态">{{ pickingStatusLabel(picking.status) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="拣货版本">{{ picking.version }}</el-descriptions-item>
|
||||
<el-descriptions-item label="应拣件数">{{ picking.expectedCount ?? '—' }}</el-descriptions-item>
|
||||
<el-descriptions-item label="已拣件数">{{ picking.pickedCount ?? '—' }}</el-descriptions-item>
|
||||
|
||||
Reference in New Issue
Block a user