Newer
Older
smartwell_front / src / views / home / alarm / count / components / deptCount.vue
liyaguang on 16 Apr 9 KB 虚拟表格组件封装
<!--
  Description: 报警统计-各单位报警统计
  Author: 李亚光
  Date: 2023-07-09
 -->
<script lang="ts" setup name="AlarmCount">
import layout from './layout.vue'
import { getAlarmCompany, getAlarmTypeList } from '@/api/home/alarm/count'
import { shortcuts } from '@/utils/common'
import useUserStore from '@/store/modules/user'
const userStore = useUserStore()
const alarmType = ref<any[]>([])
const listQuery = ref({
  begTime: '',
  endTime: '',
  ledgerType: '',
  timeType: '1',
})
const selectTimeType = (type: string) => {
  listQuery.value.timeType = type
}
// 开始结束时间
const datetimerange = ref()
watch(() => datetimerange.value, (newVal) => {
  listQuery.value.begTime = ''
  listQuery.value.endTime = ''
  if (Array.isArray(newVal)) {
    if (newVal.length) {
      listQuery.value.begTime = `${newVal[0]}`
      listQuery.value.endTime = `${newVal[1]}`
    }
  }
})
// 类别
const ledgerTypeList = ref<{ id: string; name: string; value: string }[]>([
  {
    name: '闸井',
    id: '1',
    value: '1',
  },
  {
    name: '场站',
    id: '2',
    value: '2',
  },
  {
    name: '管线',
    id: '3',
    value: '3',
  },
])
const columns = ref<any[]>([
])
const xAxisData = ref([])
const data = ref<any[]>([])
const list = ref([])
const loading = ref(true)
const resizePage = () => {
  setTimeout(() => {
    const resize = new Event('resize')
    window.dispatchEvent(resize)
  })
}

const fetchData = () => {
  loading.value = true
  getAlarmCompany(listQuery.value).then((res) => {
    if (!res.data.length) {
      xAxisData.value = []
      list.value = []
      loading.value = false
      return
    }
    if (!userStore.roleTips.join().includes('admin')) {
      xAxisData.value = res.data.map((item: any) => item.dept)
      list.value = res.data
    }
    else {
      const deptList = [
        '高压管网',
        '第一分公司',
        '第二分公司',
        '第三分公司',
        '第四分公司',
        '第五分公司',
        '怀柔有限公司',
        '密云有限公司',
        '平谷有限公司',
        '延庆有限公司',
        '昌平有限公司',
        '房山有限公司',
      ]
      // 过滤
      list.value = res.data.filter((item: any) => deptList.filter(citem => item.dept.includes(citem)).length)
      // 排序
      const arr = [] as any[]
      deptList.forEach((item: string) => {
        const data = list.value.filter((citem: any) => citem.dept.includes(item))
        if (data.length) {
          arr.push(data[0])
        }
      })
      // console.log(arr, 'arr')
      list.value = arr
      xAxisData.value = list.value.map((item: any) => item.dept)
    }

    const objArr = []
    let ledgerTypeArr = []
    if (!listQuery.value.ledgerType) {
      for (const i in list.value[0]) {
        if (i !== 'dept') {
          objArr.push(i)
        }
      }
    }
    else if (listQuery.value.ledgerType === '1') {
      ledgerTypeArr = alarmType.value.filter((item: any) => item.watchObject === '1').map((item: any) => item.alarmName)
      for (const i in list.value[0]) {
        if (i !== 'dept' && ledgerTypeArr.includes(i)) {
          objArr.push(i)
        }
      }
    }
    else if (listQuery.value.ledgerType === '2') {
      ledgerTypeArr = alarmType.value.filter((item: any) => item.watchObject === '2').map((item: any) => item.alarmName)
      for (const i in list.value[0]) {
        if (i !== 'dept' && ledgerTypeArr.includes(i)) {
          objArr.push(i)
        }
      }
    }
    else if (listQuery.value.ledgerType === '3') {
      ledgerTypeArr = alarmType.value.filter((item: any) => item.watchObject === '3').map((item: any) => item.alarmName)
      for (const i in list.value[0]) {
        if (i !== 'dept' && ledgerTypeArr.includes(i)) {
          objArr.push(i)
        }
      }
    }
    data.value = objArr.map((item: any) => ({
      name: item,
      data: list.value.map((citem: any) => citem[item]),
    }))
    columns.value = objArr.map((item: any) => ({
      text: item,
      value: item,
      width: 120
    }))
    // if (!listQuery.value.ledgerType) {
    //   data.value = [
    //     {
    //       name: '闸井浓度超限',
    //       data: res.data.map((item: any) => item['闸井浓度超限']),
    //     },
    //     {
    //       name: '场站浓度超限',
    //       data: res.data.map((item: any) => item['场站浓度超限']),
    //     },
    //     {
    //       name: '管线浓度超限',
    //       data: res.data.map((item: any) => item['管线浓度超限']),
    //     },
    //   ]
    // }
    // else if (listQuery.value.ledgerType === '1') {
    //   data.value = [
    //     {
    //       name: '闸井浓度超限',
    //       data: res.data.map((item: any) => item['闸井浓度超限']),
    //     },
    //   ]
    // }
    // else if (listQuery.value.ledgerType === '2') {
    //   data.value = [
    //     {
    //       name: '场站浓度超限',
    //       data: res.data.map((item: any) => item['场站浓度超限']),
    //     },
    //   ]
    // }
    // else if (listQuery.value.ledgerType === '3') {
    //   data.value = [
    //     {
    //       name: '管线浓度超限',
    //       data: res.data.map((item: any) => item['管线浓度超限']),
    //     },
    //   ]
    // }

    // .map((item: any) => ({
    //   dept: item.dept,
    //   well: item['闸井浓度超限'],
    //   station: item['场站浓度超限'],
    //   pipeline: item['管线浓度超限'],
    // }))
    // columns.value = data.value.map((item: any) => ({
    //   text: item.name,
    //   value: columnsDict[item.name],
    // }))
    resizePage()
    loading.value = false
  }).catch(() => {
    loading.value = false
  })
}
onMounted(() => {
  getAlarmTypeList().then((res) => {
    alarmType.value = res.data
    fetchData()
  })
})
</script>

<template>
  <layout title="各单位报警统计">
    <!-- 查询条件 -->
    <template #search>
      <div class="search">
        <el-button :class="listQuery.timeType === '1' ? 'active' : ''" round size="small" style="margin: 0 5px;"
          @click="selectTimeType('1')">
          今日
        </el-button>
        <el-button :class="listQuery.timeType === '2' ? 'active' : ''" round size="small" style="margin: 0 5px;"
          @click="selectTimeType('2')">
          本周
        </el-button>
        <el-button :class="listQuery.timeType === '3' ? 'active' : ''" round size="small" style="margin: 0 5px;"
          @click="selectTimeType('3')">
          本月
        </el-button>
        <el-select v-model="listQuery.ledgerType" placeholder="全部类别" clearable style="width: 160px;margin: 0 5px;">
          <el-option v-for="item in ledgerTypeList" :key="item.id" :label="item.name" :value="item.id" />
        </el-select>
        <el-date-picker v-model="datetimerange" type="datetimerange" format="YYYY-MM-DD HH:mm:ss"
          style="width: 380px;margin: 0 5px;" value-format="YYYY-MM-DD HH:mm:ss" range-separator="至"
          start-placeholder="报警开始时间" end-placeholder="报警结束时间" clearable :shortcuts="shortcuts" />
        <el-button type="primary" style="margin: 0 5px;" @click="fetchData">
          搜索
        </el-button>
      </div>
    </template>
    <template #content>
      <div v-loading="loading" class="alarm-count">
        <div class="bar">
          <bar-chart-vertical v-show="xAxisData.length" :x-axis-data="xAxisData" :bar-coner="0" :data="data"
            :colors="[]" :bar-width="15" :show-label="false"
            :legend="{ itemWidth: 8, itemHeight: 8, type: 'scroll', orient: 'horizontal', icon: 'roundRect', right: '40', top: '10' }"
            :grid="{
              top: 50,
              left: 40,
              right: 40,
              bottom: 20,
              containLabel: true, // 是否包含坐标轴的刻度标签
            }" />
          <el-empty v-show="!xAxisData.length" description="暂无数据" />
        </div>
        <div class="table">
          <!-- <el-table border :data="list" stripe style="width: 100%;" :height="440">
            <el-table-column label="管理单位" prop="dept" align="center" width="200" />
            <el-table-column v-for="item in columns" :key="item.text" :label="item.text" :prop="item.value"
              align="center" />
          </el-table> -->
          <virtual-table :data="list" style="width: 100%;" :height="460" :columns="[
            { text: '管理单位', value: 'dept', width:120 },
            ...columns
          ]">
            <!-- <template #preColumns>
              <vxe-column title="序号" width="80" align="center">
                <template #default="{ rowIndex }">
                  {{ rowIndex + 1 }}
                </template>
              </vxe-column>
            </template> -->
          </virtual-table>
        </div>
      </div>
    </template>
  </layout>
</template>

<style lang="scss" scoped>
.active {
  color: #0d76d4;
  border-color: #c5d8ff;
  outline: none;
  background-color: #ecf2ff;
}

.search {
  display: flex;
  align-items: center;
}

.alarm-count {
  display: flex;

  .bar {
    width: 60%;
    height: 450px;
  }

  .table {
    width: 38%;
    padding: 10px;
    margin-left: 20px;
  }
}
</style>