Newer
Older
smartwell_front / src / views / home / alarm / current / components / processDialog.vue
liyaguang on 25 Dec 9 KB 需求与问题修改
<!--
  Description: 报警管理-流程状态
  Author: 李亚光
  Date: 2024-09-10
 -->
<script lang="ts" setup name="MonitorDataDialog">
import { alarmProcessNode } from '@/api/home/alarm/current'
import { uniqueMultiArray } from '@/utils/Array'
const emits = defineEmits(['refresh'])
const dialogFormVisible = ref(false) // 对话框是否显示
const initData = [
  {
    name: '报警生成',
    procrssNames: ['未读', '已读'],
    processCode: ['1'],
    icon0: '开始',
    icon1: '开始',
    active: 1,
  },
  {
    name: '分公司调度中心',
    procrssNames: ['待现场确认'],
    processCode: ['2', '4'],
    icon0: '人员-0',
    icon1: '人员-1',
    active: 2,
  },
  {
    name: '确认人员',
    procrssNames: ['已确认'],
    processCode: ['5'],
    icon0: '人员-0',
    icon1: '人员-1',
    active: 3,
  },
  {
    name: '处置人员',
    procrssNames: ['待处置'],
    processCode: ['6', '7'],
    icon0: '人员-0',
    icon1: '人员-1',
    active: 4,
  },
  {
    name: '设备正常',
    procrssNames: ['已处置'],
    processCode: ['8'],
    icon0: '设备-0',
    icon1: '设备-1',
    active: 5,
  },
  {
    name: '结束',
    procrssNames: ['已处置'],
    processCode: ['9'],
    icon0: '结束',
    icon1: '结束',
    active: 6,
  },
]
// 计算时长
const computedDuartion = (time: string, duration: string) => {
  if (!duration) {
    return ''
  }
  else {
    // 操作时间
    const time1 = new Date(time).getTime()
    // 时长
    const durationTime = Number(duration) * 60 * 60 * 1000
    // 当前时间
    const time2 = new Date().getTime()
    let result = time2 - time1 + durationTime
    console.log(result, 'result')
    // 已超过
    const day = Math.floor(Math.abs(result) / (24 * 60 * 60 * 1000))
    const hour = day > 0 ? Math.floor((Math.abs(result) - day * (24 * 60 * 60 * 1000)) / (60 * 60 * 1000)) : Math.floor(Math.abs(result) / (60 * 60 * 1000))
    const minute = hour > 0 ? Math.floor((Math.abs(result) - day * (24 * 60 * 60 * 1000) - hour * (60 * 60 * 1000)) / (60 * 1000)) : Math.floor(Math.abs(result) / (60 * 1000))
    if (result > 0) {
      return `已超时${day > 0 ? `${day}天` : ''}${hour > 0 ? `${hour}小时` : ''}${minute > 0 ? `${minute}分钟` : ''}`
    }
    else {
      return `${day > 0 ? `${day}天` : ''}${hour > 0 ? `${hour}小时` : ''}${minute > 0 ? `${minute}分钟` : ''}`
    }
  }
}
const processData = ref<any[]>([])
const active = ref(1)
// 初始化对话框
const loading = ref(true)
const initDialog = (row: any) => {
  console.log(row, 'row')
  dialogFormVisible.value = true
  loading.value = true
  processData.value = JSON.parse(JSON.stringify(initData))
  alarmProcessNode(row.id).then((res) => {
    if (res.data.length) {
      const last = res.data[res.data.length - 1]
      // 挂起流程
      if (last.FLOW_STATUS === '3') {
        //  挂起
        processData.value.splice(2, 0, {
          name: '挂起',
          procrssNames: ['挂起'],
          icon0: '挂起',
          icon1: '挂起',
          active: 2,
        })
        active.value = 3
        processData.value = processData.value.map((item, index) => ({ ...item, active: index + 1 }))
        // console.log(processData.value, 'processData.value')
        // 处理content
        // 已读
        const already = res.data.filter((item: any) => item.process_name === '已读' || item.process_name === '未读')
        processData.value[0].content = `
        <span>时间: ${already[0].APPROVAL_TIME}</span></br>
        <span>人员: ${already[0].NAME}</span></br>
        <span>操作: ${already[0].process_name}</span></br>
        `
        // 分中心确认
        const confirm = res.data.filter((item: any) => item.process_name === '待现场确认')
        processData.value[1].content = `
        <span>时间: ${confirm[0].APPROVAL_TIME}</span></br>
        <span>人员: ${confirm[0].NAME}</span></br>
        <span>操作: 已读</span></br>
        `
        // 挂起
        const pending = res.data.filter((item: any) => item.process_name === '挂起')
        processData.value[2].content = `
        <span>时间: ${pending[0].APPROVAL_TIME}</span></br>
        <span>人员: ${pending[0].NAME}</span></br>
        <span>操作: ${pending[0].process_name}</span></br>
        <span>挂起时长: ${pending[0].DESCN?.split('|')[0] || ''}小时</span></br>
        <span>挂起原因: ${pending[0].DESCN?.split('|')[1] || ''}</span></br>
        <span>剩余时长: ${computedDuartion(pending[0].APPROVAL_TIME, pending[0].DESCN?.split('|')[0])}</span></br>
        `
        console.log(processData.value, ' processData.value[1]')
      }
      else {
        const data = uniqueMultiArray(res.data, 'process_name')
        data.forEach((item: any, index: number) => {
          const cindex = processData.value.findIndex((citem: any) => citem.processCode?.includes(item.FLOW_STATUS))
          if (cindex !== -1) {
            console.log(1111)
            console.log(processData.value[cindex].procrssNames)
            if (processData.value[cindex].procrssNames.includes('已确认') || processData.value[cindex].procrssNames.includes('已处置')) {
              processData.value[cindex].content = `
        <span>时间: ${data[index].APPROVAL_TIME}</span></br>
        <span>人员: ${data[index].NAME}</span></br>
        <span>操作: ${data[index].process_name}</span></br>
        <span>${processData.value[cindex].procrssNames.includes('已确认') ? '确认' : processData.value[cindex].procrssNames.includes('已处置') ? '处置' : ''}内容: ${data[index].DESCN}</span></br>
        `
            }
            else {
              processData.value[cindex].content = `
        <span>时间: ${data[index].APPROVAL_TIME}</span></br>
        <span>人员: ${data[index].NAME}</span></br>
        <span>操作: ${data[index].process_name}</span></br>
        `
            }

            processData.value[cindex].person = data[index].NAME
          }
        })
        processData.value[0].content = `
        <span>时间: ${row.alarmTime}</span></br>
        <span>操作: 报警生成</span></br>
        `
        // 确认误报
        if (data.length < 4 && Number(data[data.length - 1].FLOW_STATUS) >= 7) {
          processData.value = processData.value.filter((item: any) => item.name !== '处置人员')
          const cindex = processData.value.findIndex((item: any) => item.name === '确认人员')
          if (!processData.value[cindex].content) {
            const index = data.findIndex((item: any) => item.FLOW_STATUS === '7')
            processData.value[cindex].content = `
                    <span>时间: ${data[index].APPROVAL_TIME}</span></br>
        <span>人员: ${data[index].NAME}</span></br>
        <span>操作: ${data[index].process_name}</span></br>
        `
            processData.value[cindex].person = data[index].NAME
          }
        }
        active.value = processData.value.findLastIndex((citem: any) => citem.content) + 1
        // console.log(processData.value, 'processData.value')
        // console.log(active.value, 'active.value')
        // const lastName = last.process_name
        // if (lastName === '已处置' && last.DESCN === '已修复') {
        //   active.value = 6
        //   processData.value[processData.value.length - 1].content = processData.value[processData.value.length - 2].content
        // }
      }
    }
    loading.value = false
  }).catch(() => {
    loading.value = false
  })
}
defineExpose({
  initDialog,
})

const cancel = () => {
  dialogFormVisible.value = false
}
// 点击节点
const processDetail = (row: any) => {
  // if (row.active <= active.value) {
  // }
}
</script>

<template>
  <el-dialog v-model="dialogFormVisible" title="流程图" append-to-body>
    <div v-loading="loading" class="process-container">
      <el-steps style="width: 100%;" :active="active" align-center>
        <el-step v-for="item in processData" :key="item.name" @click="processDetail(item)">
          <template #icon>
            <el-tooltip :disabled="!(item.active <= active)" :content="item.content || ''" raw-content placement="top"
              effect="light">
              <el-icon class="title-icon">
                <svg-icon :name="item.active <= active ? item.icon1 : item.icon0" />
              </el-icon>
            </el-tooltip>
          </template>
          <template #title>
            <div>
              {{ item.name }}
            </div>
          </template>
          <template #description>
            <span>{{ item.person }}</span>
          </template>
        </el-step>
      </el-steps>
    </div>
    <template #footer>
      <div class="dialog-footer">
        <el-button type="primary" @click="cancel">
          确认
        </el-button>
      </div>
    </template>
  </el-dialog>
</template>

<style lang="scss" scoped>
::v-deep(.el-step__line) {
  height: 1px !important;
}

::v-deep(.el-step__line-inner) {
  height: 1px !important;
}

::v-deep(.el-step__title) {
  padding-top: 15px;
  text-align: center;
  // margin-left: -10px;
}

.el-dialog {
  width: 700px;
}

.el-select {
  width: 100%;
}

.process-container {
  width: 100%;
  height: 250px;
  display: flex;
  justify-content: center;
  flex-direction: column;
  padding: 0 20px;

  ::v-deep(.el-step__icon) {
    svg {
      width: 50px;
      height: 50px;
    }

    .title-icon {
      // height:30px;
      width: 50px;
      font-size: 24px;
      vertical-align: -0.25em;
      transition: transform 0.3s;
      color: unset;

      &:hover {
        cursor: pointer;
      }
    }

    .icon-device {
      font-size: 30px;
      width: 70px;

      svg {
        width: 50px;
        height: 50px;
      }
    }
  }
}
</style>