Newer
Older
smart-metering-front / src / views / measure / bench / bench.vue
MrTan on 22 Dec 2022 11 KB 更换申请页面
<script lang="ts" setup name="bench">
import { getCurrentInstance, ref } from 'vue'
import type { Ref } from 'vue'
import { getCertificateStatistic, getStaffSStatistic, getStatistic, getTrainLogSStatistic } from '@/api/system/bench'
import { getPlanList } from '@/api/system/plan'
import { listPageApi } from '@/api/measure/file'
import Linechart from '@/components/Echart/LineChart.vue'
import Piechart from '@/components/echarts/pie.vue'
import BenchCol from '@/components/benchCol/index.vue'
import type { lineDataI, pieDataI } from '@/components/Echart/echart-interface'
import useUserStore from '@/store/modules/user'
const { username } = useUserStore()
const buttomTypes = ref([
  { id: '1', text: '培训记录', url: '/train/trainLog' },
  { id: '2', text: '证书到期提醒', url: '/person/remind' },
  { id: '3', text: '溯源供方', url: '/source/list' },
  { id: '4', text: '实验室', url: '/measureDept/ks' },
  { id: '5', text: '工程组', url: '/measureDept/gcz' },
  { id: '6', text: '计量人员', url: '/person/list' },
])
const tableData = ref([])
const meterageTableData = ref([])
const columns = ref([
  { text: '培训名称', value: 'planName', width: '110' },
  { text: '负责人', value: 'director', width: '120' },
  { text: '培训时间', value: 'trainTime' },
])
const meterageColumns = ref([
  { text: '文件名称', value: 'fileName', width: '110' },
  { text: '类别', value: 'fileTypeName', width: '110' },
  { text: '发布时间', value: 'publishTime' },
])
const CertificateColumns = ref([
  { text: '证书名称', value: 'certificateName', width: '110' },
  { text: '到期时间', value: 'validDate' },
])
const CertificatesColumns = ref([
  { text: '证书名称', value: 'certificateName', width: '110' },
  { text: '人员名称', value: 'name', width: '110' },
  { text: '到期时间', value: 'validDate' },
])
const StatisticxAxis: Ref<string[]> = ref([])
const StatisticData: Ref<lineDataI[]> = ref([])
const StaffSStatisticData: Ref<lineDataI[]> = ref([])
const StaffSStatisticxAxis: Ref<string[]> = ref([])
const TrainLogSList: Ref<pieDataI[]> = ref([])
const TrainLogTitle = ref(0)
const CertificateList = ref([])
// 我的证书返回值
interface validReturn {
  certificateName:	string
  count:	string
  date:	string
  lastValidDate:	number
  name:	string
  notQualified:	number
  qualified:	number
  qualifiedCount:	number
  trainCount:	number
  validDate:	string
}
const CertificateObject = ref<validReturn>({
  certificateName:	'',
  count:	'',
  date:	'',
  lastValidDate:	0,
  name:	'',
  notQualified:	0,
  qualified:	0,
  qualifiedCount:	0,
  trainCount:	0,
  validDate:	'',
})

// 获得权限
const { proxy } = getCurrentInstance() as any
const getStatisticList = () => {
  const params = {
    createTime: '',
    deptId: 0,
    director: '',
    effectiveCompany: '',
    trainTime: '',
    offset: 1,
    limit: 10000,
  }
  getPlanList(params).then((res) => {
    tableData.value = res.data.rows
  })
  // 培训计划统计返回值
  interface planReturn {
    date: string
    count: string | number
  }
  getStatistic().then((res) => {
    StatisticxAxis.value = res.data.map((item: planReturn) => {
      return item.date
    })
    const yValue = res.data.map((item: planReturn) => {
      return Number(item.count)
    })
    StatisticData.value = [{ name: '培训计划', data: yValue }]
  })
  getStaffSStatistic().then((res) => {
    StaffSStatisticxAxis.value = res.data.map((item: planReturn) => item.date)
    const yValue = res.data.map((item: planReturn) => Number(item.count))
    StaffSStatisticData.value = [{ name: '人数', data: yValue }]
  })
  const param = {
    account: username,
  }
  getTrainLogSStatistic(param).then((res) => {
    TrainLogSList.value = [
      { name: `合格     ${res.data.qualified}--${(res.data.qualifiedCount / res.data.trainCount) * 100}%`, value: res.data.qualified },
      { name: `不合格   ${res.data.notQualified}-- ${((res.data.notQualified / res.data.trainCount) * 100)}%`, value: res.data.notQualified },
    ]
    TrainLogTitle.value = res.data.trainCount
  })
  // 返回值
  interface CertificatReturn {
    lastValidDate: number
  }
  getCertificateStatistic(param).then((res) => {
    CertificateList.value = res.data
    CertificateObject.value = res.data.sort((nex: CertificatReturn, max: CertificatReturn) => {
      return nex.lastValidDate - max.lastValidDate
    })[0]
  })
}
const getmeterageList = () => {
  const params = {
    fileNo: '', // 编号
    fileName: '', // 名称
    publishTime: '', // 发布时间
    fileCode: '', // 文件号
    effectiveTime: '', // 实施时间
    effectiveStatus: '', // 实施状态
    limit: 10,
    offset: 1,
    fileType: '', // 类型
  }
  listPageApi(params).then((res) => {
    meterageTableData.value = res.data.rows
  })
}
getmeterageList()
getStatisticList()
</script>

<template>
  <app-container>
    <div class="bench">
      <bench-col
        v-if="proxy.hasPerm('/workbench/meterTrainStatistic')"
        title="培训计划"
        path-url="/train/plan"
        width="27.8vw"
        height="40vh"
      >
        <el-table
          :data="tableData"
          style="width: 100%; height: 80%; border-radius: 10px;"
        >
          <el-table-column
            v-for="item in columns"
            :key="item.value"
            :prop="item.value"
            align="center"
            :label="item.text"
            :width="item.width"
          />
        </el-table>
      </bench-col>
      <bench-col
        v-if="proxy.hasPerm('/workbench/meterTrain/line')"
        title="培训计划"
        width="27.8vw"
        height="40.7vh"
      >
        <line-chart
          :x-axis-data="StatisticxAxis"
          width="100%"
          height="75%"
          :data="StatisticData"
          unit="个"
        />
      </bench-col>
      <div class="bench-right">
        <bench-col
          v-if="proxy.hasPerm('/workbench/meterTrain/buttom')"
          width="27.8vw"
          height="20vh"
        >
          <div class="bench-right-top">
            <div
              v-for="item in buttomTypes"
              :key="item.id"
              class="right-top-box"
              @click="$router.push(item.url)"
            >
              {{ item.text }}
            </div>
          </div>
        </bench-col>
        <bench-col
          v-if="proxy.hasPerm('/workbench/meterTrain/train')"
          title="我的培训考核"
          width="27.8vw"
          height="20vh"
        >
          <div class="pie-chart">
            <pie-chart
              :data="TrainLogSList"
              width="200%"
              height="200%"
              :label-formatter="`${TrainLogTitle}`"
            />
            <div class="pie-chart-info">
              <div
                v-for="(item, index) in TrainLogSList"
                :key="index"
                class="chart-info-title"
              >
                <div class="chart-info-bg" />
                {{ item.name }}
              </div>
            </div>
          </div>
        </bench-col>
      </div>
      <bench-col
        v-if="proxy.hasPerm('/measure/file/quality')"
        title="计量文件"
        path-url="/file/quality"
        width="27.8vw"
        height="40vh"
      >
        <el-table
          :data="meterageTableData"
          style="width: 100%; height: 80%; border-radius: 10px;"
        >
          <el-table-column
            v-for="item in meterageColumns"
            :key="item.value"
            :prop="item.value"
            align="center"
            :label="item.text"
            :width="item.width"
          />
        </el-table>
      </bench-col>
      <bench-col
        v-if="proxy.hasPerm('/workbench/person/remind')"
        title="我的证书"
        width="27.8vw"
        height="40vh"
        path-url="/person/remind"
      >
        <div style="display: flex;">
          <el-table
            :data="CertificateList"
            style="width: 65%; height: 31.5vh; border-radius: 10px;"
          >
            <el-table-column
              v-for="item in CertificateColumns"
              :key="item.value"
              :prop="item.value"
              align="center"
              :label="item.text"
              :width="item.width"
            />
          </el-table>
          <div class="validDate">
            <div class="validDate-top">
              <span>{{ CertificateObject.lastValidDate }}天</span>
            </div>
            <div class="validDate-bottom">
              最近到期时间 <br>
              <span>{{ CertificateObject.validDate }}</span>
            </div>
          </div>
        </div>
      </bench-col>
      <bench-col
        v-if="proxy.hasPerm('/workbench/person/list')"
        title="计量人员"
        width="27.8vw"
        height="40vh"
      >
        <line-chart
          :x-axis-data="StaffSStatisticxAxis"
          width="100%"
          height="75%"
          :data="StaffSStatisticData"
          unit="人"
        />
      </bench-col>
      <bench-col
        v-if="proxy.hasPerm('/workbench/person/certificate')"
        title="证书预警"
        path-url="/person/remind"
        width="27.8vw"
        height="40vh"
      >
        <el-table
          :data="CertificateList"
          style="width: 100%; height: 80%; border-radius: 10px;"
        >
          <el-table-column
            v-for="item in CertificatesColumns"
            :key="item.value"
            :prop="item.value"
            align="center"
            :label="item.text"
            :width="item.width"
          />
        </el-table>
      </bench-col>
    </div>
  </app-container>
</template>

<style lang="scss" scoped>
.bench {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;

  .bench-right {
    display: flex;
    flex-direction: column;
    height: 40vh;
    margin-top: 1%;

    .bench-right-top {
      padding: 5%;
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      justify-content: space-around;

      .right-top-box {
        width: 25%;
        margin: 2%;
        height: 40%;
        border-radius: 5px;
        text-align: center;
        font-size: 14px;
        line-height: 4.5vh;
        color: rgb(223 219 219);
        cursor: pointer;
        background-color: #3d7eff;
      }
    }
  }
}

.validDate {
  width: 35%;
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;

  .validDate-top {
    width: 100px;
    height: 100px;
    margin-bottom: 30px;
    background:
      url("../../../assets/images/bench/clock.png") no-repeat center /
      cover;
  }

  .validDate-top span {
    position: relative;
    top: 40%;
    right: 0;
    font-size: 22px;
  }

  .validDate-bottom {
    font-size: 18px;
    font-weight: 600;
  }

  .validDate-bottom span {
    font-size: 14px;
    font-weight: 400;
    color: #999;
  }
}

.pie-chart {
  display: flex;
  align-items: center;
  transform: translateY(-26%);
  width: 100%;
  height: 80%;

  .pie-chart-info {
    width: 30vw;
    transform: translate(-35%, -20%);
    font-size: 12px;

    .chart-info-title {
      display: flex;
      align-items: center;
      margin-top: 10px;

      .chart-info-bg {
        width: 10px;
        height: 10px;
        border-radius: 50%;
        margin-right: 8px;
        background-color: #3d7eff;
      }
    }
  }
}
</style>