<template>
  <div class="approval-button">
    <!-- 正常待办审批按钮 -->
    <ul
      class="approval-process__footer"
      v-if="approvalButtonList && approvalButtonList.length"
    >
      <div class="footer-btn__left" v-if="!isHangUp">
        <li
          class="footer-item__btn prognostic-map"
          v-if="isShowMoreBtn"
          @click="handleMore"
        >
          <i class="icon-daohanglan-gengduo btn-icon"></i>
          <span class="footer-text__btn">更多</span>
        </li>
        <li
          class="footer-item__btn flow-map"
          v-if="saveDraftBtn.alias"
          @click="handleSavaDraft"
          :class="{ 'disabled-btn': disabled }"
        >
          <i class="icon-baocun1 btn-icon"></i>
          <span class="footer-text__btn">
            {{ saveDraftBtn.name }}
          </span>
        </li>
      </div>
      <div
        class="btn-right"
        :class="{
          'two-btn': approvalButtonList.length === 2,
          'one-btn': approvalButtonList.length === 1 || isHangUp,
        }"
      >
        <template v-if="!isHangUp">
          <li
            class="footer-item__btn approval__btn plain-btn"
            v-if="secondShowBtn"
          >
            <van-button
              :type="
                isRejectOrOppose(secondShowBtn.alias) ? 'danger' : 'default'
              "
              plain
              :disabled="disabled"
              @click="handleClick(secondShowBtn.alias)"
            >
              {{ secondShowBtn.name }}
            </van-button>
          </li>
          <li
            class="footer-item__btn approval__btn first-btn"
            v-if="firstShowBtn"
          >
            <van-button
              :type="isRejectOrOppose(firstShowBtn.alias) ? 'danger' : 'info'"
              :disabled="disabled"
              @click="handleClick(firstShowBtn.alias)"
            >
              {{ firstShowBtn.name }}
            </van-button>
          </li>
        </template>
        <li class="footer-item__btn approval__btn first-btn" v-else>
          <van-button type="info" @click="handleHangUp">取消挂起</van-button>
        </li>
      </div>
    </ul>
    <div
      class="other-approval-btn"
      :class="{
        'mandatory-receipt-btn': signForAndHangupBtn.length,
        'has-hangup-btn': signForAndHangupBtn.length > 1,
      }"
    >
    <van-button
        v-if="isDelegate"
        class="btn-margin"
        type="info"
        @click="delBpmTaskMyDelegateById"
      >
        收回
      </van-button>
      <van-button
        v-if="
          (isShowRevokeBtn && isRequest && !isEndOrArtificialEnd) ||
          isRevokeCurrentNode
        "
        class="btn-margin"
        type="info"
        :disabled="isHangUp"
        @click="handleClickRevoke"
      >
        撤回
      </van-button>
      <van-button
        v-if="isShowSignatureFeedback"
        type="info"
        class="btn-margin"
        :disabled="isHangUp"
        @click="handleClick('signFeedback')"
      >
        加签反馈
      </van-button>
      <van-button
        v-if="isShowCommunicateFeedback"
        type="info"
        class="btn-margin"
        :disabled="isHangUp"
        @click="handleClick('communicateFeedback')"
      >
        沟通反馈
      </van-button>
      <!-- 传阅回复 -->
      <van-button
        v-if="isShowReply"
        type="info"
        class="btn-margin"
        :disabled="isHangUp"
        @click="handleClick('reply')"
      >
        回复
      </van-button>
      <template v-if="bpmTask.status === 'TRANSFORMEDINQU' && isGetApprovalBtn">
        <van-button
          type="default"
          class="consult-replay"
          :disabled="isHangUp"
          @click="handleClick('consultResponse')"
        >
          征询回复
        </van-button>
        <van-button
          type="info"
          @click="handleClick('inqu')"
          class="consult"
          :disabled="isHangUp"
        >
          征询
        </van-button>
      </template>
      <template
        v-if="
          signForAndHangupBtn.length && !isHangUp && taskStatus === 'canLock'
        "
      >
        <template v-for="(item, index) in signForAndHangupBtn">
          <!-- 挂起 -->
          <van-button
            class="btn-item"
            v-if="
              (item.alias === 'hangUp' && !isHangUp) ||
              (item.alias === 'cancelHangUp' && isHangUp)
            "
            :key="item.alias + index"
            @click="handleHangUp"
          >
            {{ item.name }}
          </van-button>
          <!-- 签收 -->
          <van-button
            class="btn-item"
            v-if="item.alias === 'lockUnlock' && !isDone"
            :key="index"
            @click="handleSignFor"
          >
            {{ taskStatus === 'canLock' ? item.name : '取消签收' }}
          </van-button>
        </template>
      </template>
    </div>
    <!-- 更多 -->
    <van-action-sheet
      v-model="showMoreBtn"
      cancel-text="取消"
      close-on-click-action
      get-container="body"
      class="more-btn__action"
      @cancel="onCancel"
    >
      <ul class="btn-wrap">
        <template v-for="(item, index) in otherButtons">
          <li
            class="btn-item"
            :class="{ 'disabled-btn': disabled }"
            v-if="
              !['lockUnlock', 'hangUp', 'cancelHangUp'].includes(item.alias)
            "
            :key="item.alias"
            @click="handleClick(item.alias)"
          >
            {{ item.name }}
          </li>
          <!-- 签收 -->
          <li
            class="btn-item"
            v-if="item.alias === 'lockUnlock' && !isDone"
            :key="index"
            @click="handleSignFor"
          >
            {{ taskStatus === 'canLock' ? item.name : '取消签收' }}
          </li>
          <!-- 挂起 -->
          <li
            class="btn-item"
            v-if="
              (item.alias === 'hangUp' && !isHangUp) ||
              (item.alias === 'cancelHangUp' && isHangUp)
            "
            :key="item.alias + index"
            @click="handleHangUp"
          >
            {{ item.name }}
          </li>
        </template>
        <li
          class="btn-item"
          key="delete"
          @click="handleDel"
          v-if="isShowDelButton"
        >
          删除
        </li>
      </ul>
    </van-action-sheet>
    <!-- 审批弹窗 -->
    <approval-dialog
      ref="approvalDialog"
      :currentAlias="currentAlias"
      :show.sync="showApprovalAction"
      :curNodeDef="curNodeDef"
      :bpmTask="bpmTask"
      :data="data"
      :formType="formType"
      @confirm="handleConfirm"
    ></approval-dialog>
    <!-- 相关流程跳转提示弹窗 -->
    <relevant-tip-popup
      :showPopup.sync="showRelevantTipPopup"
      @click-flow="handleClickFlow"
      @sava-form="handleSavaForm"
    ></relevant-tip-popup>
  </div>
</template>

<script>
  import {
    TASK_STATUS_MESSAGE,
    HANGUP,
    FORBIDDEN,
    CAN_LOCK_STATUS,
    SAVA_FORM_OPINION,
  } from './const'

  import ApprovalDialog from '@/views/matter/components/ApprovalDialog'
  import RelevantTipPopup from '@/views/matter/components/RelevantTipPopup'

  import { resultJudge } from '@/utils/event.js'
  import { validObject } from '@/utils'

  import {
    getApprovalButtons,
    hangUpOrCancelHangUp,
    isTaskFirstNode,
    saveApprovalComments,
  } from '@/api/flow'
  import {
    canLock,
    savaTaskDraft,
    savaCountersign,
    savaUserTaskCountersign,
    savaTermination,
    savaInquiry,
    savaExchange,
    savaTransfer,
    savaTaskComplete,
    getSponsorRevoke,
    savaRevoke,
    savaInquiryReply,
    savaCountersignFeedback,
    savaCommunicateFeedback,
    deleteInstById,
    savaCirculationReply,
    getTaskLockStatus,
    takeBackTask
  } from '@/api/process'

  import preJavascript from '@/mixins/preJavascript'
  import approvalOpinion from '@/mixins/approvalOpinion'
  import { Base64 } from 'js-base64'
  import { mapActions, mapState } from 'vuex'
  import { setValueByPath } from '@/utils/value.js'
  import { Dialog, Notify } from 'vant'

  export default {
    name: 'ApprovalButton',
    components: {
      ApprovalDialog,
      RelevantTipPopup,
    },
    mixins: [preJavascript, approvalOpinion],
    props: {
      currentLearderId: {
        type: String,
        default: '',
      },
      processInstStatus: [Number, String],
      beforeClick: {
        type: Function,
        default: null,
      },
      data: {
        type: Object,
        default: () => {},
      },
      bpmTask: {
        type: Object,
        default: () => {},
      },
      curNodeDef: {
        type: Object,
        default: () => {},
      },
      currentNodeInfo: {
        type: Object,
        default: () => {},
      },
      formType: {
        type: String,
        default: '',
      },
    },
    data() {
      return {
        approvalButtonList: [], //审批按钮
        taskStatus: '', //任务能否锁定状态
        showMoreBtn: false,
        isHangUp: false,
        disabled: false,
        showApprovalAction: false,
        savaFormAndOpinion: SAVA_FORM_OPINION,
        currentAlias: '',
        approvalDialogData: {},
        requestParams: {}, //启动或处理待办时发送到后台的参数
        isShowRevokeBtn: false,
        showDelBtn: false,
        closeConfirmLoadingCallBack: null,
        showRelevantTipPopup: false,
        currentRelevantId: '',
      }
    },
    computed: {
      ...mapState('login', ['account']),
      isDone() {
        return this.$route.query.type === 'done'
      },
      taskId() {
        return this.$route.query.taskId || this.$route.params.taskId
      },
      instId() {
        return this.$route.query.instId || this.$route.params.instId
      },
      isGetApprovalBtn() {
        return (
          this.$route.query.isGetApprovalBtn || this.$route.meta.isGetApprovalBtn
        )
      },
      leaderId() {
        return this.$route.query.leaderId || this.currentLearderId || 0
      },
      isRejectOrOppose() {
        return (alias) => {
          return ['reject', 'oppose'].includes(alias)
        }
      },
      //当前显示按钮组件列表
      currentShowBtnList() {
        let isLock = false
        this.approvalButtonList.map((btn) => {
          isLock = btn.isLock
        })
        return isLock && this.taskStatus === 'canLock'
          ? []
          : this.approvalButtonList || []
      },
      firstShowBtn() {
        let firstBtn = null
        if (this.currentShowBtnList && this.currentShowBtnList.length) {
          const btn = this.currentShowBtnList.find(
            (item) => item.alias === 'agree'
          )
          firstBtn = btn ? { ...btn } : { ...this.currentShowBtnList[0] }
        }
        return firstBtn
      },
      secondShowBtn() {
        const remainderBtn = this.currentShowBtnList?.filter(
          (item) => item.alias !== this.firstShowBtn.alias
        )
        return (remainderBtn && remainderBtn[0]) || null
      },
      saveDraftBtn() {
        return (
          this.currentShowBtnList?.find((item) => item.alias === 'saveDraft') ||
          {}
        )
      },
      otherButtons() {
        const filterBtnAlias = [
          'saveDraft',
          this.firstShowBtn && this.firstShowBtn.alias,
          this.secondShowBtn && this.secondShowBtn.alias,
        ]
        return (
          this.currentShowBtnList?.filter(
            (item) => !filterBtnAlias.includes(item.alias)
          ) || []
        )
      },
      isShowMoreBtn() {
        if (this.currentShowBtnList) {
          return (
            this.currentShowBtnList.length > 3 ||
            (this.currentShowBtnList.length === 3 && !this.saveDraftBtn.alias)
          )
        } else {
          return false
        }
      },
      signForAndHangupBtn() {
        return this.approvalButtonList.filter(
          (item) =>
            ['lockUnlock', 'hangUp', 'cancelHangUp'].includes(item.alias) &&
            item.isLock
        )
      },
      isRequest() {
        return this.$route.query.type === 'request'
      },
      //是否允许本环节撤回
      isRevokeCurrentNode() {
        const { revoke, previousRevoke, opinionStatus } =
          this.currentNodeInfo || {}
        return (
          this.isDone &&
          revoke &&
          previousRevoke &&
          !['transAgree', 'opposeTrans'].includes(opinionStatus) &&
          !['back', 'backToStart'].includes(this.$route.query.status)
        )
      },
      //是否审批终止,人工结束,已撤回
      isEndOrArtificialEnd() {
        return ['end', 'manualend', 'revoke', 'revokeToStart'].includes(
          this.$route.query.status
        )
      },
      doneTaskId() {
        return this.$route.query.doneTaskId
      },
      from() {
        return this.$route.query.from
      },
      isShowSignatureFeedback() {
        return (
          this.bpmTask.status === 'USERADDSIGN' &&
          !this.isDone &&
          !['circulate', 'received'].includes(this.from)
        )
      },
      isShowCommunicateFeedback() {
        return this.$route.query.receivedStatus === 'COMMU' && !this.isDone
      },
      isShowReply() {
        return (
          this.from === 'received' &&
          !['COMMU', 'FOLLOW', 'feedback'].includes(
            this.$route.query.receivedStatus
          )
        )
      },
      isShowDelButton() {
        return (
          this.showDelBtn &&
          !['TRANSFORMEDINQU', 'USERADDSIGN'].includes(this.bpmTask.status)
        )
      },
      isDelegate(){
        return this.from === 'delegate'&& this.$route.query.status!=='finish'
      }
    },
    watch: {
      processInstStatus(val) {
        //1.流程被挂起(hangUp) 3.流程被禁止(forbidden)
        if (val === HANGUP) {
          this.disabled = true
          this.isHangUp = true
          this.$notify({
            type: 'warning',
            message: '当前流程实例已被挂起,无法审批',
          })
        } else if (val === FORBIDDEN) {
          this.disabled = true
          this.$notify({
            type: 'warning',
            message: '当前流程实例已被禁止,无法审批',
          })
        } else {
          this.isHangUp = false
          this.disabled = false
        }
      },
      'bpmTask.instStatus'(val) {
        if (val === 'revokeToStart') {
          return (this.showDelBtn = true)
        } else if (val === 'back' || val === 'backToStart') {
          // 如果是驳回状态，进一步判断当前任务是否在第一个节点
          isTaskFirstNode(this.taskId).then((response) => {
            if (response.state) {
              return (this.showDelBtn = response.value)
            }
          })
        }
      },
    },
    created() {
      if (['request', 'done'].includes(this.$route.query.type) && !this.taskId) {
        this.getSponsorRevokeByInstId()
      }
      //获取审批按钮
      if (this.isGetApprovalBtn) {
        this.getApprovalButtonByTaskId()
        this.getTaskIsLockStatus()
      }
      this.$root.$on('click-relevant-flow', (row) => {
        this.currentRelevantId = row.id
        if (this.isGetApprovalBtn) {
          this.showRelevantTipPopup = true
        } else {
          this.handleClickFlow()
        }
      })
    },
    methods: {
      ...mapActions('login', ['validAndCompletedCurrent']),
      //获取审批按钮
      getApprovalButtonByTaskId() {
        getApprovalButtons({
          taskId: this.taskId,
          leaderId: this.leaderId,
        }).then((res) => {
          if (res) {
            this.approvalButtonList = res.buttons || []
          }
        })
      },
      //获取任务是否能锁定状态
      getTaskIsLockStatus() {
        canLock({
          taskId: this.taskId,
          leaderId: this.leaderId,
        }).then((res) => {
          this.taskStatus = CAN_LOCK_STATUS[res]
        })
      },
      handleMore() {
        this.showMoreBtn = true
      },
      onCancel() {
        this.showMoreBtn = false
      },
      //挂起，取消挂起
      handleHangUp() {
        const type = this.isHangUp ? 'unForbiddenInstance' : 'forbiddenInstance'
        const query = {
          instId: this.instId,
          type,
          taskId: this.taskId,
        }
        hangUpOrCancelHangUp(query, async (res) => {
          if (res.state) {
            this.isHangUp = !this.isHangUp
            await this.$notify({ type: 'success', message: res.message })
            if (this.isHangUp) {
              await this.$notify({
                type: 'warning',
                message: '当前流程已被挂起,无法审批',
              })
              this.showMoreBtn = false
              this.disabled = true
            } else {
              this.disabled = false
            }
          }
        })
      },
      //签收
      handleSignFor() {
        this.currentAlias = 'lockUnlock'
        let query = {
          taskId: this.taskId,
          leaderId: this.leaderId ? this.leaderId : '',
        }
        canLock(query).then(() => {
          if (this.taskStatus === 'LockedBySomeone') {
            this.$notify({
              type: 'warning',
              message: TASK_STATUS_MESSAGE[this.taskStatus],
            })
          } else {
            getTaskLockStatus(query, (res) => {
              const tipMsg = res == 1 ? '签收成功' : '取消签收成功'
              this.showMoreBtn = false
              this.$notify({ type: 'success', message: tipMsg })
              this.$emit('update-form')
              //获取审批按钮
              if (this.isGetApprovalBtn) {
                this.getApprovalButtonByTaskId()
                this.getTaskIsLockStatus()
              }
            })
          }
        })
      },
      //获取任务是否锁定状态
      getTaskIsLock(type) {
        const query = {
          taskId: this.taskId,
          leaderId: this.leaderId,
        }
        canLock(query).then((res) => {
          if (res || res == 0) {
            this.taskStatus = CAN_LOCK_STATUS[res]
            if (['LockedBySomeone', 'hasHandle'].includes(this.taskStatus)) {
              this.$notify({
                type: 'warning',
                message: TASK_STATUS_MESSAGE[this.taskStatus],
              })
              if (this.taskStatus === 'hasHandle') {
                this.$router.push('/matter/myTask')
              }
            } else {
              if (type === 'saveDraft') {
                this.showApprovalAction = true
              } else if (
                ['agree', 'oppose', 'agreeTrans', 'opposeTrans'].includes(type)
              ) {
                this.$refs.approvalDialog.selectPathJumpDialogBefore()
              }
            }
          }
        })
      },
      handleClickBefore(alias) {
        this.currentAlias = alias
        if (this.beforeClick) {
          resultJudge(this.beforeClick(this.currentAlias)).then((result) => {
            if (result) {
              this.getTaskIsLock(alias)
            }
          })
        } else {
          this.getTaskIsLock(alias)
        }
      },
      handleSavaDraft() {
        this.handleClickBefore('saveDraft')
      },
      handleConfirm(data, cb) {
        this.closeConfirmLoadingCallBack = cb
        this.approvalDialogData = { ...data }
        if (this.currentAlias === 'addSign') {
          //用户任务加签
          if (this.curNodeDef.type === 'USERTASK') {
            //提交前执行前置脚本
            this.submitBefore('addSign')
          } else {
            //会签任务加签
            this.handleJointlySignTask()
          }
        } else if (this.currentAlias === 'inqu') {
          //征询提交
          this.handleInqu()
        } else if (this.currentAlias === 'delegate') {
          //转办提交
          this.handleTransfer()
        } else if (
          ['agree', 'oppose', 'agreeTrans', 'opposeTrans'].includes(
            this.currentAlias
          )
        ) {
          if (
            this.currentAlias === 'agree' &&
            data.agreeParams.isSelectNodeOrUser
          ) {
            this.handleSubmitAgree()
          } else {
            this.handleComplete()
          }
        } else {
          this.submitBefore(
            this.currentAlias === 'saveDraft' ? 'save' : this.currentAlias
          )
        }
      },
      //处理同意，驳回配置自由跳转，选择路径，自由选择，选择候选人提交
      handleSubmitAgree() {
        //审批意见回填
        this.setOpinionWrap()
        const data = {
          ...this.getSubmitCommonData(),
          ...this.approvalDialogData.agreeParams,
        }
        this.$dialog
          .confirm({
            title: '提示',
            message: '确认办理此任务?',
            cancelButtonText: '取消',
            confirmButtonText: '确定',
            type: 'warning',
            closeOnClickModal: false,
            beforeClose: (action, done) => {
              if (action === 'confirm') {
                //删除多余参数
                if (data.hasOwnProperty('proInstId')) {
                  delete data.proInstId
                }
                if (data.hasOwnProperty('defId')) {
                  delete data.defId
                }
                if (data.hasOwnProperty('isSendNodeUsers')) {
                  delete data.isSendNodeUsers
                }
                if (data.hasOwnProperty('startOrgId')) {
                  delete data.startOrgId
                }
                if (data.hasOwnProperty('isSelectNodeOrUser')) {
                  delete data.isSelectNodeOrUser
                }
                if (data.hasOwnProperty('businessKey')) {
                  delete data.businessKey
                }
                if (data.hasOwnProperty('sysCode')) {
                  delete data.sysCode
                }
                savaTaskComplete(data)
                  .then((res) => {
                    done()
                    this.handleApprovalSuccess(res)
                  })
                  .finally(() => {
                    this.closeConfirmLoadingCallBack &&
                      this.closeConfirmLoadingCallBack()
                    done()
                  })
              } else {
                this.closeConfirmLoadingCallBack &&
                      this.closeConfirmLoadingCallBack()
                done()
              }
            },
          })
          .then(() => {})
      },
      onSubmit(alias) {
        switch (alias) {
          case 'save':
            this.handleSaveDraft()
            break
          case 'addSign':
            this.handleAddSign()
            break
          case 'endProcess':
            this.handleTermination()
            break
          case 'startTrans':
            this.handleCirculation()
            break
          case 'reject':
            this.handleComplete()
            break
          case 'revoke':
            this.handleRevokeBtn()
            break
          case 'consultResponse': //征询回复
            this.handleConsultResponse()
            break
          case 'signFeedback': //加签反馈
            this.handleSignFeedback()
            break
          case 'communicateFeedback': //沟通反馈
            this.handleCommunicateFeedback()
            break
          case 'reply': //传阅回复
            this.handleReply()
            break
        }
      },
      //加签
      handleAddSign() {
        const data = {
          userIds: this.approvalDialogData.userIds,
          action: 'back',
          taskId: this.taskId,
          files: JSON.stringify(this.approvalDialogData.fileList),
          opinion: this.approvalDialogData.opinion,
          data: Base64.encode(JSON.stringify(this.data)),
        }
        savaUserTaskCountersign(data)
          .then((res) => {
            if (!res.state)
              return this.$notify({ type: 'danger', message: res.message })
            this.$notify({ type: 'success', message: res.message })
            this.$router.push('/matter/myTask')
          })
          .finally(() => {
            this.showApprovalAction = false
            this.closeConfirmLoadingCallBack && this.closeConfirmLoadingCallBack()
          })
      },
      handleSaveDraft(type) {
          //   defId: this.bpmTask.procDefId,
          // approval: true,
        let params = {
          ...this.getSubmitCommonData(),
      
          formKey: this.formKey,
        }
        if (type === 'relevantFlow') {
          params.actionName = 'saveDraft'
        }
        savaTaskDraft(params)
          .then((res) => {
            if (res.state) {
              if (type === 'relevantFlow') {
                this.handleClickFlow()
              } else {
                this.$emit('update-form')
              }
              // 保存版本号自增1
              Object.keys(this.data).forEach((key) => {
                if (
                  this.data[key].form_data_rev_ ||
                  this.data[key].form_data_rev_ === 0
                ) {
                  this.data[key].form_data_rev_++
                }
              })
              this.$notify({ type: 'success', message: res.message })
            } else {
              this.$notify({ type: 'success', message: res.message })
            }
            if (this.approvalDialogData.saveType === this.savaFormAndOpinion) {
              this.temporaryApprovalComments()
            }
          })
          .finally(() => {
            this.showApprovalAction = false
            this.closeConfirmLoadingCallBack && this.closeConfirmLoadingCallBack()
          })
      },
      //暂存审批意见
      temporaryApprovalComments() {
        const params = {
          procInstId: this.bpmTask.procInstId, //实例Id
          taskId: this.taskId,
          opinion: this.approvalDialogData.opinion,
        }
        saveApprovalComments(params)
      },
      //获取点击审批按钮时需要提交的数据
      getSubmitCommonData() {
        let formType = ''
        if (this.formType) {
          formType = this.formType.toLowerCase()
        }
        const formData = {
          formType: formType,
          businessKey: this.data?.businessKey || '',
          sysCode: this.data?.sysCode || '',
          vars: this.data?.vars || '',
          data:
            formType === 'inner' ? Base64.encode(JSON.stringify(this.data)) : '',
        }
        const data = {
          taskId: this.taskId,
          actionName: this.currentAlias,
          destination: '',
          zfiles: '',
          jumpType: '',
          agentLeaderId: this.leaderId,
          files: JSON.stringify(this.approvalDialogData.fileList),
          ...validObject(formData),
        }
        return data
      },
      //审批按钮事件
      handleClick(alias) {
        if (alias === 'reject') {
          this.$refs.approvalDialog.openApprovalAction()
        } else if (
          ['agree', 'oppose', 'agreeTrans', 'opposeTrans'].includes(alias)
        ) {
          this.handleClickBefore(alias)
        } else {
          this.showApprovalAction = true
        }
        this.showMoreBtn = false
        this.currentAlias = alias
      },
      //会签任务加签
      handleJointlySignTask() {
        const params = {
          taskId: this.taskId,
          files: JSON.stringify(this.approvalDialogData.fileList),
          opinion: this.approvalDialogData.opinion,
          userId: this.approvalDialogData.userIds,
        }
        savaCountersign(params)
          .then((res) => {
            if (!res.state)
              return this.$notify({ type: 'warning', message: res.message })
            this.$notify({ type: 'success', message: res.message })
          })
          .finally(() => {
            this.showApprovalAction = false
            this.closeConfirmLoadingCallBack && this.closeConfirmLoadingCallBack()
          })
      },
      //流程终止
      handleTermination() {
        this.validAndCompletedCurrent().then(() => {
          const params = {
            taskId: this.taskId,
            messageType: 'inner',
            files: JSON.stringify(this.approvalDialogData.fileList),
            endReason: this.approvalDialogData.opinion,
          }
          savaTermination(params)
            .then((res) => {
              this.handleApprovalSuccess(res)
            })
            .finally(() => {
              this.showApprovalAction = false
              this.closeConfirmLoadingCallBack &&
                this.closeConfirmLoadingCallBack()
            })
        })
      },
      //征询
      handleInqu() {
        const { opinion, userIds, fileList, inquiryType } =
          this.approvalDialogData || {}
        const params = {
          taskId: this.taskId,
          opinion: opinion,
          userIds: userIds,
          action: 'back',
          files: fileList && JSON.stringify(fileList),
          data: JSON.stringify(this.data),
          inquType: inquiryType,
        }
        savaInquiry(params)
          .then((res) => {
            this.handleApprovalSuccess(res)
          })
          .finally(() => {
            this.closeConfirmLoadingCallBack && this.closeConfirmLoadingCallBack()
          })
      },
      //流转
      handleCirculation() {
        const {
          opinion,
          userIds,
          fileList,
          voteType,
          voteAmount,
          radioVote,
          decideType,
          signType,
          action,
        } = this.approvalDialogData || {}
        const params = {
          taskId: this.taskId,
          opinion,
          userIds,
          voteType,
          radioVote,
          decideType,
          voteAmount,
          signType,
          action,
          files: JSON.stringify(fileList),
          data: Base64.encode(JSON.stringify(this.data)),
          formKey: this.formKey,
        }
        savaExchange(params)
          .then((res) => {
            this.handleApprovalSuccess(res)
          })
          .finally(() => {
            this.closeConfirmLoadingCallBack && this.closeConfirmLoadingCallBack()
          })
      },
      //转办
      handleTransfer() {
        const { opinion, userIds, fileList } = this.approvalDialogData || {}
        const params = {
          messageType: 'inner',
          taskId: this.taskId,
          formData: JSON.stringify(this.data),
          formKey: this.formKey,
          opinion,
          userId: userIds,
          files: JSON.stringify(fileList),
        }
        savaTransfer(params)
          .then((res) => {
            this.handleApprovalSuccess(res)
          })
          .finally(() => {
            this.closeConfirmLoadingCallBack && this.closeConfirmLoadingCallBack()
          })
      },
      //审批驳回，反对，同意
      handleComplete() {
        //审批意见回填
        this.setOpinionWrap()
        const currentUrgentConfig = this.$storage.get('urgentStateValue')
        const data = {
          formKey: this.formKey,
          data: Base64.encode(JSON.stringify(this.data)),
          opinion: this.approvalDialogData.opinion,
          ...this.getSubmitCommonData(),
        }
        if (this.currentAlias === 'reject') {
          Object.assign(data, this.approvalDialogData.rejectParams)
        }
        // 如果有紧急状态，需要传递这个参数
        if (currentUrgentConfig) {
          data.urgentStateValue = currentUrgentConfig
        }
        const this_ = this
        //删除多余参数
        if (data.hasOwnProperty('proInstId')) {
          delete data.proInstId
        }
        if (data.hasOwnProperty('defId')) {
          delete data.defId
        }
        if (data.hasOwnProperty('isSendNodeUsers')) {
          delete data.isSendNodeUsers
        }
        if (data.hasOwnProperty('startOrgId')) {
          delete data.startOrgId
        }
        if (data.hasOwnProperty('isSelectNodeOrUser')) {
          delete data.isSelectNodeOrUser
        }
        if (data.hasOwnProperty('businessKey')) {
          delete data.businessKey
        }
        if (data.hasOwnProperty('sysCode')) {
          delete data.sysCode
        }
        savaTaskComplete(data)
          .then((res) => {
            this.handleApprovalSuccess(res)
          })
          .catch(() => {
            //处理任务失败吧意见回填的值改回去
            for (let key in this_.oldOpinion) {
              setValueByPath(this_.data, key, this_.oldOpinion[key])
            }
            this_.oldOpinion = {}
          })
          .finally(() => {
            this.closeConfirmLoadingCallBack && this.closeConfirmLoadingCallBack()
          })
      },
      handleApprovalSuccess(res) {
        if (res.state) {
          this.$notify({ type: 'success', message: res.message })
          this.showApprovalAction = false
          this.$router.push('/matter/myTask')
        } else {
          this.$notify({ type: 'danger', message: res.message })
        }
      },
      getSponsorRevokeByInstId() {
        getSponsorRevoke(this.instId, (res) => {
          if (res.state) {
            this.isShowRevokeBtn = res.value
          }
        })
      },
      //撤回
      handleClickRevoke() {
        this.currentAlias = 'revoke'
        this.showApprovalAction = true
      },
      //处理撤回
      handleRevokeBtn() {
        const { opinion } = this.approvalDialogData
        let data = {
          instanceId: this.instId,
          isHandRevoke: this.isDone ? this.isDone : false,
          cause: opinion,
          taskId: this.doneTaskId || '',
        }
        if (this.currentNodeInfo.taskKey) {
          data.revokeNodeId = this.currentNodeInfo.taskKey
        }
        savaRevoke(data).then((res) => {
          if (!res.state){
            this.$refs.approvalDialog.handleConfirmLoading()
            return this.$notify({ type: 'danger', message: res.message })
          }
          if (res.value) {
            this.showApprovalAction = false
            this.closeConfirmLoadingCallBack && this.closeConfirmLoadingCallBack()
            this.$notify({ type: 'success', message: res.message })
            const query = {
              taskId: res.value,
              leaderId: 0,
              instId: this.instId,
              isGetApprovalBtn: true,
            }
            this.$router.push({
              path: `/matter/approvalForm`,
              query,
            })
          } else {
            this.$router.push('/matter/myTask')
          }
        }).catch(e =>{
          this.$refs.approvalDialog.handleConfirmLoading()
        })
      },
      //征询回复
      handleConsultResponse() {
        const { opinion, fileList } = this.approvalDialogData
        const params = {
          procDefId: this.bpmTask.procDefId, //定义id
          procInstId: this.bpmTask.procInstId, //实例id
          taskId: this.taskId,
          status: 'inqu_reply',
          formData: JSON.stringify(this.data),
          zfiles: '',
          opinion,
          files: JSON.stringify(fileList),
        }
        savaInquiryReply(params)
          .then((res) => {
            this.handleApprovalSuccess(res)
          })
          .finally(() => {
            this.closeConfirmLoadingCallBack && this.closeConfirmLoadingCallBack()
          })
      },
      //加签反馈
      handleSignFeedback() {
        const { opinion, fileList } = this.approvalDialogData
        const params = {
          procDefId: this.bpmTask.procDefId, //定义id
          procInstId: this.bpmTask.procInstId, //实例id
          taskId: this.taskId,
          status: 'inqu_reply',
          zfiles: '',
          opinion,
          files: JSON.stringify(fileList),
        }
        savaCountersignFeedback(params)
          .then((res) => {
            this.handleApprovalSuccess(res)
          })
          .finally(() => {
            this.closeConfirmLoadingCallBack && this.closeConfirmLoadingCallBack()
          })
      },
      //沟通反馈
      handleCommunicateFeedback() {
        const { opinion, fileList } = this.approvalDialogData
        const params = {
          instId: this.instId, //实例id
          taskId: this.$route.query.readId,
          zfiles: '',
          opinion,
          files: JSON.stringify(fileList),
        }
        savaCommunicateFeedback(params).then((res) => {
          this.showApprovalAction = false
          this.closeConfirmLoadingCallBack && this.closeConfirmLoadingCallBack()

          this.$notify({
            type: res.state ? 'success' : 'danger',
            message: res.message,
          })
          this.$router.push('/matter/circulateMatter')
        })
      },
      //传阅回复
      handleReply() {
        const { opinion, fileList } = this.approvalDialogData
        const params = {
          instId: this.instId, //实例id
          taskId: this.$route.query.readId,
          zfiles: '',
          opinion,
          files: JSON.stringify(fileList),
        }
        savaCirculationReply(params).then((res) => {
          this.showApprovalAction = false
          this.closeConfirmLoadingCallBack && this.closeConfirmLoadingCallBack()
          this.$notify({
            type: res.state ? 'success' : 'danger',
            message: res.message,
          })
          this.$router.push('/matter/circulateMatter')
        })
      },
      //删除流程（驳回）
      handleDel() {
        this.$dialog
          .confirm({
            title: '提示',
            message: '确认删除此流程实例?',
            beforeClose: (action, done) => {
              if (action === 'confirm') {
                deleteInstById(this.instId)
                  .then((res) => {
                    if (!res.state)
                      return this.$notify({
                        type: 'danger',
                        message: res.message,
                      })
                    this.$notify({ type: 'success', message: res.message })
                    this.$router.push('/matter/myTask')
                  })
                  .finally(() => {
                    done()
                  })
              } else {
                done()
              }
            },
          })
          .then(() => {})
      },
      handleSavaForm() {
        this.handleSaveDraft('relevantFlow')
      },
      handleClickFlow() {
        this.$router.push({
          path: '/matter/approvalForm',
          query: {
            instId: this.currentRelevantId,
            isReadonly: true,
            isRelevantFlow: true,
            type: 'done',
          },
        })
      },
        //根据任务ID收回转办任务
      delBpmTaskMyDelegateById() {
        Dialog.confirm({
          title: '提示',
          message: '确认收回此流程?',
          beforeClose: (action, done) => {
            if (action === 'confirm') {
              takeBackTask(this.currentNodeInfo.taskId).then((res) => {
                done()
                if (!res.state)
                  return Notify({ type: 'danger', message: res.message })
                Notify({ type: 'success', message: res.message })
                this.$router.push('/matter/myTask/3')
              })
            } else {
              done()
            }
          },
        }).then(() => {})
      },
    },
  }
</script>

<style lang="scss" scoped>
  .approval-button {
    position: fixed;
    bottom: 0;
    width: 100%;
    z-index: 100;
    .approval-process__footer {
      display: flex;
      justify-content: space-between;
      height: 64px;
      align-items: center;
      width: 100%;
      background: $base-white-color;
      border-top: 1px solid #eee;

      .footer-item__btn {
        display: flex;
        flex-direction: column;
        .btn-icon {
          font-size: $base-font-size-max;
        }
        .footer-text__btn {
          font-size: $base-font-size-small;
          margin-top: 3px;
        }
        ::v-deep {
          .van-button {
            font-size: $base-font-size-default;
            border-radius: 8px;
          }
          .van-button--info {
            background-color: $--color-primary;
            border-color: $--color-primary;
          }
          .van-button--plain.van-button--danger {
            color: $base-danger-color;
            border-color: $base-danger-color;
          }
        }
      }
      .disabled-btn {
        pointer-events: none;
      }

      .footer-btn__left {
        display: flex;
        flex: 1;
        margin-top: 2px;
        .footer-item__btn {
          flex: 1;
          text-align: center;
        }
      }
      .approval__btn {
        width: 108px;
        margin-right: 16px;
        margin-top: 4px;
      }
      .plain-btn {
        margin-right: 12px;
      }
      .first-btn {
        margin-top: 4px;
      }
      .btn-right {
        display: flex;
      }
      .two-btn,
      .one-btn {
        width: 100%;
        margin-left: 16px;
        .approval__btn {
          flex: 1;
        }
      }
    }

    ::v-deep {
      .van-action-sheet__cancel {
        font-size: 14px;
        color: $base-gray-text-color;
      }
    }
    .other-approval-btn {
      width: 100%;
      background: $base-white-color;
      height: 64px;
      display: flex;
      align-items: center;
      justify-content: center;
      &:empty {
        display: none;
      }
      ::v-deep {
        .van-button {
          flex: 1;
          font-size: $base-font-size-default;
          border-radius: 8px;
        }
        .van-button--info {
          background-color: $--color-primary;
          border-color: $--color-primary;
        }
      }
      .consult-replay {
        margin-left: 16px;
        margin-right: 12px;
      }
      .consult {
        margin-right: 16px;
      }
      .btn-margin {
        margin: 0 16px;
      }
    }
    .mandatory-receipt-btn {
      padding: 0 16px;
      width: calc(100% - 32px);
      .btn-item {
        &:last-child {
          background-color: $--color-primary;
          border-color: $--color-primary;
          color: $base-white-color;
        }
      }
    }
    .has-hangup-btn {
      .btn-item {
        &:first-child {
          margin-right: 12px;
        }
      }
    }
  }
  .more-btn__action {
    .btn-wrap {
      .btn-item {
        height: 48px;
        line-height: 48px;
        text-align: center;
        font-size: $base-font-size-default;
        color: $base-text-color;
      }
    }
  }
</style>
