From 5c1e0a47eea514f59f697133fe8a01bcbf6f7a78 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 15 十月 2026 10:31:28 +0800
Subject: [PATCH] refactor(首页): 展示模块跟随菜单权限自动隐藏

---
 src/views/dashboard/analytics/modules/biz-cards.vue |   79 ++++++++++++++++++++++++++++++++++++---
 1 files changed, 73 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..00446e2 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,11 +11,42 @@
 import { getMaterialStockPage } from '#/api/mes/wm/materialstock';
 import { getTaskTodoPage } from '#/api/bpm/task';
 
+import { useHomeAccess } from '#/utils/use-home-access';
+
 defineOptions({ name: 'DashboardBizCards' });
 
 const emit = defineEmits<{
   navigate: [name: string];
 }>();
+
+const { canQuery, canSeeMenu } = useHomeAccess();
+
+const canViewPurchase = computed(
+  () => canQuery('erp:purchase-order:query') && canSeeMenu('ErpPurchaseOrder'),
+);
+const canViewSale = computed(
+  () => canQuery('erp:sale-order:query') && canSeeMenu('ErpSaleOrder'),
+);
+const canViewStock = computed(
+  () => canQuery('mes:wm-material-stock:query') && canSeeMenu('MesWmMaterialStock'),
+);
+const canViewBpmTodo = computed(
+  () => canQuery('bpm:task:query') && canSeeMenu('BpmTodoTask'),
+);
+
+/** 鍙鍗$墖鏁伴噺鍐冲畾鍒楀锛岄伩鍏嶅彧鍓╀竴涓ゅ紶鏃舵尋鍦ㄥ乏涓婅 */
+const colSpan = computed(() => {
+  const count = [
+    canViewPurchase.value,
+    canViewSale.value,
+    canViewStock.value,
+    canViewBpmTodo.value,
+  ].filter(Boolean).length;
+  if (count >= 4) return 6;
+  if (count === 3) return 8;
+  if (count === 2) return 12;
+  return 24;
+});
 
 const purchaseCount = ref(0);
 const saleCount = ref(0);
@@ -23,6 +54,7 @@
 const bpmTodoCount = ref(0);
 
 async function loadPurchase() {
+  if (!canViewPurchase.value) return;
   try {
     const result = await getPurchaseOrderPage({ pageNo: 1, pageSize: 1 });
     purchaseCount.value = result.total ?? 0;
@@ -30,6 +62,7 @@
 }
 
 async function loadSale() {
+  if (!canViewSale.value) return;
   try {
     const result = await getSaleOrderPage({ pageNo: 1, pageSize: 1 });
     saleCount.value = result.total ?? 0;
@@ -37,6 +70,7 @@
 }
 
 async function loadStock() {
+  if (!canViewStock.value) return;
   try {
     const result = await getMaterialStockPage({ pageNo: 1, pageSize: 1 });
     stockCount.value = result.total ?? 0;
@@ -44,6 +78,7 @@
 }
 
 async function loadBpmTodo() {
+  if (!canViewBpmTodo.value) return;
   try {
     const result = await getTaskTodoPage({ pageNo: 1, pageSize: 1 });
     bpmTodoCount.value = result.total ?? 0;
@@ -85,7 +120,15 @@
 <template>
   <Row :gutter="16">
     <!-- 閲囪喘璁㈠崟 -->
-    <Col :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4">
+    <Col
+      v-if="canViewPurchase"
+      :lg="colSpan"
+      :md="colSpan"
+      :sm="colSpan"
+      :xl="colSpan"
+      :xs="24"
+      class="mb-4"
+    >
       <div
         class="glass-tilt group cursor-pointer overflow-hidden rounded-2xl border-0"
         :style="tiltStyle('purchase')"
@@ -112,7 +155,15 @@
     </Col>
 
     <!-- 閿�鍞鍗� -->
-    <Col :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4">
+    <Col
+      v-if="canViewSale"
+      :lg="colSpan"
+      :md="colSpan"
+      :sm="colSpan"
+      :xl="colSpan"
+      :xs="24"
+      class="mb-4"
+    >
       <div
         class="glass-tilt group cursor-pointer overflow-hidden rounded-2xl border-0"
         :style="tiltStyle('sale')"
@@ -139,7 +190,15 @@
     </Col>
 
     <!-- 鐗╂枡搴撳瓨 -->
-    <Col :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4">
+    <Col
+      v-if="canViewStock"
+      :lg="colSpan"
+      :md="colSpan"
+      :sm="colSpan"
+      :xl="colSpan"
+      :xs="24"
+      class="mb-4"
+    >
       <div
         class="glass-tilt group cursor-pointer overflow-hidden rounded-2xl border-0"
         :style="tiltStyle('stock')"
@@ -166,13 +225,21 @@
     </Col>
 
     <!-- BPM 寰呭姙 -->
-    <Col :lg="6" :md="12" :sm="12" :xl="6" :xs="24" class="mb-4">
+    <Col
+      v-if="canViewBpmTodo"
+      :lg="colSpan"
+      :md="colSpan"
+      :sm="colSpan"
+      :xl="colSpan"
+      :xs="24"
+      class="mb-4"
+    >
       <div
         class="glass-tilt group cursor-pointer overflow-hidden rounded-2xl border-0"
         :style="tiltStyle('bpm')"
         @mousemove="(e: MouseEvent) => onMouseMove(e, 'bpm')"
         @mouseleave="onMouseLeave('bpm')"
-        @click="emit('navigate', 'BpmTaskTodo')"
+        @click="emit('navigate', 'BpmTodoTask')"
       >
         <div class="relative z-10 flex items-center gap-4 p-5">
           <div class="flex size-12 flex-shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-red-500 to-rose-400 shadow-lg shadow-red-500/25 transition-transform duration-300 group-hover:scale-110">

--
Gitblit v1.9.3