179 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						|
  <section class="AiProcess">
 | 
						|
    <ai-flow ref="AiFlow" v-model="detail.nowNodeId" :config="detail.workflowConfig" readonly :process.sync="process" height="200px"/>
 | 
						|
    <ai-wrapper border :title="currentNodeName" v-if="!!detail.id &&!isFinished">
 | 
						|
      <template v-if="currentNode.type=='task'">
 | 
						|
        <ai-info-item label="当前审批" :value="currentNode.properties.userName"/>
 | 
						|
        <ai-info-item label="操作时间" :value="currentNode.properties.updateTime"/>
 | 
						|
        <ai-info-item label="审批意见" isLine>
 | 
						|
          <el-input v-if="canAudit" type="textarea" rows="3" v-model="currentNode.properties.remark"/>
 | 
						|
          <span v-else v-text="currentNode.properties.remark"/>
 | 
						|
        </ai-info-item>
 | 
						|
      </template>
 | 
						|
      <template v-else-if="currentNode.type=='start'">
 | 
						|
        <ai-info-item label="开始时间" :value="currentNode.properties.updateTime" isLine/>
 | 
						|
      </template>
 | 
						|
      <template v-else-if="currentNode.type=='end'">
 | 
						|
        <ai-info-item label="结束时间" :value="currentNode.properties.updateTime" isLine/>
 | 
						|
      </template>
 | 
						|
    </ai-wrapper>
 | 
						|
    <el-row class="processOptions mar-t16" type="flex" justify="center" v-if="canAudit">
 | 
						|
      <el-button @click="handleReject" type="danger">拒绝</el-button>
 | 
						|
      <el-button @click="handleReturn" v-if="!incomingIsStart">驳回</el-button>
 | 
						|
      <el-button type="primary" @click="handlePass">同意</el-button>
 | 
						|
    </el-row>
 | 
						|
  </section>
 | 
						|
</template>
 | 
						|
 | 
						|
<script>
 | 
						|
import AiFlow from "./AiFlow";
 | 
						|
import request from "../../lib/js/request";
 | 
						|
import AiWrapper from "../basic/AiWrapper";
 | 
						|
import AiInfoItem from "../basic/AiInfoItem";
 | 
						|
import {mapState, mapActions} from "vuex"
 | 
						|
 | 
						|
export default {
 | 
						|
  name: "AiProcess",
 | 
						|
  props: {
 | 
						|
    bid: String
 | 
						|
  },
 | 
						|
  components: {AiInfoItem, AiWrapper, AiFlow},
 | 
						|
  data() {
 | 
						|
    return {
 | 
						|
      instance: request,
 | 
						|
      detail: {},
 | 
						|
      currentNode: {properties: {}},
 | 
						|
      process: null
 | 
						|
    }
 | 
						|
  },
 | 
						|
  computed: {
 | 
						|
    ...mapState(['user']),
 | 
						|
    currentNodeName: v => v.currentNode?.text?.value || "当前节点",
 | 
						|
    canAudit: v => v.user.info.id == v.currentNode?.properties.userId && v.currentNode?.id == v.detail.nowNodeId && !v.isFinished,
 | 
						|
    incomingIsStart: v => v.process?.getNodeIncomingNode(v.detail.nowNodeId)?.[0]?.type == "start",
 | 
						|
    isFinished: v => v.detail.nowNodeId == "finished"
 | 
						|
  },
 | 
						|
  methods: {
 | 
						|
    ...mapActions(['endFlow']),
 | 
						|
    getProcess() {
 | 
						|
      const {bid: id} = this.$props
 | 
						|
      id ? this.instance.post("/app/appworkflowlog/queryDetailById", null, {
 | 
						|
        params: {id}
 | 
						|
      }).then(res => {
 | 
						|
        if (res?.data) {
 | 
						|
          const {workflowConfig = null, nowNodeId} = res.data
 | 
						|
          this.detail = {...res.data, workflowConfig: JSON.parse(workflowConfig)}
 | 
						|
          this.currentNode = this.detail.workflowConfig.nodes.find(e => e.id == nowNodeId) || this.currentNode
 | 
						|
        }
 | 
						|
      }) : console.error("无法获取bid")
 | 
						|
    },
 | 
						|
    initEvents() {
 | 
						|
      this.process.on("node:click", res => {
 | 
						|
        if (res?.data) {
 | 
						|
          this.currentNode = res.data
 | 
						|
        }
 | 
						|
      })
 | 
						|
      this.process.on("blank:click", () => {
 | 
						|
        this.currentNode = this.process.getNodeModelById(this.detail.nowNodeId)
 | 
						|
      })
 | 
						|
    },
 | 
						|
    handleReject() {
 | 
						|
      this.$confirm("是否要拒绝该申请?").then(() => {
 | 
						|
        this.currentNode.properties = {
 | 
						|
          remark: "拒绝申请", ...this.currentNode.properties,
 | 
						|
          status: "reject",
 | 
						|
          updateTime: this.$moment().format("YYYY-MM-DD HH:mm:ss")
 | 
						|
        }
 | 
						|
        this.process.setProperties(this.detail.nowNodeId, {
 | 
						|
          ...this.currentNode.properties,
 | 
						|
        })
 | 
						|
        const form = {...this.detail, workflowConfig: this.process.getGraphData()}
 | 
						|
        this.saveProcess(form)
 | 
						|
      }).catch(() => 0)
 | 
						|
    },
 | 
						|
    handleReturn() {
 | 
						|
      this.$confirm("是否要驳回该申请返回到前次审批?").then(() => {
 | 
						|
        this.currentNode.properties = {
 | 
						|
          remark: "驳回申请", ...this.currentNode.properties,
 | 
						|
          status: "reject",
 | 
						|
          updateTime: this.$moment().format("YYYY-MM-DD HH:mm:ss")
 | 
						|
        }
 | 
						|
        let {nowNodeId} = this.detail
 | 
						|
        this.process.setProperties(nowNodeId, {
 | 
						|
          ...this.currentNode.properties,
 | 
						|
        })
 | 
						|
        const next = this.process.getNodeIncomingNode(nowNodeId)
 | 
						|
        const form = {...this.detail, workflowConfig: this.process.getGraphData()}
 | 
						|
        nowNodeId = []
 | 
						|
        next?.map(e => {
 | 
						|
          nowNodeId.push(e.id)
 | 
						|
          this.process.setProperties(e.id, {status: 'current'})
 | 
						|
        })
 | 
						|
        this.saveProcess({...form, nowNodeId: nowNodeId.toString()})
 | 
						|
      }).catch(() => 0)
 | 
						|
    },
 | 
						|
    handlePass() {
 | 
						|
      this.$confirm("是否要同意该申请?").then(() => {
 | 
						|
        this.currentNode.properties = {
 | 
						|
          remark: "同意申请", ...this.currentNode.properties,
 | 
						|
          status: "pass",
 | 
						|
          updateTime: this.$moment().format("YYYY-MM-DD HH:mm:ss")
 | 
						|
        }
 | 
						|
        let {nowNodeId} = this.detail
 | 
						|
        this.process.setProperties(nowNodeId, {
 | 
						|
          ...this.currentNode.properties,
 | 
						|
        })
 | 
						|
        const next = this.process.getNodeOutgoingNode(nowNodeId)
 | 
						|
        const form = {...this.detail, workflowConfig: this.process.getGraphData()}
 | 
						|
        if (next?.[0].type == "end") this.endFlow(form).then(res => {
 | 
						|
          if (res?.code == 0) {
 | 
						|
            this.$message.success("提交成功!")
 | 
						|
            this.getProcess()
 | 
						|
          }
 | 
						|
        })
 | 
						|
        else {
 | 
						|
          nowNodeId = []
 | 
						|
          next?.map(e => {
 | 
						|
            nowNodeId.push(e.id)
 | 
						|
            this.process.setProperties(e.id, {status: 'current'})
 | 
						|
          })
 | 
						|
          this.saveProcess({...form, nowNodeId: nowNodeId.toString()})
 | 
						|
        }
 | 
						|
      }).catch(() => 0)
 | 
						|
    },
 | 
						|
    saveProcess(form) {
 | 
						|
      const {workflowConfig} = form
 | 
						|
      this.instance.post("/app/appworkflowlog/addOrUpdate", {...form, workflowConfig: JSON.stringify(workflowConfig)}).then(res => {
 | 
						|
        if (res?.code == 0) {
 | 
						|
          this.$message.success("提交成功!")
 | 
						|
          this.$emit("submit")
 | 
						|
        }
 | 
						|
      })
 | 
						|
    }
 | 
						|
  },
 | 
						|
  watch: {
 | 
						|
    process: {
 | 
						|
      immediate: true,
 | 
						|
      handler(v) {
 | 
						|
        if (!!v) {
 | 
						|
          this.initEvents()
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  },
 | 
						|
  created() {
 | 
						|
    this.getProcess()
 | 
						|
  }
 | 
						|
}
 | 
						|
</script>
 | 
						|
 | 
						|
<style lang="scss" scoped>
 | 
						|
.AiProcess {
 | 
						|
  .processOptions {
 | 
						|
    .el-button {
 | 
						|
      min-width: 72px;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
</style>
 |