From 534394e00cfcc6b4f3dc3073add3ccd9fa937eee Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期五, 21 三月 2025 10:57:16 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/flowable/task/myProcess/send/index.vue    |  113 +++++-----
 src/views/flowable/task/myProcess/detail/index.vue  |   81 +++----
 src/api/flowable/definition.js                      |   11 +
 src/components/Process/style/flow-viewer.scss       |   65 ++++-
 src/components/Process/index.vue                    |   40 ++++
 src/views/flowable/definition/model.vue             |   18 +
 src/components/Process/viewer/index.vue             |   80 +++++--
 src/views/projectProcess/components/LogTimeLine.vue |  151 +++++++++++++++
 8 files changed, 414 insertions(+), 145 deletions(-)

diff --git a/src/api/flowable/definition.js b/src/api/flowable/definition.js
index b280346..03fb263 100644
--- a/src/api/flowable/definition.js
+++ b/src/api/flowable/definition.js
@@ -95,7 +95,7 @@
   })
 }
 
-// 璇诲彇xml鏂囦欢
+// 淇濆瓨xml鏂囦欢
 export function saveXml(data) {
   return request({
     url: '/flowable/definition/save',
@@ -104,6 +104,15 @@
   })
 }
 
+// 鏇存柊xml鏂囦欢
+export function updateXml(data) {
+  return request({
+    url: '/flowable/definition/update',
+    method: 'post',
+    data: data
+  })
+}
+
 // 鏂板娴佺▼瀹氫箟
 export function addDeployment(data) {
   return request({
diff --git a/src/components/Process/index.vue b/src/components/Process/index.vue
index 56e62f3..290cb9b 100644
--- a/src/components/Process/index.vue
+++ b/src/components/Process/index.vue
@@ -39,6 +39,7 @@
             <el-button size="mini" icon="el-icon-download" @click="saveXML(true)">涓嬭浇xml</el-button>
             <el-button size="mini" icon="el-icon-picture" @click="saveImg('svg', true)">涓嬭浇svg</el-button>
             <el-button size="mini" type="primary" @click="save">淇濆瓨妯″瀷</el-button>
+            <el-button size="mini" type="warning" @click="update">鏇存柊妯″瀷</el-button>
             <el-button size="mini" type="danger" @click="goBack">鍏抽棴</el-button>
           </el-button-group>
         </div>
@@ -68,6 +69,7 @@
 // 寮曞叆flowable鐨勮妭鐐规枃浠�
 import FlowableModule from './flowable/flowable.json'
 import customControlsModule from './customPanel'
+import {taskWait} from "@/api/projectProcess/projectProcess";
 export default {
   name: "BpmnModel",
   components: {Designer},
@@ -256,6 +258,39 @@
       this.goBack();
     },
 
+    update() {
+      this.$prompt('鏇存柊娴佺▼涓嶄細浜х敓鏂扮増鏈紝閲嶈鐨勬槸浣犱笉鑳戒慨鏀规祦绋嬫帹杩涗腑宸茬粡鎵ц杩囩殑浠诲姟鑺傜偣锛屽惁鍒欎細寮曡捣鏁版嵁闂锛侊紒锛�<span style="color: red">璇峰湪涓嬫柟杈撳叆锛氭垜宸茬煡鏅�</span>', '鏇存柊娴佺▼', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning',
+        customClass: 'updateC',
+        dangerouslyUseHTMLString: true,
+        inputType: 'textarea',
+        inputValidator: (value) => {
+          if (!value || value.trim() === '') {
+            return "璇疯緭鍏ワ細鎴戝凡鐭ユ檽"
+          }
+          if (value !== "鎴戝凡鐭ユ檽") {
+            return "杈撳叆閿欒锛岃杈撳叆锛氭垜宸茬煡鏅�"
+          }
+          return true
+        },
+        inputErrorMessage: '璇疯緭鍏ワ細鎴戝凡鐭ユ檽'
+      }).then(async ({value}) => {
+        const process = this.getProcess()
+        const xml = await this.saveXML()
+        const svg = await this.saveImg()
+        const result = {process, xml, svg}
+        this.$emit('update', result)
+        window.parent.postMessage(result, '*')
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堟搷浣�'
+        });
+      });
+    },
+
     // 鎵撳紑娴佺▼鏂囦欢
     openBpmn(file) {
       const reader = new FileReader()
@@ -348,5 +383,10 @@
     width: 100%;
     margin: 0 0 5px;
   }
+
+}
+
+.updateC {
+  width: 500px;
 }
 </style>
diff --git a/src/components/Process/style/flow-viewer.scss b/src/components/Process/style/flow-viewer.scss
index 76fb85c..15c6b67 100644
--- a/src/components/Process/style/flow-viewer.scss
+++ b/src/components/Process/style/flow-viewer.scss
@@ -99,7 +99,7 @@
     right: 10px;
   }
 
-  // 瀹屾垚娴佺▼绾�
+  /* ---------瀹屾垚棰滆壊---------- */
   .highlight.djs-shape .djs-visual > :nth-child(1) {
     fill: #56bb56 !important;
     stroke: #56bb56 !important;
@@ -120,7 +120,7 @@
     stroke: #56bb56 !important;
   }
 
-  // 浠e姙娴佺▼绾�
+  /* ----------浠e姙棰滆壊---------- */
   .highlight-todo.djs-shape .djs-visual > :nth-child(1) {
     fill: #559db0 !important;
     stroke: #559db0 !important;
@@ -141,29 +141,51 @@
     stroke: #559db0 !important;
   }
 
-  // 宸茶秴鏃舵祦绋嬬嚎
+  /* --------瀹圭己棰滆壊-------- */
   //鏂瑰潡鍐呴儴棰滆壊
-  .highlight-overtime.djs-shape .djs-visual > :nth-child(1) {
-    fill: #ff5353 !important;
-    stroke: #ff5353 !important;
+  .highlight-wait.djs-shape .djs-visual > :nth-child(1) {
+    fill: #F56C6C !important;
+    stroke: #F56C6C !important;
     fill-opacity: 0.2 !important;
   }
   //鏂囧瓧棰滆壊
-  .highlight-overtime.djs-shape .djs-visual > :nth-child(2) {
-    fill: #ff5353 !important;
+  .highlight-wait.djs-shape .djs-visual > :nth-child(2) {
+    fill: #F56C6C !important;
   }
   //浜虹墿ui棰滆壊
-  .highlight-overtime.djs-shape .djs-visual > path {
-    fill: #ff5353 !important;
+  .highlight-wait.djs-shape .djs-visual > path {
+    fill: #F56C6C !important;
     fill-opacity: 0.2 !important;
-    stroke: #ff5353 !important;
+    stroke: #F56C6C !important;
   }
   //鍓嶉潰閭f潯绾跨殑棰滆壊
-  .highlight-overtime.djs-connection > .djs-visual > path {
-    stroke: #ff5353 !important;
+  .highlight-wait.djs-connection > .djs-visual > path {
+    stroke: #F56C6C !important;
 }
 
-  // 鍗冲皢瓒呮椂娴佺▼绾�
+  /* --------璺宠繃棰滆壊--------- */
+  .highlight-jump.djs-shape .djs-visual > :nth-child(1) {
+    fill: #909399 !important;
+    stroke: #909399 !important;
+    fill-opacity: 0.2 !important;
+  }
+  //鏂囧瓧棰滆壊
+  .highlight-jump.djs-shape .djs-visual > :nth-child(2) {
+    fill: #909399 !important;
+  }
+  //浜虹墿ui棰滆壊
+  .highlight-jump.djs-shape .djs-visual > path {
+    fill: #909399 !important;
+    fill-opacity: 0.2 !important;
+    stroke: #909399 !important;
+  }
+  //鍓嶉潰閭f潯绾跨殑棰滆壊
+  .highlight-jump.djs-connection > .djs-visual > path {
+    stroke: #909399 !important;
+  }
+
+
+  /* --------瓒呮椂棰滆壊 */
   .highlight-willOvertime.djs-shape .djs-visual > :nth-child(1) {
     fill: #eab24a !important;
     stroke: #eab24a !important;
@@ -234,12 +256,21 @@
       margin-right: 8px;
     }
 
-    .todo {
+    .jump {
       padding: 4px;
-      background: #ECEDEE;
+      background: #909399;
       border: 1px solid rgba(204, 204, 204, 0.1);
       border-radius: 3px;
-      color: #666666;
+      color: #4f4f4f;
+      margin-right: 5px;
+    }
+
+    .wait {
+      padding: 4px;
+      background: #F56C6C;
+      border: 1px solid rgba(204, 204, 204, 0.1);
+      border-radius: 3px;
+      color: #eae9e9;
       margin-right: 5px;
     }
 
diff --git a/src/components/Process/viewer/index.vue b/src/components/Process/viewer/index.vue
index ed21bd3..5558f6b 100644
--- a/src/components/Process/viewer/index.vue
+++ b/src/components/Process/viewer/index.vue
@@ -6,9 +6,9 @@
           <span class="intro">鐘舵�侊細</span>
           <div class="finish">宸插姙鐞�</div>
           <div class="processing">澶勭悊涓�</div>
-          <div class="todo">鏈繘琛�</div>
           <div class="overtime">宸茶秴鏃�</div>
-<!--          <div class="overtime">宸茶秴鏃�</div>-->
+          <div class="jump">璺� 杩�</div>
+          <div class="wait">瀹� 缂�</div>
         </div>
         <!-- 娴佺▼鍥炬樉绀� -->
         <div v-loading="loading" class="canvas" ref="flowCanvas"></div>
@@ -110,25 +110,34 @@
         const endTask = nodeData[nodeData.length - 1]
         if (n.$type === 'bpmn:UserTask') {
           if (completeTask) {
-            canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo')
-            if(completeTask.overtime && completeTask.overtime==='red'){
-              canvas.addMarker(n.id,  'highlight-willOvertime')
-            }
-          // else if(completeTask.overtime && completeTask.overtime==='yellow'){
-          //     canvas.addMarker(n.id,  'highlight-willOvertime')
-          //   }
-            n.outgoing?.forEach(nn => {
-              const targetTask = nodeData.find(m => m.key === nn.targetRef.id)
-              if (targetTask) {
-                if (todoTask && completeTask.key === todoTask.key && !todoTask.completed) {
-                  canvas.addMarker(nn.id, todoTask.completed ? 'highlight' : 'highlight-todo')
-                  canvas.addMarker(nn.targetRef.id, todoTask.completed ? 'highlight' : 'highlight-todo')
-                } else {
-                  canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
-                  canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
-                }
-
+            if (completeTask.hasJump) {
+              canvas.addMarker(n.id,  'highlight-jump')
+            } else if (completeTask.hasWait) {
+              canvas.addMarker(n.id,  'highlight-wait')
+            } else {
+              canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo')
+              if(completeTask.overtime && completeTask.overtime==='red' || completeTask.overtime==='yellow'){
+                canvas.addMarker(n.id,  'highlight-willOvertime')
               }
+            }
+            n.outgoing?.forEach(nn => {
+              if (completeTask.hasJump) {
+                canvas.addMarker(nn.id,  'highlight-jump')
+              } else if (completeTask.hasWait) {
+                canvas.addMarker(nn.id,  'highlight-wait')
+              } else {
+                const targetTask = nodeData.find(m => m.key === nn.targetRef.id)
+                if (targetTask) {
+                  if (todoTask && completeTask.key === todoTask.key && !todoTask.completed) {
+                    canvas.addMarker(nn.id, todoTask.completed ? 'highlight' : 'highlight-todo')
+                    canvas.addMarker(nn.targetRef.id, todoTask.completed ? 'highlight' : 'highlight-todo')
+                  } else {
+                    canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                    canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                  }
+                }
+              }
+
             })
           }
         }
@@ -139,9 +148,14 @@
             n.outgoing?.forEach(nn => {
               const targetTask = nodeData.find(m => m.key === nn.targetRef.id)
               if (targetTask) {
-
-                canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
-                canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                if (targetTask.hasJump) {
+                  canvas.addMarker(nn.id,  'highlight-jump')
+                } else if (targetTask.hasWait) {
+                  canvas.addMarker(nn.id,  'highlight-wait')
+                } else {
+                  canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                  canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                }
               }
             })
           }
@@ -153,8 +167,14 @@
             n.outgoing?.forEach(nn => {
               const targetTask = nodeData.find(m => m.key === nn.targetRef.id)
               if (targetTask) {
-                canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
-                canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                if (targetTask.hasJump) {
+                  canvas.addMarker(nn.id,  'highlight-jump')
+                } else if (targetTask.hasWait) {
+                  canvas.addMarker(nn.id,  'highlight-wait')
+                }  else {
+                  canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                  canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
+                }
               }
             })
           }
@@ -162,8 +182,14 @@
           n.outgoing.forEach(nn => {
             const completeTask = nodeData.find(m => m.key === nn.targetRef.id)
             if (completeTask) {
-              canvas.addMarker(nn.id, 'highlight')
-              canvas.addMarker(n.id, 'highlight')
+              if (completeTask.hasJump) {
+                canvas.addMarker(nn.id,  'highlight-jump')
+              } else if (completeTask.hasWait) {
+                canvas.addMarker(nn.id,  'highlight-wait')
+              } else {
+                canvas.addMarker(nn.id, 'highlight')
+                canvas.addMarker(n.id, 'highlight')
+              }
               return;
             }
           })
diff --git a/src/views/flowable/definition/model.vue b/src/views/flowable/definition/model.vue
index 3ef28fd..93ca8e3 100644
--- a/src/views/flowable/definition/model.vue
+++ b/src/views/flowable/definition/model.vue
@@ -5,6 +5,7 @@
       :xml="xml"
       :is-view="false"
       @save="save"
+      @update="update"
       @showXML="showXML"
     />
     <!--鍦ㄧ嚎鏌ョ湅xml-->
@@ -17,7 +18,7 @@
   </div>
 </template>
 <script>
-import {readXml, roleList, saveXml, userList,expList} from "@/api/flowable/definition";
+import {readXml, roleList, saveXml, userList, expList, updateXml} from "@/api/flowable/definition";
 import BpmnModel from '@/components/Process'
 import vkBeautify from 'vkbeautify'
 import hljs from 'highlight.js'
@@ -101,6 +102,21 @@
         this.$tab.closeOpenPage(obj);
       })
     },
+    /** 鏇存柊xml */
+    update(data) {
+      const params = {
+        deploymentId: this.$route.query && this.$route.query.deployId,
+        name: data.process.name,
+        category: data.process.category,
+        xml: data.xml
+      }
+      updateXml(params).then(res => {
+        this.$modal.msgSuccess(res.msg)
+        // 鍏抽棴褰撳墠鏍囩椤靛苟杩斿洖涓婁釜椤甸潰
+        const obj = { path: "/flowable/definition", query: { t: Date.now()} };
+        this.$tab.closeOpenPage(obj);
+      })
+    },
     /** 鎸囧畾娴佺▼鍔炵悊浜哄憳鍒楄〃 */
     getDataList() {
       userList().then(res => {
diff --git a/src/views/flowable/task/myProcess/detail/index.vue b/src/views/flowable/task/myProcess/detail/index.vue
index b8e9952..6dc7580 100644
--- a/src/views/flowable/task/myProcess/detail/index.vue
+++ b/src/views/flowable/task/myProcess/detail/index.vue
@@ -3,55 +3,49 @@
     <el-card class="box-card" >
       <div slot="header" class="clearfix" style="display: flex">
         <div style="flex: 1" class="el-icon-document">{{`浠诲姟璇︽儏锛歚 + this.goBackParams.processName}}</div>
-        <div style="flex: 2">{{projectName + '鈥斺��' + flowName}}</div>
+        <div style="flex: 2; color: #303133">{{projectName + '鈥斺��' + flowName}}</div>
         <el-button style="float: right;" size="mini" type="danger" @click="goBack">鍏抽棴</el-button>
       </div>
       <el-tabs  tab-position="top" v-model="activeName" @tab-click="handleClick">
         <!--琛ㄥ崟淇℃伅-->
         <el-tab-pane label="琛ㄥ崟淇℃伅" name="1">
           <!--鍒濆鍖栨祦绋嬪姞杞借〃鍗曚俊鎭�-->
-          <el-col :span="16" :offset="4" v-loading="formLoading" class="tab-min-height">
+          <el-col :span="24" v-loading="formLoading" class="tab-min-height">
             <div v-if="formDataList && formDataList.length > 0">
               <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp" style="position: relative">
-                <div v-if="formDataObj.current">
-                  <div class="current">褰撳墠闃舵锛�<span>{{formDataObj.beforeNodeName}}</span></div>
-                </div>
-                <div v-else-if="formDataList.length > 1">
-                  <div class="before">鍓嶇疆闃舵锛�<span>{{formDataObj.beforeNodeName}}</span></div>
-                </div>
-                <div v-if="formDataObj != null && formDataObj.formJsonObj != null">
-                  <v-form-render  :form-data="formDataObj.formJsonObj.formJson" :ref="'form' + index"/>
-                </div>
-                <div v-else>
-                  <el-alert
-                    title="鏈粦瀹氳〃鍗�"
-                    type="warning"
-                    :closable="false"
-                  >
-                  </el-alert>
-                </div>
-                <div style="position: absolute;top: 10px; right: 20px" v-if="formDataObj.events.length > 0">
-                  <el-popover
-                    placement="right-start"
-                    title="浠诲姟鏃ュ織"
-                    width="800"
-                    trigger="hover"
-                    >
-                    <div v-if="formDataObj.events.length > 0">
-                      <log-view :log-list="formDataObj.events"/>
+                <el-row>
+                  <el-col :span="18">
+                    <div v-if="formDataObj.current">
+                      <div class="current">褰撳墠闃舵锛�<span>{{formDataObj.beforeNodeName}}</span></div>
                     </div>
-                    <el-button slot="reference">浠诲姟鏃ュ織</el-button>
-                  </el-popover>
-                </div>
-                <div v-if="formDataList.length <= 1">
-                  <div class="before_none">鍓嶇疆闃舵锛�<span>涓嶅瓨鍦ㄥ墠缃樁娈�</span></div>
-                  <el-alert
-                    title="涓嶅瓨鍦ㄥ墠缃樁娈�"
-                    type="warning"
-                    :closable="false"
-                  >
-                  </el-alert>
-                </div>
+                    <div v-else-if="formDataList.length > 1">
+                      <div class="before">鍓嶇疆闃舵锛�<span>{{formDataObj.beforeNodeName}}</span></div>
+                    </div>
+                    <div v-if="formDataObj != null && formDataObj.formJsonObj != null">
+                      <v-form-render  :form-data="formDataObj.formJsonObj.formJson" :ref="'form' + index"/>
+                    </div>
+                    <div v-else>
+                      <el-alert
+                        title="鏈粦瀹氳〃鍗�"
+                        type="warning"
+                        :closable="false"
+                      >
+                      </el-alert>
+                    </div>
+                    <div v-if="formDataList.length <= 1">
+                      <div class="before_none">鍓嶇疆闃舵锛�<span>涓嶅瓨鍦ㄥ墠缃樁娈�</span></div>
+                      <el-alert
+                        title="涓嶅瓨鍦ㄥ墠缃樁娈�"
+                        type="warning"
+                        :closable="false"
+                      >
+                      </el-alert>
+                    </div>
+                  </el-col>
+                  <el-col :span="6">
+                    <log-time-line v-if="formDataObj.events.length > 0" :log-list="formDataObj.events"/>
+                  </el-col>
+                </el-row>
               </div>
             </div>
           </el-col>
@@ -123,12 +117,13 @@
 import {flowTaskForm, flowTaskFormDetail} from "@/api/flowable/todo";
 import BpmnViewer from '@/components/Process/viewer';
 import LogView from "@/views/projectProcess/components/LogView";
+import LogTimeLine from "@/views/projectProcess/components/LogTimeLine";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 
 export default {
   name: "Record",
   components: {
-    BpmnViewer, LogView
+    BpmnViewer, LogView, LogTimeLine
   },
   props: {},
   data() {
@@ -293,7 +288,9 @@
   padding: 20px;
   margin-top: 5px;
   margin-bottom: 20px;
-  box-shadow: rgba(67, 71, 85, 0.27) 0px 0px 0.25em, rgba(90, 125, 188, 0.05) 0px 0.25em 1em;
+  margin-left: 3px;
+  margin-right: 3px;
+  box-shadow: rgba(67, 71, 85, 0.27) 0px 0px 0.1em, rgba(90, 125, 188, 0.05) 0px 0.1em 0.5em;
 }
 .before {
   span {
diff --git a/src/views/flowable/task/myProcess/send/index.vue b/src/views/flowable/task/myProcess/send/index.vue
index e50e92b..32bbe07 100644
--- a/src/views/flowable/task/myProcess/send/index.vue
+++ b/src/views/flowable/task/myProcess/send/index.vue
@@ -3,68 +3,63 @@
     <el-card class="box-card" >
       <div slot="header" class="clearfix" style="display: flex">
         <div style="flex: 1" class="el-icon-document">{{`浠诲姟鍔炵悊锛歚 + processName}}</div>
-        <div style="flex: 2">{{projectName + '鈥斺��' + flowName}}</div>
+        <div style="flex: 2; color: #303133">{{projectName + '鈥斺��' + flowName}}</div>
         <el-button style="float: right;" size="mini" type="danger" @click="goBack">鍏抽棴</el-button>
       </div>
       <el-tabs  tab-position="top" v-model="activeName"  @tab-click="handleClick">
         <!--琛ㄥ崟淇℃伅-->
         <el-tab-pane label="琛ㄥ崟淇℃伅" name="1">
           <!--鍒濆鍖栨祦绋嬪姞杞借〃鍗曚俊鎭�-->
-          <el-col :span="16" :offset="4" v-loading="formLoading"  class="tab-min-height">
+          <el-col :span="24" v-loading="formLoading"  class="tab-min-height">
             <div v-if="formDataList && formDataList.length > 0">
-              <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp" style="position: relative">
-                <div v-if="formDataObj.current">
-                  <!--     褰撳墠鑺傜偣鍙崗鍚屻�佽浆鍔炵瓑鎿嶄綔         -->
-                  <div class="op-list">
-                    <el-button size="small" type="primary" :disabled="formDataObj.taskStatus === '鎸傝捣' || submitLoading" v-loading="submitLoading" @click="submitForm">纭骞舵彁浜�</el-button>
-<!--                    <el-button size="small" type="primary" disabled @click="submitForm">鍗忓悓鍔炵悊(鍔熻兘寮�鍙戜腑)</el-button>-->
-                    <el-button size="small" type="primary" v-if="!isWait" :disabled="formDataObj.taskStatus === '鎸傝捣'" @click="openDelegation(formDataList[0].beforeNodeName)">杞姙</el-button>
-                    <el-button v-if="formDataObj.canJump && !isWait" :disabled="formDataObj.taskStatus === '鎸傝捣'" size="small" type="primary" @click="jumpTask()">璺宠繃</el-button>
-                    <el-button v-if="formDataObj.canWait && !isWait" :disabled="formDataObj.taskStatus === '鎸傝捣'" size="small" type="primary" @click="waitTask()">瀹圭己</el-button>
-                    <el-button v-if="formDataObj.canHangup && formDataObj.taskStatus !== '鎸傝捣' && !isWait" size="small" type="primary" @click="hangup">鎸傝捣</el-button>
-                    <el-button v-if="formDataObj.canHangup && formDataObj.taskStatus === '鎸傝捣' && !isWait" size="small" type="primary" @click="cancelHangup">缁撴潫鎸傝捣</el-button>
-                  </div>
-                  <div class="current">褰撳墠闃舵锛�<span>{{formDataObj.beforeNodeName}}</span><span v-if="formDataObj.taskStatus === 'HANGUP'">锛堟寕璧蜂腑锛�</span></div>
-                </div>
-                <div v-else-if="formDataList.length > 1">
-                  <!--     鍓嶇疆鑺傜偣鍙┏鍥�         -->
-                  <div class="reject-but">
-                    <el-button type="danger" size="small" @click="openRejectTask(formDataObj.beforeNodeName)">椹� 鍥�</el-button>
-                    <el-popover
-                      style="margin-left: 10px" v-if="formDataObj.events.length > 0"
-                      placement="right-start"
-                      title="浠诲姟鏃ュ織"
-                      width="800"
-                      trigger="hover"
-                    >
-                      <div v-if="formDataObj.events.length > 0">
-                        <log-view :log-list="formDataObj.events"/>
+              <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp">
+                <el-row>
+                  <el-col :span="18" style="position: relative">
+                    <div v-if="formDataObj.current">
+                      <!--     褰撳墠鑺傜偣鍙崗鍚屻�佽浆鍔炵瓑鎿嶄綔         -->
+                      <div class="op-list">
+                        <el-button size="small" type="primary" :disabled="formDataObj.taskStatus === '鎸傝捣' || submitLoading" v-loading="submitLoading" @click="submitForm">纭骞舵彁浜�</el-button>
+                        <!--                    <el-button size="small" type="primary" disabled @click="submitForm">鍗忓悓鍔炵悊(鍔熻兘寮�鍙戜腑)</el-button>-->
+                        <el-button size="small" type="primary" v-if="!isWait" :disabled="formDataObj.taskStatus === '鎸傝捣'" @click="openDelegation(formDataList[0].beforeNodeName)">杞姙</el-button>
+                        <el-button v-if="formDataObj.canJump && !isWait" :disabled="formDataObj.taskStatus === '鎸傝捣'" size="small" type="primary" @click="jumpTask()">璺宠繃</el-button>
+                        <el-button v-if="formDataObj.canWait && !isWait" :disabled="formDataObj.taskStatus === '鎸傝捣'" size="small" type="primary" @click="waitTask()">瀹圭己</el-button>
+                        <el-button v-if="formDataObj.canHangup && formDataObj.taskStatus !== '鎸傝捣' && !isWait" size="small" type="primary" @click="hangup">鎸傝捣</el-button>
+                        <el-button v-if="formDataObj.canHangup && formDataObj.taskStatus === '鎸傝捣' && !isWait" size="small" type="primary" @click="cancelHangup">缁撴潫鎸傝捣</el-button>
                       </div>
-                      <el-button slot="reference">浠诲姟鏃ュ織</el-button>
-                    </el-popover>
-                  </div>
-                  <div class="before">鍓嶇疆闃舵锛�<span>{{formDataObj.beforeNodeName}}</span></div>
-                </div>
-                <div v-if="formDataObj != null && formDataObj.formJsonObj != null">
-                  <v-form-render  :form-data="formDataObj.formJsonObj.formJson" :ref="'form' + index"/>
-                </div>
-                <div v-else>
-                  <el-alert
-                    title="鏈粦瀹氳〃鍗�"
-                    type="warning"
-                    :closable="false"
-                  >
-                  </el-alert>
-                </div>
-                <div v-if="formDataList.length <= 1">
-                  <div class="before_none">鍓嶇疆闃舵锛�<span>涓嶅瓨鍦ㄥ墠缃樁娈�</span></div>
-                  <el-alert
-                    title="涓嶅瓨鍦ㄥ墠缃樁娈�"
-                    type="warning"
-                    :closable="false"
-                  >
-                  </el-alert>
-                </div>
+                      <div class="current">褰撳墠闃舵锛�<span>{{formDataObj.beforeNodeName}}</span><span v-if="formDataObj.taskStatus === 'HANGUP'">锛堟寕璧蜂腑锛�</span></div>
+                    </div>
+                    <div v-else-if="formDataList.length > 1">
+                      <!--     鍓嶇疆鑺傜偣鍙┏鍥�         -->
+                      <div class="reject-but">
+                        <el-button type="danger" size="small" @click="openRejectTask(formDataObj.beforeNodeName)">椹� 鍥�</el-button>
+                      </div>
+                      <div class="before">鍓嶇疆闃舵锛�<span>{{formDataObj.beforeNodeName}}</span></div>
+                    </div>
+                    <div v-if="formDataObj != null && formDataObj.formJsonObj != null">
+                      <v-form-render  :form-data="formDataObj.formJsonObj.formJson" :ref="'form' + index"/>
+                    </div>
+                    <div v-else>
+                      <el-alert
+                        title="鏈粦瀹氳〃鍗�"
+                        type="warning"
+                        :closable="false"
+                      >
+                      </el-alert>
+                    </div>
+                    <div v-if="formDataList.length <= 1">
+                      <div class="before_none">鍓嶇疆闃舵锛�<span>涓嶅瓨鍦ㄥ墠缃樁娈�</span></div>
+                      <el-alert
+                        title="涓嶅瓨鍦ㄥ墠缃樁娈�"
+                        type="warning"
+                        :closable="false"
+                      >
+                      </el-alert>
+                    </div>
+                  </el-col>
+                  <el-col :span="6">
+                    <log-time-line v-if="formDataObj.events.length > 0" :log-list="formDataObj.events"/>
+                  </el-col>
+                </el-row>
               </div>
             </div>
           </el-col>
@@ -189,6 +184,7 @@
 import { flowTaskForm } from "@/api/flowable/todo";
 import {getNextFlowNodeByStart} from "@/api/flowable/todo";
 import LogView from "@/views/projectProcess/components/LogView";
+import LogTimeLine from "@/views/projectProcess/components/LogTimeLine";
 import {rejectTask} from "@/api/flowable/process";
 import {cancelTaskHangup, taskDelegation, taskHangup, taskJump, taskWait} from "@/api/projectProcess/projectProcess";
 
@@ -200,7 +196,8 @@
     MyDept,
     SingleUser,
     MultUser,
-    LogView
+    LogView,
+    LogTimeLine
   },
   props: {},
   data() {
@@ -824,6 +821,8 @@
   padding: 20px;
   margin-top: 5px;
   margin-bottom: 20px;
+  margin-left: 3px;
+  margin-right: 3px;
   box-shadow: rgba(67, 71, 85, 0.27) 0px 0px 0.25em, rgba(90, 125, 188, 0.05) 0px 0.25em 1em;
 }
 .before {
@@ -843,7 +842,7 @@
 }
 .reject-but {
   position: absolute;
-  top: 4px;
+  top: -4px;
   right: 4px
 }
 .current {
@@ -855,7 +854,7 @@
 }
 .op-list {
   position: absolute;
-  top: 4px;
+  top: -4px;
   right: 4px;
   display: flex;
   justify-content: center;
diff --git a/src/views/projectProcess/components/LogTimeLine.vue b/src/views/projectProcess/components/LogTimeLine.vue
new file mode 100644
index 0000000..bda6f6b
--- /dev/null
+++ b/src/views/projectProcess/components/LogTimeLine.vue
@@ -0,0 +1,151 @@
+<template>
+  <div>
+    <el-timeline>
+      <el-timeline-item
+        v-for="(log, index) in logList"
+        :key="index"
+        :color="getColor(log)"
+        placement="top"
+        :timestamp="log.gmtCreate">
+        <div class="log" v-if="log.eventType === 'FINISHED'">
+          <div>
+            <span class="tag name">{{log.nickName}}</span>
+            <span class="tag op">瀹屾垚</span>
+            浜嗕换鍔�
+            <span class="tag taskName">{{log.taskName}}</span>
+          </div>
+        </div>
+        <div class="log" v-else-if="log.eventType === 'REJECT'">
+          <div>
+            <span class="tag name">{{log.nickName}}</span>
+            <span class="tag reject">椹冲洖</span>
+            浜嗕换鍔�
+            <span class="tag taskName">{{log.taskName}}</span>
+            锛�
+            <span class="tag reject">椹冲洖鍘熷洜</span>
+            锛�
+            <span class="tag">{{log.eventDataObj.reason}}</span>
+          </div>
+        </div>
+        <div class="log" v-else-if="log.eventType === 'HANGUP'">
+          <div>
+            <span class="tag name">{{log.nickName}}</span>
+            <span class="tag reject">鎸傝捣</span>
+            浜嗕换鍔�
+            <span class="tag taskName">{{log.taskName}}</span>
+            锛�
+            <span class="tag reject">鎸傝捣鍘熷洜</span>
+            锛�
+            <span class="tag">{{log.eventDataObj.reason}}</span>
+          </div>
+        </div>
+        <div class="log" v-else-if="log.eventType === 'CANCEL_HANGUP'">
+          <div>
+            <span class="tag name">{{log.nickName}}</span>
+            <span class="tag reject">鍙栨秷鎸傝捣</span>
+            浜嗕换鍔�
+            <span class="tag taskName">{{log.taskName}}</span>
+          </div>
+        </div>
+        <div class="log" v-else-if="log.eventType === 'DELEGATE'">
+          <div>
+            <span class="tag name">{{log.nickName}}</span>
+            灏嗕换鍔�
+            <span class="tag taskName">{{log.taskName}}</span>
+            <span class="tag op">杞姙</span>
+            缁欎簡
+            <span class="tag">{{log.eventDataObj.afterHandlerNames.join('銆�')}}</span>
+          </div>
+        </div>
+        <div class="log" v-else-if="log.eventType === 'JUMP'">
+          <div>
+            <span class="tag name">{{log.nickName}}</span>
+            <span class="tag jump">璺宠繃</span>
+            浜嗕换鍔�
+            <span class="tag taskName">{{log.taskName}}</span>
+            锛�
+            <span class="tag jump">璺宠繃璇存槑</span>
+            锛�
+            <span class="tag">{{log.eventDataObj.desc}}</span>
+          </div>
+        </div>
+        <div class="log" v-else-if="log.eventType === 'WAIT'">
+          <div>
+            <span class="tag name">{{log.nickName}}</span>
+            <span class="tag jump">瀹圭己</span>
+            浜嗕换鍔�
+            <span class="tag taskName">{{log.taskName}}</span>
+            锛�
+            <span class="tag jump">瀹圭己璇存槑</span>
+            锛�
+            <span class="tag">{{log.eventDataObj.desc}}</span>
+          </div>
+        </div>
+        <div class="log" v-else-if="log.eventType === 'SUPERVISE'">
+          <div>
+            <span class="tag name">{{log.nickName}}</span>
+            <span class="tag db">鐫e姙</span>
+            浜嗕换鍔�
+            <span class="tag taskName">{{log.taskName}}</span>
+            锛�
+            <span class="tag db">鐫e姙淇℃伅</span>
+            锛�
+            <span class="tag">{{log.eventDataObj.content}}</span>
+          </div>
+        </div>
+        <div class="log" v-else-if="log.eventType === 'TEAM_WORK'">
+          <div>
+            <span class="tag name">{{log.nickName}}</span>
+            閭�璇蜂簡璋佽皝璋�
+            <span class="tag op">鍗忓悓鍔炵悊</span>
+            <span class="tag taskName">{{log.taskName}}</span>
+          </div>
+        </div>
+      </el-timeline-item>
+    </el-timeline>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "LogTimeLine",
+  props: {
+    logList: {
+      require: true,
+      type: Array
+    }
+  },
+  data() {
+    return {
+
+    }
+  },
+  methods: {
+    getColor(log) {
+      if (log.eventType === 'FINISHED') {
+        return "#67C23A"
+      } else if (log.eventType === 'REJECT') {
+        return "#F56C6C"
+      } else if (log.eventType === 'HANGUP') {
+        return "#409EFF"
+      } else if (log.eventType === 'CANCEL_HANGUP') {
+        return "#409EFF"
+      } else if (log.eventType === 'DELEGATE') {
+        return "#53b1d3"
+      } else if (log.eventType === 'JUMP' || log.eventType === 'WAIT') {
+        return "#E6A23C"
+      } else if (log.eventType === 'SUPERVISE') {
+        return "#F56C6C"
+      } else if (log.eventType === 'TEAM_WORK') {
+        return "#909399"
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.log {
+  color: #606266;
+}
+</style>

--
Gitblit v1.8.0