Newer
Older
smart-metering-front / src / views / device / bench / deviceBench.vue
<script lang="ts" setup name="DeviceBench">
import { getCurrentInstance, ref } from 'vue'
import type { Ref } from 'vue'
import type { IPlanMonthlyStatisticsReturn, IPlanReturn, ITableData } from './bench-interface'
import Linechart from '@/components/Echart/LineChart.vue'
import type { lineDataI } from '@/components/Echart/echart-interface'
import { getMeasureTrend, getMonthlyStatistics, getMyEquipment, getStandardTrend, getStandingBookRemind } from '@/api/device/bench'
import { getRemindListPage } from '@/api/device/standard'
import type { IexpiraListQuery } from '@/views/device/standardEquipment/standard_interface'

// 每个展示块高度
const blockHeight = ref(300)
const blockWidth = ref(400)
const standingBookLoading = ref(false) // 设备台账检定提醒表格loading
const equipmentTrendLoading = ref(false) // 设备检定趋势loading
const standardLoading = ref(false) // 标准装置到期提醒表格loading
const standardTrendLoading = ref(false) // 装置检定趋势loading
const MonthlyStatisticsLoading = ref(false) // 本月统计数据loading
const myEquipmentLoading = ref(false) // 我的设备loading

// const standardLoading = ref(false) // 标准装置到期提醒表格loading
// 设备台账检定提醒表格数据
const standingBookTableData = ref<ITableData[]>([])
// 设备台账检定提醒表头
const standingBookTableHead = [
  { text: '设备名称', value: 'equipmentName' },
  { text: '负责人', value: 'usePersonName', width: '120' },
  { text: '上次检定时间', value: 'mesureDate', width: '180' },
]

// 标准装置查询参数
const listQuery: Ref<IexpiraListQuery> = ref({
  category: '', // 类别
  id: '', // 主键id
  managerState: '', // 管理状态
  preparationEndDate: '', // 结束时间
  preparationStartDate: '', // 开始时间
  standardLaboratory: '', // 标准所在部门
  standardName: '', // 标准名称
  standardNo: '', // 标准编号
  validEndTime: '', // 结束时间
  validStartTime: '', // 开始时间
  offset: 1, // 当前页
  limit: 20, // 每页多少条
})
// 标准装置到期提醒表格数据
const standardTableData = ref<ITableData[]>([])
// 标准装置到期提醒表头
const standardTableHead = [
  { text: '标准名称', value: 'standardName', align: 'center' },
  { text: '负责人', value: 'standardOwnerName', align: 'center' },
  { text: '有效日期', value: 'preparationDate', width: '180', align: 'center' },
]
const total = ref(20)

// 设备检定趋势x轴
const equipmentTrendXData: Ref<string[]> = ref([])
// 设备检定趋势数据
const equipmentTrendData: Ref<lineDataI[]> = ref([])
// 设备检定趋势y轴最大值
const equipmentTrendYDataMax = ref()

// 装置检定趋势x轴
const standardTrendXData: Ref<string[]> = ref([])
// 装置检定趋势数据
const standardTrendData: Ref<lineDataI[]> = ref([])
// 装置检定趋势y轴最大值
const standardTrendYDataMax = ref()

// 我的设备
const myEquipment = ref({
  verifiedNum: '', // 待检测设备数量
  overtimeNum: '', // 超期未检测设备数量
})
// 本月统计数据
const theMonthTotalData = ref({
  measureSum: '', // 测量设备
  testIn: '', // 在用设备
  testLeave: '', // 闲置设备
  testSeal: '', // 封存设备
  standardSum: '', // 标准装置
  standardIn: '', // 在用装置
  standardStop: '', // 暂停装置
  standardAnnul: '', // 撤销装置
  receive: '', // 领用
  borrow: '', // 借用
})

// 获取设备检定趋势
const fetchMeasureTrend = () => {
  equipmentTrendLoading.value = true
  getMeasureTrend().then((res) => {
    equipmentTrendXData.value = res.data.map((item: IPlanReturn) => item.date)
    const yValue = res.data.map((item: IPlanReturn) => Number(item.count))
    equipmentTrendYDataMax.value = Math.max(yValue) > 10 ? Math.max(yValue) : 10
    equipmentTrendData.value = [{ name: '到期设备', data: yValue }]
    equipmentTrendLoading.value = false
  })
}

// 获取装置检定趋势
const fetchStandardTrend = () => {
  standardTrendLoading.value = true
  getStandardTrend().then((res) => {
    standardTrendXData.value = res.data.map((item: IPlanReturn) => item.date)
    const yValue = res.data.map((item: IPlanReturn) => Number(item.count))
    standardTrendYDataMax.value = Math.max(yValue) > 10 ? Math.max(yValue) : 10
    standardTrendData.value = [{ name: '标准装置', data: yValue }]
    standardTrendLoading.value = false
  })
}

// 获取本月统计数据
const fetchMonthlyStatistics = () => {
  MonthlyStatisticsLoading.value = true
  getMonthlyStatistics().then((res) => {
    theMonthTotalData.value.measureSum = res.data.measureSum // 测量设备
    theMonthTotalData.value.standardSum = res.data.standardSum // 标准装置

    // 本月设备借用
    res.data.equipmentApplyList.forEach((item: IPlanMonthlyStatisticsReturn) => {
      if (item.state === '本月设备借用') {
        theMonthTotalData.value.borrow = item.count
      }
      else if (item.state === '本月设备领用') {
        theMonthTotalData.value.receive = item.count
      }
    })

    // 测量设备
    res.data.measureStateList.forEach((item: IPlanMonthlyStatisticsReturn) => {
      if (item.state === '在用设备') {
        theMonthTotalData.value.testIn = item.count
      }
      else if (item.state === '闲置设备') {
        theMonthTotalData.value.testLeave = item.count
      }
      else if (item.state === '封存设备') {
        theMonthTotalData.value.testSeal = item.count
      }
    })
    // 标准装置
    res.data.standardStateList.forEach((item: IPlanMonthlyStatisticsReturn) => {
      if (item.state === '暂停装置') {
        theMonthTotalData.value.standardStop = item.count
      }
      else if (item.state === '撤销装置') {
        theMonthTotalData.value.standardAnnul = item.count
      }
      else if (item.state === '在用装置') {
        theMonthTotalData.value.standardIn = item.count
      }
    })
    MonthlyStatisticsLoading.value = false
  })
}

// 获取我的设备
const fetchMyEquipment = () => {
  myEquipmentLoading.value = true
  getMyEquipment().then((res) => {
    myEquipment.value.verifiedNum = res.data.verifiedNum // 待检测设备数量
    myEquipment.value.overtimeNum = res.data.overtimeNum // 超期未检测设备数量
    myEquipmentLoading.value = false
  })
}

// 获取设备台账提醒
const fetchStandingBookRemind = () => {
  standingBookLoading.value = true
  getStandingBookRemind().then((res) => {
    standingBookTableData.value = res.data
    standingBookLoading.value = false
  })
}

// 获取标准装置到期提醒
const fetchRemindListPage = () => {
  standardLoading.value = true
  getRemindListPage(listQuery.value).then((res) => {
    standardTableData.value = res.data.rows
    total.value = parseInt(res.data.total)
    standardLoading.value = false
  })
}

function calcBlockSize() {
  // 计算工作台区域高度 - 顶部-面包屑-边距
  const bodyHeight = document.body.clientHeight - 60 - 50 - 20
  blockHeight.value = bodyHeight > 610 ? (bodyHeight - 10) / 2 : 300
  blockWidth.value = (document.body.clientWidth - 180 - 20 - 20) / 3
  console.log(blockHeight.value, blockWidth.value - 20)
}
window.addEventListener('resize', () => {
  calcBlockSize()
})

onMounted(() => {
  calcBlockSize()
  fetchMeasureTrend() // 获取设备检定趋势
  fetchStandardTrend() // 获取装置检定趋势
  fetchMonthlyStatistics() // 获取本月统计数据
  fetchMyEquipment() // 获取我的设备
  fetchStandingBookRemind() // 获取设备台账提醒
  fetchRemindListPage() // 获取标准装置到期提醒
})
</script>

<template>
  <app-container>
    <div class="device-bench">
      <el-row :gutter="10">
        <el-col :span="8">
          <bench-col
            v-loading="standingBookLoading"
            icon="icon-book"
            title="设备台账检定提醒"
            path-url="/standingBook/adjustDevice"
            :style="{ height: blockHeight }"
            :height="blockHeight"
          >
            <el-table :data="standingBookTableData" :height="blockHeight - 60" style="width: 100%; height: 100%;" stripe header-row-class-name="bench-table-header" row-class-name="bench-table-row" class="bench-table">
              <el-table-column
                v-for="item in standingBookTableHead"
                :key="item.value"
                :prop="item.value"
                align="center"
                :label="item.text"
                :width="item.width"
              />
            </el-table>
          </bench-col>
        </el-col>
        <el-col :span="8">
          <bench-col
            v-loading="equipmentTrendLoading"
            icon="icon-line"
            title="设备检定趋势"
            :height="blockHeight"
          >
            <line-chart
              :x-axis-data="equipmentTrendXData"
              :width="`${blockWidth - 20}px`"
              :data="equipmentTrendData"
              unit="件"
            />
          </bench-col>
        </el-col>
        <el-col :span="8">
          <bench-col
            v-loading="MonthlyStatisticsLoading"
            icon="icon-book"
            title="本月统计数据"
            :height="blockHeight"
          >
            <div class="the-month-total-Data">
              <div>
                <div class="title">
                  <span>测量设备</span>
                  <span style="margin-right: 6px;">{{ theMonthTotalData.measureSum }}</span>
                </div>
                <div class="content">
                  <el-row :gutter="10">
                    <el-col :span="8">
                      <div class="item">
                        <span>在用设备</span>
                        <span style="margin-top: 6px;">
                          {{ theMonthTotalData.testIn }}
                        </span>
                      </div>
                    </el-col>
                    <el-col :span="8">
                      <div class="item">
                        <span>闲置设备</span>
                        <span style="margin-top: 6px;">{{ theMonthTotalData.testLeave }}</span>
                      </div>
                    </el-col>
                    <el-col :span="8">
                      <div class="item">
                        <span>封存设备</span>
                        <span style="margin-top: 6px;">{{ theMonthTotalData.testSeal }}</span>
                      </div>
                    </el-col>
                  </el-row>
                </div>
              </div>
              <div>
                <div class="title">
                  <span>标准装置</span>
                  <span style="margin-right: 6px;">{{ theMonthTotalData.standardSum }}</span>
                </div>
                <div class="content">
                  <el-row :gutter="10">
                    <el-col :span="8">
                      <div class="item">
                        <span>在用装置</span>
                        <span style="margin-top: 6px;">{{ theMonthTotalData.standardIn }}</span>
                      </div>
                    </el-col>
                    <el-col :span="8">
                      <div class="item">
                        <span>暂停装置</span>
                        <span style="margin-top: 6px;">{{ theMonthTotalData.standardStop }}</span>
                      </div>
                    </el-col>
                    <el-col :span="8">
                      <div class="item">
                        <span>撤销装置</span>
                        <span style="margin-top: 6px;">{{ theMonthTotalData.standardAnnul }}</span>
                      </div>
                    </el-col>
                  </el-row>
                </div>
              </div>

              <div class="content">
                <el-row :gutter="20">
                  <el-col :span="12">
                    <div class="item">
                      <span>本月设备领用</span>
                      <span style="margin-top: 6px;">{{ theMonthTotalData.receive }}</span>
                    </div>
                  </el-col>
                  <el-col :span="12">
                    <div class="item">
                      <span>本月设备借用</span>
                      <span style="margin-top: 6px;">{{ theMonthTotalData.borrow }}</span>
                    </div>
                  </el-col>
                </el-row>
              </div>
            </div>
          </bench-col>
        </el-col>
      </el-row>
    </div>
    <div class="device-bench" style="margin-top: 10px;">
      <el-row :gutter="10">
        <el-col :span="8">
          <bench-col
            v-loading="standardLoading"
            icon="icon-book"
            title="标准装置到期提醒"
            path-url="/standard/expirationRemind"
            :style="{ height: blockHeight }"
            :height="blockHeight"
          >
            <el-table :data="standardTableData" :height="blockHeight - 60" style="width: 100%; height: 100%;" stripe header-row-class-name="bench-table-header" row-class-name="bench-table-row" class="bench-table">
              <el-table-column
                v-for="item in standardTableHead"
                :key="item.value"
                :prop="item.value"
                align="center"
                :label="item.text"
                :width="item.width"
              />
            </el-table>
          </bench-col>
        </el-col>
        <el-col :span="8">
          <bench-col
            v-loading="standardTrendLoading"
            icon="icon-line"
            title="装置检定趋势"
            :height="blockHeight"
          >
            <line-chart
              :x-axis-data="standardTrendXData"
              :width="`${blockWidth - 20}px`"
              :data="standardTrendData"
              unit="件"
            />
          </bench-col>
        </el-col>
        <el-col :span="8">
          <bench-col
            v-loading="myEquipmentLoading"
            icon="icon-book"
            title="我的设备"
            :height="blockHeight"
          >
            <div class="my-equipment">
              <div class="item">
                <span>待检定设备数量</span>
                <span style="margin-top: 16px;">{{ myEquipment.verifiedNum }}</span>
              </div>
              <div class="item">
                <span>超期未检定设备数量</span>
                <span style="margin-top: 16px;">{{ myEquipment.overtimeNum }}</span>
              </div>
            </div>
          </bench-col>
        </el-col>
      </el-row>
    </div>
  </app-container>
</template>

<style lang="scss" scoped>
.device-bench {
  width: 100%;
  height: 100%;
  box-sizing: border-box;

  .the-month-total-Data {
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    justify-content: space-around;
    padding: 0 20px;

    .title {
      display: flex;
      justify-content: space-between;
      font-weight: 500;
      margin-bottom: 3px;
    }

    .content {
      width: 100%;

      .item {
        display: flex;
        flex-direction: column;
        flex: 1;
        margin-right: 10px;
        padding: 3px 0;
        justify-content: center;
        align-items: center;
        background-image: linear-gradient(to bottom, #e9f5ff, #3d7eff);
        border-radius: 8px;

        &:last-child {
          margin-right: 0;
        }
      }
    }
  }

  .my-equipment {
    height: 100%;
    display: flex;
    flex-direction: column;
    justify-content: space-around;
    padding: 20px;

    .item {
      height: 40%;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      background-image: linear-gradient(to right, #caddff, #3d7eff);
      border-radius: 16px;
    }
  }
}
</style>

<style lang="scss">
.bench-table {
  .el-table__header-wrapper {
    border-radius: 8px;
  }
}

.bench-table-header {
  th {
    font-weight: normal;
    font-size: 14px;
  }
}

.bench-table-row {
  border-radius: 8px;
}
</style>