From b25e78e9887935e5955f0c5ad798104eca444016 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期二, 08 四月 2025 18:12:09 +0800
Subject: [PATCH] 修改任务实现,流程日志扩展

---
 src/api/flowable/todo.js                            |    8 +
 src/views/projectProcess/components/EditTask.vue    |  195 ++++++++++++++++++++++++++++++++
 src/api/projectProcess/projectProcess.js            |    9 +
 src/views/projectProcess/detail/index.vue           |   70 ++---------
 src/views/projectProcess/components/LogView.vue     |   10 +
 src/views/projectProcess/components/LogTimeLine.vue |   13 ++
 6 files changed, 247 insertions(+), 58 deletions(-)

diff --git a/src/api/flowable/todo.js b/src/api/flowable/todo.js
index 436efa4..007f685 100644
--- a/src/api/flowable/todo.js
+++ b/src/api/flowable/todo.js
@@ -131,6 +131,14 @@
     params: query
   })
 }
+// 褰撳墠鑺傜偣琛ㄥ崟鏁版嵁
+export function currentFlowTaskForm(query) {
+  return request({
+    url: '/flowable/task/current/flowTaskForm',
+    method: 'get',
+    params: query
+  })
+}
 // 娴佺▼鑺傜偣鏌ョ湅璇︽儏琛ㄥ崟
 export function flowTaskFormDetail(processInsId, taskId) {
   return request({
diff --git a/src/api/projectProcess/projectProcess.js b/src/api/projectProcess/projectProcess.js
index 5c0b743..d8bcc16 100644
--- a/src/api/projectProcess/projectProcess.js
+++ b/src/api/projectProcess/projectProcess.js
@@ -46,6 +46,15 @@
   })
 }
 
+// 淇敼浠诲姟
+export const editTask = (data) => {
+  return request({
+    url: "/project-process/admin/edit/finish/task",
+    method: "POST",
+    data: data
+  })
+}
+
 // 娴佺▼寰呭姙鍒楄〃
 export function getProjectProcessTodo(query) {
   return request({
diff --git a/src/views/projectProcess/components/EditTask.vue b/src/views/projectProcess/components/EditTask.vue
new file mode 100644
index 0000000..8d0f19a
--- /dev/null
+++ b/src/views/projectProcess/components/EditTask.vue
@@ -0,0 +1,195 @@
+<template>
+  <div>
+    <el-dialog
+      :title="'淇敼浠诲姟锛�' + currentTask.beforeNodeName"
+      :visible.sync="open"
+      :destroy-on-close="true"
+      :fullscreen="true"
+      :before-close="close">
+      <el-row>
+        <el-col :span="16">
+          <div v-if="currentTask != null && currentTask.formJsonObj != null">
+            <v-form-render :form-data="currentTask.formJsonObj.formJson" ref="form"/>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div style="padding-left: 40px;min-height: 200px">
+            <div style="position: relative">
+              <div v-if="currentTask.taskStatus == '宸插畬鎴�'">褰撳墠鐘舵�侊細{{currentTask.taskStatus}}<span v-show="editForm.nowStatus">--->{{editForm.nowStatus}}</span>锛�
+                <el-button type="primary" size="small" @click="openJump">鏀逛负璺宠繃</el-button>
+                <el-button type="primary" size="small" @click="openWait">鏀逛负瀹圭己</el-button>
+                <el-button type="text" size="small" @click="cancelStatus" v-show="editForm.nowStatus">鍙栨秷鐘舵�佹洿鏀�</el-button>
+              </div>
+              <div v-else-if="currentTask.taskStatus == '璺宠繃'">褰撳墠鐘舵�侊細{{currentTask.taskStatus}}<span v-show="editForm.nowStatus">--->{{editForm.nowStatus}}</span>锛�
+                <el-button type="primary" size="small" @click="openWait">鏀逛负瀹圭己</el-button>
+                <el-button type="text" size="small" @click="cancelStatus" v-show="editForm.nowStatus">鍙栨秷鐘舵�佹洿鏀�</el-button>
+              </div>
+              <div v-else-if="currentTask.taskStatus == '瀹圭己'">褰撳墠鐘舵�侊細{{currentTask.taskStatus}}<span v-show="editForm.nowStatus">--->{{editForm.nowStatus}}</span>锛�
+                <el-button type="primary" size="small" @click="openJump">鏀逛负璺宠繃</el-button>
+                <el-button type="text" size="small" @click="cancelStatus" v-show="editForm.nowStatus">鍙栨秷鐘舵�佹洿鏀�</el-button>
+              </div>
+              <el-button style="position: absolute;right: 0px; top: 0px" type="primary" size="small" @click="save">淇� 瀛�</el-button>
+            </div>
+            <div style="margin-top: 15px">
+              <el-form v-show="showJumpForm" :model="taskJumpForm" :rules="jumpRules" ref="jumpForm" label-position="left">
+                <el-form-item label="璺宠繃璇存槑" prop="desc">
+                  <el-input v-model="taskJumpForm.desc"></el-input>
+                </el-form-item>
+              </el-form>
+              <el-form v-show="showWaitForm" :model="taskWaitForm" :rules="waitRules" ref="waitForm" label-position="left">
+                <el-form-item label="瀹圭己璇存槑" prop="desc">
+                  <el-input v-model="taskWaitForm.desc"></el-input>
+                </el-form-item>
+              </el-form>
+            </div>
+          </div>
+          <div>
+            <log-time-line v-if="currentTask.events && currentTask.events.length > 0" :log-list="currentTask.events"/>
+          </div>
+        </el-col>
+      </el-row>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {currentFlowTaskForm} from "@/api/flowable/todo";
+import LogTimeLine from "@/views/projectProcess/components/LogTimeLine";
+import {editTask} from "@/api/projectProcess/projectProcess";
+
+export default {
+  name: "EditTask",
+  components: {LogTimeLine},
+  props: {
+    taskId: {
+      type: String,
+      required: true
+    },
+    open: {
+      type: Boolean,
+      default: false
+    }
+  },
+  watch: {
+    taskId: {
+      handler(newV) {
+        if (newV) {
+          currentFlowTaskForm({taskId: newV}).then(res => {
+            this.currentTask = res.data
+            this.editForm.originalStatus = res.data.taskStatus
+            this.editForm.taskId = newV
+            this.formJson = this.currentTask.formJsonObj.formJson
+            this.$nextTick(() => {
+              this.$refs.form.setFormJson(this.currentTask.formJsonObj.formJson);
+              this.$refs.form.setFormData(this.currentTask.formJsonObj);
+            })
+          })
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      showJumpForm: false,
+      showWaitForm: false,
+      jumpRules: {
+        desc: [
+          { required: true, message: '璇疯緭鍏ヨ烦杩囪鏄�', trigger: 'blur' },
+        ]
+      },
+      waitRules: {
+        desc: [
+          { required: true, message: '璇疯緭鍏ュ缂鸿鏄�', trigger: 'blur' },
+        ]
+      },
+      currentTask: {
+
+      },
+      taskJumpForm: {
+        desc: ''
+      },
+      taskWaitForm: {
+        desc: ''
+      },
+      formJson: {}, // 琛ㄥ崟json
+      formData: {}, // 濉啓鐨勮〃鍗曟暟鎹�,
+      editForm: {
+        taskId: '',
+        variables: null,
+        originalStatus: '',
+        nowStatus: '',
+        taskJumpForm: null,
+        taskWaitForm: null
+      }
+    }
+  },
+  methods: {
+    cancelStatus() {
+      this.editForm.nowStatus = ''
+      this.showWaitForm = false
+      this.showJumpForm = false
+      this.editForm.taskWaitForm = {}
+      this.editForm.taskJumpForm = {}
+    },
+    openJump() {
+      this.showWaitForm = false
+      this.editForm.taskWaitForm = {}
+      this.editForm.nowStatus = '璺宠繃'
+      this.showJumpForm = true
+    },
+    openWait() {
+      this.showJumpForm = false
+      this.editForm.taskJumpForm = {}
+      this.editForm.nowStatus = '瀹圭己'
+      this.showWaitForm = true
+    },
+    save() {
+      this.$refs.form.getFormData().then(formData => {
+        this.formData = formData
+        const param = {
+          formJson:  this.formJson,
+        }
+        // 澶嶅埗瀵硅薄鐨勫睘鎬у�肩粰鏂扮殑瀵硅薄
+        Object.assign(param, formData);
+        this.editForm.variables = param
+        if (this.editForm.nowStatus) {
+          if (this.editForm.nowStatus == '璺宠繃') {
+            this.$refs['jumpForm'].validate((valid) => {
+              if (valid) {
+                this.editForm.taskJumpForm = this.taskJumpForm
+                editTask(this.editForm).then(res => {
+                  this.$message.success("淇敼鎴愬姛")
+                  this.close()
+                })
+              }
+            })
+          } else if (this.editForm.nowStatus == '瀹圭己') {
+            this.$refs['waitForm'].validate((valid) => {
+              if (valid) {
+                this.editForm.taskWaitForm = this.taskWaitForm
+                editTask(this.editForm).then(res => {
+                  this.$message.success("淇敼鎴愬姛")
+                  this.close()
+                })
+              }
+            })
+          }
+        } else {
+          this.editForm.nowStatus = this.editForm.originalStatus
+          editTask(this.editForm).then(res => {
+            this.$message.success("淇敼鎴愬姛")
+            this.close()
+          })
+        }
+      })
+    },
+    close() {
+      this.$emit("close")
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/projectProcess/components/LogTimeLine.vue b/src/views/projectProcess/components/LogTimeLine.vue
index bda6f6b..db01762 100644
--- a/src/views/projectProcess/components/LogTimeLine.vue
+++ b/src/views/projectProcess/components/LogTimeLine.vue
@@ -93,6 +93,14 @@
             <span class="tag">{{log.eventDataObj.content}}</span>
           </div>
         </div>
+        <div class="log" v-else-if="log.eventType === 'EDIT'">
+          <div>
+            <span class="tag name">{{log.nickName}}</span>
+            <span class="tag db">淇敼</span>
+            浜嗕换鍔�
+            <span class="tag taskName">{{log.taskName}}</span>
+          </div>
+        </div>
         <div class="log" v-else-if="log.eventType === 'TEAM_WORK'">
           <div>
             <span class="tag name">{{log.nickName}}</span>
@@ -124,7 +132,7 @@
     getColor(log) {
       if (log.eventType === 'FINISHED') {
         return "#67C23A"
-      } else if (log.eventType === 'REJECT') {
+      } else if (log.eventType === 'REJECT' || log.eventType === 'EDIT') {
         return "#F56C6C"
       } else if (log.eventType === 'HANGUP') {
         return "#409EFF"
@@ -148,4 +156,7 @@
 .log {
   color: #606266;
 }
+.tag {
+  margin: 0 5px;
+}
 </style>
diff --git a/src/views/projectProcess/components/LogView.vue b/src/views/projectProcess/components/LogView.vue
index 12b2472..70e5322 100644
--- a/src/views/projectProcess/components/LogView.vue
+++ b/src/views/projectProcess/components/LogView.vue
@@ -104,6 +104,16 @@
             <span class="tag">{{log.eventDataObj.content}}</span>
           </div>
         </div>
+        <div class="log" v-else-if="log.eventType === 'EDIT'">
+          <div>
+            <span class="tag name">{{log.nickName}}</span>
+            浜�
+            <span class="tag time">{{log.gmtCreate}}</span>
+            <span class="tag db">淇敼</span>
+            浜嗕换鍔�
+            <span class="tag taskName">{{log.taskName}}</span>
+          </div>
+        </div>
         <div class="log" v-else-if="log.eventType === 'TEAM_WORK'">
           <div>
             <span class="tag name">{{log.nickName}}</span>
diff --git a/src/views/projectProcess/detail/index.vue b/src/views/projectProcess/detail/index.vue
index 823ec0d..ca42051 100644
--- a/src/views/projectProcess/detail/index.vue
+++ b/src/views/projectProcess/detail/index.vue
@@ -88,6 +88,7 @@
               <el-button v-if="scope.row.taskStatus !== '鏈紑濮�'" @click="goToProcessDetail(scope.row)" type="text" size="small">鏌ョ湅</el-button>
               <el-button v-if="showHandle(scope.row)" @click="goToDo(scope.row)" type="text" size="small">鍔炵悊</el-button>
               <el-button v-if = "scope.row.taskStatus === '寰呭姙'" @click="openSupervise(scope.row)" type="text" size="small">鐫e姙</el-button>
+              <el-button v-if = "scope.row.taskStatus === '宸插畬鎴�' || scope.row.taskStatus === '璺宠繃' || scope.row.taskStatus === '瀹圭己'" v-hasPermi="['task:edit']" @click="openEditTask(scope.row)" type="text" size="small">淇敼</el-button>
             </template>
           </el-table-column>
         </el-table>
@@ -127,62 +128,6 @@
       <log-view style="padding: 10px 20px" :log-list="logList"/>
     </el-drawer>
 
-<!--    <el-dialog-->
-<!--      :title="`${this.queryParams.processName}锛氭祦杞褰昤"-->
-<!--      :visible.sync="processRecordShow"-->
-<!--      :fullscreen="true"-->
-<!--      :close-on-click-modal="false"-->
-<!--      :destroy-on-close="true"-->
-<!--    >-->
-<!--      <div>-->
-<!--        <log-view :log-list="logList"/>-->
-<!--&lt;!&ndash;        <div class="block">&ndash;&gt;-->
-<!--&lt;!&ndash;          <el-timeline>&ndash;&gt;-->
-<!--&lt;!&ndash;            <el-timeline-item&ndash;&gt;-->
-<!--&lt;!&ndash;              v-for="(item,index ) in flowRecordList"&ndash;&gt;-->
-<!--&lt;!&ndash;              :key="index"&ndash;&gt;-->
-<!--&lt;!&ndash;              :icon="setIcon(item.finishTime)"&ndash;&gt;-->
-<!--&lt;!&ndash;              :color="setColor(item.finishTime)"&ndash;&gt;-->
-<!--&lt;!&ndash;            >&ndash;&gt;-->
-<!--&lt;!&ndash;              <p style="font-weight: 700">{{item.taskName}}&ndash;&gt;-->
-<!--&lt;!&ndash;                <span v-if="item.comment && item.comment.type === '3'" style="color: red">(鎵ц浜嗛┏鍥�)</span>&ndash;&gt;-->
-<!--&lt;!&ndash;                <span v-if="item.overtime && item.overtime==='red'" style="color: red">(宸茶秴鏃�)</span>&ndash;&gt;-->
-<!--&lt;!&ndash;                <span v-if="item.overtime && item.overtime==='yellow'" style="color: orange">(鍗冲皢瓒呮椂)</span>&ndash;&gt;-->
-<!--&lt;!&ndash;              </p>&ndash;&gt;-->
-<!--&lt;!&ndash;              <el-card :body-style="{ padding: '10px' }">&ndash;&gt;-->
-<!--&lt;!&ndash;                <el-descriptions class="margin-top" :column="1" size="small" border>&ndash;&gt;-->
-<!--&lt;!&ndash;                  <el-descriptions-item v-if="item.assigneeName" label-class-name="my-label">&ndash;&gt;-->
-<!--&lt;!&ndash;                    <template slot="label"><i class="el-icon-user"></i>鍔炵悊浜�</template>&ndash;&gt;-->
-<!--&lt;!&ndash;                    {{item.assigneeName}}&ndash;&gt;-->
-<!--&lt;!&ndash;                    <el-tag type="info" size="mini">{{item.deptName}}</el-tag>&ndash;&gt;-->
-<!--&lt;!&ndash;                  </el-descriptions-item>&ndash;&gt;-->
-<!--&lt;!&ndash;                  <el-descriptions-item v-if="item.candidate" label-class-name="my-label">&ndash;&gt;-->
-<!--&lt;!&ndash;                    <template slot="label"><i class="el-icon-user"></i>鍊欓�夊姙鐞�</template>&ndash;&gt;-->
-<!--&lt;!&ndash;                    {{item.candidate}}&ndash;&gt;-->
-<!--&lt;!&ndash;                  </el-descriptions-item>&ndash;&gt;-->
-<!--&lt;!&ndash;                  <el-descriptions-item label-class-name="my-label">&ndash;&gt;-->
-<!--&lt;!&ndash;                    <template slot="label"><i class="el-icon-date"></i>鎺ユ敹鏃堕棿</template>&ndash;&gt;-->
-<!--&lt;!&ndash;                    {{item.createTime}}&ndash;&gt;-->
-<!--&lt;!&ndash;                  </el-descriptions-item>&ndash;&gt;-->
-<!--&lt;!&ndash;                  <el-descriptions-item v-if="item.finishTime" label-class-name="my-label">&ndash;&gt;-->
-<!--&lt;!&ndash;                    <template slot="label"><i class="el-icon-date"></i>澶勭悊鏃堕棿</template>&ndash;&gt;-->
-<!--&lt;!&ndash;                    {{item.finishTime}}&ndash;&gt;-->
-<!--&lt;!&ndash;                  </el-descriptions-item>&ndash;&gt;-->
-<!--&lt;!&ndash;                  <el-descriptions-item v-if="item.duration"  label-class-name="my-label">&ndash;&gt;-->
-<!--&lt;!&ndash;                    <template slot="label"><i class="el-icon-time"></i>鑰楁椂</template>&ndash;&gt;-->
-<!--&lt;!&ndash;                    {{item.duration}}&ndash;&gt;-->
-<!--&lt;!&ndash;                  </el-descriptions-item>&ndash;&gt;-->
-<!--&lt;!&ndash;                  <el-descriptions-item v-if="item.comment" label-class-name="my-label">&ndash;&gt;-->
-<!--&lt;!&ndash;                    <template slot="label"><i class="el-icon-tickets"></i>澶勭悊鎰忚</template>&ndash;&gt;-->
-<!--&lt;!&ndash;                    {{item.comment.comment}}&ndash;&gt;-->
-<!--&lt;!&ndash;                  </el-descriptions-item>&ndash;&gt;-->
-<!--&lt;!&ndash;                </el-descriptions>&ndash;&gt;-->
-<!--&lt;!&ndash;              </el-card>&ndash;&gt;-->
-<!--&lt;!&ndash;            </el-timeline-item>&ndash;&gt;-->
-<!--&lt;!&ndash;          </el-timeline>&ndash;&gt;-->
-<!--&lt;!&ndash;        </div>&ndash;&gt;-->
-<!--      </div>-->
-<!--    </el-dialog>-->
     <el-dialog :visible.sync="superviseShow" width="1000px"  title="鐫e姙" append-to-body>
       <el-form ref="superviseForm" :model="superviseForm" :rules="superviseRules" label-width="80px">
         <el-form-item label="鐫e姙鍐呭" prop="content">
@@ -194,6 +139,8 @@
         <el-button type="primary" @click="submitSupervise">纭� 瀹�</el-button>
       </div>
     </el-dialog>
+
+    <edit-task :task-id="editTaskId" :open="editTaskOpen" @close="editTaskOpen = false; editTaskId = ''"/>
   </div>
 </template>
 
@@ -206,6 +153,7 @@
 import {flowXmlAndNode} from "@/api/flowable/definition";
 import BpmnViewer from '@/components/Process/viewer';
 import LogView from "@/views/projectProcess/components/LogView";
+import EditTask from "@/views/projectProcess/components/EditTask";
 import {flowRecord} from "@/api/flowable/finished";
 import {editProject} from "@/api/projectEngineering/projectInfo";
 import {getProjectProcessLog} from "@/api/flowLog/flowLog";
@@ -214,10 +162,13 @@
   name: "Detail",
   components: {
     BpmnViewer,
-    LogView
+    LogView,
+    EditTask
   },
   data() {
     return {
+      editTaskId: '',
+      editTaskOpen: false,
       logList: [], // 娴佺▼鏃ュ織
       processRecordShow: false, // 娴佽浆璁板綍鏄剧ず
       flowRecordList: [], // 娴佺▼娴佽浆鏁版嵁
@@ -280,6 +231,11 @@
     this.getProjectProcessInfo()
   },
   methods: {
+    // 鎵撳紑缂栬緫浠诲姟
+    openEditTask(row) {
+      this.editTaskOpen = true
+      this.editTaskId = row.taskId
+    },
     transEventType(selectTabId) {
       if (selectTabId == 1) {
         return "all"

--
Gitblit v1.8.0