cuilei
5 天以前 ba77fdc6a30c9ad0941e40319f8c4f6fe6fdf9f1
src/views/mdc/base/modules/StatisticsChart/StatisticsLegend.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,866 @@
<template>
  <div id="StatisticsLegend"
       style="width: 100%; height: 100%; overflow: hidden;display: flex;flex-direction: column;background-color: #f5f4f4">
    <!-- æŸ¥è¯¢åŒºåŸŸ -->
    <div style="width: 100%; height: 44px; background-color: #fff" class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
          <a-col :md="5" :sm="5" :xs="5">
            <a-form-item label="名称">
              <a-input placeholder="请选择树节点" :readOnly="readOnly" v-model="queryParam.tierName"></a-input>
            </a-form-item>
          </a-col>
          <a-col :md="4" :sm="4" :xs="4">
            <a-form-item label="日期">
              <a-date-picker v-model="queryParams.collectTime" :disabledDate="disabledDate" format='YYYY-MM-DD'
                             @change="dataChange" :allowClear="false"/>
            </a-form-item>
          </a-col>
          <a-col :md="2" :sm="2" :xs="2">
            <a-space>
              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
              <a-button type="primary" @click="searchReset" icon="reload">重置</a-button>
            </a-space>
          </a-col>
        </a-row>
      </a-form>
    </div>
    <!--开机率-->
    <div class="PowerOnRate  Line-box">
      <div class="title">
        <div class="circle"></div>
        <div class="text">利用率</div>
      </div>
      <div class="PowerOnRate-box box-bottom">
        <div class="PowerOnRate-left" ref="PowerOnRatePie" id="PowerOnRatePie"></div>
        <div class="PowerOnRate-right" ref="PowerOnRateLine" id="PowerOnRateLine"></div>
      </div>
    </div>
    <!--利用率和开动率-->
    <div class="UtilizationStartup">
      <div class="Utilization Line-box">
        <div class="title">
          <div class="circle"></div>
          <div class="text">开机率</div>
        </div>
        <div class="Utilization-box box-bottom">
          <div class="Utilization-left left">
            <div class="left-box">
              <div class="left-box-con">
                <div class="Rate-box-kong" :style="{height:100-UtilizationHeight+'%'}"></div>
                <div class="Rate-box" :style="{height:UtilizationHeight+'%'}">
                  <p class="Rate-box-text">
                    <span ref="UtilizationRate">{{UtilizationHeight}}%</span>
                    <br>
                    å¼€æœºçއ
                  </p>
                </div>
              </div>
            </div>
          </div>
          <div class="Utilization-right" ref="UtilizationLine" id="UtilizationLine"></div>
        </div>
      </div>
      <div class="Startup Line-box">
        <div class="title">
          <div class="circle"></div>
          <div class="text">开动率</div>
        </div>
        <div class="Startup-box box-bottom">
          <div class="Startup-left left" ref="StartupRate">
            <div class="left-box">
              <div class="left-box-con">
                <div class="Rate-box-kong" :style="{height:100-StartupHeight+'%'}"></div>
                <div class="Rate-box" :style="{height:StartupHeight+'%'}">
                  <p class="Rate-box-text">
                    <span>{{StatCharUsedopeningRate}}%</span>
                    <br>
                    å¼€åŠ¨çŽ‡
                  </p>
                </div>
              </div>
            </div>
          </div>
          <div class="Startup-right" ref="StartupLine" id="StartupLine"></div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
  import moment from 'moment'
  import { putAction, getAction } from '@/api/manage'
  import $ from 'jquery'
  import * as echarts from 'echarts'
  export default {
    name: 'StatisticsLegend',
    props: { equip: {} },
    data() {
      return {
        readOnly: true,
        showday: true,
        StatCharOpeningRate: 0,
        StatCharUsedRate: 0,
        StatCharUsedopeningRate: 0,
        openingLong: 0,
        waitingLong: 0,
        processLong: 0,
        closedLong: 0,
        totalLong: 0,
        UtilizationHeight: 0,
        StartupHeight: 0,
        quip: {},
        dates: [],
        queryParam: {},
        queryParams: {
          collectTime: undefined
        },
        shiftSubList: [],
        shiftList: [],
        url: {
          getEquipmentByPid: '/mdc/mdcequipment/getEquipmentByPid',
          dayStatisticalRate: '/mdc/efficiencyReport/dayStatisticalRate',
          getBaseTree: '/mdc/mdcEquipment/queryTreeListByProduction'
        }
      }
    },
    created() {
      let collectTime = moment(moment().add(-1, 'd'), 'YYYY-MM-DD')
      this.queryParams.collectTime = moment().add(-1, 'd').format('YYYY-MM-DD')
      this.queryParams.dateTime = moment().add(-1, 'd').format('YYYYMMDD')
      this.initEquipmentNode()
    },
    methods: {
      disabledDate(current) {
        //Can not slect days before today and today
        return current && current > moment().subtract('days', 1)
      },
      //把秒计算成对应的时分秒的函数
      getTime(time) {
        //转换为时分秒
        let h = Math.round(time / 60 / 60)
        h = h < 10 ? '0' + h : h
        //作为返回值返回
        // console.log(h);
        return h
      },
      moment,
      draw() {
        //利用率
        //饼图
        let PowerOnRatePie = this.$echarts.init(document.getElementById('PowerOnRatePie'), 'macarons')
        let PowerOnRatePie_option = {
          // color: ["#3859fa", '#ccc'],
          title: {
            text: this.StatCharUsedRate + '%',
            subtext: '利用率',
            textStyle: {
              color: '#268e80',
              fontSize: 18
            },
            subtextStyle: {
              color: '#292929'
            },
            x: 'center',
            y: 'center'
          },
          series: [{
            name: '',
            type: 'pie',
            radius: ['55%', '70%'],
            itemStyle: {
              normal: {
                borderWidth: 4,//扇区间加间隔
                borderColor: '#fff'//间隔为白色
              }
            },
            label: {
              normal: {
                show: false
              }
            },
            data: [{
              value: 100,
              itemStyle: {
                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                  offset: 0,
                  color: '#88a8fd'
                },
                  {
                    offset: 1,
                    color: '#544cee'
                  }], false)
              }
            },
              {
                value: 100 - this.StatCharUsedRate,
                itemStyle: {
                  color: '#f0f3f5'
                }
              }
            ]
          }
          ]
        }
        PowerOnRatePie.setOption(PowerOnRatePie_option)
        let PowerOnRateLine = this.$echarts.init(document.getElementById('PowerOnRateLine'), 'macarons')
        let PowerOnRateLine_option = {
          tooltip: {
            trigger: 'axis'
          },
          grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            top: 60,
            containLabel: true
          },
          legend: {
            // selected:{
            //     "曲线":false,
            // },
            top: '0',
            right: '10',
            //设置单选多选模式
            // selectedMode:'single',
            icon: 'pin',
            data: [
              // {
              //   name:'曲线',
              //   textStyle:{
              //     padding:4,
              //     color:'#e957ff',
              //     // borderWidth:1,
              //     fontSize:16,
              //     // borderColor:'#50E6D7'
              //   }
              // },
              {
                name: '柱状图',
                textStyle: {
                  padding: 4,
                  fontSize: 16,
                  color: '#9996f8'
                  // borderWidth:1,
                  // borderColor:'#50E6D7'
                }
              }
            ]
          },
          xAxis: {
            type: 'category',
            data: ['开机时长', '关机时长', '运行时长', '待机时长'],
            axisLabel: {          //坐标轴字体颜色
              textStyle: {
                color: '#000'
              }
            },
            axisLine: {
              lineStyle: {
                color: '#e5e5e5'
              }
            },
            axisTick: {       //y轴刻度线
              show: false
            },
            splitLine: {    //网格
              show: false
            },
            boundaryGap: true
          },
          yAxis: {
            name: '时间/小时',
            type: 'value',
            axisLabel: {        //坐标轴字体颜色
              textStyle: {
                color: '#000'
              }
            },
            axisLine: {
              show: false
            },
            axisTick: {       //y轴刻度线
              show: false
            },
            splitLine: {    //网格
              show: true,
              lineStyle: {
                color: '#dadde4',
                type: 'dashed'
              }
            }
          },
          series: [
            //   {
            //   name:'曲线',
            //   type: 'line',
            //   smooth:true,
            //   symbol: 'circle',
            //   symbolSize: 8,
            //   label:{
            //     show:true,
            //     position:"top",
            //     textStyle:{
            //       color:'#000',
            //     },
            //     formatter:"时长:{c}H"
            //   },
            //   itemStyle: {
            //     color: "rgb(87, 120, 225)",
            //     borderColor: "#fff",
            //     borderWidth: 2,
            //     shadowColor: 'rgba(0, 0, 0, .3)',
            //   },
            //   lineStyle: {
            //     normal: {
            //       color:"rgb(87, 120, 225)",
            //       shadowColor: 'rgba(87, 120, 225, .4)',
            //       shadowBlur: 8,
            //       shadowOffsetY: 10,
            //       shadowOffsetX: 0,
            //     },
            //   },
            //   areaStyle: {
            //     normal: {
            //       color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
            //         offset: 0,
            //         color: 'rgba(87, 120, 225, .6)'
            //       }, {
            //         offset: 1,
            //         color: 'rgba(87, 120, 225, .3)'
            //       }]),
            //     }
            //   },
            //   data: [this.openingLong, this.closedLong, this.processLong,this.waitingLong],
            // },
            {
              name: '柱状图',
              type: 'bar',
              data: [this.openingLong, this.closedLong, this.processLong, this.waitingLong],
              // data:[22,3,5,6],
              barWidth: 25,
              label: {
                show: true,
                position: 'top',
                textStyle: {
                  color: '#000'
                },
                // formatter:"时长:{c}H",
                formatter: params => {
                  const value = String(params.value)
                  return value.length == 2 && value[0] === '0' ? `时长:${value.slice(1)}H` : `时长:${value}H`
                }
              },
              itemStyle: {
                normal: {
                  color: function(params) {
                    let colorList = [
                      ['#6496e9', '#6bded3'],
                      ['#849db8', '#b4b8cc'],
                      ['#4fe1c5', '#4ecee1'],
                      // ["#9978fa","#88a1fa"],
                      ['#ffbb65', '#fdc68b']
                    ]
                    // return colorList[params.dataIndex];
                    let colorItem = colorList[params.dataIndex]
                    return new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                      offset: 0,
                      color: colorItem[0]
                    },
                      {
                        offset: 1,
                        color: colorItem[1]
                      }], false)
                  },
                  barBorderRadius: [5, 5, 0, 0]
                }
              }
            }]
        }
        PowerOnRateLine.setOption(PowerOnRateLine_option)
        //开机率
        let UtilizationLine = this.$echarts.init(document.getElementById('UtilizationLine'), 'macarons')
        let UtilizationLine_option = {
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'shadow'
            }
          },
          grid: {
            top: '15%',
            right: '3%',
            left: '10%',
            bottom: '12%'
          },
          xAxis: [{
            type: 'category',
            data: ['开机时长', '总时长'],
            axisLine: {
              lineStyle: {
                // color: 'rgba(70, 196, 255, .8)'
              }
            },
            axisTick: {
              show: false
            },
            axisLabel: {
              // color: 'rgba(111, 132, 189, 1)',
              textStyle: {
                fontSize: 14
              }
            }
          }],
          yAxis: [{
            type: 'value',
            name: '时间/小时',
            nameTextStyle: {
              // color: 'rgba(111, 132, 189, 1)'
            },
            axisLabel: {
              formatter: '{value}'
              // color: 'rgba(111, 132, 189, 1)',
            },
            axisTick: {
              show: false
            },
            axisLine: {
              show: false
            },
            splitLine: {
              lineStyle: {
                // color: 'rgba(70, 196, 255, .3)'
              }
            }
          }],
          series: [
            {
              type: 'bar',
              data: [this.openingLong, this.totalLong],
              // data:[22,22],
              barWidth: 25,
              label: {
                show: true,
                position: 'top',
                textStyle: {
                  color: '#000'
                },
                // formatter:"时长:{c}H",
                formatter: params => {
                  const value = String(params.value)
                  return value.length == 2 && value[0] === '0' ? `时长:${value.slice(1)}H` : `时长:${value}H`
                }
              },
              itemStyle: {
                normal: {
                  color: function(params) {
                    let colorList = [
                      ['#6496e9', '#6bded3'],
                      ['#9978fa', '#88a1fa']
                    ]
                    // return colorList[params.dataIndex];
                    let colorItem = colorList[params.dataIndex]
                    return new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                      offset: 0,
                      color: colorItem[0]
                    },
                      {
                        offset: 1,
                        color: colorItem[1]
                      }], false)
                  },
                  barBorderRadius: [5, 5, 0, 0]
                }
              }
            }]
        }
        UtilizationLine.setOption(UtilizationLine_option)
        //开动率
        let StartupLine = this.$echarts.init(document.getElementById('StartupLine'), 'macarons')
        let StartupLine_option = {
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'shadow'
            }
          },
          grid: {
            top: '15%',
            right: '3%',
            left: '10%',
            bottom: '12%'
          },
          xAxis: [{
            type: 'category',
            data: ['运行时长', '开机时长'],
            axisLine: {
              lineStyle: {
                // color: 'rgba(70, 196, 255, .8)'
              }
            },
            axisTick: {
              show: false
            },
            axisLabel: {
              // color: 'rgba(111, 132, 189, 1)',
              textStyle: {
                fontSize: 14
              }
            }
          }],
          yAxis: [{
            type: 'value',
            name: '时间/小时',
            nameTextStyle: {
              // color: 'rgba(111, 132, 189, 1)'
            },
            axisLabel: {
              formatter: '{value}'
              // color: 'rgba(111, 132, 189, 1)',
            },
            axisTick: {
              show: false
            },
            axisLine: {
              show: false
            },
            splitLine: {
              lineStyle: {
                // color: 'rgba(70, 196, 255, .3)'
              }
            }
          }],
          series: [{
            type: 'bar',
            data: [this.processLong, this.openingLong],
            // data:[22,22],
            barWidth: 25,
            label: {
              show: true,
              position: 'top',
              textStyle: {
                color: '#000'
              },
              // formatter:"时长:{c}H",
              formatter: params => {
                const value = String(params.value)
                return value.length == 2 && value[0] === '0' ? `时长:${value.slice(1)}H` : `时长:${value}H`
              }
            },
            itemStyle: {
              normal: {
                color: function(params) {
                  let colorList = [
                    ['#4fe1c5', '#4ecee1'],
                    ['#6496e9', '#6bded3']
                  ]
                  // return colorList[params.dataIndex];
                  let colorItem = colorList[params.dataIndex]
                  return new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: colorItem[0]
                  },
                    {
                      offset: 1,
                      color: colorItem[1]
                    }], false)
                },
                barBorderRadius: [5, 5, 0, 0]
              }
            }
          }]
        }
        StartupLine.setOption(StartupLine_option)
      },
      queryStatistical() {
        getAction(this.url.dayStatisticalRate, this.queryParams).then(res => {
          if (res.success) {
            this.StatCharOpeningRate = res.result.openRate
            this.StatCharUsedRate = res.result.utilizationRate
            this.UtilizationHeight = res.result.openRate
            this.StatCharUsedopeningRate = res.result.usedOpenRate
            this.StartupHeight = res.result.usedOpenRate
            this.openingLong = this.getTime(res.result.openLong)
            this.waitingLong = this.getTime(res.result.waitLong)
            this.processLong = this.getTime(res.result.processLong)
            this.closedLong = this.getTime(res.result.closeLong)
            this.totalLong = parseInt(this.openingLong) + parseInt(this.closedLong)
            this.draw()
          }
        })
      },
      dataChange(val) {
        if (val) {
          this.queryParams.dateTime = val.format('YYYYMMDD')
          this.queryParams.collectTime = val.format('YYYY-MM-DD')
        }
      },
      initEquipmentNode() {
        let _this = this
        getAction(this.url.getBaseTree).then((res) => {
          if (res.success) {
            const { isEquipment, productionId, tierName } = this.$route.params
            // åˆ¤æ–­æ˜¯å¦æ˜¯ä»Žçœ‹æ¿è·³è½¬è¿‡æ¥ï¼ŒproductionId å­˜åœ¨åˆ™ä¸ºä»Žçœ‹æ¿è·³è½¬
            if (productionId) {
              // åˆ¤æ–­æ˜¯å¦ç‚¹å‡»çš„æ˜¯è®¾å¤‡å±‚级
              if (!isEquipment) {
                _this.$set(this.queryParams, 'parentId', productionId)
                _this.$set(this.queryParam, 'tierName', tierName)
              } else {
                _this.$set(this.queryParams, 'equipmentId', productionId)
                _this.$set(this.queryParam, 'tierName', productionId + '/' + tierName)
              }
            } else {
              if (res.result[0]) {
                _this.$set(this.queryParam, 'tierName', res.result[0].title)
                _this.$set(this.queryParams, 'parentId', res.result[0].key)
              }
            }
            this.queryStatistical()
          } else {
            this.$notification.warning({
              message: '消息',
              description: res.message
            })
          }
        }).finally(() => {
          this.loading = false
          this.cardLoading = false
        })
      },
      searchReset() {
        this.queryParam = {}
        this.queryParams = {
          collectTime: moment().add(-1, 'd').format('YYYY-MM-DD'),
          dateTime: moment().add(-1, 'd').format('YYYYMMDD')
        }
        this.initEquipmentNode()
      },
      searchQuery() {
        this.queryStatistical()
      }
    },
    watch: {
      equip(val) {
        // console.log(val);
        if (val && val.equipmentId) {
          this.$set(this.queryParam, 'tierName', val.title)
          this.$set(this.queryParam, 'equipmentId', val.equipmentId)
          this.queryParams.parentId = ''
          this.queryParams.equipmentId = val.equipmentId
        } else {
          this.queryParams.parentId = val.key
          this.queryParams.equipmentId = ''
          this.$set(this.queryParam, 'tierName', val.title)
        }
        this.searchQuery()
      }
      // this.searchQuery();
    }
  }
</script>
<style scoped>
  .charContent {
    display: flex;
  }
  @media screen and (min-width: 1920px) {
    #StatisticsLegend {
      height: 748px !important;
      overflow: scroll;
    }
  }
  @media screen and (min-width: 1680px) and (max-width: 1920px) {
    #StatisticsLegend {
      height: 748px !important;
      overflow: scroll;
    }
  }
  @media screen and (min-width: 1400px) and (max-width: 1680px) {
    #StatisticsLegend {
      height: 600px !important;
      overflow: scroll;
    }
  }
  @media screen and (min-width: 1280px) and (max-width: 1400px) {
    #StatisticsLegend {
      height: 501px !important;
      overflow: scroll;
    }
  }
  @media screen and (max-width: 1280px) {
    #StatisticsLegend {
      height: 501px !important;
      overflow: scroll;
    }
  }
  #StatisticsLegend .PowerOnRate {
    flex: 1;
    margin-bottom: 15px;
    background-color: #fff;
  }
  #StatisticsLegend .UtilizationStartup {
    flex: 1;
    display: flex;
  }
  #StatisticsLegend .UtilizationStartup > div {
    flex: 1;
    background-color: #fff;
  }
  #StatisticsLegend .UtilizationStartup .Utilization {
    margin-right: 15px;
  }
  .title {
    display: flex;
    align-items: center;
    padding-left: 15px;
    padding-top: 5px;
  }
  .title .circle {
    width: 15px;
    height: 15px;
    background-color: #7282ec;
    border-radius: 100%;
    margin-right: 10px;
  }
  .title .text {
    font-size: 2vh;
  }
  .Line-box {
    display: flex;
    flex-direction: column;
  }
  .Line-box .box-bottom {
    flex: 1;
  }
  .PowerOnRate-box {
    display: flex;
  }
  .PowerOnRate-box .PowerOnRate-left {
    width: 25%;
  }
  .PowerOnRate-box .PowerOnRate-right {
    flex: 1;
  }
  .Utilization-box {
    display: flex;
  }
  .Utilization-box .Utilization-left {
    width: 25%;
  }
  .Utilization-box .Utilization-right {
    flex: 1;
  }
  .Startup-box {
    display: flex;
  }
  .Startup-box .Startup-left {
    width: 25%;
  }
  .Startup-box .Startup-right {
    flex: 1;
  }
  .left {
    display: flex;
    align-items: center;
  }
  .left .left-box {
    width: 65%;
    height: 60%;
    margin: 0 auto;
    overflow: hidden;
    border-radius: 8px;
    /*border: 6px solid red;*/
    /*!*background-color: yellow;*!*/
    /*border-image: linear-gradient(to top, #2bf3c7, #06a8f8) 1;*/
  }
  .left-box-con {
    width: 100%;
    height: 100%;
    position: relative;
    text-align: center;
    border: 6px solid red;
    /*background-color: yellow;*/
    border-image: linear-gradient(to top, #2bf3c7, #06a8f8) 1;
  }
  .left .left-box .Rate-box-kong {
    width: 100%;
    background: -moz-linear-gradient(bottom, #b5dec2 0%, #f4f5ba 100%);
    background: -webkit-gradient(linear, bottom bottom, top top, color-stop(0%, #b5dec2), color-stop(100%, #f4f5ba));
    background: -webkit-linear-gradient(bottom, #b5dec2 0%, #f4f5ba 100%);
    background: -o-linear-gradient(bottom, #b5dec2 0%, #f4f5ba 100%);
    background: -ms-linear-gradient(bottom, #b5dec2 0%, #f4f5ba 100%);
    background: linear-gradient(to top, #b5dec2 0%, #f4f5ba 100%);
  }
  .left .left-box .Rate-box {
    position: absolute;
    text-align: center;
    bottom: 0;
    width: 100%;
    height: 89%;
    /*background-color: green;*/
    background: -moz-linear-gradient(bottom, #06a8f8 0%, #2bf3c7 100%);
    background: -webkit-gradient(linear, bottom bottom, top top, color-stop(0%, #06a8f8), color-stop(100%, #2bf3c7));
    background: -webkit-linear-gradient(bottom, #06a8f8 0%, #2bf3c7 100%);
    background: -o-linear-gradient(bottom, #06a8f8 0%, #2bf3c7 100%);
    background: -ms-linear-gradient(bottom, #06a8f8 0%, #2bf3c7 100%);
    background: linear-gradient(to top, #06a8f8 0%, #2bf3c7 100%);
  }
  .left .left-box .Rate-box p {
    position: absolute;
    bottom: 0;
    color: #fff;
    width: 100%;
    text-align: center;
  }
  .con-left {
    display: flex;
    flex-direction: column;
    flex-wrap: wrap;
    justify-content: space-around;
    align-items: center;
  }
  .con-left > span {
    flex: 1;
  }
</style>