Newer
Older
xc-business-system / src / views / resource / customer / suggestForm / detail.vue
dutingting on 12 Feb 21 KB 资源管理、质量管理驳回
<!-- 委托方意见登记表详情 -->
<script name="SuggestFormDetail" lang="ts" setup>
import { ElLoading, ElMessage, ElMessageBox, dayjs } from 'element-plus'
import type { ICustomerSuggestInfo } from './customer-suggest'
import type { IDictType } from '@/commonInterface/resource-interface'
import type { addInfo } from '@/views/system/user/user-interface'
import FilterSysUser from '@/views/resource/common/filterSysUser.vue'
import ApprovalDialog from '@/views/resource/common/approvalDialog.vue'
import ApprovalRecordTable from '@/components/ApprovalRecord/ApprovalRecordTable.vue'
import useUserStore from '@/store/modules/user'
import { getDictByCode } from '@/api/system/dict'
import { SCHEDULE } from '@/utils/scheduleDict'
import { acceptForm, deleteFormRevoked, failUpdate, getFormDetail, refuseApproval, rejectAcceptedForm, rejectApproval, revokeApproval, saveForm, submitForm, updateDraft } from '@/api/resource/suggestForm'

// 从路由中传过来的参数
const type = ref<string>('')
const id = ref<string>('')
const status = ref<string>('')
const decisionItem = ref('')

// 关键字段是否可以编辑
const keyFieldsDisable = ref<boolean>(true)

const flowFormId = SCHEDULE.CUSTOMER_OPINION_REGISTER_APPROVAL // 资源管理 - 委托方意见登记表

const userInfo = useUserStore()
const route = useRoute()
const router = useRouter()
const title = ref('')

const radioItems = ref([
  { name: '基本信息', value: 'suggest-basic' },
  { name: '审批详情', value: 'suggest-approval' },
])

const current = ref('')
const currentLabel = ref('')

// 弹窗子组件
const apprDial = ref()
const suggestFormRef = ref()
const refSysUserFilter = ref()

const suggestFormRules = ref({
  reasonAndConclusion: [{ required: true, message: '原因及结论不能为空', trigger: 'blur' }],
}) // 表单验证规则

// 是否显示相关按钮
const saveButtVisable = ref<boolean>(false) // 是否显示 保存 按钮
const submitButtVisable = ref<boolean>(false) // 是否显示 提交 按钮
const flowButtsVisable = ref<boolean>(false) // 是否显示 同意和拒绝 按钮
const cancelButtVisable = ref<boolean>(false) // 是否显示 取消 按钮
const deleteButtVisable = ref<boolean>(false) // 是否显示 删除 按钮
const editButtVisable = ref<boolean>(false) // 是否显示 编辑 按钮
const acceptButtVisable = ref<boolean>(false) // 是否显示 受理 按钮
const rejectButtVisable = ref<boolean>(false) // 是否显示 退回 按钮

const suggestInfo = ref<ICustomerSuggestInfo>({
  id: '',
  formNo: '',
  formName: '委托方意见登记表',
  customerId: '',
  customerName: '',
  customerDeptId: '',
  customerDeptName: '',
  customerDeptPid: '',
  labCode: '',
  labCodeName: '',
  handleStatus: '',
  appealUserId: '',
  appealUserName: '',
  acceptanceUserId: '',
  acceptanceUserName: '',
  acceptanceTime: '',
  processId: '',
  taskId: '',
  createTime: '',
  createUserId: '',
  createUserName: '',
  suggestContent: '',
  reasonAndConclusion: '',
  remark: '',
})

// 字典值
const meterDeptDict = ref<Array<IDictType>>([])

// 逻辑
// 详情页的各个tab切换操作
const radioChangeHandler = (newVal: string | number | boolean) => {
  const radioTarget = radioItems.value.filter(item => item.name === newVal)
  if (radioTarget.length > 0) {
    currentLabel.value = radioTarget[0].name
    current.value = radioTarget[0].value
  }
  else {
    currentLabel.value = radioItems.value[0].name
    current.value = radioItems.value[0].value
  }
}

// 将所有流程操作的按钮隐藏
const hideAllOpterationButtons = () => {
  saveButtVisable.value = false
  submitButtVisable.value = false
  flowButtsVisable.value = false
  cancelButtVisable.value = false
  deleteButtVisable.value = false
  editButtVisable.value = false
  acceptButtVisable.value = false
  rejectButtVisable.value = false
}

// 根据审批状态显示对应的流程操作按钮
const showOperationButtonByStatus = () => {
  switch (status.value) {
    case '1':
      // 草稿箱:保存、提交按钮可见
      saveButtVisable.value = true
      submitButtVisable.value = true
      break

    case '2':
      // 待审批:同意、拒绝按钮可见
      flowButtsVisable.value = true
      break

    case '3':
      // 审批中:取消按钮可见
      cancelButtVisable.value = true
      break

    case '5':
      // 未通过:编辑 按钮可见
      editButtVisable.value = true
      break

    case '6':
      // 已取消:编辑 删除按钮可见
      editButtVisable.value = true
      deleteButtVisable.value = true
      break

    case '11':
      // 待处理:受理 退回 保存 提交按钮可见
      if (suggestInfo.value.handleStatus === '0') {
        // 未处置状态下 可以受理 只可选择受理人不可编辑字段
        acceptButtVisable.value = true
        keyFieldsDisable.value = true
      }
      else {
        // 处置中状态下可以退回管理组 保存及提交
        saveButtVisable.value = true
        submitButtVisable.value = true
        rejectButtVisable.value = true
        keyFieldsDisable.value = false
      }
      break

    default:
      // 默认不显示所有的操作按钮
      hideAllOpterationButtons()
      break
  }
}

// 关闭
const resetForm = () => {
  sessionStorage.removeItem('suggestFormInfo') // 返回列表时 将缓存中的数据删除
  sessionStorage.removeItem('bizMeterStationDeptId')
  router.go(-1)
}

// 保存至草稿箱
const saveSuggestInfo = () => {
  saveForm({
    id: suggestInfo.value.id,
    reasonAndConclusion: suggestInfo.value.reasonAndConclusion,
    effectRemark: suggestInfo.value.effectRemark,
  }).then((res) => {
    if (res.code === 200) {
      // 提示保存成功
      ElMessage.success('保存成功')
      submitButtVisable.value = true // 保存成功后显示提交按钮
    }
    else {
      // 提示失败信息
      ElMessage.error(`保存失败:${res.message}`)
    }
  })
}

// 编辑草稿箱(不走流程审批)
const updateSuggestInfo = () => {
  updateDraft(suggestInfo.value).then((res) => {
    if (res.code === 200) {
      // 提示保存成功
      ElMessage.success('保存成功')
    }
    else {
      // 提示失败信息
      ElMessage.error(`保存失败:${res.message}`)
    }
  })
}

// 编辑按钮点击事件处理函数
const editClickedHandler = () => {
  type.value = 'update'
  title.value = '委托方意见登记表(编辑)'

  // 隐藏编辑按钮 显示提交按钮
  editButtVisable.value = false
  submitButtVisable.value = true
  keyFieldsDisable.value = false
}

// 新建时保存后的处理 获取返回的id
const saveButtonHandler = async () => {
  if (!suggestFormRef) { return }

  await suggestFormRef.value.validate((valid: boolean, fields: any) => {
    if (valid === true) {
      ElMessageBox.confirm(
        '确认保存吗?',
        '提示',
        {
          confirmButtonText: '确认',
          cancelButtonText: '取消',
          type: 'warning',
        },
      ).then(() => {
        if (type.value === 'create') {
          saveSuggestInfo()
        }
        else if (type.value === 'update') {
          updateSuggestInfo()
        }
      })
    }
  })
}

// 受理
const acceptFormHandler = () => {
  refSysUserFilter.value.showOrHideFilterDialog(true, meterDeptDict.value[0].value)
}

// 选择实施人
const effectUserSelectedHanler = (user: addInfo) => {
  refSysUserFilter.value.showOrHideFilterDialog(false)

  ElMessageBox.confirm(`是否由 ${user.name} 受理委托方意见登记表`, '提示', {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    type: 'warning',
  }).then(() => {
  // 调用接口
    acceptForm({ effectUserId: user.id, effectUserName: user.name, id: suggestInfo.value.id }).then((res) => {
      if (res.code === 200) {
        ElMessage.success(`委托方意见登记表 ${suggestInfo.value.formNo} 受理成功`)

        // 更新表单
        suggestInfo.value.acceptanceTime = dayjs().format('YYYY-MM-DD HH:mm:ss')
        suggestInfo.value.acceptanceUserName = userInfo.name
        acceptButtVisable.value = false

        resetForm()
      }
      else {
        ElMessage.error(`委托方意见登记表 ${suggestInfo.value.formNo} 受理失败`)
      }
    })
  })
}

// 退回管理组
const rejectFormHandler = async () => {
  ElMessageBox.confirm('是否退回到管理组', '提示', {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    type: 'warning',
  }).then(() => {
    rejectAcceptedForm({ id: suggestInfo.value.id }).then((res) => {
      if (res.code === 200) {
        ElMessage.success(`委托方意见登记表 ${suggestInfo.value.formNo} 回退到管理组成功`)
      }
      else {
        ElMessage.error(`委托方意见登记表 ${suggestInfo.value.formNo} 回退到管理组失败`)
      }
    })

    resetForm()
  })
}

// 提交按钮
const submitButtonHandler = async () => {
  await suggestFormRef.value.validate((valid: boolean) => {
    if (valid === true) {
      if (suggestInfo.value === null || suggestInfo.value.processId === undefined || suggestInfo.value.processId === '') {
        // 流程id为空 表示还未进入流程中 直接提交
        ElMessageBox.confirm(`是否提交意见登记表 ${suggestInfo.value.formNo}`, '提示', {
          confirmButtonText: '确认',
          cancelButtonText: '取消',
          type: 'warning',
        }).then(() => {
          saveForm({
            id: suggestInfo.value.id,
            reasonAndConclusion: suggestInfo.value.reasonAndConclusion,
            effectRemark: suggestInfo.value.effectRemark,
          }).then((res) => {
            if (res.code === 200) {
              submitForm({
                formId: flowFormId,
                id: suggestInfo.value.id,
              }).then((res) => {
                if (res.code === 200) {
                  ElMessage.success(`意见登记表 ${suggestInfo.value.formNo} 提交成功`)

                  type.value = 'detail'
                  keyFieldsDisable.value = true
                  hideAllOpterationButtons()
                }
                else {
                  ElMessage.error(`意见登记表 ${suggestInfo.value.formNo} 提交失败:${res.message}`)
                }
              })
            }
          })
        })
      }
      else {
        // 之前已经在流程中的表单 保存提交
        failUpdate(suggestInfo.value).then((res) => {
          if (res.code === 200) {
          // 提示保存成功
            ElMessage.success(`意见登记表 ${suggestInfo.value.formNo} 提交成功`)

            type.value = 'detail'
            keyFieldsDisable.value = true
            hideAllOpterationButtons()
          }
          else {
          // 提示失败信息
            ElMessage.error(`意见登记表 ${suggestInfo.value.formNo} 提交失败:${res.message}`)
          }
        })
      }
    }
  })
}

// 流程审批-同意
const approvalAgreeHandler = () => {
  apprDial.value.initDialog('agree', suggestInfo.value.id, suggestInfo.value.taskId || route.query.taskId, '')
}
// 流程审批-驳回
const approvalRejectHandler = () => {
  apprDial.value.initDialog('reject', suggestInfo.value.id, suggestInfo.value.taskId || route.query.taskId, '')
}
// 流程审批-拒绝
const approvalRefuseHandler = () => {
  apprDial.value.initDialog('refuse', suggestInfo.value.id, suggestInfo.value.taskId || route.query.taskId, '')
}

// 取消流程
const revokeClickedHandler = () => {
  ElMessageBox.confirm(
    '确认取消该审批吗?',
    '提示',
    {
      confirmButtonText: '确认',
      cancelButtonText: '取消',
      type: 'warning',
    },
  )
    .then(() => {
      const loading = ElLoading.service({
        lock: true,
        text: '加载中...',
        background: 'rgba(255, 255, 255, 0.6)',
      })
      const params = {
        processInstanceId: suggestInfo.value.processId!,
        comments: '',
        id: id.value,
      }
      revokeApproval(params).then((res) => {
        ElMessage({
          type: 'success',
          message: '已取消',
        })
        cancelButtVisable.value = false
        loading.close()
      })
    })
}

// 删除(只有已取消的可以在详情中删除)
const deleteClickedHandler = () => {
  ElMessageBox.confirm(
    `确认删除意见登记表 ${suggestInfo.value.formNo} 吗?`,
    '提示',
    {
      confirmButtonText: '确认',
      cancelButtonText: '取消',
      type: 'warning',
    },
  ).then(() => {
    deleteFormRevoked({ id: suggestInfo.value.id, taskId: suggestInfo.value.taskId || route.query.taskId }).then((res) => {
      if (res.code === 200) {
        ElMessage.success(`意见登记表 ${suggestInfo.value.formNo} 删除成功`)
        resetForm()
      }
      else {
        ElMessage.error(`意见登记表 ${suggestInfo.value.formNo} 删除失败:${res.message}`)
      }
    })
  })
}

// 流程操作之后刷新
const approvalSuccessHandler = (type: string) => {
  if (type === 'agree' || type === 'refuse') {
    flowButtsVisable.value = false
  }
  else if (type === 'revoke') {
    cancelButtVisable.value = false
  }
}

// 驳回
const reject = (comments: string, taskId: string, id: string) => {
  const param = {
    id,
    taskId, // 任务id
    comments, // 拒绝原因
  }
  rejectApproval(param).then((res) => {
    if (res.code === 200) {
      ElMessage.success('已驳回')
    }
    else {
      ElMessage.error(`驳回失败:${res.message}`)
    }
    // 关闭弹窗
    apprDial.value.handleClose()

    flowButtsVisable.value = false
  })
}
// 拒绝
const formRefuseHandler = (param: any) => {
  refuseApproval(param).then((res) => {
    if (res.code === 200) {
      ElMessage.success('拒绝审批完成')
    }
    else {
      ElMessage.error(`拒绝审批失败:${res.message}`)
    }
    // 关闭弹窗
    apprDial.value.handleClose()

    flowButtsVisable.value = false
  })
}

const getMeterDeptId = () => {
  if (sessionStorage.getItem('bizMeterStationDeptId') !== null && sessionStorage.getItem('bizMeterStationDeptId') !== '') {
    meterDeptDict.value = JSON.parse(sessionStorage.getItem('bizMeterStationDeptId')!)
  }
  else {
    getDictByCode('bizMeterStationDeptId').then((res) => {
      if (res.code === 200) {
        meterDeptDict.value = res.data
        sessionStorage.setItem('bizMeterStationDeptId', JSON.stringify(res.data))
      }
    })
  }
}

const initDict = () => {
  getMeterDeptId()
}

// 获取详情
const fetchFormDetail = () => {
  const loading = ElLoading.service({})
  getFormDetail({ id: id.value }).then((res) => {
    suggestInfo.value = res.data
    loading.close()
  })
}

const initDialog = (params: any) => {
  // 从路由中获取参数
  type.value = params.type
  id.value = params.id !== undefined ? params.id : ''
  status.value = params.status

  // 默认显示第一个tab内容
  current.value = radioItems.value[0].value
  currentLabel.value = radioItems.value[0].name

  switch (params.type) {
    case 'create' :
      title.value = '委托方意见登记表(新增)'
      saveButtVisable.value = true
      submitButtVisable.value = false // 首先隐藏提交按钮
      rejectButtVisable.value = true

      keyFieldsDisable.value = false
      break
    case 'update':
      title.value = '委托方意见登记表(编辑)'
      id.value = params.id
      fetchFormDetail()

      // 判断显示哪些流程操作按钮
      showOperationButtonByStatus()

      break
    case 'detail':
      title.value = '委托方意见登记表'
      id.value = params.id
      fetchFormDetail()

      // 查看详情时所有的操作按钮都隐藏
      showOperationButtonByStatus()
      keyFieldsDisable.value = true

      break
    default:
      title.value = ''
      keyFieldsDisable.value = true
      break
  }
}

watch(() => status.value, (val) => {
  if (val === '11') { // 待处理把审批详情删除
    if (radioItems.value[radioItems.value.length - 1].value === 'suggest-approval') {
      radioItems.value.pop()
    }
    console.log(radioItems.value)
  }
  else { // 其他把审批详情加上
    if (radioItems.value[radioItems.value.length - 1].value !== 'suggest-approval') {
      radioItems.value.push({ name: '审批详情', value: 'suggest-approval' })
    }
  }
})

onMounted(() => {
  initDict()
  initDialog(route.query)
})
</script>

<template>
  <app-container>
    <el-form ref="suggestFormRef" :model="suggestInfo" :rules="suggestFormRules" label-position="right" label-width="110px" border stripe>
      <detail-page :title="`${title}`">
        <template #btns>
          <el-button v-if="editButtVisable" type="primary" @click="editClickedHandler()">
            编辑
          </el-button>

          <template v-if="flowButtsVisable">
            <el-button type="primary" @click="approvalAgreeHandler">
              同意
            </el-button>
            <el-button v-if="(`${decisionItem}` === '1' || `${decisionItem}` === '2')" type="warning" @click="approvalRejectHandler">
              驳回
            </el-button>
            <el-button v-if="(`${decisionItem}` === '1' || `${decisionItem}` === '3')" type="danger" @click="approvalRefuseHandler">
              拒绝
            </el-button>
          </template>

          <el-button v-if="acceptButtVisable" type="primary" @click="acceptFormHandler">
            受理
          </el-button>

          <el-button v-if="submitButtVisable" type="primary" @click="submitButtonHandler">
            提交
          </el-button>
          <el-button v-if="saveButtVisable" type="primary" @click="saveButtonHandler">
            保存
          </el-button>
          <el-button v-if="rejectButtVisable" type="danger" @click="rejectFormHandler">
            退回
          </el-button>

          <el-button v-if="deleteButtVisable" type="danger" @click="deleteClickedHandler">
            删除
          </el-button>
          <el-button v-if="cancelButtVisable" type="info" @click="revokeClickedHandler">
            取消
          </el-button>

          <el-button type="info" @click="resetForm()">
            关闭
          </el-button>
        </template>

        <el-radio-group v-model="currentLabel" @change="radioChangeHandler">
          <el-radio-button v-for="item in radioItems" :key="item.value" :label="item.name" :disabled="id === ''" />
        </el-radio-group>
      </detail-page>
      <detail-block v-if="current === 'suggest-basic'" title=" ">
        <el-row :gutter="24">
          <!-- 第一行 第一列 -->
          <el-col :span="6">
            <el-form-item label="文件编号">
              <el-input v-model="suggestInfo.formNo" :disabled="true" />
            </el-form-item>

            <el-form-item label="创建人">
              <el-input v-model="suggestInfo.createUserName" :disabled="true" />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="意见反馈单位">
              <el-input v-model="suggestInfo.customerName" :disabled="true" />
            </el-form-item>

            <el-form-item label="创建时间">
              <el-input v-model="suggestInfo.createTime" :disabled="true" />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="意见反馈部门">
              <el-input v-model="suggestInfo.customerDeptName" :disabled="true" />
            </el-form-item>

            <el-form-item label="受理人">
              <el-input v-model="suggestInfo.acceptanceUserName" :disabled="true" />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="意见对象">
              <el-input v-model="suggestInfo.labCodeName" :disabled="true" />
            </el-form-item>

            <el-form-item label="受理时间">
              <el-input v-model="suggestInfo.acceptanceTime" :disabled="true" />
            </el-form-item>
          </el-col>
        </el-row>
      </detail-block>
      <template v-if="current === 'suggest-basic'">
        <detail-block title="">
          <el-row :gutter="24">
            <el-col :span="24">
              <el-form-item label="意见内容">
                <el-input v-model="suggestInfo.suggestContent" type="textarea" :rows="5" :disabled="true" />
              </el-form-item>
            </el-col>
          </el-row>

          <el-row :gutter="24">
            <el-col :span="24">
              <el-form-item label="原因及结论" prop="reasonAndConclusion">
                <el-input v-model="suggestInfo.reasonAndConclusion" type="textarea" :rows="5" :clearable="true" :disabled="keyFieldsDisable" />
              </el-form-item>
            </el-col>
          </el-row>

          <el-row :gutter="24">
            <el-col :span="24">
              <el-form-item label="备注">
                <el-input v-model="suggestInfo.effectRemark" type="textarea" rows="3" :clearable="true" :disabled="keyFieldsDisable" />
              </el-form-item>
            </el-col>
          </el-row>
        </detail-block>
      </template>
    </el-form>

    <approval-dialog
      ref="apprDial"
      @on-success="approvalSuccessHandler"
      @on-refuse="formRefuseHandler"
      @reject="reject"
    />

    <filter-sys-user ref="refSysUserFilter" :need-pid="true" @record-selected="effectUserSelectedHanler" />

    <!-- 草稿箱/待处理状态下不显示审批详情 -->
    <template v-if="current === 'suggest-approval' && status !== '1' && status !== '11'">
      <approval-record-table :process-id="suggestInfo.processId" />
    </template>
  </app-container>
</template>