From 2b6c67c330d86e84dfbeec9b7b66a45567aaeb00 Mon Sep 17 00:00:00 2001
From: Lius <Lius2225@163.com>
Date: 星期二, 05 八月 2025 17:11:46 +0800
Subject: [PATCH] MDC设备车间树改造,设备权限改造

---
 src/views/mdc/base/modules/StatisticalAnalysis/StatisticalAnalysisMain.vue |  671 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 671 insertions(+), 0 deletions(-)

diff --git a/src/views/mdc/base/modules/StatisticalAnalysis/StatisticalAnalysisMain.vue b/src/views/mdc/base/modules/StatisticalAnalysis/StatisticalAnalysisMain.vue
new file mode 100644
index 0000000..2a3ad68
--- /dev/null
+++ b/src/views/mdc/base/modules/StatisticalAnalysis/StatisticalAnalysisMain.vue
@@ -0,0 +1,671 @@
+<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_text" style="width: 8%;">
+          <p>寮�鏈虹巼</p>
+          <p>{{UtilizationHeight}}%</p>
+          <p>鍒╃敤鐜�</p>
+          <p>{{StatCharUsedRate}}%</p>
+        </div>
+        <div class="PowerOnRate-right" ref="PowerOnRateLine" id="PowerOnRateLine"></div>
+        <div  class="PowerOnRate_text" style="width: 8%">
+          <table width="85px;" align="center">
+            <tr>
+              <td align="right"><div style="width: 15px;height: 15px;background-color: #6496e9;position: static;"/></td>
+              <td align="left">寮�鏈�</td>
+            </tr>
+            <tr>
+              <td align="right"><div style="width: 15px;height: 15px;background-color: #A8A8A8;position: static;"/></td>
+              <td align="left">鍏虫満</td>
+            </tr>
+            <tr>
+              <td align="right"><div style="width: 15px;height: 15px;background-color: #4ecee1"/></td>
+              <td align="left">杩愯</td>
+            </tr>
+            <tr>
+              <td align="right"><div style="width: 15px;height: 15px;background-color: #FCCE10"/></td>
+              <td align="left">寰呮満</td>
+            </tr>
+          </table>
+        </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-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-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: 'StatisticalAnalysisMain',
+    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:null,
+        },
+        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()
+      // this.queryStatistical();
+      // this.getTime(37800);
+    },
+
+    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 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
+          },
+          // toolbox: {
+          //   show : true,
+          //   padding: 15,
+          //   feature : {
+          //     saveAsImage : {show: true,title:'淇濆瓨鍥剧墖',name :'璁惧鏁堢巼缁熻鎶ヨ〃'}
+          //   }
+          // },
+          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,
+              color:'#dadde4',
+              lineStyle:{
+                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,4,5],
+              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  statChartPieOption1 = {
+          // title: {
+          //   x: 'left',
+          //   subtext: '寮�鏈烘晥鐜�',
+          //   textStyle: {
+          //     color: '#268e80',
+          //     fontSize: 20,
+          //
+          //   },
+          // },
+          tooltip: {
+            trigger: 'item',
+            // formatter: "{a} <br/>{b} : {c} ({d}%)"锛�
+            formatter:params=>{
+              const value=String(params.value)
+              return value.length==2&&value[0]==='0'?`${params.seriesName}<br/>${params.name}锛�${value.slice(1)}H锛�${params.percent}%锛塦:`${params.seriesName}<br/>${params.name}锛�${value}H锛�${params.percent}%锛塦
+            }
+          },
+          legend: {
+            orient: 'vertical',
+            x: '85%',
+            y: '50%',
+            data: ['寮�鏈烘椂闂�', '鍏虫満鏃堕棿']
+          },
+          calculable: true,
+          series: [{
+            name: '寮�鏈烘晥鐜�',
+            type: 'pie',
+            radius: '70%',
+            /*center: ['55%', '55%'],*/
+            itemStyle: {
+              normal: {
+                color: function (params) {
+                  let colorList = [ '#6496e9','#849db8'];
+                  return colorList[params.dataIndex]
+                },
+                label: {
+                  show: true,
+                  position: 'top',
+                  // formatter: '{b}\n{c}',
+                  // formatter:params=>String(params.value).length==2?params.name+String(params.value).slice(1):params.name+String(params.value)
+                  formatter:params=>{
+                    const value=String(params.value)
+                    return value.length==2&&value[0]==='0'?params.name+' '+value.slice(1)+'H':params.name+' '+value+'H'
+                  }
+                }
+              }
+            },
+            data: [{value: this.openingLong, name: '寮�鏈烘椂闂�'},
+              {value: this.closedLong, name: '鍏虫満鏃堕棿'}]
+          }]
+        };
+        UtilizationLine.setOption(statChartPieOption1);
+
+        //杩愯鏃堕棿\寰呮満鏃堕棿
+        let StartupLine = this.$echarts.init(document.getElementById('StartupLine'), 'macarons');
+        let statChartPieOption2 = {
+          // title: {
+          //   x: 'left',
+          //   subtext: '杩愯鏁堢巼'
+          // },
+          tooltip: {
+            trigger: 'item',
+            // formatter: "{a} <br/>{b} : {c} ({d}%)",
+            formatter:params=>{
+              const value=String(params.value)
+              return value.length==2&&value[0]==='0'?`${params.seriesName}<br/>${params.name}锛�${value.slice(1)}H锛�${params.percent}%锛塦:`${params.seriesName}<br/>${params.name}锛�${value}H锛�${params.percent}%锛塦
+            }
+          },
+          legend: {
+            orient: 'vertical',
+            x: '85%',
+            y: '50%',
+            data: ['杩愯鏃堕棿', '寰呮満鏃堕棿']
+          },
+          calculable: true,
+          series: [{
+            name: '杩愯鏁堢巼',
+            type: 'pie',
+            radius: '70%',
+            itemStyle: {
+              normal: {
+                color: function (params) {
+                  var colorList = ['#4ecee1', '#FCCE10'];
+                  return colorList[params.dataIndex]
+                },
+                label: {
+                  show: true,
+                  position: 'top',
+                  // formatter: '{b}\n{c}',
+                  formatter:params=>{
+                    const value=String(params.value)
+                    return value.length==2&&value[0]==='0'?params.name+' '+value.slice(1)+'H':params.name+' '+value+'H'
+                  }
+                }
+              }
+            },
+            data: [{value: this.processLong, name: '杩愯鏃堕棿'},
+              {value: this.waitingLong, name: '寰呮満鏃堕棿'}]
+          }]
+        };
+        StartupLine.setOption(statChartPieOption2);
+      },
+      queryStatistical(){
+        getAction(this.url.dayStatisticalRate,this.queryParams).then(res =>{
+          if(res.success) {
+            // console.log(res);
+            this.StatCharOpeningRate = res.result.openRate;
+            //鍒╃敤鐜�
+            this.StatCharUsedRate = res.result.utilizationRate;
+            //寮�鏈虹巼
+            this.UtilizationHeight = res.result.openRate;
+            this.StatCharUsedopeningRate = res.result.StartupHeight;
+            this.StartupHeight = res.result.StartupHeight;
+            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) {
+        this.queryParam.collectTime1 = "";
+        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) {
+            if(res.result[0]){
+              _this.$set(this.queryParam, 'tierName', res.result[0].title)
+              _this.$set(this.queryParams, 'parentId', res.result[0].key)
+            }
+            // console.log(res.result[0].entity.tierName)
+            _this.queryStatistical()
+          } else {
+            // this.$message.warn(res.message)
+            this.$notification.warning({
+              message:'娑堟伅',
+              description:res.message
+            });
+          }
+        }).finally(() => {
+          this.loading = false
+          this.cardLoading = false
+        })
+        // getAction(this.url.getEquipmentByPid, { pid: id }).then((res) => {
+        //   if (res.success) {
+        //     if (res.result) {
+        //       _this.$set(this.queryParam, 'tierName', res.result.tierName)
+        //       _this.$set(this.queryParam, 'equipmentId', res.result.equipmentId)
+        //       // _this.quip = res.result
+        //       _this.searchQuery()
+        //     } else {
+        //       _this.$message.warning('璇烽厤缃澶囷紒')
+        //     }
+        //   }
+        // })
+      },
+      searchReset() {
+        this.queryParam = {}
+        this.queryParams = {
+          collectTime:moment().add(-1,'d').format('YYYY-MM-DD'),
+          dateTime:moment().add(-1,'d').format('YYYYMMDD')
+        }
+        this.initEquipmentNode()
+        // this.dates = []
+        // this.queryStatistical()
+        // this.onClearSelected()
+      },
+      searchQuery(){
+        this.queryStatistical();
+      }
+    },
+    watch: {
+      equip(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()
+      }
+    }
+  }
+</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_text{
+    width: 10%;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    font-weight: 800;
+  }
+  .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>
\ No newline at end of file

--
Gitblit v1.9.3