Sfoglia il codice sorgente

feat: 一些问题优化

wuwenyi 1 settimana fa
parent
commit
cfabe46329

+ 2 - 2
src/api/flow/import.ts

@@ -1,7 +1,7 @@
 import { http } from '@/api/request'
 
 /** 下载流程 Excel 导入模板 */
-export async function downloadTemplate(definitionId: number): Promise<void> {
+export async function downloadTemplate(definitionId: number, filename?: string): Promise<void> {
   const blob = await http.get<Blob>(`/flow/import/template/${definitionId}`, {
     responseType: 'blob',
     timeout: 120000,
@@ -9,7 +9,7 @@ export async function downloadTemplate(definitionId: number): Promise<void> {
   const url = window.URL.createObjectURL(blob)
   const link = document.createElement('a')
   link.href = url
-  link.download = 'template.xlsx'
+  link.download = (filename || 'template') + '.xlsx'
   document.body.appendChild(link)
   link.click()
   document.body.removeChild(link)

+ 1 - 14
src/router/index.ts

@@ -45,23 +45,10 @@ const router = createRouter({
       ],
     },
     {
-      path: '/workbench',
-      component: () => import('@/components/Layout/index.vue'),
-      meta: { title: '工作台', icon: 'Monitor', permissions: ['flow_manager', 'super_admin'] },
-      children: [
-        {
-          path: '',
-          name: 'Workbench',
-          component: () => import('@/views/workbench/index.vue'),
-          meta: { title: '智能工作台', icon: 'Monitor' },
-        },
-      ],
-    },
-    {
       path: '/analysis',
       component: () => import('@/components/Layout/index.vue'),
       redirect: '/analysis/flow',
-      meta: { title: '数据看板', icon: 'TrendCharts', permissions: ['flow_manager', 'super_admin'] },
+      meta: { title: '数据看板', icon: 'TrendCharts', permissions: ['dept_manager', 'flow_manager', 'super_admin'] },
       children: [
         {
           path: 'flow',

+ 1 - 1
src/views/analysis/NodeCountChart.vue

@@ -4,7 +4,7 @@
       <span>各节点统计</span>
     </template>
     <v-chart v-if="dataLength > 0" :option="option" autoresize style="height: 60px;" :style="{ height: Math.max(dataLength * 36, 200) + 'px' }" />
-    <el-empty v-else description="暂无数据" />
+    <el-empty v-else description="请选择流程" />
   </el-card>
 </template>
 

+ 8 - 3
src/views/analysis/useAnalysis.ts

@@ -274,6 +274,9 @@ export function useAnalysis() {
   async function loadDefinitions() {
     try {
       definitionOptions.value = await listEnabled()
+      if (definitionOptions.value.length > 0 && !query.processDefinitionId) {
+        query.processDefinitionId = definitionOptions.value[definitionOptions.value.length - 1].id
+      }
     } catch {
       definitionOptions.value = []
     }
@@ -364,9 +367,11 @@ export function useAnalysis() {
     if (idx == null) return
     const node = nodeList.value[idx]
     if (!node) return
-    stuckQuery.nodeId = node.nodeId
-    nextTick(() => loadStuck(1))
-    ElMessage.info(`已切换至节点「${node.nodeName}」明细`)
+    instanceQuery.currentNodeName = node.nodeName
+    instanceQuery.processName = node.processName || ''
+    instanceQuery.pageNum = 1
+    loadInstanceList()
+    ElMessage.info(`已筛选节点「${node.nodeName}」`)
   }
 
   function openInstanceDetail(id: number) {

+ 4 - 2
src/views/flow/execute/InstanceDetail.vue

@@ -52,8 +52,9 @@
         />
       </div>
 
+      <!-- TODO: 接入OSS后重新启用附件功能 -->
       <!-- 附件列表 -->
-      <div class="attachment-section">
+      <div v-if="false" class="attachment-section">
         <h4>附件列表</h4>
         <div v-if="attachments.length > 0" class="attachment-list">
           <div v-for="att in attachments" :key="att.id" class="attachment-item">
@@ -137,7 +138,8 @@
                   </template>
                 </el-alert>
               </el-form-item>
-              <el-form-item label="附件">
+              <!-- TODO: 接入OSS后重新启用附件功能 -->
+              <el-form-item v-if="false" label="附件">
                 <el-upload
                   v-model:file-list="fileUpload.attachmentList"
                   action="#"

+ 2 - 1
src/views/flow/execute/index.vue

@@ -41,7 +41,8 @@
           <FlowFormFields v-if="hasFormFields" v-model="dynamicFormData" :definition="selectedDefinition" />
           <el-input v-else v-model="startForm.formData" type="textarea" :rows="4" placeholder="请输入表单数据,格式:每行一个字段,如 amount=1000" />
         </el-form-item>
-        <el-form-item label="附件">
+        <!-- TODO: 接入OSS后重新启用附件功能 -->
+        <el-form-item v-if="false" label="附件">
           <el-upload v-model:file-list="fileUpload.attachmentList" action="#" :http-request="fileUpload.handleUpload" :before-upload="beforeFileUpload" :before-remove="() => true" :limit="5" multiple>
             <el-button type="primary" size="small">上传附件</el-button>
           </el-upload>

+ 2 - 1
src/views/flow/instance/mine.vue

@@ -290,7 +290,8 @@ const importing = ref(false)
 async function downloadTemplate() {
   if (!importDefinitionId.value) return
   try {
-    await downloadFlowTemplate(importDefinitionId.value)
+    const def = definitionList.value.find(d => d.id === importDefinitionId.value)
+    await downloadFlowTemplate(importDefinitionId.value, (def?.name || '流程') + '模板')
   } catch {
     ElMessage.error({ message: '下载模板失败', duration: 3000 })
   }

+ 32 - 15
src/views/flow/task/todo.vue

@@ -126,34 +126,43 @@
                   type="success"
                   size="small"
                   :icon="Check"
+                  style="padding: 0 4px;"
                   @click.stop="openQuickApprove(row, 'pass')"
                 >
                   通过
                 </el-button>
                 <el-button
                   link
-                  type="danger"
+                  type="warning"
                   size="small"
-                  :icon="Close"
-                  @click.stop="openQuickApprove(row, 'reject')"
+                  :icon="Back"
+                  style="padding: 0 4px;"
+                  @click.stop="openRollback(row)"
                 >
-                  拒绝
+                  回退
+                </el-button>
+                <el-button
+                  link
+                  type="primary"
+                  size="small"
+                  :icon="View"
+                  style="padding: 0 4px;"
+                  @click.stop="handleDetail(row)"
+                >
+                  详情
                 </el-button>
                 <el-dropdown trigger="click" @command="(cmd: string) => handleMoreAction(cmd, row)">
-                  <el-button link type="primary" size="small">
+                  <el-button link type="primary" size="small" style="padding: 0 4px;">
                     更多<el-icon class="el-icon--right"><arrow-down /></el-icon>
                   </el-button>
                   <template #dropdown>
                     <el-dropdown-menu>
-                      <el-dropdown-item command="rollback">
-                        <el-icon><Back /></el-icon>回退
+                      <el-dropdown-item command="reject">
+                        <el-icon><Close /></el-icon>拒绝
                       </el-dropdown-item>
                       <el-dropdown-item command="addSign">
                         <el-icon><Plus /></el-icon>加签
                       </el-dropdown-item>
-                      <el-dropdown-item command="detail" divided>
-                        <el-icon><View /></el-icon>详情
-                      </el-dropdown-item>
                     </el-dropdown-menu>
                   </template>
                 </el-dropdown>
@@ -501,6 +510,10 @@ function handleDetail(row: FlowTask) {
   detailVisible.value = true
 }
 
+function handleRowClick(row: FlowTask) {
+  handleDetail(row)
+}
+
 function handleAddSign(row: FlowTask) {
   addSignDialogRef.value?.open(row.id)
 }
@@ -511,15 +524,12 @@ function onAddSigned() {
 
 function handleMoreAction(cmd: string, row: FlowTask) {
   switch (cmd) {
-    case 'rollback':
-      openRollback(row)
+    case 'reject':
+      openQuickApprove(row, 'reject')
       break
     case 'addSign':
       handleAddSign(row)
       break
-    case 'detail':
-      handleDetail(row)
-      break
   }
 }
 
@@ -554,6 +564,10 @@ function resetQuery() {
 async function loadDefinitions() {
   try {
     definitionList.value = await listEnabled()
+    // 默认选中第一个流程
+    if (definitionList.value.length > 0 && !queryParams.processName) {
+      queryParams.processName = definitionList.value[0].name
+    }
   } catch {
     definitionList.value = []
   }
@@ -725,4 +739,7 @@ onMounted(() => {
   height: 100%;
   padding-right: 8px;
 }
+:deep(.el-table__body-wrapper .el-button--small.is-link + .el-button--small.is-link) {
+  margin-left: 0;
+}
 </style>