From a1b66588ecfb279027c10585702a6605b9140818 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 19 May 2026 10:59:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(wms):=20=E4=BF=AE=E5=A4=8D=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E6=B1=87=E6=80=BB=E5=8D=A1=E5=B1=95=E7=A4=BA=E8=B7=B3?= =?UTF-8?q?=E8=BD=AC=E5=92=8C=E5=BA=93=E5=AD=98=E9=80=89=E6=8B=A9=E8=B7=A8?= =?UTF-8?q?=E9=A1=B5=E5=8B=BE=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/wms-home-order-summary-cards.vue | 94 ++++++++++++-- .../modules/wms-home-order-summary-cards.vue | 115 +++++++++++++++--- 2 files changed, 178 insertions(+), 31 deletions(-) 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 });