zouyu
2025-03-17 0600ab29100da647a5cd34c935c16f59b3e772e5
src/views/chart/inspetionItemStatistics/index.vue
@@ -1,9 +1,326 @@
<template>
  <div>检测项目统计</div>
</template>
  <div class="inspection-main" v-loading="loading">
    <div class="inspection-content" style="height:100%">
      <!-- <p style="font-size: 16px;padding:19.5px 0px">检测项目统计</p> -->
      <el-row :gutter="20">
        <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;">
          <div class="inspection-card inspection-head">
            <div class="inspection-head-left">
              <h4>今日项目接收</h4>
              <span >{{ pageData.RECEVICE }}</span>
              <div class="inspection-head-left-info">
                <img :src="`../../../static/img/daliy-${pageData.RECEIVE_RATIO<0?'down':'up'}.svg`" alt="">
                <span :class="{active:pageData.RECEIVE_RATIO<0}" class="num" v-html="`&nbsp; ${handleData(pageData.RECEIVE_RATIO)}%&nbsp; `"></span>
                <span style="font-size: 12px;">较昨天</span>
              </div>
            </div>
            <img src="../../../static/img/daliy-0.svg" alt="" srcset="">
          </div>
        </el-col>
        <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;">
          <div class="inspection-card inspection-head">
            <div class="inspection-head-left">
              <h4>今日项目完成</h4>
              <span >{{ pageData.FINISHE }}</span>
              <div class="inspection-head-left-info">
                <img :src="`../../../static/img/daliy-${pageData.FINISHE_RATIO<0?'down':'up'}.svg`" alt="">
                <span :class="{active:pageData.FINISHE_RATIO<0}" class="num" v-html="`&nbsp; ${handleData(pageData.FINISHE_RATIO)}%&nbsp; `"></span>
                <span style="font-size: 12px;">较昨天</span>
              </div>
            </div>
            <img src="../../../static/img/daliy-1.svg" alt="" srcset="">
          </div>
        </el-col>
        <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;">
          <div class="inspection-card inspection-head">
            <div class="inspection-head-left">
              <h4>今日项目剩余</h4>
              <span >{{ pageData.SURPLUS }}</span>
              <div class="inspection-head-left-info">
                <img :src="`../../../static/img/daliy-${pageData.SURPLUS_RATIO<0?'down':'up'}.svg`" alt="">
                <span :class="{active:pageData.SURPLUS_RATIO<0}" class="num" v-html="`&nbsp; ${handleData(pageData.SURPLUS_RATIO)}%&nbsp; `"></span>
                <span style="font-size: 12px;">较昨天</span>
              </div>
            </div>
            <img src="../../../static/img/daliy-2.svg" alt="" srcset="">
          </div>
        </el-col>
        <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;">
          <div class="inspection-card inspection-head" style="flex-direction: column;padding-bottom: 5px;">
            <h4 style="margin-bottom: 5px;">今日项目合格率</h4>
            <echart-module :id="'inspection-qualified'" :config="chartConfig2" :datas="chartData2" style="align-self: center;"></echart-module>
          </div>
        </el-col>
        <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;">
          <div class="inspection-card inspection-head" style="flex-direction: column;padding-bottom: 5px;">
            <h4 style="margin-bottom: 5px;">今日项目完成率</h4>
            <echart-module :id="'inspection-complete'" :config="chartConfig3" :datas="chartData3" style="align-self: center;"></echart-module>
          </div>
        </el-col>
        <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;">
          <div class="inspection-card inspection-head" style="flex-direction: column;padding-bottom: 5px;">
            <h4 style="margin-bottom: 5px;">今日项目延期率</h4>
            <echart-module :id="'inspection-extension'" :config="chartConfig4" :datas="chartData4" style="align-self: center;"></echart-module>
          </div>
        </el-col>
      </el-row>
      <el-row :gutter="20" style="height: calc(100% - 170px);">
        <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" style="margin-bottom: 16px; height: 100%;">
          <div class="inspection-card chart-box" style="height: 100%;">
            <h4>近10日项目接收量</h4>
            <echart-module :id="'inspection-left'" :config="chartConfig0" :datas="chartData0" style="height: calc(100% - 32px);"></echart-module>
          </div>
        </el-col>
        <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" style="margin-bottom: 16px;height: 100%;">
          <div class="inspection-card chart-box" style="height: 100%;">
            <h4>近10日实际完成项目与接收项目对比</h4>
            <echart-module :id="'inspection-right'" :config="chartConfig1" :datas="chartData1" style="height: calc(100% - 32px);"></echart-module>
          </div>
        </el-col>
      </el-row>
    </div>
  </div>
  </template>
<script>
export default {};
</script>
  <script>
<style></style>
  import EchartModule from '@/components/Echart/echart.vue'
  import {
    testProductByDay
} from "../../../api/chart/dailyBusinessStatistical";
  export default {
    components: {EchartModule},
    data(){
      return{
        chartConfig0:{
          height: '',
          isLoading:true,
          type:'line'
        },
        chartData0:{
          xData:[],
          yData:[
            {
              title:'项目接收量',
              data:[]
            }
          ]
        },
        chartConfig1:{
          height: '',
          isLoading:true,
          type:'bar'
        },
        chartData1:{
          xData:[],
          yData:[
            {
              title:'今日接收',
              data:[]
            },
            {
              title:'今日完成',
              data:[]
            },
          ]
        },
        chartConfig2:{
          height: '103px',
          width:'140px',
          isLoading:true,
          type:'pie'
        },
        chartData2:{
          title:'今日项目合格率',
          percentage:'0',
          color:['#1CCAB8','#E1E4E8'],
          data:[
            {
              name:'合格',
              value:'0'
            },
            {
              name:'不合格',
              value:'0'
            },
          ]
        },
        chartConfig3:{
          height: '103px',
          width:'140px',
          isLoading:true,
          type:'pie'
        },
        chartData3:{
          title:'今日项目完成率',
          percentage:'0',
          color:['#FBB647','#E1E4E8'],
          data:[
            {
              name:'完成',
              value:'0'
            },
            {
              name:'未完成',
              value:'0'
            },
          ]
        },
        chartConfig4:{
          height: '103px',
          width:'140px',
          isLoading:true,
          type:'pie'
        },
        chartData4:{
          title:'今日项延期率',
          percentage:'0',
          color:['#FF3838','#E1E4E8'],
          data:[
            {
              name:'延期',
              value:'0'
            },
            {
              name:'未延期',
              value:'0'
            },
          ]
        },
        loading:false,
        pageData:{},
        timers:null
      }
    },
    mounted(){
      this.init()
      this.timers&&clearInterval(this.timers);
      setInterval(this.init(),1000*60*5)
    },
    methods:{
      init(){
      this.chartConfig0.isLoading = false
      this.chartConfig1.isLoading = false
      this.chartConfig2.isLoading = false
      this.chartConfig3.isLoading = false
      this.chartConfig4.isLoading = false
      this.loading = true;
      testProductByDay().then(res => {
        if (res.code == 201) return
        this.pageData = this.HaveJson(res.data)
        let xData = res.data.DAYS.map(m=>{
          let arr = m.split('-')
          return `${arr[1]}-${arr[2]}`
        })
        this.chartData0.xData = xData
        this.chartData1.xData = xData
        this.chartData0.yData[0].data = this.pageData.RECETENDAYS
        this.chartData1.yData[0].data = this.pageData.RECETENDAYS
        this.chartData1.yData[1].data = this.pageData.FINISHTENDAYS
        this.chartData2.percentage = (this.pageData.ACCEPT_RATE_TODAY*100).toFixed(0)+'%'
        this.chartData3.percentage = (this.pageData.FINISH_RATE_TODAY*100).toFixed(0)+'%'
        this.chartData4.percentage = (this.pageData.DELAY_RATE_TODAY*100).toFixed(0)+'%'
        this.chartData2.data[0].value = this.pageData.ACCEPT
        this.chartData2.data[1].value = this.pageData.FINISHE - this.pageData.ACCEPT
        this.loading = false;
        this.chartData3.data[0].value = this.pageData.FINISHE
        this.chartData3.data[1].value = this.pageData.RECEVICE - this.pageData.FINISHE
        this.chartData4.data[0].value = this.pageData.SURPLUS
        this.chartData4.data[1].value = this.pageData.RECEVICE - this.pageData.SURPLUS
        this.chartConfig0.isLoading = true
        this.chartConfig1.isLoading = true
        this.chartConfig2.isLoading = true
        this.chartConfig3.isLoading = true
        this.chartConfig4.isLoading = true
      })
      },
      handleData(val){
        if(val){
          let num = Math.abs(val)*100
          return num.toFixed(0);
        }else{
          return '0'
        }
      }
    },
    deactivated(){
      this.timers&&clearInterval(this.timers);
    }
  }
  </script>
  <style scoped>
  .inspection-main{
    height: 450px;
    overflow-y: auto;
    overflow-x: hidden;
  }
  .inspection-content{
    padding: 20px 0;
    box-sizing: border-box;
  }
  .inspection-card{
    width: 100%;
    background: #FFFFFF;
    border-radius: 14px;
    box-shadow: 6px 6px 54px 0px rgba(0,0,0,0.05);
  }
  .inspection-head{
    padding: 16px;
    box-sizing: border-box;
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
  }
  .inspection-head h4{
    color: #202224;
    font-size: 16px;
    font-weight: 400;
    margin-bottom: 20px;
    opacity: 0.8;
  }
  .inspection-head-left>span{
    font-family: Nunito Sans-Bold;color: #202224;
    font-weight: bold;
    font-size: 28px;
    display: inline-block;
    margin-bottom: 16px;
  }
  .inspection-head-left .inspection-head-left-info{
    display: flex;
    align-items: center;
    font-size: 16px;
    color: #202224;
  }
  .inspection-head-left .inspection-head-left-info .num{
    color: #00B69B;
  }
  .inspection-head-left .inspection-head-left-info .num.active{
    color: #F93C65;
  }
  .chart-box{
    padding: 16px 24px;
    box-sizing: border-box;
  }
  .chart-box h4{
    color: #202224;
    font-family: PingFang SC-Regular;
    font-weight: 400;
    font-size: 24px;
    margin-bottom: 16px;
  }
  .chart{
    width: 100%;
    height: 450px;
  }
  </style>