From b725cca0ff60728be04ef2ddb4cde5fcdf80bf8e Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期一, 14 九月 2026 16:15:24 +0800
Subject: [PATCH] feat(bpm): 流程模型列表新增「免审批」开关与全局总开关

---
 src/views/bpm/model/index.vue |   87 +++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 83 insertions(+), 4 deletions(-)

diff --git a/src/views/bpm/model/index.vue b/src/views/bpm/model/index.vue
index d7b2b7d..2ed2171 100644
--- a/src/views/bpm/model/index.vue
+++ b/src/views/bpm/model/index.vue
@@ -1,15 +1,37 @@
 <script lang="ts" setup>
 import type { ModelCategoryInfo } from '#/api/bpm/model';
 
-import { onActivated, onMounted, reactive, ref, useTemplateRef, watch } from 'vue';
+import {
+  computed,
+  onActivated,
+  onMounted,
+  reactive,
+  ref,
+  useTemplateRef,
+  watch,
+} from 'vue';
 
+import { useAccess } from '@vben/access';
 import { Page, useVbenModal } from '@vben/common-ui';
 import { IconifyIcon } from '@vben/icons';
 import { cloneDeep } from '@vben/utils';
 
 import { useSortable } from '@vueuse/integrations/useSortable';
-import { Button, Card, Dropdown, Input, Menu, message } from 'ant-design-vue';
+import {
+  Button,
+  Card,
+  Dropdown,
+  Input,
+  Menu,
+  message,
+  Switch,
+  Tooltip,
+} from 'ant-design-vue';
 
+import {
+  getAutoApproveList,
+  updateGlobalAutoApprove,
+} from '#/api/bpm/autoApprove';
 import {
   getCategorySimpleList,
   updateCategorySortBatch,
@@ -26,6 +48,17 @@
 });
 
 const modelListSpinning = ref(false); // 妯″瀷鍒楄〃鍔犺浇鐘舵��
+
+/** 鍏ㄥ眬鍏嶅鎵规�诲紑鍏冲崰鐢ㄧ殑娴佺▼ Key锛堜笌鍚庣 BpmProcessAutoApproveService.GLOBAL_KEY 淇濇寔涓�鑷达級 */
+const GLOBAL_AUTO_APPROVE_KEY = '*';
+const globalAutoApprove = ref(false); // 鍏ㄥ眬鍏嶅鎵规�诲紑鍏�
+const globalAutoApproveLoading = ref(false); // 鎬诲紑鍏虫彁浜ょ姸鎬�
+
+const { hasAccessByCodes } = useAccess();
+/** 鍏嶅鎵瑰紑鍏崇殑鏉冮檺锛氭棤鏉冮檺鏃跺紑鍏崇疆鐏帮紝閬垮厤鐐逛簡鎵嶆姤閿� */
+const hasPermiAutoApprove = computed(() => {
+  return hasAccessByCodes(['bpm:process-auto-approve:update']);
+});
 
 const saveSortLoading = ref(false); // 淇濆瓨鎺掑簭鐘舵��
 const categoryGroup = ref<ModelCategoryInfo[]>([]); // 鎸夌収 category 鍒嗙粍鐨勬暟鎹�
@@ -59,8 +92,22 @@
 async function getList() {
   modelListSpinning.value = true;
   try {
-    const modelList = await getModelList(queryParams.name);
-    const categoryList = await getCategorySimpleList();
+    const [modelList, categoryList, autoApproveList] = await Promise.all([
+      getModelList(queryParams.name),
+      getCategorySimpleList(),
+      getAutoApproveList(),
+    ]);
+    // 鍏嶅鎵归厤缃寜銆屾祦绋� Key銆嶅缓绔嬫槧灏勶紝鍚堝苟鍒版ā鍨嬭鏁版嵁涓婏紝渚涘垪琛ㄥ唴鐨勫厤瀹℃壒寮�鍏冲垪鐩存帴璇诲彇
+    const autoApproveMap = new Map<string, boolean>();
+    autoApproveList.forEach((config) => {
+      autoApproveMap.set(config.processDefinitionKey, config.autoApprove);
+    });
+    modelList.forEach((model: any) => {
+      model.autoApprove = autoApproveMap.get(model.key) ?? false;
+    });
+    // 鍏ㄥ眬鎬诲紑鍏充互鐗规畩 Key 瀛樻斁鍦ㄥ悓涓�鏉¢厤缃噷
+    globalAutoApprove.value =
+      autoApproveMap.get(GLOBAL_AUTO_APPROVE_KEY) ?? false;
     // 鎸夌収 category 鑱氬悎
     categoryGroup.value = categoryList.map((category: any) => ({
       ...category,
@@ -142,6 +189,28 @@
     sortableInstance.value.option('disabled', true);
   }
 }
+
+/** 鍒囨崲鍏ㄥ眬鍏嶅鎵规�诲紑鍏筹細寮�鍚悗鎵�鏈夋祦绋嬩竴寰嬪厤瀹℃壒 */
+async function handleGlobalAutoApproveChange(checked: boolean) {
+  globalAutoApprove.value = checked;
+  globalAutoApproveLoading.value = true;
+  try {
+    await updateGlobalAutoApprove(checked);
+    message.success(
+      checked
+        ? '宸插紑鍚叏灞�鍏嶅鎵癸細鎵�鏈夋祦绋嬫彁浜ゅ悗灏嗙洿鎺ラ�氳繃'
+        : '宸插叧闂叏灞�鍏嶅鎵癸細鎭㈠涓烘寜鍚勬祦绋嬪紑鍏冲垽瀹�',
+    );
+    // 閲嶆柊鎷夊彇鍒楄〃锛屽悓姝ュ悇娴佺▼寮�鍏崇殑灞曠ず
+    await getList();
+  } catch (error) {
+    // 澶辫触鍥炴粴
+    globalAutoApprove.value = !checked;
+    console.error('璁剧疆鍏ㄥ眬鍏嶅鎵瑰紑鍏冲け璐�', error);
+  } finally {
+    globalAutoApproveLoading.value = false;
+  }
+}
 </script>
 
 <template>
@@ -156,6 +225,16 @@
     >
       <template #extra>
         <div v-if="!isCategorySorting">
+          <Tooltip title="寮�鍚悗鎵�鏈夋祦绋嬩竴寰嬪厤瀹℃壒锛堜紭鍏堜簬鍚勬祦绋嬭嚜宸辩殑寮�鍏筹級">
+            <span class="mr-1">鍏ㄩ儴鍏嶅鎵�</span>
+          </Tooltip>
+          <Switch
+            :checked="globalAutoApprove"
+            :loading="globalAutoApproveLoading"
+            :disabled="!hasPermiAutoApprove"
+            class="mr-3"
+            @change="(checked: any) => handleGlobalAutoApproveChange(checked)"
+          />
           <Input
             v-model:value="queryParams.name"
             placeholder="鎼滅储娴佺▼"

--
Gitblit v1.9.3