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

View File

@ -28,6 +28,7 @@ import type { EChartsOption } from 'echarts'
import { WmsHomeStatisticsApi, type WmsHomeOrderTrendVO } from '@/api/wms/home' import { WmsHomeStatisticsApi, type WmsHomeOrderTrendVO } from '@/api/wms/home'
import { DICT_TYPE, getDictLabel } from '@/utils/dict' import { DICT_TYPE, getDictLabel } from '@/utils/dict'
import { formatDate } from '@/utils/formatTime' import { formatDate } from '@/utils/formatTime'
import { OrderTypeEnum } from '@/views/wms/utils/constants'
defineOptions({ name: 'WmsHomeOrderTrendChart' }) 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[] = [ const orderDefinitions: OrderDefinition[] = [
{ {
orderType: OrderTypeEnum.RECEIPT, orderType: OrderTypeEnum.RECEIPT,
title: getOrderTypeTitle(OrderTypeEnum.RECEIPT, '入库'), title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.RECEIPT).replace(/单$/, ''),
color: '#2f7df6', color: '#2f7df6',
trendField: 'receiptCount' trendField: 'receiptCount'
}, },
{ {
orderType: OrderTypeEnum.SHIPMENT, orderType: OrderTypeEnum.SHIPMENT,
title: getOrderTypeTitle(OrderTypeEnum.SHIPMENT, '出库'), title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.SHIPMENT).replace(/单$/, ''),
color: '#18a058', color: '#18a058',
trendField: 'shipmentCount' trendField: 'shipmentCount'
}, },
{ {
orderType: OrderTypeEnum.MOVEMENT, orderType: OrderTypeEnum.MOVEMENT,
title: getOrderTypeTitle(OrderTypeEnum.MOVEMENT, '移库'), title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.MOVEMENT).replace(/单$/, ''),
color: '#f59e0b', color: '#f59e0b',
trendField: 'movementCount' trendField: 'movementCount'
}, },
{ {
orderType: OrderTypeEnum.CHECK, orderType: OrderTypeEnum.CHECK,
title: getOrderTypeTitle(OrderTypeEnum.CHECK, '盘库'), title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.CHECK).replace(/单$/, ''),
color: '#7c3aed', color: '#7c3aed',
trendField: 'checkCount' trendField: 'checkCount'
} }

View File

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