xiangpei
2025-04-08 b25e78e9887935e5955f0c5ad798104eca444016
修改任务实现,流程日志扩展
5个文件已修改
1个文件已添加
305 ■■■■ 已修改文件
src/api/flowable/todo.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/projectProcess/projectProcess.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectProcess/components/EditTask.vue 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectProcess/components/LogTimeLine.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectProcess/components/LogView.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/projectProcess/detail/index.vue 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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({
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({
src/views/projectProcess/components/EditTask.vue
New file
@@ -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>
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>
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>
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">督办</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="督办" append-to-body>
      <el-form ref="superviseForm" :model="superviseForm" :rules="superviseRules" label-width="80px">
        <el-form-item label="督办内容" 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"