Newer
Older
smart-metering-front / src / views / device / bench / deviceBench.vue
dutingting on 28 Dec 2022 11 KB 测量设备工作台搭建
<script lang="ts" setup name="DeviceBench">
import { getCurrentInstance, ref } from 'vue'
import type { Ref } from 'vue'
import Linechart from '@/components/Echart/LineChart.vue'
import type { lineDataI } from '@/components/Echart/echart-interface'

// 每个展示块高度
const blockHeight = ref(300)
const blockWidth = ref(400)
const { proxy } = getCurrentInstance() as any
// 设备台账检定提醒表格数据
const standingBookTableData = ref([
  {
    equipmentName: '设备1',
    usePersonName: '负责人1',
    lastTime: '2022-12-21 12:10:30',
  },
  {
    equipmentName: '设备1',
    usePersonName: '负责人1',
    lastTime: '2022-12-21 12:10:30',
  },
  {
    equipmentName: '设备1',
    usePersonName: '负责人1',
    lastTime: '2022-12-21 12:10:30',
  },
  {
    equipmentName: '设备1',
    usePersonName: '负责人1',
    lastTime: '2022-12-21 12:10:30',
  },
  {
    equipmentName: '设备1',
    usePersonName: '负责人1',
    lastTime: '2022-12-21 12:10:30',
  },
  {
    equipmentName: '设备1',
    usePersonName: '负责人1',
    lastTime: '2022-12-21 12:10:30',
  },
  {
    equipmentName: '设备1',
    usePersonName: '负责人1',
    lastTime: '2022-12-21 12:10:30',
  },
  {
    equipmentName: '设备1',
    usePersonName: '负责人1',
    lastTime: '2022-12-21 12:10:30',
  },
  {
    equipmentName: '设备1',
    usePersonName: '负责人1',
    lastTime: '2022-12-21 12:10:30',
  },
])
// 设备台账检定提醒表头
const standingBookTableHead = [
  { text: '设备名称', value: 'equipmentName' },
  { text: '负责人', value: 'usePersonName', width: '120' },
  { text: '上次检定时间', value: 'lastTime', width: '180' },
]
// 标准装置到期提醒表格数据
const standardTableData = ref([
  {
    equipmentName: '设备1',
    usePersonName: '负责人1',
    lastTime: '2022-12-21 12:10:30',
  },
])
// 标准装置到期提醒表头
const standardTableHead = [
  { text: '设备名称', value: 'equipmentName' },
  { text: '负责人', value: 'usePersonName', width: '120' },
  { text: '上次检定时间', value: 'lastTime', width: '180' },
]
// 设备检定趋势x轴
const equipmentTestXData: Ref<string[]> = ref([])
// 设备检定趋势数据
const equipmentTestData: Ref<lineDataI[]> = ref([])
// 设备检定趋势y轴最大值
const equipmentTestYDataMax = ref()

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

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

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()
  setTimeout(() => {
    equipmentTestXData.value = ['2022-08', '2022-12']
    equipmentTestData.value = [{ name: '到期设备', data: [1, 11] }]
    standardTestXData.value = ['2022-01', '2022-12', '2023-09']
    standardTestData.value = [{ name: '标准装置', data: [1, 10, 2] }]
  })
})
</script>

<template>
  <app-container>
    <div class="device-bench">
      <el-row :gutter="10">
        <el-col :span="8">
          <bench-col
            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
            icon="icon-line"
            title="设备检定趋势"
            :height="blockHeight"
          >
            <line-chart
              :x-axis-data="equipmentTestXData"
              :width="`${blockWidth - 20}px`"
              :data="equipmentTestData"
              unit="件"
            />
          </bench-col>
        </el-col>
        <el-col :span="8">
          <bench-col
            icon="icon-book"
            title="本月统计数据"
            :height="blockHeight"
          >
            <div class="the-month-total-Data">
              <div>
                <div class="title">
                  <span>测量设备</span>
                  <span style="margin-right: 6px;">{{ theMonthTotalData.testValue }}</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.standardValue }}</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
            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
            icon="icon-line"
            title="设备检定趋势"
            :height="blockHeight"
          >
            <line-chart
              :x-axis-data="standardTestXData"
              :width="`${blockWidth - 20}px`"
              :data="standardTestData"
              unit="件"
            />
          </bench-col>
        </el-col>
        <el-col :span="8">
          <bench-col
            icon="icon-book"
            title="我的设备"
            :height="blockHeight"
          >
            <div class="my-equipment">
              <div class="item">
                <span>待检定设备数量</span>
                <span style="margin-top: 16px;">{{ myEquipment.stay }}</span>
              </div>
              <div class="item">
                <span>超期未检定设备数量</span>
                <span style="margin-top: 16px;">{{ myEquipment.not }}</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>