diff --git a/apps/web-antd/src/views/wms/home/modules/wms-home-order-summary-cards.vue b/apps/web-antd/src/views/wms/home/modules/wms-home-order-summary-cards.vue index 702d1bf6b..0fe3e92a0 100644 --- a/apps/web-antd/src/views/wms/home/modules/wms-home-order-summary-cards.vue +++ b/apps/web-antd/src/views/wms/home/modules/wms-home-order-summary-cards.vue @@ -2,57 +2,101 @@ import type { WmsHomeStatisticsApi } from '#/api/wms/home'; import { ref } from 'vue'; +import { useRouter } from 'vue-router'; import { DICT_TYPE } from '@vben/constants'; import { getDictLabel } from '@vben/hooks'; +import { Button, Card, message } from 'ant-design-vue'; + import { getOrderSummary } from '#/api/wms/home'; import { OrderStatusEnum, OrderTypeEnum } from '#/views/wms/utils/constants'; defineOptions({ name: 'WmsHomeOrderSummaryCards' }); +interface StatusItem { + color: string; + label: string; + value: number; +} + interface OrderSummaryItem { color: string; + routeName: string; statuses?: WmsHomeStatisticsApi.OrderStatus[]; title: string; total?: number; type: number; } +const router = useRouter(); + const orderDefinitions: OrderSummaryItem[] = [ { color: '#2f7df6', + routeName: 'WmsReceiptOrder', title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.RECEIPT).replace(/单$/, ''), type: OrderTypeEnum.RECEIPT, }, { color: '#18a058', + routeName: 'WmsShipmentOrder', title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.SHIPMENT).replace(/单$/, ''), type: OrderTypeEnum.SHIPMENT, }, { color: '#f59e0b', + routeName: 'WmsMovementOrder', title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.MOVEMENT).replace(/单$/, ''), type: OrderTypeEnum.MOVEMENT, }, { color: '#7c3aed', + routeName: 'WmsCheckOrder', title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.CHECK).replace(/单$/, ''), type: OrderTypeEnum.CHECK, }, ]; -const statusList = [ - { label: getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, OrderStatusEnum.PREPARE) || '草稿', value: OrderStatusEnum.PREPARE }, - { label: getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, OrderStatusEnum.FINISHED) || '已完成', value: OrderStatusEnum.FINISHED }, - { label: getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, OrderStatusEnum.CANCELED) || '已作废', value: OrderStatusEnum.CANCELED }, +const statusList: StatusItem[] = [ + { + color: '#409eff', + label: getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, OrderStatusEnum.PREPARE) || '草稿', + value: OrderStatusEnum.PREPARE, + }, + { + color: '#67c23a', + label: getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, OrderStatusEnum.FINISHED) || '已完成', + value: OrderStatusEnum.FINISHED, + }, + { + color: '#909399', + label: getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, OrderStatusEnum.CANCELED) || '已作废', + value: OrderStatusEnum.CANCELED, + }, ]; const loading = ref(false); const summaryList = ref(orderDefinitions); function getStatusCount(item: OrderSummaryItem, status: number) { - return item.statuses?.find((row) => row.status === status)?.count; + return item.statuses?.find((row) => row.status === status)?.count ?? 0; +} + +function getStatusPercent(item: OrderSummaryItem, status: number) { + const total = item.total ?? 0; + if (total <= 0) { + return '0%'; + } + return `${(getStatusCount(item, status) / total) * 100}%`; +} + +async function handleNavigate(routeName: string) { + try { + await router.push({ name: routeName }); + } catch { + message.warning('当前菜单尚未加载,请从左侧菜单进入对应页面'); + } } async function load(warehouseId?: number) { @@ -77,23 +121,49 @@ defineExpose({ load }); diff --git a/apps/web-ele/src/views/wms/home/modules/wms-home-order-summary-cards.vue b/apps/web-ele/src/views/wms/home/modules/wms-home-order-summary-cards.vue index 702d1bf6b..20846d7f5 100644 --- a/apps/web-ele/src/views/wms/home/modules/wms-home-order-summary-cards.vue +++ b/apps/web-ele/src/views/wms/home/modules/wms-home-order-summary-cards.vue @@ -2,57 +2,101 @@ import type { WmsHomeStatisticsApi } from '#/api/wms/home'; import { ref } from 'vue'; +import { useRouter } from 'vue-router'; import { DICT_TYPE } from '@vben/constants'; import { getDictLabel } from '@vben/hooks'; +import { ElButton, ElCard, ElMessage, ElSkeleton } from 'element-plus'; + import { getOrderSummary } from '#/api/wms/home'; import { OrderStatusEnum, OrderTypeEnum } from '#/views/wms/utils/constants'; defineOptions({ name: 'WmsHomeOrderSummaryCards' }); +interface StatusItem { + color: string; + label: string; + value: number; +} + interface OrderSummaryItem { color: string; + routeName: string; statuses?: WmsHomeStatisticsApi.OrderStatus[]; title: string; total?: number; type: number; } +const router = useRouter(); + const orderDefinitions: OrderSummaryItem[] = [ { color: '#2f7df6', + routeName: 'WmsReceiptOrder', title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.RECEIPT).replace(/单$/, ''), type: OrderTypeEnum.RECEIPT, }, { color: '#18a058', + routeName: 'WmsShipmentOrder', title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.SHIPMENT).replace(/单$/, ''), type: OrderTypeEnum.SHIPMENT, }, { color: '#f59e0b', + routeName: 'WmsMovementOrder', title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.MOVEMENT).replace(/单$/, ''), type: OrderTypeEnum.MOVEMENT, }, { color: '#7c3aed', + routeName: 'WmsCheckOrder', title: getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, OrderTypeEnum.CHECK).replace(/单$/, ''), type: OrderTypeEnum.CHECK, }, ]; -const statusList = [ - { label: getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, OrderStatusEnum.PREPARE) || '草稿', value: OrderStatusEnum.PREPARE }, - { label: getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, OrderStatusEnum.FINISHED) || '已完成', value: OrderStatusEnum.FINISHED }, - { label: getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, OrderStatusEnum.CANCELED) || '已作废', value: OrderStatusEnum.CANCELED }, +const statusList: StatusItem[] = [ + { + color: '#409eff', + label: getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, OrderStatusEnum.PREPARE) || '草稿', + value: OrderStatusEnum.PREPARE, + }, + { + color: '#67c23a', + label: getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, OrderStatusEnum.FINISHED) || '已完成', + value: OrderStatusEnum.FINISHED, + }, + { + color: '#909399', + label: getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, OrderStatusEnum.CANCELED) || '已作废', + value: OrderStatusEnum.CANCELED, + }, ]; const loading = ref(false); const summaryList = ref(orderDefinitions); function getStatusCount(item: OrderSummaryItem, status: number) { - return item.statuses?.find((row) => row.status === status)?.count; + return item.statuses?.find((row) => row.status === status)?.count ?? 0; +} + +function getStatusPercent(item: OrderSummaryItem, status: number) { + const total = item.total ?? 0; + if (total <= 0) { + return '0%'; + } + return `${(getStatusCount(item, status) / total) * 100}%`; +} + +async function handleNavigate(routeName: string) { + try { + await router.push({ name: routeName }); + } catch { + ElMessage.warning('当前菜单尚未加载,请从左侧菜单进入对应页面'); + } } async function load(warehouseId?: number) { @@ -77,23 +121,56 @@ defineExpose({ load });