Newer
Older
xc-business-system / src / views / resource / environment / ups / edit.vue
dutingting on 12 Feb 24 KB 资源管理、质量管理驳回
<!-- UPS内阻测试记录详情 -->
<script name="EnvironmentUpsResistanceDetail" lang="ts" setup>
import { ElLoading, ElMessage, ElMessageBox, dayjs } from 'element-plus'
import { MessageBox } from '@element-plus/icons-vue'
import type { IUpsResistanceRecord } from './ups-interface'
import ApprovalDialog from '@/views/resource/common/approvalDialog.vue'
// import FilterSingleEquipment from '@/views/resource/common/filterSingleEquipment.vue'
import type { IForm as IEquipmentForm } from '@/views/equipement/info/book/book-interface'
import { SCHEDULE } from '@/utils/scheduleDict'
import type { TableColumn } from '@/components/NormalTable/table_interface'
import { detailUpsResistance, draftDeleteUpsResistance, failUpdateUpsResistance, refuseApprovalUpsResistance, rejectApprovalUPS, revokeApprovalUpsResistance, saveUpsResistance, submitUpsResistance, updateUpsResistance } from '@/api/resource/environmentTest'
import ApprovalRecordTable from '@/components/ApprovalRecord/ApprovalRecordTable.vue'
import type { IDictType } from '@/commonInterface/resource-interface'
import useUserStore from '@/store/modules/user'
import upsLocation from '/public/config/ups.json'
import SelectEquipmentDialog from '@/views/business/fieldTest/approve/dialog/selectEquipmentDialog.vue'
import { getDictByCode } from '@/api/system/dict'
import type { dictType } from '@/global'
const user = useUserStore()
// 从路由中传过来的参数
const type = ref<string>('')
const id = ref<string>('')
const status = ref<string>('')

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

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

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

// 子组件
const approvalDialog = ref()
const testRecordRef = ref()
const refEqipmentFilter = ref()

const recordForm = ref<IUpsResistanceRecord>({
  id: '',
  recordNo: '',
  recordName: 'UPS蓄电池内阻测试记录',
  createUserId: '',
  batteryBrand: '',
  batteryCapacity: '',
  testDate: '',
  testLocation: '',
  testUseEquipmentId: '',
  testUseEquipment: '',
  conclusion: '',
  upsRecordDetailList: [],
  createTime: '',
  approvalStatus: '',
  approvalStatusName: '',
  processId: '',
  taskId: '',
})

const upsColumns = ref<TableColumn[]>([
  { text: '电池序号', value: 'batteryNo', align: 'center', width: '90' },
  { text: '浮充时单体电压(V)', value: 'voltage', align: 'center' },
  { text: '浮充时内阻(mΩ)', value: 'resistance', align: 'center' },
  { text: '外观及连接情况', value: 'appearance', align: 'center', width: '220' },
  { text: '备注', value: 'remark', align: 'center' },
])

const checkRules = ref({
  testDate: [{ required: true, message: '测试时间不能为空', trigger: 'blur' }],
  testLocation: [{ required: true, message: '测试地点不能为空', trigger: ['blur', 'change'] }],
  testUseEquipmentId: [{ required: true, message: '测试仪表不能为空', trigger: ['blur', 'change'] }],
  batteryBrand: [{ required: true, message: '蓄电池品牌型号不能为空', trigger: 'blur' }],
  batteryCapacity: [{ required: true, message: '蓄电池容量不能为空', trigger: 'blur' }],
  conclusion: [{ required: true, message: '测试结论不能为空', trigger: ['blur', 'change'] }],
}) // 表单验证规则

// 是否显示相关按钮
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 conclusionDict = 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
}

// 根据审批状态显示对应的流程操作按钮
const showOperationButtonByStatus = () => {
  switch (status.value) {
    case '0':
      // 全部:保存按钮可见
      if (type.value === 'update') {
        saveButtVisable.value = true
      }
      else {
        saveButtVisable.value = false
      }
      break

    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

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

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

// 简单校验电池测试结果值
const validateUpsBattery = () => {
  let valid = true
  recordForm.value.upsRecordDetailList.forEach((batt, index) => {
    if (batt.voltage !== '' && isNaN(parseFloat(batt.voltage)) === true) {
      ElMessage.warning(`电池${index + 1}的浮充单体电压值需要为数字`)
      valid = false
    }

    if (batt.resistance !== '' && isNaN(parseFloat(batt.resistance)) === true) {
      ElMessage.warning(`电池${index + 1}的电池内阻需要为数字`)
      valid = false
    }
  })

  return valid
}

// 保存至草稿箱
const saveDraft = () => {
  recordForm.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') // 创建时间改为提交时间
  const loading = ElLoading.service({
    lock: true,
    text: '加载中...',
    background: 'rgba(255, 255, 255, 0.6)',
  })
  saveUpsResistance(recordForm.value).then((res) => {
    if (res.code === 200) {
      // 提示保存成功
      ElMessage.success('保存成功')
      // 设置返回的id和编号
      recordForm.value.recordNo = res.data.recordNo
      recordForm.value.id = res.data.id
      id.value = res.data.id

      type.value = 'update'
      status.value = '1' // 保存成功后进入草稿箱 为了不显示审批详情
    }
    else {
      // 提示失败信息
      ElMessage.error(`保存失败:${res.message}`)
    }
    loading.close()
  })
}
// 编辑草稿箱(不走流程审批)
const updateDraft = () => {
  const loading = ElLoading.service({
    lock: true,
    text: '加载中...',
    background: 'rgba(255, 255, 255, 0.6)',
  })
  updateUpsResistance(recordForm.value).then((res) => {
    if (res.code === 200) {
      // 提示保存成功
      ElMessage.success('保存成功')
    }
    else {
      // 提示失败信息
      ElMessage.error(`保存失败:${res.message}`)
    }
    loading.close()
  })
}

// 编辑按钮点击事件处理函数
const editClickedHandler = () => {
  type.value = 'update'
  title.value = 'UPS蓄电池内阻测试记录(编辑)'

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

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

  if (validateUpsBattery() === false) {
    return
  }

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

// 提交按钮
const submitButtonHandler = async () => {
  if (recordForm.value === null || recordForm.value.processId === undefined || recordForm.value.processId === '') {
    // 流程id为空 表示还未进入流程中 直接提交
    ElMessageBox.confirm(`是否提交UPS蓄电池内阻测试记录 ${recordForm.value.recordNo}`, '提示', {
      confirmButtonText: '确认',
      cancelButtonText: '取消',
      type: 'warning',
    }).then(() => {
      const loading = ElLoading.service({
        lock: true,
        text: '加载中...',
        background: 'rgba(255, 255, 255, 0.6)',
      })
      submitUpsResistance({
        formId: SCHEDULE.UPS_RESISTANCE_RECORD_APPROVAL,
        id: recordForm.value.id,
      }).then((res) => {
        if (res.code === 200) {
          ElMessage.success(`UPS蓄电池内阻测试记录 ${recordForm.value.recordNo} 提交成功`)

          type.value = 'detail'
          hideAllOpterationButtons()
        }
        else {
          ElMessage.error(`UPS蓄电池内阻测试记录 ${recordForm.value.recordNo} 提交失败:${res.message}`)
        }
        loading.close()
      })
    })
  }
  else {
    // 之前已经在流程中的表单 保存提交
    await testRecordRef.value.validate((valid: boolean) => {
      if (valid === true) {
        const loading = ElLoading.service({
          lock: true,
          text: '加载中...',
          background: 'rgba(255, 255, 255, 0.6)',
        })
        failUpdateUpsResistance(recordForm.value).then((res) => {
          if (res.code === 200) {
          // 提示保存成功
            ElMessage.success('保存成功')

            type.value = 'detail'
            keyFieldsDisable.value = true

            hideAllOpterationButtons()
          }
          else {
          // 提示失败信息
            ElMessage.error(`保存失败:${res.message}`)
          }
          loading.close()
        })
      }
    })
  }
}

// 根据id查询详情
const detailById = async (id: string) => {
  const loading = ElLoading.service({
    lock: true,
    text: '加载中...',
    background: 'rgba(255, 255, 255, 0.6)',
  })
  await detailUpsResistance({ id }).then((res) => {
    if (res.code === 200) {
      recordForm.value = res.data
      recordForm.value.upsRecordDetailList = res.data.upsRecordDetailList.map((item: any) => {
        return {
          ...item,
          appearance: `${item.appearance}`,
        }
      })
      if (recordForm.value.taskId === '') {
        recordForm.value.taskId = sessionStorage.getItem('upsResistanceRecordTaskId')!
      }
    }
    loading.close()
  })
}

// --------------------------------选择设备-------------------------------------------
const selectEquipmentDialogRef = ref() // 选择设备组件ref
// 添加
const selectEquipment = () => {
  selectEquipmentDialogRef.value.initDialog()
}

// 确定选择设备
const confirmSelectEquipment = (list: any) => {
  if (list && list.length) {
    recordForm.value.testUseEquipment = list[0].equipmentName + list[0].model + list[0].manufactureNo //	测试所用设备
    recordForm.value.testUseEquipmentId = list[0].id //		测试所用设备id
  }
}

// --------------------------------审批-------------------------------------------

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

// 取消流程
const revokeClickedHandler = () => {
  const params = {
    processInstanceId: route.query.processId!,
    comments: '',
    id: id.value,
  }
  ElMessageBox.confirm(
    '确认取消该审批吗?',
    '提示',
    {
      confirmButtonText: '确认',
      cancelButtonText: '取消',
      type: 'warning',
    },
  )
    .then(() => {
      revokeApprovalUpsResistance(params).then((res) => {
        ElMessage({
          type: 'success',
          message: '已取消',
        })
        cancelButtVisable.value = false
      })
    })
}

// 删除审批单
const deleteClickedHandler = () => {
  ElMessageBox.confirm(`是否删除审批单 ${recordForm.value.recordNo}`, '提示', {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    type: 'warning',
  }).then(() => {
    draftDeleteUpsResistance({ id: id.value }).then((res) => {
      if (res.code === 200) {
        ElMessage.success(`审批单 ${recordForm.value.recordNo} 删除成功`)
        resetForm()
      }
      else {
        ElMessage.error(`审批单 ${recordForm.value.recordNo} 删除失败: ${res.message}`)
      }
    })
  })
}

// 流程审批(同意、拒绝、取消)结束后的操作 将按钮都隐藏(本身就不能编辑了)
const approvalSuccessHandler = (type: string) => {
  if (type === 'agree' || type === 'refuse') {
    flowButtsVisable.value = false
  }
  else if (type === 'revoke') {
    cancelButtVisable.value = false
  }
}

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

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

    flowButtsVisable.value = false
  })
}
// --------------------------------------字典-----------------------------------------------
const useDeptList = ref<dictType[]>([]) // 部门
const labDeptList = ref<dictType[]>([]) // 实验室
// 查询字典
const getDictFun = () => {
  // 实验室
  getDictByCode('bizLabCode').then((response) => {
    labDeptList.value = response.data
  })

  // 部门
  getDictByCode('bizGroupCode').then((response) => {
    useDeptList.value = response.data
  })
  // 结论
  getDictByCode('bizUpsConclusion').then((res) => {
    if (res.code === 200) {
      conclusionDict.value = res.data
    }
  })
}

const initDict = async () => {
  getDictFun()
}

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

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

  switch (params.type) {
    case 'create' :
      title.value = 'UPS蓄电池内阻测试记录(新增)'
      saveButtVisable.value = true
      submitButtVisable.value = true

      recordForm.value.createUserId = userInfo.id
      recordForm.value.createUserName = userInfo.name
      recordForm.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
      recordForm.value.testDate = dayjs(new Date()).format('YYYY-MM-DD')
      recordForm.value.testLocation = user.bizLabCode === 'X' ? '西昌UPS间' : user.bizLabCode === 'H' ? '海口UPS间' : '' // 实验室
      // 初始化32块电池
      for (let i = 0; i < 32; i++) {
        recordForm.value.upsRecordDetailList.push({
          batteryNo: `${i + 1}`,
          resistance: '',
          voltage: '',
          appearance: '1', // 外观检查默认合格
          remark: '',
        })
      }

      keyFieldsDisable.value = false

      break
    case 'update':
      title.value = 'UPS蓄电池内阻测试记录(编辑)'

      detailById(id.value)

      // 判断显示哪些流程操作按钮
      showOperationButtonByStatus()
      keyFieldsDisable.value = true

      break
    case 'detail':
      title.value = 'UPS蓄电池内阻测试记录(详情)'
      id.value = params.id

      detailById(id.value)

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

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

watch(() => status.value, (val) => {
  if (val === '1' || type.value === 'create') { // 草稿箱把审批详情删了
    if (radioItems.value[radioItems.value.length - 1].value === 'ups-approval') {
      radioItems.value.pop()
    }
    console.log(radioItems.value)
  }
  else { // 非全部和草稿箱把审批详情加上
    if (radioItems.value[radioItems.value.length - 1].value !== 'ups-approval') {
      radioItems.value.push({ name: '审批详情', value: 'ups-approval' })
    }
  }
})

watch(() => recordForm.value.testLocation, (val) => {
  const target = upsLocation.filter((item: { value: string }) => item.value === val)
  if (target.length > 0) {
    recordForm.value.batteryBrand = target[0].batteryBrand
    recordForm.value.batteryCapacity = target[0].batteryCapacity
  }
})

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

<template>
  <app-container class="resource-environment-ups">
    <el-form ref="testRecordRef" :model="recordForm" :rules="checkRules" label-position="right" label-width="125px" 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="submitButtVisable" :disabled="id === ''" type="primary" @click="submitButtonHandler">
            {{ status === '5' || status === '6' ? '保存' : '提交' }}
          </el-button>
          <el-button v-if="saveButtVisable" type="primary" @click="saveButtonHandler">
            保存
          </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>
        <template v-if="current === 'ups-basic'">
          <el-row :gutter="24">
            <el-col :span="6">
              <el-form-item label="记录编号">
                <el-input v-model="recordForm.recordNo" placeholder="系统自动生成" :disabled="true" />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="测试时间" prop="testDate">
                <el-date-picker v-model="recordForm.testDate" :disabled="type === 'detail'" style="width: 100%;" />
              </el-form-item>
            </el-col>

            <el-col :span="6">
              <el-form-item label="测试地点" prop="testLocation">
                <!-- <el-select v-model="recordForm.testLocation" placeholder="请选择测试地点" :disabled="type === 'detail'" style="width: 100%;" clearable>
                  <el-option v-for="loc in upsLocation" :key="loc.value" :value="loc.value" :label="loc.name" />
                </el-select> -->
                <el-autocomplete
                  v-model="recordForm.testLocation"
                  :fetch-suggestions="upsLocation"
                  placeholder="测试地点"
                  style="width: 100%;"
                  :disabled="type === 'detail'"
                  clearable
                />
              </el-form-item>
            </el-col>

            <el-col :span="6">
              <el-form-item label="测试人员">
                <el-input v-model="recordForm.createUserName" :disabled="true" />
                <el-input v-model="recordForm.createUserId" type="hidden" />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="测试仪表" prop="testUseEquipmentId">
                <el-input v-model="recordForm.testUseEquipmentId" type="hidden" />
                <el-input v-model="recordForm.testUseEquipment" placeholder="请选择测试仪表" :disabled="true">
                  <template v-if="type !== 'detail'" #append>
                    <el-button @click="selectEquipment">
                      选择
                    </el-button>
                  </template>
                </el-input>
              </el-form-item>
            </el-col>

            <el-col :span="6">
              <el-form-item label="蓄电池品牌型号">
                <el-input v-model="recordForm.batteryBrand" :placeholder="type === 'detail' ? ' ' : '请输入蓄电池品牌型号'" :disabled="type === 'detail'" style="width: 100%;" />
              </el-form-item>
            </el-col>

            <el-col :span="6">
              <el-form-item label="蓄电池容量">
                <el-input v-model="recordForm.batteryCapacity" :placeholder="type === 'detail' ? ' ' : '请输入蓄电池容量'" :disabled="type === 'detail'" style="width: 100%;" />
              </el-form-item>
            </el-col>

            <el-col :span="6">
              <el-form-item label="测试结论" prop="conclusion">
                <el-select v-model="recordForm.conclusion" :disabled="type === 'detail'" style="width: 100%;">
                  <el-option v-for="dict in conclusionDict" :key="dict.id" :value="dict.value" :label="dict.name" />
                </el-select>
              </el-form-item>
            </el-col>
          </el-row>
        </template>
      </detail-block>
      <detail-block v-if="current === 'ups-basic'">
        <el-table :data="recordForm.upsRecordDetailList" :columns="upsColumns" border stripe>
          <el-table-column v-for="col in upsColumns" :key="col.value" :label="col.text" :align="col.align" :width="col.width">
            <template #default="scope">
              <span v-if="col.value === 'batteryNo'">{{ scope.row[col.value] }}</span>
              <el-radio-group v-else-if="col.value === 'appearance'" v-model="scope.row[col.value]" :disabled="type === 'detail'">
                <el-radio v-for="dict in conclusionDict" :key="dict.id" :label="dict.value">
                  {{ dict.name }}
                </el-radio>
              </el-radio-group>
              <el-input v-else v-model="scope.row[col.value]" type="textarea" autosize clearable :disabled="type === 'detail'" />
            </template>
          </el-table-column>
        </el-table>
      </detail-block>
    </el-form>

    <approval-dialog
      ref="approvalDialog"
      @on-success="approvalSuccessHandler" @on-refuse="refuseHandler" @reject="reject"
    />

    <filter-single-equipment ref="refEqipmentFilter" @record-selected="equipementSelectedHandler" />

    <template v-if="current === 'ups-approval' && status !== '1'">
      <approval-record-table :process-id="recordForm.processId" />
    </template>
    <!-- 选择设备台账 -->
    <select-equipment-dialog ref="selectEquipmentDialogRef" equipment-name="蓄电池内阻测试仪" :is-multi="false" @confirm="confirmSelectEquipment" />
  </app-container>
</template>

<style lang="scss">
.resource-environment-ups {
  .el-radio__label {
    display: block !important;
  }
}
</style>