feat(wms):将首页的枚举值去掉,统一合并到 constants 里,更聚焦点

pull/878/head
YunaiV 2026-05-17 18:17:30 +08:00
parent ceb1aa9bce
commit 46c436e0df
3 changed files with 42 additions and 79 deletions

View File

@ -27,9 +27,9 @@
</div>
<div class="mt-18px flex items-baseline gap-8px">
<em class="not-italic text-[var(--el-text-color-secondary)]">合计</em>
<span class="text-32px font-700 leading-38px text-[var(--el-text-color-primary)]">{{
formatCount(item.total)
}}</span>
<span class="text-32px font-700 leading-38px text-[var(--el-text-color-primary)]">
{{ item.total?.toLocaleString() }}
</span>
<em class="not-italic text-[var(--el-text-color-secondary)]"></em>
</div>
<div
@ -50,9 +50,9 @@
<span class="block truncate text-12px text-[var(--el-text-color-secondary)]">
{{ status.label }}
</span>
<strong class="mt-2px block text-16px" :style="{ color: status.color }">{{
item.statusCounts[status.value]
}}</strong>
<strong class="mt-2px block text-16px" :style="{ color: status.color }">
{{ item.statusCounts?.[status.value] }}
</strong>
</div>
</div>
</div>
@ -64,7 +64,7 @@
import { useRouter } from 'vue-router'
import { WmsHomeStatisticsApi } from '@/api/wms/home'
import { DICT_TYPE, getDictLabel } from '@/utils/dict'
import { OrderStatusEnum } from '@/views/wms/utils/constants'
import { OrderStatusEnum, OrderTypeEnum } from '@/views/wms/utils/constants'
defineOptions({ name: 'WmsHomeOrderSummaryCards' })
@ -74,34 +74,18 @@ interface StatusItem {
color: string
}
interface OrderDefinition {
interface OrderSummaryItem {
orderType: number
title: string
color: string
routeName: string
}
interface OrderSummaryItem extends OrderDefinition {
total: number
statusCounts: Record<number, number>
total?: number
statusCounts?: Partial<Record<number, number>>
}
const router = useRouter()
const message = useMessage()
const OrderTypeEnum = {
RECEIPT: 1,
SHIPMENT: 2,
MOVEMENT: 3,
CHECK: 4
} as const
/** 获取单据类型名称 */
const getOrderTypeTitle = (type: number, defaultTitle: string) => {
const label = getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, type) || defaultTitle
return label.endsWith('单') ? label.slice(0, -1) : label
}
/** 获取单据状态名称 */
const getOrderStatusLabel = (status: number, defaultLabel: string) => {
return getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, status) || defaultLabel
@ -125,51 +109,34 @@ const statusList: StatusItem[] = [
color: '#909399'
}
]
const orderDefinitions: OrderDefinition[] = [
const orderDefinitions: OrderSummaryItem[] = [
{
orderType: OrderTypeEnum.RECEIPT,
title: getOrderTypeTitle(OrderTypeEnum.RECEIPT, '入库'),
title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.RECEIPT).replace(/单$/, ''),
color: '#2f7df6',
routeName: 'WmsReceiptOrder'
},
{
orderType: OrderTypeEnum.SHIPMENT,
title: getOrderTypeTitle(OrderTypeEnum.SHIPMENT, '出库'),
title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.SHIPMENT).replace(/单$/, ''),
color: '#18a058',
routeName: 'WmsShipmentOrder'
},
{
orderType: OrderTypeEnum.MOVEMENT,
title: getOrderTypeTitle(OrderTypeEnum.MOVEMENT, '移库'),
title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.MOVEMENT).replace(/单$/, ''),
color: '#f59e0b',
routeName: 'WmsMovementOrder'
},
{
orderType: OrderTypeEnum.CHECK,
title: getOrderTypeTitle(OrderTypeEnum.CHECK, '盘库'),
title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.CHECK).replace(/单$/, ''),
color: '#7c3aed',
routeName: 'WmsCheckOrder'
}
]
/** 构建默认的状态数量集合 */
const buildEmptyStatusCounts = () => {
return statusList.reduce(
(result, status) => {
result[status.value] = 0
return result
},
{} as Record<number, number>
)
}
const summaryList = ref<OrderSummaryItem[]>(
orderDefinitions.map((item) => ({
...item,
total: 0,
statusCounts: buildEmptyStatusCounts()
}))
)
const summaryList = ref<OrderSummaryItem[]>(orderDefinitions)
/** 加载单据汇总数据 */
const load = async (warehouseId?: number) => {
@ -178,14 +145,16 @@ const load = async (warehouseId?: number) => {
const data = await WmsHomeStatisticsApi.getOrderSummary(warehouseId ? { warehouseId } : {})
summaryList.value = orderDefinitions.map((definition) => {
const summary = data.find((item) => item.type === definition.orderType)
const statusCounts = statusList.reduce((result, status) => {
const statusItem = summary?.statuses?.find((item) => item.status === status.value)
result[status.value] = statusItem?.count || 0
return result
}, buildEmptyStatusCounts())
const statusCounts = summary?.statuses?.reduce(
(result, item) => {
result[item.status] = item.count
return result
},
{} as Partial<Record<number, number>>
)
return {
...definition,
total: summary?.total || 0,
total: summary?.total,
statusCounts
}
})
@ -205,17 +174,15 @@ const handleNavigate = async (name: string) => {
/** 计算状态进度条占比 */
function getStatusPercent(item: OrderSummaryItem, status: number) {
const count = item.statusCounts[status] || 0
if (!item.total || !count) {
const count = item.statusCounts?.[status]
if (item.total === undefined || count === undefined) {
return undefined
}
if (item.total === 0) {
return '0%'
}
return `${(count / item.total) * 100}%`
}
/** 格式化单据数量 */
function formatCount(value: number) {
return value.toLocaleString()
}
defineExpose({ load })
</script>

View File

@ -28,6 +28,7 @@ import type { EChartsOption } from 'echarts'
import { WmsHomeStatisticsApi, type WmsHomeOrderTrendVO } from '@/api/wms/home'
import { DICT_TYPE, getDictLabel } from '@/utils/dict'
import { formatDate } from '@/utils/formatTime'
import { OrderTypeEnum } from '@/views/wms/utils/constants'
defineOptions({ name: 'WmsHomeOrderTrendChart' })
@ -41,41 +42,28 @@ interface OrderDefinition {
>
}
const OrderTypeEnum = {
RECEIPT: 1,
SHIPMENT: 2,
MOVEMENT: 3,
CHECK: 4
} as const
/** 获取单据类型名称 */
const getOrderTypeTitle = (type: number, defaultTitle: string) => {
const label = getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, type) || defaultTitle
return label.endsWith('单') ? label.slice(0, -1) : label
}
const orderDefinitions: OrderDefinition[] = [
{
orderType: OrderTypeEnum.RECEIPT,
title: getOrderTypeTitle(OrderTypeEnum.RECEIPT, '入库'),
title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.RECEIPT).replace(/单$/, ''),
color: '#2f7df6',
trendField: 'receiptCount'
},
{
orderType: OrderTypeEnum.SHIPMENT,
title: getOrderTypeTitle(OrderTypeEnum.SHIPMENT, '出库'),
title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.SHIPMENT).replace(/单$/, ''),
color: '#18a058',
trendField: 'shipmentCount'
},
{
orderType: OrderTypeEnum.MOVEMENT,
title: getOrderTypeTitle(OrderTypeEnum.MOVEMENT, '移库'),
title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.MOVEMENT).replace(/单$/, ''),
color: '#f59e0b',
trendField: 'movementCount'
},
{
orderType: OrderTypeEnum.CHECK,
title: getOrderTypeTitle(OrderTypeEnum.CHECK, '盘库'),
title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.CHECK).replace(/单$/, ''),
color: '#7c3aed',
trendField: 'checkCount'
}

View File

@ -5,6 +5,14 @@ export const OrderStatusEnum = {
CANCELED: 5 // 已作废
} as const
/** 单据类型枚举 */
export const OrderTypeEnum = {
RECEIPT: 1, // 入库
SHIPMENT: 2, // 出库
MOVEMENT: 3, // 移库
CHECK: 4 // 盘库
} as const
/** 可修改的单据状态 */
export const OrderUpdateStatusList: number[] = [OrderStatusEnum.PREPARE]