xiangpei
2025-05-06 5c929cfb5286a31a4e067cbc61e8774f4e7d42ae
src/views/flowable/task/myProcess/send/index.vue
@@ -3,54 +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="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" @click="openDelegation(formDataList[0].beforeNodeName)">转办</el-button>
                    <el-button v-if="formDataObj.canJump" size="small" type="primary" @click="openDelegation()">跳过</el-button>
                    <el-button v-if="formDataObj.canWait" size="small" type="primary" @click="openDelegation()">容缺</el-button>
                  </div>
                  <div class="current">当前阶段:<span>{{formDataObj.beforeNodeName}}</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>
              <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>
                      <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>
@@ -171,11 +180,13 @@
import SingleUser from '@/components/flow/User/SingleUser'
import MultUser from '@/components/flow/User/MultUser'
import MyRole from '@/components/flow/Role/MyRole'
import {completeSubmitFormTask} from "@/api/flowable/process";
import {completeSubmitFormTask, waitCompleteSubmitFormTask} from "@/api/flowable/process";
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 {taskDelegation} from "@/api/projectProcess/projectProcess";
import {cancelTaskHangup, taskDelegation, taskHangup, taskJump, taskWait} from "@/api/projectProcess/projectProcess";
export default {
  name: "Record",
@@ -185,10 +196,14 @@
    MyDept,
    SingleUser,
    MultUser,
    LogView,
    LogTimeLine
  },
  props: {},
  data() {
    return {
      isWait: false,
      jumpDesc: '', // 跳过说明
      rejectLoading: false, // 驳回按钮加载
      submitLoading: false, // 提交按钮加载
      delegationButLoading: false, // 转办按钮加载
@@ -265,15 +280,123 @@
    this.deployId = this.$route.query && this.$route.query.deployId;
    this.taskId = this.$route.query && this.$route.query.taskId;
    this.projectName = this.$route.query && this.$route.query.projectName;
    this.projectId = this.$route.query && this.$route.query.projectId;
    this.flowName = this.$route.query && this.$route.query.flowName;
    // 初始化表单
    this.procDefId  = this.$route.query && this.$route.query.procDefId;
    this.procInsId  = this.$route.query && this.$route.query.procInsId;
    this.goBackParams  = this.$route.query && this.$route.query.goBackParams;
    this.isWait = this.$route.query && this.$route.query.isWait === 'true' ? true : false;
    // this.getNextFlowNodeByStart(this.deployId);
    this.getFlowFormData(this.taskId);
  },
  methods: {
    // 挂起任务
    hangup() {
      this.$prompt('备注说明', '确定要挂起此任务吗', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        inputType: 'textarea'
        // inputPattern: /[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/,
        // inputErrorMessage: '邮箱格式不正确'
      }).then(({ value }) => {
        let hangupForm = {
          taskId: this.taskId,
          projectId: this.projectId,
          processInsId: this.procInsId,
          reason: value
        }
        taskHangup(hangupForm).then(res => {
          this.$message.success("操作成功")
          this.goBack()
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消挂起操作'
        });
      });
    },
    // 挂起任务
    cancelHangup() {
      this.$confirm('确定要取消挂起吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        let cancelHangupForm = {
          taskId: this.taskId,
          projectId: this.projectId,
          processInsId: this.procInsId
        }
        cancelTaskHangup(cancelHangupForm).then(res => {
          this.$message.success("操作成功")
          this.goBack()
        })
      })
    },
    // 容缺任务
    waitTask() {
      this.$prompt('备注说明', '确定要容缺此任务吗', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        inputType: 'textarea',
        inputValidator: (value) => {
          if (!value || value.trim() === '') {
            return "请填写备注说明"
          }
          return true
        },
        inputErrorMessage: '请填写备注说明'
      }).then(({ value }) => {
        let waitForm = {
          taskId: this.taskId,
          projectId: this.projectId,
          processInsId: this.procInsId,
          desc: value
        }
        taskWait(waitForm).then(res => {
          this.$message.success("操作成功")
          this.goBack()
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消容缺操作'
        });
      });
    },
    // 跳过任务
    jumpTask() {
      this.$prompt('备注说明', '确定要跳过此任务吗', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        inputType: 'textarea',
        inputValidator: (value) => {
          if (!value || value.trim() === '') {
            return "请填写备注说明"
          }
          return true
        },
        inputErrorMessage: '请填写备注说明'
      }).then(({ value }) => {
        let jumpForm = {
          taskId: this.taskId,
          projectId: this.projectId,
          processInsId: this.procInsId,
          desc: value
        }
        taskJump(jumpForm).then(res => {
          this.$message.success("操作成功")
          this.goBack()
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消跳过操作'
        });
      });
    },
    removeDept(dept) {
      let index = this.delegationDeptSelect.indexOf(dept);
      if (index !== -1) {
@@ -317,7 +440,7 @@
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            this.delegationForm.projectId = this.goBackParams.projectId
            this.delegationForm.projectId = this.projectId
            this.delegationForm.processInsId = this.procInsId
            this.delegationButLoading = true
            taskDelegation(this.delegationForm).then(res => {
@@ -479,7 +602,7 @@
    handleClick(tab, event) {
      if (tab.name === '2'){
        this.imgLoading = true
        flowXmlAndNode({procInsId:this.procInsId,deployId:this.deployId}).then(res => {
        flowXmlAndNode({processInsId:this.procInsId,deployId:this.deployId}).then(res => {
          this.imgLoading = false
          this.flowData = res.data;
        })
@@ -537,7 +660,7 @@
      this.$router.push({
        path: '/projectFlow/detail',
        query: {
          projectId: this.goBackParams.projectId,
          projectId: this.projectId,
          processDefId: this.goBackParams.processDefId,
          processName: this.goBackParams.processName
        }
@@ -550,10 +673,10 @@
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.submitLoading = true
        let that = this
        if (eval("that.$refs.form" +0)) {
          eval("that.$refs.form" +0)[0].getFormData().then(formData => {
            this.submitLoading = true
            this.formData = formData
            const param = {
              formJson:  this.formJson,
@@ -561,62 +684,36 @@
            // 复制对象的属性值给新的对象
            Object.assign(param, formData);
            // 完成任务
            completeSubmitFormTask(this.taskId, param).then(res => {
            if (this.isWait) {
              waitCompleteSubmitFormTask(this.taskId, param).then(res => {
                this.$modal.msgSuccess(res.msg);
                this.submitLoading = false
                this.goBack();
              })
            } else {
              completeSubmitFormTask(this.taskId, param).then(res => {
                this.$modal.msgSuccess(res.msg);
                this.submitLoading = false
                this.goBack();
              })
            }
          })
        } else {
          // 没关联表单直接传空
          if (this.isWait) {
              waitCompleteSubmitFormTask(this.taskId, {}).then(res => {
              this.$modal.msgSuccess(res.msg);
              this.submitLoading = false
              this.goBack();
            })
          })
        } else {
          // 没关联表单直接传空
          completeSubmitFormTask(this.taskId, {}).then(res => {
            this.$modal.msgSuccess(res.msg);
            this.submitLoading = false
            this.goBack();
          })
          } else {
            completeSubmitFormTask(this.taskId, {}).then(res => {
              this.$modal.msgSuccess(res.msg);
              this.submitLoading = false
              this.goBack();
            })
          }
        }
        // let that = this
        // eval("that.$refs.form" +0)[0].getFormData().then(formData => {
        //   // 根据当前任务或者流程设计配置的下一步节点 todo 暂时未涉及到考虑网关、表达式和多节点情况
        //   getNextFlowNodeByStart({deploymentId: this.deployId, variables: formData}).then(res => {
        //     const data = res.data;
        //     if (data) {
        //       this.formData = formData;
        //       if (data.dataType === 'dynamic') {
        //         if (data.type === 'assignee') { // 指定人员
        //           this.checkSendUser = true;
        //           this.checkType = "single";
        //         } else if (data.type === 'candidateUsers') {  // 候选人员(多个)
        //           this.checkSendUser = true;
        //           this.checkType = "multiple";
        //         } else if (data.type === 'candidateGroups') { // 指定组(所属角色接收任务)
        //           this.checkSendRole = true;
        //         } else { // 会签
        //           // 流程设计指定的 elementVariable 作为会签人员列表
        //           this.multiInstanceVars = data.vars;
        //           this.checkSendUser = true;
        //           this.checkType = "multiple";
        //         }
        //         this.taskOpen = true;
        //         this.taskTitle = "选择任务接收";
        //       } else {
        //         if (this.procDefId) {
        //           const param = {
        //             formJson:  this.formJson,
        //           }
        //           // 复制对象的属性值给新的对象
        //           Object.assign(param, formData);
        //           // 完成任务
        //           completeSubmitFormTask(this.taskId, param).then(res => {
        //             this.$modal.msgSuccess(res.msg);
        //             this.goBack();
        //           })
        //         }
        //       }
        //     }
        //   })
        // })
      }).catch((err) => {
        console.log(err)
        this.$message({
@@ -724,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 {
@@ -743,7 +842,7 @@
}
.reject-but {
  position: absolute;
  top: 4px;
  top: -4px;
  right: 4px
}
.current {
@@ -755,7 +854,7 @@
}
.op-list {
  position: absolute;
  top: 4px;
  top: -4px;
  right: 4px;
  display: flex;
  justify-content: center;