From f40d1de62a7cee36fd36afd8dcb210ef84bcb684 Mon Sep 17 00:00:00 2001
From: kehaiyou <tritiumtech@outlook.com>
Date: Sun, 24 Sep 2023 19:42:53 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E3=80=90=E5=B7=A5=E4=BD=9C=E6=B5=81?=
 =?UTF-8?q?=E3=80=91--=E5=9B=9E=E9=80=80=E7=9A=84=E9=AB=98=E4=BA=AE?=
 =?UTF-8?q?=E5=92=8Capi=E5=9C=B0=E5=9D=80=E6=9B=B4=E6=8D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/api/bpm/task/index.ts                     |  4 +--
 .../package/designer/ProcessViewer.vue        | 26 ++++++++++++++++---
 ...ialogForm.vue => TaskReturnDialogForm.vue} |  6 ++---
 .../bpm/processInstance/detail/index.vue      |  8 +++---
 4 files changed, 31 insertions(+), 13 deletions(-)
 rename src/views/bpm/processInstance/detail/{TaskRollbackDialogForm.vue => TaskReturnDialogForm.vue} (95%)

diff --git a/src/api/bpm/task/index.ts b/src/api/bpm/task/index.ts
index 126f01eb..43bcceab 100644
--- a/src/api/bpm/task/index.ts
+++ b/src/api/bpm/task/index.ts
@@ -54,6 +54,6 @@ export const getReturnList = async (params) => {
  * 确认回退
  * @param params
  */
-export const okRollback = async (data) => {
-  return await request.put({ url: '/bpm/task/rollback', data })
+export const okReturnTask = async (data) => {
+  return await request.put({ url: '/bpm/task/return', data })
 }
diff --git a/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue b/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue
index dd4c8456..0b1f8078 100644
--- a/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue
+++ b/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue
@@ -11,6 +11,7 @@ import BpmnViewer from 'bpmn-js/lib/Viewer'
 import DefaultEmptyXML from './plugins/defaultEmpty'
 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import { formatDate } from '@/utils/formatTime'
+import { isEmpty } from '@/utils/is'
 
 defineOptions({ name: 'MyProcessViewer' })
 
@@ -85,6 +86,7 @@ const createNewDiagram = async (xml) => {
     // console.error(`[Process Designer Warn]: ${e?.message || e}`);
   }
 }
+
 /* 高亮流程图 */
 // TODO 芋艿:如果多个 endActivity 的话,目前的逻辑可能有一定的问题。https://www.jdon.com/workflow/multi-events.html
 const highlightDiagram = async () => {
@@ -97,6 +99,9 @@ const highlightDiagram = async () => {
   let canvas = bpmnModeler.get('canvas')
   let todoActivity: any = activityList.find((m: any) => !m.endTime) // 找到待办的任务
   let endActivity: any = activityList[activityList.length - 1] // 获得最后一个任务
+  let findProcessTask = false //是否已经高亮了进行中的任务
+  //进行中高亮之后的任务 key 集合,用于过滤掉 taskList 进行中后面的任务,避免进行中后面的数据 Hover 还有数据
+  let removeTaskDefinitionKeyList = []
   // debugger
   bpmnModeler.getDefinitions().rootElements[0].flowElements?.forEach((n: any) => {
     let activity: any = activityList.find((m: any) => m.key === n.id) // 找到对应的活动
@@ -110,9 +115,17 @@ const highlightDiagram = async () => {
       if (!task) {
         return
       }
+      //进行中的任务已经高亮过了,则不高亮后面的任务了
+      if (findProcessTask) {
+        removeTaskDefinitionKeyList.push(n.id)
+        return
+      }
       // 高亮任务
       canvas.addMarker(n.id, getResultCss(task.result))
-
+      //标记是否高亮了进行中任务
+      if (task.result === 1) {
+        findProcessTask = true
+      }
       // 如果非通过,就不走后面的线条了
       if (task.result !== 2) {
         return
@@ -212,6 +225,11 @@ const highlightDiagram = async () => {
       }
     }
   })
+  if (!isEmpty(removeTaskDefinitionKeyList)) {
+    taskList.value = taskList.value.filter(
+      (item) => !removeTaskDefinitionKeyList.includes(item.definitionKey)
+    )
+  }
 }
 const getActivityHighlightCss = (activity) => {
   return activity.endTime ? 'highlight' : 'highlight-todo'
@@ -276,9 +294,9 @@ const elementHover = (element) => {
   console.log(element.value, 'element.value')
   const activity = activityLists.value.find((m) => m.key === element.value.id)
   console.log(activity, 'activityactivityactivityactivity')
-  // if (!activity) {
-  //   return
-  // }
+  if (!activity) {
+    return
+  }
   if (!elementOverlayIds.value[element.value.id] && element.value.type !== 'bpmn:Process') {
     let html = `<div class="element-overlays">
             <p>Elemet id: ${element.value.id}</p>
diff --git a/src/views/bpm/processInstance/detail/TaskRollbackDialogForm.vue b/src/views/bpm/processInstance/detail/TaskReturnDialogForm.vue
similarity index 95%
rename from src/views/bpm/processInstance/detail/TaskRollbackDialogForm.vue
rename to src/views/bpm/processInstance/detail/TaskReturnDialogForm.vue
index 168fd1a8..4d9fc5d8 100644
--- a/src/views/bpm/processInstance/detail/TaskRollbackDialogForm.vue
+++ b/src/views/bpm/processInstance/detail/TaskReturnDialogForm.vue
@@ -11,9 +11,9 @@
         <el-select v-model="formData.targetDefinitionKey" clearable style="width: 100%">
           <el-option
             v-for="item in returnList"
-            :key="item.taskDefinitionKey"
+            :key="item.definitionKey"
             :label="item.name"
-            :value="item.taskDefinitionKey"
+            :value="item.definitionKey"
           />
         </el-select>
       </el-form-item>
@@ -68,7 +68,7 @@ const submitForm = async () => {
   // 提交请求
   formLoading.value = true
   try {
-    await TaskApi.okRollback(formData.value)
+    await TaskApi.okReturnTask(formData.value)
     message.success('回退成功')
     dialogVisible.value = false
     // 发送操作成功的事件
diff --git a/src/views/bpm/processInstance/detail/index.vue b/src/views/bpm/processInstance/detail/index.vue
index 6b57242d..fbadad4c 100644
--- a/src/views/bpm/processInstance/detail/index.vue
+++ b/src/views/bpm/processInstance/detail/index.vue
@@ -92,7 +92,7 @@
     <!-- 弹窗:转派审批人 -->
     <TaskUpdateAssigneeForm ref="taskUpdateAssigneeFormRef" @success="getDetail" />
     <!-- 弹窗,回退节点 -->
-    <TaskRollbackDialog ref="taskRollbackRef" @success="getDetail" />
+    <TaskReturnDialog ref="taskReturnDialogRef" @success="getDetail" />
   </ContentWrap>
 </template>
 <script lang="ts" setup>
@@ -105,7 +105,7 @@ import * as TaskApi from '@/api/bpm/task'
 import TaskUpdateAssigneeForm from './TaskUpdateAssigneeForm.vue'
 import ProcessInstanceBpmnViewer from './ProcessInstanceBpmnViewer.vue'
 import ProcessInstanceTaskList from './ProcessInstanceTaskList.vue'
-import TaskRollbackDialog from './TaskRollbackDialogForm.vue'
+import TaskReturnDialog from './TaskReturnDialogForm.vue'
 import { registerComponent } from '@/utils/routerHelper'
 
 defineOptions({ name: 'BpmProcessInstanceDetail' })
@@ -176,10 +176,10 @@ const handleDelegate = async (task) => {
 }
 
 //回退弹框组件
-const taskRollbackRef = ref()
+const taskReturnDialogRef = ref()
 /** 处理审批退回的操作 */
 const handleBack = async (task) => {
-  taskRollbackRef.value.open(task.id)
+  taskReturnDialogRef.value.open(task.id)
 }
 
 /** 获得详情 */