xiangpei
2025-03-09 0829704d064b5d843014897a84b42f3625571d97
src/views/flowable/task/myProcess/detail/index.vue
@@ -1,20 +1,60 @@
<template>
  <div class="app-container">
    <el-card class="box-card" >
      <div slot="header" class="clearfix">
        <span class="el-icon-document">任务详情</span>
      <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>
        <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-if="formDataList && formDataList.length > 0">
            <div v-for="(formDataObj, index) in formDataList" :key="index" class="form-warp">
              <div v-if="formDataObj.current" style="margin-bottom: 15px;color: #409eff">当前阶段:<span style="color: red">{{formDataObj.beforeNodeName}}</span></div>
              <div v-else style="margin-bottom: 15px;color: #409eff">前置阶段:<span style="color: #d5904b">{{formDataObj.beforeNodeName}}</span></div>
              <v-form-render  :form-data="formDataObj.formJson" :ref="'form' + index"/>
          <!--初始化流程加载表单信息-->
          <el-col :span="16" :offset="4" 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"/>
                    </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>
            </div>
         </el-col>
          </el-col>
        </el-tab-pane>
        <!--流程流转记录-->
        <el-tab-pane label="流转记录" name="2">
@@ -29,7 +69,8 @@
                >
                  <p style="font-weight: 700">{{item.taskName}}
                    <span v-if="item.comment && item.comment.type === '3'" style="color: red">(执行了驳回)</span>
                    <span v-if="item.overtime" style="color: red">(已超时)</span>
                    <span v-if="item.overtime && item.overtime==='red'" style="color: red">(已超时)</span>
                    <span v-if="item.overtime && item.overtime==='yellow'" style="color: orange">(即将超时)</span>
                  </p>
                  <el-card :body-style="{ padding: '10px' }">
                    <el-descriptions class="margin-top" :column="1" size="small" border>
@@ -67,7 +108,9 @@
        </el-tab-pane>
        <!--流程图-->
        <el-tab-pane label="流程图" name="3">
          <bpmn-viewer :flowData="flowData" :procInsId="taskForm.procInsId"/>
          <div class="tab-min-height" v-loading="imgLoading">
            <bpmn-viewer :flowData="flowData" :procInsId="taskForm.procInsId"/>
          </div>
        </el-tab-pane>
    </el-tabs>
    </el-card>
@@ -79,16 +122,21 @@
import {getProcessVariables, flowXmlAndNode} from "@/api/flowable/definition";
import {flowTaskForm, flowTaskFormDetail} from "@/api/flowable/todo";
import BpmnViewer from '@/components/Process/viewer';
import LogView from "@/views/projectProcess/components/LogView";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
  name: "Record",
  components: {
    BpmnViewer
    BpmnViewer, LogView
  },
  props: {},
  data() {
    return {
      formLoading: false, // 加载表单
      imgLoading: false, // 加载流程图
      projectName: '',
      flowName: '',
      // 模型xml数据
      flowData: {},
      formDataList: [],  // 表单列表
@@ -115,14 +163,18 @@
    this.taskForm.taskId  = this.$route.query && this.$route.query.taskId;
    this.taskForm.procInsId = this.$route.query && this.$route.query.procInsId;
    this.goBackParams = this.$route.query && this.$route.query.goBackParams;
    this.projectName = this.$route.query && this.$route.query.projectName;
    this.flowName = this.$route.query && this.$route.query.flowName;
    // 流程任务重获取变量表单
    this.processVariables( this.taskForm.taskId)
    this.getFlowRecordList(this.taskForm.procInsId, this.taskForm.deployId);
    this.processVariables( this.taskForm.taskId, this.taskForm.procInsId)
    this.getFlowRecordList(this.taskForm.procInsId);
  },
  methods: {
    handleClick(tab, event) {
      if (tab.name === '3'){
        flowXmlAndNode({procInsId:this.taskForm.procInsId,deployId:this.taskForm.deployId}).then(res => {
        this.imgLoading = true
        flowXmlAndNode({processInsId:this.taskForm.procInsId,deployId:this.taskForm.deployId}).then(res => {
          this.imgLoading = false
          this.flowData = res.data;
        })
      }
@@ -142,9 +194,9 @@
      }
    },
    /** 流程流转记录 */
    getFlowRecordList(procInsId, deployId) {
    getFlowRecordList(procInsId) {
      const that = this
      const params = {procInsId: procInsId, deployId: deployId}
      const params = {procInsId: procInsId}
      flowRecord(params).then(res => {
        that.flowRecordList = res.data.flowList;
      }).catch(res => {
@@ -152,17 +204,17 @@
      })
    },
    /** 获取流程变量内容 */
    processVariables(taskId) {
    processVariables(taskId, processInsId) {
      if (taskId) {
        this.formLoading = true
        // 提交流程申请时填写的表单存入了流程变量中后续任务处理时需要展示
        flowTaskFormDetail(taskId).then(res => {
        flowTaskFormDetail(processInsId, taskId).then(res => {
          this.formDataList = res.data
          if (this.formDataList && this.formDataList.length > 0) {
            this.$nextTick(() => {
              this.formDataList.forEach((formDataObj, index) => {
                console.log("表单数据列表", formDataObj.formJson)
                let that = this
                console.log(eval("that.$refs.form" + index)[0])
                if (formDataObj.formJsonObj) {
                  eval("that.$refs.form" + index)[0].setFormJson(formDataObj.formJsonObj.formJson);
@@ -175,6 +227,7 @@
              // this.formJson = this.formDataList[0].formJsonObj.formJson
            })
          }
          this.formLoading = false
          // this.$nextTick(() => {
          //   // 回显表单
          //   this.$refs.vFormRef.setFormJson(res.data.formJson);
@@ -192,11 +245,14 @@
    },
    /** 返回页面 */
    goBack() {
      // 关闭当前标签页
      this.$store.dispatch("tagsView/delView", this.$route);
      this.$router.push({
        path: '/projectFlow/detail',
        query: {
          projectId: this.goBackParams.projectId,
          processDefId: this.goBackParams.processDefId
          processDefId: this.goBackParams.processDefId,
          processName: this.goBackParams.processName
        }
      })
    },
@@ -233,11 +289,48 @@
}
.form-warp {
  min-width: 700px;
  padding: 20px;
  margin-top: 5px;
  margin-bottom: 20px;
  box-shadow:
    inset 0 -3em 3em rgba(0, 0, 0, 0.1),
    0 0 0 2px rgb(239, 239, 239),
    0.3em 0.3em 1em rgba(0, 0, 0, 0.3);
  box-shadow: rgba(67, 71, 85, 0.27) 0px 0px 0.25em, rgba(90, 125, 188, 0.05) 0px 0.25em 1em;
}
.before {
  span {
    color: #F56C6C
  }
  margin-bottom: 15px;
  color: #E6A23C
}
.before_none {
  span {
    color: #F56C6C
  }
  margin-bottom: 15px;
  margin-top: 15px;
  color: #E6A23C
}
.reject-but {
  position: absolute;
  top: 4px;
  right: 4px
}
.current {
  span {
    color: #409EFF
  }
  margin-bottom: 15px;
  color: #E6A23C
}
.op-list {
  position: absolute;
  top: 4px;
  right: 4px;
  display: flex;
  justify-content: center;
  align-items: center;
}
.tab-min-height {
  min-height: 500px;
}
</style>