From 3268de7494d5281186bb692635540e38db251e13 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 12 十月 2026 11:53:01 +0800
Subject: [PATCH] feat(dashboard): 添加权限控制和能耗分析功能

---
 src/views/dashboard/analytics/modules/biz-cards.vue |   23 +++++++++++++++++------
 1 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/views/dashboard/analytics/modules/biz-cards.vue b/src/views/dashboard/analytics/modules/biz-cards.vue
index 95a9e63..5fc8ff1 100644
--- a/src/views/dashboard/analytics/modules/biz-cards.vue
+++ b/src/views/dashboard/analytics/modules/biz-cards.vue
@@ -1,5 +1,5 @@
 <script lang="ts" setup>
-import { onMounted, ref } from 'vue';
+import { computed, onMounted, ref } from 'vue';
 
 import { CountTo } from '@vben/common-ui';
 import { IconifyIcon } from '@vben/icons';
@@ -11,6 +11,8 @@
 import { getMaterialStockPage } from '#/api/mes/wm/materialstock';
 import { getTaskTodoPage } from '#/api/bpm/task';
 
+import { useHomeAccess } from '../use-home-access';
+
 defineOptions({ name: 'DashboardBizCards' });
 
 const emit = defineEmits<{
@@ -21,8 +23,14 @@
 const saleCount = ref(0);
 const stockCount = ref(0);
 const bpmTodoCount = ref(0);
+const { canNavigate, canQuery } = useHomeAccess();
+const canViewPurchase = computed(() => canQuery('erp:purchase-order:query') && canNavigate('ErpPurchaseOrder'));
+const canViewSale = computed(() => canQuery('erp:sale-order:query') && canNavigate('ErpSaleOrder'));
+const canViewStock = computed(() => canQuery('mes:wm-material-stock:query') && canNavigate('MesWmMaterialStock'));
+const canViewBpmTodo = computed(() => canQuery('bpm:task:query') && canNavigate('BpmTaskTodo'));
 
 async function loadPurchase() {
+  if (!canViewPurchase.value) return;
   try {
     const result = await getPurchaseOrderPage({ pageNo: 1, pageSize: 1 });
     purchaseCount.value = result.total ?? 0;
@@ -30,6 +38,7 @@
 }
 
 async function loadSale() {
+  if (!canViewSale.value) return;
   try {
     const result = await getSaleOrderPage({ pageNo: 1, pageSize: 1 });
     saleCount.value = result.total ?? 0;
@@ -37,6 +46,7 @@
 }
 
 async function loadStock() {
+  if (!canViewStock.value) return;
   try {
     const result = await getMaterialStockPage({ pageNo: 1, pageSize: 1 });
     stockCount.value = result.total ?? 0;
@@ -44,6 +54,7 @@
 }
 
 async function loadBpmTodo() {
+  if (!canViewBpmTodo.value) return;
   try {
     const result = await getTaskTodoPage({ pageNo: 1, pageSize: 1 });
     bpmTodoCount.value = result.total ?? 0;
@@ -83,9 +94,9 @@
 </script>
 
 <template>
-  <Row :gutter="16">
+  <Row v-if="canViewPurchase || canViewSale || canViewStock || canViewBpmTodo" :gutter="16">
     <!-- 閲囪喘璁㈠崟 -->
-    <Col :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4">
+    <Col v-if="canViewPurchase" :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4">
       <div
         class="glass-tilt group cursor-pointer overflow-hidden rounded-2xl border-0"
         :style="tiltStyle('purchase')"
@@ -112,7 +123,7 @@
     </Col>
 
     <!-- 閿�鍞鍗� -->
-    <Col :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4">
+    <Col v-if="canViewSale" :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4">
       <div
         class="glass-tilt group cursor-pointer overflow-hidden rounded-2xl border-0"
         :style="tiltStyle('sale')"
@@ -139,7 +150,7 @@
     </Col>
 
     <!-- 鐗╂枡搴撳瓨 -->
-    <Col :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4">
+    <Col v-if="canViewStock" :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4">
       <div
         class="glass-tilt group cursor-pointer overflow-hidden rounded-2xl border-0"
         :style="tiltStyle('stock')"
@@ -166,7 +177,7 @@
     </Col>
 
     <!-- BPM 寰呭姙 -->
-    <Col :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4">
+    <Col v-if="canViewBpmTodo" :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4">
       <div
         class="glass-tilt group cursor-pointer overflow-hidden rounded-2xl border-0"
         :style="tiltStyle('bpm')"

--
Gitblit v1.9.3