From f3acb8ce787f3df0eda633031473be4e6a9ff448 Mon Sep 17 00:00:00 2001
From: zmc <zmc_li@foxmail.com>
Date: 星期四, 12 十月 2023 16:56:28 +0800
Subject: [PATCH] 油烟 更新了实时监控页面

---
 src/test/TestSelect.vue | 1918 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 1,729 insertions(+), 189 deletions(-)

diff --git a/src/test/TestSelect.vue b/src/test/TestSelect.vue
index 0f57761..919d833 100644
--- a/src/test/TestSelect.vue
+++ b/src/test/TestSelect.vue
@@ -1,208 +1,1748 @@
-<!-- 鑷姩浠庢帴鍙h幏鍙栨暟鎹� 鐢熸垚浠〃鐩� -->
-
-<script lang="ts">
-import axios from 'axios';
-import * as echarts from 'echarts';
-
-export default {
-  data() {
-    return {
-      loading:false,
-      smogData: [
-        // {
-        //     "time": "2023-06-24 13:23",
-        //     "value": 0.04,
-        //     "mnCode": "31011020175002"
-        // },
-        // {
-        //     "time": "2023-06-24 00:42",
-        //     "value": 0.04,
-        //     "mnCode": "31011020175004"
-        // },
-        // {
-        //     "time": "2023-05-24 20:39",
-        //     "value": 0.06,
-        //     "mnCode": "31011020175008"
-        // },
-        // {
-        //     "time": "2023-06-24 13:38",
-        //     "value": 0.66,
-        //     "mnCode": "64480047078091"
-        // },
-        // {
-        //     "time": "2023-05-24 20:39",
-        //     "value": 0.8,
-        //     "mnCode": "31011020175006"
-        // },
-        // {
-        //     "time": "2023-06-24 13:38",
-        //     "value": 0.69,
-        //     "mnCode": "64480047078099"
-        // },
-        // {
-        //     "time": "2023-05-24 20:39",
-        //     "value": 0.8,
-        //     "mnCode": "31011020175026"
-        // },
-        
-    ],//浠庡悗绔斁鍥炵殑鍊�
-      chartData: [], //浠庡浘鍍忚繑鍥炵殑鍊�
-    };
-  },
-  mounted() {
-      this.loading = true
-       //鑷姩鑾峰彇鎺ュ彛鍏ㄩ儴鏁版嵁
-      axios.get('https://fyami.com.cn/device/min/value/real_time', { params: { "page": 1, "per_page": 20 } }).then((result) => {
-      this.smogData = result.data.data
-      console.log(this.smogData);
-      this.loading = false
-    });
-   
-   
-  },
-
-  methods: {
-  showMore(){
-    this.smogData.forEach((device) => {
-        const chartDom = document.querySelector(`#chart-${device.mnCode}`) //鏍规嵁閫夋嫨鍣ㄨ幏鍙栧厓绱狅紝骞朵笖鍙繑鍥炲厓绱犱腑鐨勭涓�涓�
-        const chart = echarts.init(chartDom)
-
-        this.chartData = {
-        value: device.value,
-        axisLabel: {
-          show: true,
-          textStyle: {
-            color: '#666'
-          },
-          formatter: function (value) {
-            return value;
-          }
-        },
-        detail: {
-          formatter: function (value) {
-            return value + 'mg/m鲁';
-          },
-          textStyle: {
-            fontSize: 10,
-            fontWeight: 'bold'
-          },
-          offsetCenter: [0, '30%']
-        },
-        title: {
-          show: true,
-          text: '璁惧娌圭儫娴撳害',
-          textStyle: {
-            color: '#999',
-            fontSize: 14
-          },
-          offsetCenter: [0, '-30%']
-        },
-        axisLine: {
-          lineStyle: {
-            width: 10,
-            color: [
-              [0.2, '#67e0e3'],
-              [0.8, '#37a2da'],
-              [1, '#fd666d']
-            ]
-          }
-        },
-        splitLine: {
-          show: true,
-          length: 10,
-          lineStyle: {
-            color: 'auto',
-          }
-        },
-        axisTick: {
-          show: true,
-          length: 15,
-          lineStyle: {
-            color: 'auto',
-          }
-        }
-      };
-        
-        chart.setOption({
-          tooltip: {
-          formatter: '{a}: <br/> {c}mg/m鲁'
-        },
-        series: [
-          {
-            name: '娌圭儫娴撳害',
-            type: 'gauge',
-            min: 0,
-            max: 2,
-            splitNumber: 10,
-            axisLabel: this.chartData.axisLabel,
-            detail: this.chartData.detail,
-            data: [{ value: this.chartData.value, name: '' }],
-            title: this.chartData.title,
-            axisLine: this.chartData.axisLine,
-            splitLine: this.chartData.splitLine,
-            axisTick: this.chartData.axisTick
-          }
-        ]
-      });
-      })
-  }
-
-    },
-  }
-</script>
-
+<!-- 鍔ㄦ�佽绠楁姌绾垮浘瀹藉害 -->
 <template>
-  <div style="margin: 5px;">
-    <span style="color: #b1b3b8;" >瀹炴椂鏁版嵁</span>
-  </div>
+  <el-row ref="h1">
+    <el-col>
+   {{ windowWidth }}
+      <!-- 鑿滃崟璇绘爣棰� -->
+      <div ref="h1" class="header-container">
+        <span class="describe-info">搴楅摵鍚嶉�夋嫨锛�</span>
+        <!-- 搴楅摵鍚�  绾ц仈 -->
+        <ShopNameAndID @submit-id="(n) => (deviceId[1] = n)"></ShopNameAndID>
 
-  <hr style="margin-top: 10px;"/>
+        <!-- 寮傚父绫诲瀷閫夋嫨 -->
+        <ExceptionType @submitExceptionType="(val) => (exceptionValue = val)">
+        </ExceptionType>
 
-  <div >
-    <el-button @click="showMore" style="margin-top: 20px;margin-left: 20px">灞曠ず</el-button>
-    
-  </div>
-  <div v-loading="loading" > 
-    <!-- 鏍规嵁璁惧缂栧彿涓暟鍔ㄦ�佺敓鎴愪华琛ㄧ洏 -->
-    <el-row :gutter="20">
-      <el-col :span="12" v-for="device in smogData" :key="device.mnCode">
-        <div class="chart-container">
-          <div class="chart-title">璁惧{{ device.mnCode }}</div>
-          <div class="chart-content">
-            <div :id="'chart-' + device.mnCode" class="chartClass"></div>
-          </div>
-          <div>
-            <span>娴撳害鍊间负锛歿{ device.value }}</span>
-            <br/>
-            浜х敓鏃堕棿:{{ device.time}}
+        <TimeSelect @submit-time="giveTime"></TimeSelect>
+      </div>
+      <div
+        ref="h2"
+        style="display: flex; margin-top: 2px; justify-content: right"
+      >
+        <el-button
+          type="primary"
+          plain
+          @click="showTable"
+          style="margin-left: 20px"
+          :loading="button.queryButton"
+          >鏌ヨ</el-button
+        >
+
+        <el-tooltip
+          class="box-item"
+          effect="dark"
+          content="鐐瑰嚮鍙鍑篍xcel鏂囦欢"
+          placement="top-start"
+        >
+          <!-- 鍋氭垚鍑芥暟js鏂囦欢 -->
+          <el-icon
+            class="iconExcel clickable"
+            title="瀵煎嚭Excel鏂囦欢"
+            @click="exportDom"
+          >
+            <i-ep-Download />
+            <!-- 瀵煎嚭涓篍xcel -->
+          </el-icon>
+        </el-tooltip>
+      </div>
+      <div style="display: flex; justify-content: right; margin-right: 40px">
+        <span class="collapse-header-text">
+          闈欏畨鍖� {{ beginTime }} 鈥斺�� {{ endTime }} 娌圭儫妫�娴嬪紓甯镐俊鎭眹鎬�</span
+        >
+      </div>
+      <br />
+
+      <el-collapse ref="h3" v-model="activeNames">
+        <el-collapse-item name="1">
+          <template #title>
+            <el-tooltip
+              class="box-item"
+              effect="dark"
+              content="鐐瑰嚮鍙姌鍙�"
+              placement="right-start"
+            >
+              <h4 class="collapse-header">寮傚父鍒嗘瀽</h4>
+              <el-icon class="header-icon">
+                <i-ep-info-filled />
+              </el-icon>
+            </el-tooltip>
+
+            <el-tooltip
+              class="box-item"
+              effect="dark"
+              content="鐐瑰嚮鍙姌鍙�"
+              placement="right-start"
+            >
+            </el-tooltip>
+          </template>
+          <el-card class="box-card">
+            <el-row :gutter="25">
+              <el-col :span="8">
+                <div style="display: flex">
+                  <img
+                    src="@/assets/exceed.jpg"
+                    style="width: 25px; height: 25px; margin-top: 5px"
+                  />
+                  <span
+                    style="
+                      font-size: 16px;
+                      font-weight: bold;
+                      margin-top: 4px;
+                      margin-left: 4px;
+                    "
+                    >娌圭儫娴撳害瓒呮爣</span
+                  >
+                </div>
+
+                <div class="box-card-label">
+                  <el-scrollbar>
+                    <span class="box-card-label">搴楅摵鏁伴噺锛�</span>
+                    <span style="font-size: 20px"
+                      >{{ exception0.length }} /{{ shopsTotal }}</span
+                    >
+                    <span style="margin-left: 150px; font-size: 14px">
+                      鍗犳瘮锛歿{
+                        ((exception0.length / shopsTotal) * 100).toFixed(1)
+                      }}%</span
+                    >
+                  </el-scrollbar>
+                </div>
+
+                <hr />
+                <div class="box-card-butcontainer">
+                  <el-card class="sub-box-card">
+                    <el-scrollbar max-height="70px">
+                      <ExceptionText
+                        v-for="(item, index) in exception0"
+                        :key="item"
+                        :devId="item.devId"
+                        exception-value="0"
+                        :begin-time="beginTime"
+                        :end-time="endTime"
+                        @submit-exception-data="getAbnormalDataByClick"
+                      >
+                        {{ item.diName }}
+                        <span
+                          v-if="index < exception0.length - 1"
+                          class="text-blank"
+                          >,</span
+                        >
+                      </ExceptionText>
+                    </el-scrollbar>
+                  </el-card>
+                </div>
+              </el-col>
+
+              <el-col :span="8">
+                <div style="display: flex">
+                  <img
+                    src="@/assets/exception.jpg"
+                    style="width: 25px; height: 25px; margin-top: 5px"
+                  />
+                  <span
+                    style="
+                      font-size: 16px;
+                      font-weight: bold;
+                      margin-top: 5px;
+                      margin-left: 4px;
+                    "
+                    >渚涚數寮傚父</span
+                  >
+                </div>
+                <div class="box-card-label">
+                  <el-scrollbar>
+                    <span class="box-card-label">搴楅摵鏁伴噺锛�</span>
+                    <span style="font-size: 20px"
+                      >{{ exception1.length }} /{{ shopsTotal }}</span
+                    >
+                    <span style="margin-left: 150px; font-size: 14px">
+                      鍗犳瘮锛歿{
+                        ((exception1.length / shopsTotal) * 100).toFixed(1)
+                      }}%</span
+                    >
+                  </el-scrollbar>
+                </div>
+
+                <hr />
+
+                <div>
+                  <el-card class="sub-box-card">
+                    <el-scrollbar max-height="70px">
+                      <ExceptionText
+                        v-for="(item, index) in exception1"
+                        :key="item"
+                        :devId="item.devId"
+                        exception-value="1"
+                        :begin-time="beginTime"
+                        :end-time="endTime"
+                        @submit-exception-data="getAbnormalDataByClick"
+                      >
+                        {{ item.diName }}
+                        <span
+                          v-if="index < exception1.length - 1"
+                          class="text-blank"
+                          >,</span
+                        >
+                      </ExceptionText>
+                    </el-scrollbar>
+                  </el-card>
+                </div>
+              </el-col>
+
+              <el-col :span="8">
+                <div style="display: flex">
+                  <img
+                    src="@/assets/offline.jpg"
+                    style="width: 25px; height: 25px; margin-top: 5px"
+                  />
+                  <span
+                    style="
+                      font-size: 16px;
+                      font-weight: bold;
+                      margin-top: 5px;
+                      margin-left: 4px;
+                    "
+                    >鎺夌嚎</span
+                  >
+                </div>
+                <div class="box-card-label">
+                  <el-scrollbar>
+                    <span class="box-card-label">搴楅摵鏁伴噺锛�</span>
+                    <span style="font-size: 20px"
+                      >{{ exception2.length }} /{{ shopsTotal }}</span
+                    >
+                    <span style="margin-left: 150px; font-size: 14px">
+                      鍗犳瘮锛歿{
+                        ((exception2.length / shopsTotal) * 100).toFixed(1)
+                      }}%</span
+                    >
+                  </el-scrollbar>
+                </div>
+                <hr />
+                <div>
+                  <el-card class="sub-box-card">
+                    <el-scrollbar max-height="70px">
+                      <ExceptionText
+                        v-for="(item, index) in exception2"
+                        :key="item"
+                        :devId="item.devId"
+                        exception-value="2"
+                        :begin-time="beginTime"
+                        :end-time="endTime"
+                        @submit-exception-data="getAbnormalDataByClick"
+                      >
+                        {{ item.diName }}
+                        <span
+                          v-if="index < exception2.length - 1"
+                          class="text-blank"
+                          >,</span
+                        >
+                      </ExceptionText>
+                    </el-scrollbar>
+                  </el-card>
+                </div>
+              </el-col>
+            </el-row>
+          </el-card>
+        </el-collapse-item>
+      </el-collapse>
+
+      <h4 class="table-text">寮傚父鏁版嵁</h4>
+
+    </el-col>
+  </el-row>
+  <el-card class="table-page" v-show="!isNoData">
+    <el-table
+      ref="tableH"
+      v-loading="loading"
+      :data="displayData"
+      style="width: 100%"
+      border
+      :height="tableHeight"
+      :cell-class-name="tableCellClassName"
+ 
+    >
+      <el-table-column prop="diName" label="搴楅摵鍚嶇О">
+        <template #default="{ row }">
+          <el-tooltip effect="dark" :content="row.diName">
+            <div class="cell ellipsis">{{ row.diName }}</div>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+
+      <el-table-column prop="devId" label="璁惧缂栧彿">
+        <template #default="{ row }">
+          <el-tooltip effect="dark" :content="row.devId">
+            <div class="cell ellipsis">{{ row.devId }}</div>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+
+      <el-table-column prop="exception" label="寮傚父鍒嗙被">
+        <template #default="{ row }">
+          <el-tooltip effect="dark" :content="row.exception">
+            <div class="cell ellipsis">{{ row.exception }}</div>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+      <el-table-column label="寮傚父绫诲瀷">
+        <template #default="{ row }">
+          <span v-if="row.exceptionType == '0'">娌圭儫鏁版嵁瓒呮爣</span>
+          <span v-else-if="row.exceptionType == '1'">鐤戜技渚涚數寮傚父</span>
+          <span v-else-if="row.exceptionType == '2'">鎺夌嚎</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="region" label="鍦板尯">
+        <template #default="{ row }">
+          <el-tooltip effect="dark" :content="row.region">
+            <div class="cell ellipsis">{{ row.region }}</div>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+
+      <el-table-column prop="beginTime" label="寮�濮嬫椂闂�">
+        <template #default="{ row }">
+          <el-tooltip effect="dark" :content="row.beginTime">
+            <div class="cell ellipsis">{{ row.beginTime }}</div>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+      <el-table-column prop="endTime" label="缁撴潫鏃堕棿">
+        <template #default="{ row }">
+          <el-tooltip effect="dark" :content="row.endTime">
+            <div class="cell ellipsis">{{ row.endTime }}</div>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔">
+        <template #default="{ row }">
+          <el-button
+            type="primary"
+            class="table-button"
+            @click="showDrawer(row)"
+            >鏌ョ湅璇︽儏</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-pagination
+      ref="h4"
+      background
+      @size-change="handleSizeChange"
+      @current-change="handleCurrentChange"
+      :total="total"
+      :page-size="pageSize"
+      layout="total,prev, pager, next, jumper"
+    />
+  </el-card>
+  <el-empty v-show="isNoData" :image-size="200" />
+  <!-- 瀵硅瘽妗� -->
+  <div>
+    <el-dialog ref="diag" v-model="centerDialogVisible" draggable align-center>
+      <template #header>
+        <div style="font-size: 17px">
+          搴楅摵鍚嶏細{{ rowShopName }}
+          <span style="margin-left: 40px">寮傚父绫诲瀷锛�</span>
+          <span v-if="rowExceptionType == '0'">娌圭儫鏁版嵁瓒呮爣</span>
+          <span v-else-if="rowExceptionType == '1'">渚涚數寮傚父</span>
+          <span v-else-if="rowExceptionType == '2'">鎺夌嚎</span>
+          <div style="margin-top: 10px">
+            寮傚父鏃堕棿娈碉細{{ rowBeginTime }} ~
+            {{ rowEndTime }}
           </div>
         </div>
-        <!-- <br v-if="index % 4 == 0"/> -->
-      </el-col>
-    </el-row>
+        <div class="dialog-button-position">
+          <el-button
+            type="danger"
+            :loading="button.preButton"
+            :disabled="isPreCantouch || banTouch"
+            @click="getPreviousRowData"
+            >涓婃潯寮傚父</el-button
+          >
+          <el-button
+            type="danger"
+            :loading="button.afterButton"
+            :disabled="isNextCantouch || banTouch"
+            @click="getNextRowData"
+            >涓嬫潯寮傚父</el-button
+          >
+        </div>
+      </template>
+
+      <!-- 瓒呮爣鏁版嵁鏃� -->
+      <!-- 鎶樼嚎鍥� -->
+
+      <!-- 鎺夌嚎 -->
+      <!-- <div
+          ref="ref"
+          v-show="isOfflineShow"
+          style="
+            width: 100%;
+            height: 300px;
+            /* min-width: 100px; */
+            margin-bottom: 20px;
+            margin-left: 10px;
+            min-width: 350px;
+          "
+        ></div> -->
+
+      <ExceptionTypeLineChart
+        :option="option"
+        :is-open-dialog="centerDialogVisible"
+        v-loading="chartLoading"
+      ></ExceptionTypeLineChart>
+
+      <!--  -->
+      <div style="margin-top: 40px; margin-bottom: 5px; border: 1px">
+        <el-table
+          :data="exceedingData"
+          height="360"
+          border
+          style="margin-top: 25px"
+        >
+          <el-table-column fixed prop="diName" label="搴楅摵鍚嶇О" />
+          <el-table-column prop="mvStatCode" label="璁惧缂栧彿" />
+
+          <el-table-column prop="mvDataTime" label="閲囬泦鏃堕棿" />
+          <el-table-column
+            prop="mvFumeConcentration2"
+            label="娌圭儫娴撳害(mg/m鲁)"
+          />
+        </el-table>
+      </div>
+
+      <el-tag type="success" class="mx-1" effect="dark" round
+        ><span class="table-line-lable" v-show="rowExceptionType == '0'"
+          >寮傚父璁板綍锛�
+        </span>
+        <span v-show="rowExceptionType == '1' || rowExceptionType == '2'"
+          >缂哄け鏁版嵁锛�</span
+        >
+        <span class="table-line-num">{{ exceptionTotal }}鏉�</span>
+        <span v-show="rowExceptionType === '1' || rowExceptionType === '2'">
+          (閫昏緫璁$畻)</span
+        >
+      </el-tag>
+    </el-dialog>
   </div>
 </template>
 
+<script>
+import ExceptionType from '../sfc/ExceptionType.vue';
+import TimeSelect from '../sfc/TimeSelect.vue';
+import ExceptionText from '../sfc/ExceptionText.vue';
+import * as XLSX from 'xlsx/xlsx.mjs';
+import dayjs from 'dayjs';
+import axiosInstanceInstance from '../utils/request.js';
 
+const ShopNameAndID = defineAsyncComponent(() =>
+  import('../sfc/../sfc/ShopNameAndID.vue')
+);
 
+//  寮傚父鍥惧舰寮傛缁勪欢
+const ExceptionTypeLineChart = defineAsyncComponent(() =>
+  import('../sfc/ExceptionTypeLineChart.vue')
+);
+export default {
+  name: 'TablePage',
+  components: {
+    ExceptionType,
+    TimeSelect,
+    ShopNameAndID,
+    ExceptionText,
+    ExceptionTypeLineChart
+  },
+  data() {
+    return {
+      // 椤甸潰绐楀彛瀹藉害
+      windowWidth:0,
+      // 椤甸潰绐楀彛楂樺害
+      windowHeight:0,
 
-<style lang="scss" scoped>
-.chart-container {
-  background-color: #f9f9f9;
-  padding: 20px;
+      // 瀵硅瘽妗嗙殑瀹藉害
+      dialogW:'',
+      // 鎶樼嚎鍥惧姞杞戒腑
+      chartLoading:false,
+      button:{
+        // 鏌ヨ鎸夐挳
+        queryButton:false,
+        // 涓婁竴鏉℃寜閽�
+        preButton:false,
+        // 涓嬩竴鏉℃寜閽�
+        afterButton:false,
+        // 
+        banTouch:0
+      },
+      // 寮傚父鎶樼嚎鍥剧殑閰嶇疆
+      option: {},
+      // 鎶樼嚎鍥惧睍绀�
+      isChartShow: false,
+      // table鍏冪礌
+      tableRef: null,
+      // 寮傚父琛ㄦ牸鏁版嵁
+      tableHeight: 300,
+      // 绌烘暟鎹姸鎬�
+      isNoData: false,
+      // 寮瑰嚭妗嗕腑琛ㄦ牸鏉℃暟
+      exceptionTotal: 0,
+      // 鏃犳暟鎹椂鐨勬椂闂存暟缁勶紝鍏冪礌鐩稿樊10鍒嗛挓
+      // abnormalTimeTenMinute: [],
+      // 搴楅摵鎬绘暟
+      shopsTotal: 0,
+
+      // 鈥欎笂涓�鏉♀�樻寜閽槸鍚﹀彲浠ヨ鐐瑰嚮鐘舵��
+      isPreCantouch: false,
+      // 鈥欎笅涓�鏉♀�樻寜閽槸鍚﹀彲浠ヨ鐐瑰嚮鐘舵��
+      isNextCantouch: false,
+
+      // 瀵硅瘽妗嗘槸鍚﹀睍绀�
+      centerDialogVisible: false,
+
+      // 鎶藉眽澶撮儴淇℃伅
+      // 鎶樼嚎鍥惧搴旂殑褰撳墠琛ㄦ牸琛屾暟鎹�
+      // 搴楅摵鍚�
+      rowShopName: '',
+      // 寮傚父绫诲瀷
+      rowExceptionType: '',
+      // 寮傚父寮�濮嬫椂闂�
+      rowBeginTime: '',
+      // 寮傚父缁撴潫鏃堕棿
+      rowEndTime: '',
+      // 寮傚父鐨勮澶囩紪鍙�
+      rowMvStatCode: '',
+
+      // 琛ㄦ牸鐨勪竴琛屾暟鎹�
+      rowTable: [],
+      //鎷兼帴鐨勬墍鏈夋暟鎹�
+      allExceptionTimeData: [],
+      // 鏃犳暟鎹椂澧炲姞鐨勫墠30鍒嗛挓鏁版嵁
+      beforeData: [],
+      // 鏃犳暟鎹椂澧炲姞鐨勫悗40鍒嗛挓鏁版嵁
+      afterData: [],
+
+      // -1琛ㄧず鏈�夋嫨琛ㄦ牸鐨勮
+      selectedRowIndex: -1,
+
+      // 榛樿閫夋嫨鐨勬姌鍙犻潰鏉跨紪鍙�
+      activeNames: ['1'],
+      // 寮傚父鏃剁殑琛ㄦ牸
+      abnormalTb: [],
+      // 寮傚父鐨勮捣姝㈡椂闂�
+      abnormalBt: '',
+      abnormalEt: '',
+      // 鏄惁灞曠ず鏃堕棿杞�  鍚�
+      isAbnormal: false,
+      // 淇濆瓨鐫�寮傚父绫诲瀷0瀵瑰簲鐨勫簵閾哄悕绉板拰璁惧缂栧彿
+      exception0: [],
+      // 淇濆瓨鐫�寮傚父绫诲瀷1瀵瑰簲鐨勫簵閾哄悕绉板拰璁惧缂栧彿
+      exception1: [],
+      // 淇濆瓨鐫�寮傚父绫诲瀷2瀵瑰簲鐨勫簵閾哄悕绉板拰璁惧缂栧彿
+      exception2: [],
+      // 鍔犺浇鍔ㄧ敾
+      loading: false,
+      // 鎶藉眽鍔犺浇鍔ㄧ敾
+      loadingDrawer: true,
+      // 鍒嗛〉灞曠ず鏁版嵁
+
+      // 寮傚父琛ㄧ殑鏁版嵁
+      displayData: [],
+      // 瀛樻斁鍚庣杩斿洖鐨刯son鏁版嵁
+      jsonData: [],
+      // 鍒嗛〉鐨勮捣濮嬬储寮�
+      startIndex: 0,
+      // 褰撳墠椤�
+      currentPage: 1,
+      // 姣忛〉鏉℃暟
+      pageSize: 10,
+      total: 0,
+      // 閫夋嫨搴楅摵鍚�
+      deviceId: [],
+      deviceInfo: [],
+      // 鏃堕棿閫夋嫨鍣ㄥ紑濮嬫椂闂�
+      beginTime: '',
+      // 鏃堕棿閫夋嫨鍣ㄧ粨鏉熸椂闂�
+      endTime: '',
+      // 寮傚父琛ㄦ暟鎹�
+      abnormalData: [],
+      // 寮瑰嚭鐨勫璇濇涓殑寮傚父琛ㄦ牸鏁版嵁
+      exceedingData: [],
+      drawerVisible: false,
+      // 琛ㄦ牸鐨勪竴琛屾暟鎹�
+      drawerData: {},
+      // 鎶藉眽鏂瑰悜锛屼粠鍙冲悜宸︽墦寮�
+      drawerDirection: 'rtl',
+      optionsTime: [
+        // 鏃堕棿棰楃矑搴�
+        {
+          value: '10',
+          label: '10鍒嗛挓鏁版嵁',
+          disabled: true
+        }
+      ],
+      // 搴楅摵鍚� 绾ц仈閫夋嫨鍣�
+      optionsShop: [],
+      // 寮傚父绫诲瀷閫夋嫨鍣�
+      exceptionValue: []
+    };
+  },
+  // 鐩戝惉  鍒ゆ柇鎸夐挳鏄惁鍙偣鍑�
+  watch: {
+    selectedRowIndex(newVaue) {
+      // 澶勪簬琛ㄦ牸鐨勬渶鍚庝竴鏉℃暟鎹� 璁剧疆鈥樹笂涓�鏉♀�欐寜閽笉鍙偣
+      if (newVaue === this.displayData.length - 1) {
+        this.isPreCantouch = true;
+        //鐢ㄦ埛鍏堢偣浜嗙涓�鏉★紝pre涓簍rue,鐒跺悗鐐瑰嚮鏈�鍚庝竴鏉�,next涓簍rue銆傛鏃朵袱涓寜閽兘琚皝閿�
+        if (this.isNextCantouch == true) {
+          this.isNextCantouch = false;
+        }
+      }
+      // 澶勪簬琛ㄦ牸绗竴鏉℃暟鎹� 璁剧疆鈥樹笅涓�鏉♀�欐寜閽笉鍙偣
+      else if (newVaue === 0) {
+        this.isNextCantouch = true;
+        //鐢ㄦ埛鍏堢偣浜嗚〃鏍兼渶鍚庝竴鏉�,next涓簍rue,鐒跺悗鐐瑰嚮绗竴鏉★紝pre涓簍rue銆傛鏃朵袱涓寜閽兘琚皝閿�
+        if (this.isPreCantouch == true) {
+          this.isPreCantouch = false;
+        }
+      }
+      // 澶勪簬琛ㄦ牸鐨勪腑闂磋 灏嗘寜閽缃负鍙偣鍑荤姸鎬�
+      else {
+        this.isPreCantouch = false;
+        this.isNextCantouch = false;
+      }
+    },
+
+    // 褰撻�夋嫨鐨勬椂闂村彂鐢熷彉鍖栨椂锛屽紓甯稿垎鏋愰儴鍒嗙殑寮傚父搴楅摵鏁伴噺鍚屾鍙樺寲
+    beginTime() {
+      this.getShopNames();
+    },
+    endTime() {
+      this.getShopNames();
+    },
+    centerDialogVisible() {
+      window.addEventListener('resize', this.updateChart);
+    }
+  },
+
+  mounted() {
+    // 浠庢帴鍙h幏鍙栧簵閾哄悕绉� 缁欑骇鑱斾笅鎷夋
+    this.getDeviceInfo();
+    // 灞曠ず鏈�杩�7澶╂暟鎹�
+    this.getRecentSevenDays();
+    // 鏍规嵁寮傚父绫诲瀷杩斿洖搴楅摵鍚嶇О鍜岃澶囩紪鍙� 娓叉煋寮傚父鍒嗘瀽閮ㄥ垎瀵瑰簲鐨勫簵閾哄悕
+    this.getShopNames();
+    this.calcTableHeight();
+    window.addEventListener('resize', this.updateChart);
+    window.onresize = () => {
+    return (() => {
+                //绐楀彛缂╂斁鑷姩鑾峰彇椤甸潰瀹介珮
+                this.windowWidth = document.documentElement.clientWidth; //瀹�
+                this.windowHeight = document.documentElement.clientHeight;; //楂�
+            })()
+          }
+        
+  },
+  methods: {
+    // 鍔熻兘锛氭敼鍙樿〃鏍兼煇涓崟鍏冩牸鐨勯鑹�
+    tableCellClassName({ row, column, rowIndex, columnIndex }) {
+     if(columnIndex == 3){
+        if (row.exceptionType == '0') {
+          return 'exceeding-row';
+        } else if (row.exceptionType == '1') {
+          return 'abnormal-power-supply';
+        } else if (row.exceptionType == '2') {
+          return 'disconnect';
+        }
+     }
+      
+    },
+    // 鍔熻兘锛氬姩鎬佽绠楀璇濇鐨勫搴�
+    calDialogWidth(){
+     
+      // this.dialogW = `calc(100vw-)`
+      // console.log('瀹藉害涓�',w);
+    },
+    //鍔熻兘锛� 鍔ㄦ�佽绠楄〃鏍奸珮搴�
+    calcTableHeight() {
+      const h1 = this.$refs.h1.$el.offsetHeight;
+      const h2 = this.$refs.h4.$el.offsetHeight;
+      this.tableHeight = `calc(100vh - ${h1}px - ${h2}px - 45px - var(--el-main-padding) * 2 - var(--el-card-padding))`;
+    },
+
+    //鍔熻兘锛� 鏃堕棿鏄惁瓒呰繃10鍒嗛挓
+    isTimeDifferenceGreaterThan10Minutes(dateString1, dateString2) {
+      const date1 = new Date(dateString1);
+      const date2 = new Date(dateString2);
+
+      // 璁$畻涓や釜鏃ユ湡鐨勬椂闂村樊锛堟绉掞級
+      const timeDifferenceMs = Math.abs(date1 - date2);
+
+      // 杞崲涓哄垎閽�
+      const timeDifferenceMinutes = Math.floor(timeDifferenceMs / (1000 * 60));
+
+      // 鍒ゆ柇鏃堕棿宸槸鍚﹀ぇ浜�10鍒嗛挓
+      return timeDifferenceMinutes > 10;
+    },
+
+    // 浠�10鍒嗛挓涓洪棿闅旇繑鍥炴椂闂村瓧绗︿覆鏁扮粍
+    generateTimePoints(timePoints, yAxisData) {
+      let updatedTimePoints = [];
+      let yAxisDataAdressed = [];
+      for (let i = 0; i < timePoints.length; i++) {
+        updatedTimePoints.push(timePoints[i]);
+        yAxisDataAdressed.push(yAxisData[i]);
+        if (i < timePoints.length - 1) {
+          let current = timePoints[i];
+          let next = timePoints[i + 1];
+          while (this.isTimeDifferenceGreaterThan10Minutes(current, next)) {
+            current = dayjs(current)
+              .add(10, 'minute')
+              .format('YYYY-MM-DD HH:mm:ss');
+            updatedTimePoints.push(current);
+            yAxisDataAdressed.push(null);
+          }
+        }
+      }
+      let obj = {};
+      obj['time'] = updatedTimePoints;
+      obj['data'] = yAxisDataAdressed;
+      return obj;
+    },
+
+    isExceedOneMonth(dateStr1, dateStr2) {
+      // 瓒呰繃涓�涓湀锛岃繑鍥濼rue锛屽惁鍒欒繑鍥濬alse
+      // 灏嗘棩鏈熷瓧绗︿覆杞负鏃ユ湡瀵硅薄
+      const date1 = new Date(dateStr1);
+      const date2 = new Date(dateStr2);
+
+      // 鑾峰彇涓や釜鏃ユ湡鐨勫勾銆佹湀銆佹棩
+      const year1 = date1.getFullYear();
+      const month1 = date1.getMonth();
+      const day1 = date1.getDate();
+
+      const year2 = date2.getFullYear();
+      const month2 = date2.getMonth();
+      const day2 = date2.getDate();
+
+      // 鍒ゆ柇涓や釜鏃ユ湡鏄惁鐩稿樊涓�涓湀
+      if (year1 === year2) {
+        // 骞翠唤鐩哥瓑锛屾瘮杈冩湀浠藉樊鍊�
+        if (Math.abs(month1 - month2) === 1) {
+          // 鏈堜唤宸�间负1锛岃繕闇�瑕佸垽鏂叿浣撴棩鏈�
+          if (
+            (month1 < month2 && day1 < day2) ||
+            (month1 > month2 && day1 > day2)
+          ) {
+            return true;
+          }
+        }
+      } else if (Math.abs(year1 - year2) === 1) {
+        // 骞翠唤宸�间负1锛屾瘮杈冩湀浠藉拰鏃ユ湡
+        if (
+          (year1 < year2 && month1 === 11 && month2 === 0 && day1 < day2) ||
+          (year1 > year2 && month1 === 0 && month2 === 11 && day1 > day2)
+        ) {
+          return true;
+        }
+      }
+
+      // 榛樿杩斿洖false锛岃〃绀轰袱涓棩鏈熷瓧绗︿覆涓嶇浉宸竴涓湀
+      return false;
+    },
+
+    // 鍒氭墦寮�鍗$墖鏃剁涓�涓浘褰笉浼氳嚜鍔ㄤ几缂� 褰撶偣鍑讳笂/涓嬩竴鏉℃椂浼氳嚜鍔ㄤ几缂�
+    // 鍥惧舰鍝嶅簲寮忓彉鍖�
+    updateChart() {
+      this.$nextTick(() => {
+        this.calDialogWidth()
+      });
+    },
+
+    // 浠庢椂闂撮�夋嫨鍣ㄧ粍浠舵嬁鍒板紑濮嬪拰缁撴潫鏃堕棿
+    giveTime(val) {
+      //灏嗕腑鍥芥爣鍑嗘椂闂磋浆涓烘寚瀹氭牸寮�(璇ョ粍浠惰繑鍥炵殑鏍囧噯鏃堕棿鐨勬牸寮忥紝鎵�浠ュ繀椤荤殑鍔犺繖涓嚱鏁�)
+      this.beginTime = dayjs(val[0]).format('YYYY-MM-DD HH:mm:ss');
+      this.endTime = dayjs(val[1]).format('YYYY-MM-DD HH:mm:ss');
+    },
+
+    // 鍙傛暟锛氬紓甯哥殑寮�濮嬪拰缁撴潫鏃堕棿銆傝繑鍥炴椂闂存暟缁勶紝浠庡紑濮嬫椂闂寸殑鍚�10鍒嗛挓鍒扮粨鏉熸椂闂翠负姝€��
+    // 姣斿12:00:00-13:00:00 鎵�浠ヨ繑鍥炵殑鏁扮粍鍏冪礌鏄� 12:10:00 ,12:20:00,12:30:00....13:00:00
+    descTenTime(begin, end) {
+      let time = [];
+      if (begin == end) {
+        time.push(begin);
+        return time;
+      }
+      // 淇濈暀缁撴灉 00 10 20 30
+      let temp = dayjs(begin).add(10, 'minute').format('YYYY-MM-DD HH:mm:ss');
+      while (temp != end) {
+        time.push(temp);
+        temp = dayjs(temp).add(10, 'minute').format('YYYY-MM-DD HH:mm:ss');
+      }
+      // 鍔犱笂寮傚父鐨勭粨鏉熸椂闂�
+      time.push(temp);
+      return time;
+    },
+
+    // 淇濆瓨褰撳墠閫夋嫨鐨勮鎵�鏈変俊鎭�
+    setinfo(index) {
+      this.rowShopName = this.displayData[index].diName;
+      this.rowExceptionType = this.displayData[index].exceptionType;
+      this.rowBeginTime = this.displayData[index].beginTime;
+      this.rowEndTime = this.displayData[index].endTime;
+      this.rowMvStatCode = this.displayData[index].devId;
+    },
+
+    //鍔熻兘锛� 渚涚數寮傚父鍜屾帀绾挎椂鐨勮〃鏍兼暟鎹�
+    setExceptionData() {
+      // 鏃犳暟鎹椂鐨勬椂闂存暟缁� 鏃堕棿鐩稿樊10鍒嗛挓
+      const abnormalTimeTenMinute = this.descTenTime(
+        this.rowBeginTime,
+        this.rowEndTime
+      );
+      // 鍘婚櫎渚涚數寮傚父鍜屾帀绾垮尯闂寸殑绗竴涓湁鍏冪礌鐨勫��
+      this.exceedingData = [];
+
+      for (let i = 0; i < abnormalTimeTenMinute.length; i++) {
+        this.exceedingData.push({
+          mvStatCode: this.rowMvStatCode,
+          diName: this.rowShopName,
+          mvDataTime: abnormalTimeTenMinute[i],
+          mvFumeConcentration2: ''
+        });
+      }
+
+      // 淇濆瓨鏃犳暟鎹椂琛ㄦ牸鏉℃暟
+      this.exceptionTotal = abnormalTimeTenMinute.length;
+    },
+    // 鐐瑰嚮琛ㄦ牸鐨勮鏃�
+    selectTableRow(row) {
+      // 鑾峰彇褰撳墠琛岀殑绱㈠紩
+      this.selectedRowIndex = this.displayData.indexOf(row);
+      // 杩涘叆鎶藉眽椤甸潰鏇存柊澶撮儴鏁版嵁
+      this.setinfo(this.selectedRowIndex);
+    },
+
+    // 鑾峰彇鑾峰彇琛ㄦ牸涓嬩竴琛屾暟鎹�
+    getNextRowData() {
+      // 涓嶆槸琛ㄦ牸鐨勭涓�琛�
+      if (this.selectedRowIndex !== 0) {
+        // 鐐瑰嚮杩囩▼涓� 閿佷綇涓婁笅鏉℃寜閽�  鍦ㄨ缃畬鍥惧舰閰嶇疆椤瑰悗瑙i攣
+        this.banTouch = 1
+
+        //寰楀埌涓婁竴琛屾暟鎹储寮�
+        this.selectedRowIndex = this.selectedRowIndex - 1;
+        //璇锋眰鏁版嵁 鏀瑰彉exceedingData
+        this.setinfo(this.selectedRowIndex);
+        let params = {};
+        if (this.drawerData.devId) {
+          params['devId'] = this.displayData[this.selectedRowIndex].devId;
+        }
+        if (this.drawerData.beginTime) {
+          params['beginTime'] =
+            this.displayData[this.selectedRowIndex].beginTime;
+        }
+        if (this.drawerData.endTime) {
+          params['endTime'] = this.displayData[this.selectedRowIndex].endTime;
+        }
+        this.button.afterButton = true
+        axiosInstanceInstance
+          .get('/fume/exceed', { params: params })
+          .then((response) => {
+            // 淇濆瓨杩斿洖鐨勮秴鏍囨暟鎹�
+            this.exceedingData = response.data.data;
+            this.drawChartTest();
+            this.exceptionTotal = this.exceedingData.length;
+            this.button.afterButton = false
+          });
+      }
+ 
+    },
+
+    // 鑾峰彇鑾峰彇琛ㄦ牸涓嬩竴琛屾暟鎹�
+    getPreviousRowData() {
+      // 涓嶆槸琛ㄦ牸鐨勭涓�琛�
+      if (this.selectedRowIndex < this.displayData.length - 1) {
+        // 鐐瑰嚮杩囩▼涓� 閿佷綇涓婁笅鏉℃寜閽�  鍦ㄨ缃畬鍥惧舰閰嶇疆椤瑰悗瑙i攣
+        this.banTouch = 1
+
+        //寰楀埌涓婁竴琛屾暟鎹储寮�
+        this.selectedRowIndex = this.selectedRowIndex + 1;
+
+        //璇锋眰鏁版嵁 鏀瑰彉exceedingData
+        this.setinfo(this.selectedRowIndex);
+        let params = {};
+        if (this.drawerData.devId) {
+          params['devId'] = this.displayData[this.selectedRowIndex].devId;
+        }
+        if (this.drawerData.beginTime) {
+          params['beginTime'] =
+            this.displayData[this.selectedRowIndex].beginTime;
+        }
+        if (this.drawerData.endTime) {
+          params['endTime'] = this.displayData[this.selectedRowIndex].endTime;
+        }
+        this.button.preButton = true
+        axiosInstanceInstance
+          .get('/fume/exceed', { params: params })
+          .then((response) => {
+            // 淇濆瓨杩斿洖鐨勮秴鏍囨暟鎹�
+            this.exceedingData = response.data.data;
+            this.drawChartTest();
+            this.exceptionTotal = this.exceedingData.length;
+            this.button.preButton = false
+          });
+      }
+    },
+
+    // 鈥樻煡鐪嬭鎯呪�� 寮瑰嚭妗嗛儴鍒�
+    showDrawer(row) {
+      // 璁$畻褰撳墠琛岀殑绱㈠紩
+      this.selectTableRow(row);
+
+      this.rowTable = row;
+
+      // 琛ㄦ牸鐨勮鏁版嵁浠ュ璞″舰寮忕粰drawerData
+      this.drawerData = row;
+
+      this.centerDialogVisible = true;
+      // 鏍规嵁琛屾暟鎹姹傝缁嗚秴鏍囨暟鎹覆鏌撴姌绾垮浘
+      let params = {};
+      if (this.drawerData.devId) {
+        params['devId'] = this.drawerData.devId;
+      }
+      if (this.drawerData.beginTime) {
+        params['beginTime'] = this.drawerData.beginTime;
+      }
+      if (this.drawerData.endTime) {
+        params['endTime'] = this.drawerData.endTime;
+      }
+
+      axiosInstanceInstance
+        .get('/fume/exceed', { params: params })
+        .then((response) => {
+          // 淇濆瓨杩斿洖鐨勮秴鏍囨暟鎹�
+          this.exceedingData = response.data.data;
+          this.drawChartTest();
+          this.exceptionTotal = this.exceedingData.length;
+        });
+    },
+
+    // 鐢ㄦ埛鏍规嵁杈撳叆鐨勬潯浠舵煡璇�
+    showTable() {
+      if (this.isExceedOneMonth(this.beginTime, this.endTime)) {
+        alert('鏃堕棿璺ㄥ害涓嶈兘瓒呰繃涓�涓湀');
+        return;
+      }
+      let params = {};
+
+      if (this.deviceId[1]) {
+        params['devId'] = this.deviceId[1];
+      }
+      if (this.exceptionValue.length != 0) {
+        params['exceptionValue'] = this.exceptionValue.join();
+      }
+
+      if (this.beginTime) {
+        params['beginTime'] = this.beginTime;
+      }
+      if (this.endTime) {
+        params['endTime'] = this.endTime;
+      }
+      this.loading = true;
+      this.button.queryButton = true
+      
+      axiosInstanceInstance
+        .get('/fume/abnormalthree', { params: params })
+        .then((response) => {
+          this.abnormalData = response.data.data;
+          this.total = this.abnormalData.length;
+          this.loading = false;
+          this.button.queryButton = false
+          if (response.data.data.length == 0) {
+            ElMessage('璇ユ椂娈垫棤鏁版嵁');
+            this.isNoData = true;
+            return;
+          }
+          // 绉婚櫎绌烘暟鎹姸鎬�
+          this.isNoData = false;
+          this.handleCurrentChange(1);
+
+        });
+    },
+    handleSizeChange(val) {
+      this.pageSize = val;
+      // 鏀瑰彉姣忛〉鏄剧ず鏁扮洰鏃惰烦鍒扮涓�椤�
+      this.handleCurrentChange(1);
+    },
+    handleCurrentChange(val) {
+      const startIndex = (val - 1) * this.pageSize;
+      const endIndex = startIndex + this.pageSize;
+
+      this.displayData = this.abnormalData.slice(startIndex, endIndex);
+    },
+
+    //鐩稿樊澶氬皯涓崄鍒嗛挓  璁$畻涓苟涓嶅寘鎷紑濮嬫椂闂达紝浣嗗寘鎷粨鏉熸椂闂淬��
+    diffTenMinutesNum(beginNormal, endNormal) {
+      // 灏嗗紑濮嬫椂闂村拰缁撴潫鏃堕棿杞崲涓篸ayjs瀵硅薄
+      const start = dayjs(beginNormal);
+      const end = dayjs(endNormal);
+
+      // 璁$畻缁撴潫鏃堕棿鍑忓幓寮�濮嬫椂闂翠腑闂寸浉宸灏戜釜鍗佸垎閽�
+      const diffInMinutes = end.diff(start, 'minute');
+      const diffInTenMinutes = Math.floor(diffInMinutes / 10);
+      return diffInTenMinutes;
+    },
+
+    // 鍙傛暟锛氬紓甯哥殑寮�濮嬫椂闂达紝寮傚父鐨勭粨鏉熸椂闂淬��
+    // 鍔熻兘锛氳繑鍥炲紑濮嬫椂闂寸殑鍓�30鍒嗛挓鐨勬椂闂寸偣锛岀粨鏉熸椂闂村悗40鍒嗛挓鐨勬椂闂寸偣
+    before30AndAfter40(begin, end) {
+      let time = [];
+      const before30MinBegin = dayjs(begin)
+        .subtract(30, 'minute')
+        .format('YYYY-MM-DD HH:mm:ss');
+      // 鍚庝竴娈电殑寮�濮嬫椂闂�
+      const after10MinBegin = dayjs(end)
+        .add(10, 'minute')
+        .format('YYYY-MM-DD HH:mm:ss');
+      // 寰�鍚�40鍒嗛挓
+      const after40MinEnd = dayjs(end)
+        .add(40, 'minute')
+        .format('YYYY-MM-DD HH:mm:ss');
+      time.push(before30MinBegin);
+      time.push(after10MinBegin);
+      time.push(after40MinEnd);
+      return time;
+    },
+
+    // 鍙傛暟锛氳澶囩紪鍙凤紝 寮�濮嬫椂闂达紝 缁撴潫鏃堕棿
+    // 鍔熻兘锛氳繑鍥炴煇璁惧鍦ㄨ鏃舵鍘嗗彶鏁版嵁鐨刧et璇锋眰鍙傛暟銆�
+    requestGetParms(devnum, begin, end) {
+      return {
+        devId: devnum,
+        beginTime: begin,
+        endTime: end
+      };
+    },
+    // 鍙傛暟锛氬璞℃暟缁�(璇ュ璞′腑鐨勫睘鎬т笉鑳芥槸寮曠敤绫诲瀷锛屽惁鍒欐嫹璐濈殑鍊艰繕鏄細鐩镐簰褰卞搷)
+    // 鍔熻兘锛氭嫹璐濊瀵硅薄鏁扮粍銆�
+    shallowCopyList(itemIsObjOfList) {
+      let tempList = [];
+      itemIsObjOfList.forEach((item) => {
+        tempList.push({ ...item });
+      });
+      return tempList;
+    },
+
+    // 鍙傛暟锛氭坊鍔犻灏炬椂闂存暟鎹殑寮傚父鏁版嵁鏁扮粍(鍏冪礌涓哄璞�)
+    // 鍔熻兘锛氬涓棿寮傚父鍖洪棿鏃堕棿鍜屽�艰繘琛岃ˉ鍏咃紝杩斿洖澶勭悊鍚庣殑缁撴灉
+    // 璇︾粏鎻忚堪锛氶亶鍘嗘暟缁勶紝褰撳彂鐜版暟缁勫厓绱犱负绌烘椂锛岃缃鍏冪礌鐨勬椂闂翠负涓婁竴涓厓绱犳椂闂寸殑鍚�10鍒嗛挓锛屽苟鎶婃祿搴﹀�艰缃负null(涓婁釜鍏冪礌鐨勬椂闂翠竴瀹氫笉涓虹┖锛屾棤闇�鍐嶅幓鍒ゆ柇涓婁釜鍏冪礌涓虹┖鐨勬儏鍐�)銆�
+    addTenMinutes(exceptionDataArr) {
+      // x杞� 鏃ユ湡鏃堕棿
+      let dateList = [];
+      // y杞� 瓒呮爣娌圭儫娴撳害
+      let fumeExceeding = [];
+      let obj = {};
+      for (let i = 0; i < exceptionDataArr.length; i++) {
+        if (exceptionDataArr[i] == null) {
+          //x杞存棩鏈熴�傚厓绱犱负null鏃讹紝 璁剧疆璇ュ厓绱犵殑鏃堕棿涓哄墠涓�鍏冪礌鐨勬椂闂村悗10鍒嗛挓
+          dateList.push(
+            dayjs(dateList[dateList.length - 1])
+              .add(10, 'minute')
+              .format('YYYY-MM-DD HH:mm:ss')
+          );
+          // 瓒呮爣娌圭儫娴撳害
+          fumeExceeding.push(null);
+        } else {
+          //x杞存棩鏈�
+          dateList.push(exceptionDataArr[i].mvDataTime);
+          // 瓒呮爣娌圭儫娴撳害
+          fumeExceeding.push(exceptionDataArr[i].mvFumeConcentration2);
+        }
+      }
+      obj['dateList'] = dateList;
+      obj['fumeExceeding'] = fumeExceeding;
+      return obj;
+    },
+
+    // 鍙傛暟锛氬姞涓婂墠鍚庡尯闂寸殑寮傚父鏁版嵁锛屾椂闂村瓧绗︿覆
+    // 鍔熻兘锛氬垽鏂璬ata涓槸鍚︽湁璇ユ棩鏈熸椂闂达紝瀛樺湪杩斿洖璇ユ椂闂村搴旂殑娴撳害鍊硷紝鍚﹀垯杩斿洖-1
+    findTimeInExceptionData(data, time) {
+      for (let i = 0; i < data.length; i++) {
+        if (data[i] == null) {
+          continue;
+        }
+        if (data[i]['mvDataTime'] == time) {
+          return data[i]['mvFumeConcentration2'];
+        }
+      }
+      return -1;
+    },
+    // 鍙傛暟:鍓嶅尯闂寸殑寮�濮嬫椂闂达紝 鍚庡尯闂寸殑缁撴潫鏃堕棿, 鍔犱笂鍓嶅悗鍖洪棿鐨勬�绘椂闂存鐨勫紓甯告暟鎹殑瀵硅薄鏁扮粍
+    // 鍔熻兘锛氭牴鎹紑濮嬪拰缁撴潫鏃堕棿,杩斿洖浠�10鍒嗛挓涓洪棿闅旂殑鏃堕棿鍜屽搴旂殑鍊�
+    keepContinuousByEachTenMinutes(
+      intervalStarTime,
+      intervalEndTime,
+      headAndTailExceptionData
+    ) {
+      let xAxis = [];
+      let yAxis = [];
+      let obj = {};
+      let current = intervalStarTime;
+      let tail = dayjs(intervalEndTime)
+        .add(10, 'minute')
+        .format('YYYY-MM-DD HH:mm:ss');
+      while (current != tail) {
+        let value = this.findTimeInExceptionData(
+          headAndTailExceptionData,
+          current
+        );
+        if (value != -1) {
+          xAxis.push(current);
+          yAxis.push(value);
+        } else {
+          xAxis.push(current);
+          yAxis.push(null);
+        }
+        current = dayjs(current)
+          .add(10, 'minute')
+          .format('YYYY-MM-DD HH:mm:ss');
+      }
+      obj['xAxis'] = xAxis;
+      obj['yAxis'] = yAxis;
+      return obj;
+    },
+
+    // 鍙傛暟锛氳秴鏍囨暟鎹墠闈㈠尯闂寸殑鏁版嵁
+    // 鍔熻兘锛氳繑鍥為櫎鍘绘渶鍚庝竴涓厓绱犵殑鏁扮粍
+    removeLastItemOfBeforeData(beforeDataOfExceeding) {
+      let tempList = [];
+      if (beforeDataOfExceeding.length == 1) {
+        return tempList;
+      } else {
+        for (let i = 0; i < beforeDataOfExceeding.length - 1; i++) {
+          tempList.push({ ...beforeDataOfExceeding[i] });
+        }
+        return tempList;
+      }
+    },
+
+    // 璁剧疆option
+    // 鍙傛暟锛歺杞存椂闂达紝 y杞存补鐑熸祿搴︼紝 寮傚父绫诲埆(0浠h〃瓒呮爣锛�1浠h〃渚涚數寮傚父鍜屾帀绾�), 寮傚父寮�濮嬫椂闂达紝寮傚父缁撴潫鏃堕棿锛屽紓甯稿紑濮嬫椂闂村湪鏁翠釜鍖洪棿鐨勭储寮曚笅鏍囷紝寮傚父缁撴潫鏃堕棿鍦ㄦ暣涓尯闂寸殑绱㈠紩涓嬫爣
+    setOption(
+      xData,
+      yData,
+      exceptionCategory,
+      exceptionBeginTime,
+      exceptionEndTime,
+      beginIndex,
+      endIndex
+    ) {
+      this.option = {};
+      // 瓒呮爣
+      if (exceptionCategory == 0) {
+        this.option = {
+          tooltip: {},
+          toolbox: {
+            // 宸ュ叿鏍�
+            feature: {
+              //     dataZoom: {
+              //   yAxisIndex: 'none'
+              // },
+              // 淇濆瓨涓哄浘鐗�
+              saveAsImage: {}
+            }
+          },
+          xAxis: {
+            type: 'category',
+            data: xData,
+            name: '鏃堕棿',
+            axisLabel: {
+              formatter: function (value) {
+                return value.slice(11, -3);
+              }
+            }
+          },
+          yAxis: {
+            type: 'value',
+            name: 'mg/m鲁'
+          },
+          series: [
+            {
+              name: '娌圭儫娴撳害',
+              type: 'line',
+              data: yData.map((item) => {
+                if (item >= 1) {
+                  return {
+                    value: item,
+                    itemStyle: {
+                      color: 'red'
+                    }
+                  };
+                }
+                return item;
+              }),
+              // 鍙樻崲鎸囧畾鏃堕棿鍖洪棿鐨勮儗鏅鑹�
+              markArea: {
+                itemStyle: {
+                  color: 'rgba(255, 173, 177, 0.4)'
+                },
+                data: [
+                  [
+                    {
+                      name: '瓒呮爣鏃堕棿娈�',
+                      xAxis: exceptionBeginTime
+                    },
+                    {
+                      xAxis: exceptionEndTime
+                    }
+                  ]
+                ]
+              },
+              markLine: {
+                symbol: 'none',
+                itemStyle: {
+                  // 鍩虹嚎鍏叡鏍峰紡
+                  normal: {
+                    lineStyle: {
+                      type: 'dashed'
+                    },
+                    label: {
+                      show: true,
+                      position: 'end',
+                      formatter: '{b}'
+                    }
+                  }
+                },
+                data: [
+                  {
+                    name: '瓒呮爣',
+                    type: 'average',
+                    yAxis: 1,
+                    lineStyle: {
+                      // color: '#ff0000'
+                      color: 'red'
+                    }
+                  }
+                ]
+              }
+            }
+          ],
+          // 鎸囧畾鏃堕棿鍖洪棿鐨勭嚎娈靛彉棰滆壊
+          visualMap: {
+            show: false,
+            dimension: 0,
+            pieces: [
+              {
+                lte: beginIndex,
+                color: 'green'
+              },
+              {
+                gt: beginIndex,
+                lte: endIndex,
+                color: 'red'
+              },
+              {
+                gt: endIndex,
+                lte: xData.length - 1,
+                color: 'green'
+              }
+            ]
+          }
+        };
+      }
+      // 渚涚數寮傚父鍜屾帀绾�
+      else if (exceptionCategory == 1) {
+        this.option = {
+          tooltip: {},
+          toolbox: {
+            // 宸ュ叿鏍�
+            feature: {
+              // dataZoom: {
+              //   // 鍖哄煙缂╂斁
+              //   yAxisIndex: 'none'
+              // },
+              // 淇濆瓨涓哄浘鐗�
+              saveAsImage: {}
+            }
+          },
+          xAxis: {
+            type: 'category',
+            data: xData,
+            name: '鏃堕棿',
+            axisLabel: {
+              formatter: function (value) {
+                return value.slice(11, -3);
+              }
+            }
+          },
+          yAxis: {
+            type: 'value',
+            name: 'mg/m鲁'
+          },
+          series: [
+            {
+              name: '娌圭儫鏁版嵁',
+              type: 'line',
+              data: yData,
+              markLine: {
+                silent: true,
+                data: [
+                  // 鏍囨敞鏃犳暟鎹椂闂存鐨勬晥鏋滐紝灏嗚繖涓椂闂存鐨勬暟杞撮儴鍒嗗彉涓虹孩鑹�
+                  {
+                    name: '鏃犳暟鎹�',
+                    xAxis: exceptionBeginTime
+                  },
+                  {
+                    xAxis: exceptionEndTime
+                  }
+                ],
+                lineStyle: {
+                  color: 'red'
+                }
+              }
+            }
+          ]
+        };
+      }
+      this.banTouch = 0
+    },
+
+    // 鍔熻兘锛氱偣鍑� 鈥樻煡鐪嬭鎯呪�欙紝 鈥樹笅涓�鏉♀�欐寜閽椂浼� 鍏堥�昏緫璁$畻銆傛渶鍚庡睍绀哄浘褰�
+    drawChartTest() {
+      this.beforeData = [];
+      this.afterData = [];
+      this.allExceptionTimeData = [];
+      //寮傚父鐨勫紑濮嬫椂闂� 缁撴潫鏃堕棿
+      let exceptionBeginTime = this.rowBeginTime;
+      let exceptionEndTime = this.rowEndTime;
+
+      // beforeAndAfterTime[0]:鍓�30鍒嗛挓鐨勬椂闂寸偣
+      // beforeAndAfterTime[1]:鍚�10鍒嗛挓鐨勬椂闂寸偣
+      // beforeAndAfterTime[2]:鍚�40鍒嗛挓鐨勬椂闂寸偣
+      let beforeAndAfterTime = this.before30AndAfter40(
+        exceptionBeginTime,
+        exceptionEndTime
+      );
+
+      // 鏋勯�犲紓甯告椂闂村墠鐨勫尯闂存暟鎹姹傚弬鏁�
+      let paramsBefore = this.requestGetParms(
+        this.displayData[this.selectedRowIndex].devId,
+        beforeAndAfterTime[0],
+        this.displayData[this.selectedRowIndex].beginTime
+      );
+
+      // 鏋勯�犲紓甯告椂闂村悗鐨勫尯闂存暟鎹姹傚弬鏁�
+      let paramsAfter = this.requestGetParms(
+        this.displayData[this.selectedRowIndex].devId,
+        beforeAndAfterTime[1],
+        beforeAndAfterTime[2]
+      );
+
+      // 鎶樼嚎鍥惧姞杞戒腑鏁堟灉
+      this.chartLoading = true
+      // 璇锋眰鍓嶅崐娈�
+      axiosInstanceInstance
+        .get('/fume/history', { params: paramsBefore })
+        .then((result1) => {
+          this.beforeData = result1.data.data;
+          // 璇锋眰鍚庡崐娈�
+          axiosInstanceInstance
+            .get('/fume/history', { params: paramsAfter })
+            .then((result2) => {
+              this.afterData = result2.data.data;
+              //淇濆瓨寮傚父鍖洪棿鐨勫��
+              let tempArr = [];
+              // 淇濆瓨寮傚父鍖洪棿鍓嶅悗鐨勫��
+              let before = [];
+              let after = [];
+
+              // 鍒ゆ柇鏄惁鏄緵鐢靛紓甯告垨鎺夌嚎
+              if (
+                this.rowExceptionType === '1' ||
+                this.rowExceptionType === '2'
+              ) {
+                // 閲嶆瀯琛ㄦ牸 缂哄け寮傚父鏁版嵁鑷姩濉厖
+                this.setExceptionData();
+
+                //鐩稿樊鍑犱釜10鍒嗛挓
+                const TenMinuteNum = this.diffTenMinutesNum(
+                  exceptionBeginTime,
+                  exceptionEndTime
+                );
+                //鐢╪ull濉厖涓紓甯告棤鏁版嵁鐨勬椂闂�
+                for (let i = 0; i < TenMinuteNum; i++) {
+                  tempArr.push(null);
+                }
+                before = this.shallowCopyList(this.beforeData);
+
+                after = this.shallowCopyList(this.afterData);
+                // after = this.afterData
+              }
+              // 瓒呮爣
+              else {
+                let beforeTemp = this.removeLastItemOfBeforeData(
+                  this.beforeData
+                );
+                // 鍓嶅悗鍖洪棿鍙樉绀鸿窛绂昏秴鏍囧尯闂存椂闂存渶杩戠殑娴撳害灏忎簬1鐨勬椂闂寸偣
+                for (let i = beforeTemp.length - 1; i >= 0; i--) {
+                  if (beforeTemp[i].mvFumeConcentration2 >= 1) {
+                    break;
+                  }
+                  if (beforeTemp[i].mvFumeConcentration2 < 1) {
+                    before.unshift(this.beforeData[i]);
+                  }
+                }
+
+                for (let i = 0; i < this.afterData.length; i++) {
+                  if (this.afterData[i].mvFumeConcentration2 >= 1) {
+                    break;
+                  }
+                  if (this.afterData[i].mvFumeConcentration2 < 1) {
+                    after.unshift(this.afterData[i]);
+                  }
+                }
+                tempArr = this.shallowCopyList(this.exceedingData);
+              }
+
+              // 灏嗗墠鍚庡尯闂存暟鎹� 涓� 寮傚父鍖洪棿鏁版嵁 鍚堝苟
+              this.allExceptionTimeData = [...before, ...tempArr, ...after];
+              // x杞存棩鏈熸椂闂�
+              let dateList = [];
+              // y杞� 瓒呮爣娌圭儫娴撳害
+              let fumeExceeding = [];
+              let timeAndValue = {};
+
+              // 浠庢坊鍔犱簡棣栦綅鍖洪棿鐨勫紑濮嬪拰缁撴潫鏃堕棿杩涜閬嶅巻 淇濊瘉鏃堕棿浠�10鍒嗛挓涓洪棿闅�
+              timeAndValue = this.keepContinuousByEachTenMinutes(
+                beforeAndAfterTime[0],
+                beforeAndAfterTime[2],
+                this.allExceptionTimeData
+              );
+
+              dateList = timeAndValue['xAxis'];
+              fumeExceeding = timeAndValue['yAxis'];
+
+              // 鎻愬彇寮傚父璧峰鏃堕棿鐐瑰湪鏁翠釜鍖洪棿鍐呯殑鏁版嵁绱㈠紩
+              let startIndex = dateList.findIndex(
+                (item) => item === exceptionBeginTime
+              );
+              let endIndex = dateList.findIndex(
+                (item) => item === exceptionEndTime
+              );
+
+              // 渚涚數寮傚父鍜屾帀绾挎儏鍐� 瓒呮爣鎯呭喌
+              if (
+                this.rowExceptionType === '1' ||
+                this.rowExceptionType === '2'
+              ) {
+                this.setOption(
+                  dateList,
+                  fumeExceeding,
+                  1,
+                  exceptionBeginTime,
+                  exceptionEndTime,
+                  startIndex,
+                  endIndex
+                );
+              } else {
+                // 瓒呮爣鎯呭喌
+                this.setOption(
+                  dateList,
+                  fumeExceeding,
+                  0,
+                  exceptionBeginTime,
+                  exceptionEndTime,
+                  startIndex,
+                  endIndex
+                );
+              }
+              this.chartLoading = false
+            });
+        });
+    },
+
+    getDeviceInfo() {
+      // 绾ц仈涓嬫媺妗嗘暟鎹� 浠庢帴鍙d腑鍔ㄦ�佽幏鍙�
+      axiosInstanceInstance.get('/fume/device').then((result) => {
+        this.deviceInfo = result.data.data;
+        // 鑾峰彇鍒版�荤殑搴楅摵鏁伴噺
+        this.shopsTotal = result.data.data.length;
+        this.deviceInfo.forEach((item) => {
+          this.optionsShop[this.optionsShop.length] = {
+            value: item.diName,
+            label: item.diName,
+            children: [
+              {
+                value: item.diCode,
+                label: item.diCode
+              }
+            ]
+          };
+        });
+      });
+    },
+    exportDom() {
+      // 瀵煎嚭涓篍xcel鏂囦欢
+      const fields = [
+        'devId',
+        'exceptionType',
+        'region',
+        'beginTime',
+        'endTime'
+      ];
+      const itemsFormatted = this.abnormalData.map((item) => {
+        const newItem = {};
+        fields.forEach((field) => {
+          newItem[field] = item[field];
+        });
+        return newItem;
+      });
+      // 鍒涘缓xlsx瀵硅薄
+      const xls = XLSX.utils.json_to_sheet(itemsFormatted);
+      // 缂栬緫琛ㄥご琛�       淇敼琛ㄥご
+      xls['A1'].v = '璁惧缂栧彿';
+      xls['B1'].v = '寮傚父绫诲瀷';
+      xls['C1'].v = '鍦板尯';
+      xls['D1'].v = '寮�濮嬫椂闂�';
+      xls['E1'].v = '缁撴潫鏃堕棿';
+      // 鍒涘缓workbook锛屽苟鎶妔heet娣诲姞杩涘幓
+      const wb = XLSX.utils.book_new();
+      XLSX.utils.book_append_sheet(wb, xls, 'Sheet1');
+      // 灏唚orkbook杞负浜岃繘鍒秞lsx鏂囦欢骞朵笅杞�
+      XLSX.writeFile(wb, '鍒嗘瀽鏁版嵁.xlsx');
+    },
+
+    getAbnormalDataByClick(val) {
+      this.abnormalData = val;
+      this.total = this.abnormalData.length;
+      // 榛樿鏄剧ず绗竴椤�
+      this.handleCurrentChange(1);
+    },
+
+    // 鏍规嵁寮傚父绫诲瀷杩斿洖搴楅摵鍚嶇О鍜岃澶囩紪鍙�
+    // 姣斿娌圭儫瓒呮爣瀵瑰簲鐨勬墍鏈夊簵閾哄悕绉板拰璁惧缂栧彿锛堝凡鍘婚櫎閲嶅鐨勫簵閾哄悕锛�
+    getShopNames() {
+      axiosInstanceInstance
+        .get('/fume/shopname', {
+          params: {
+            exceptionType: '0',
+            beginTime: this.beginTime,
+            endTime: this.endTime
+          }
+        })
+        .then((result) => {
+          this.exception0 = result.data.data;
+        });
+      axiosInstanceInstance
+        .get('/fume/shopname', {
+          params: {
+            exceptionType: '1',
+            beginTime: this.beginTime,
+            endTime: this.endTime
+          }
+        })
+        .then((result) => {
+          this.exception1 = result.data.data;
+        });
+      axiosInstanceInstance
+        .get('/fume/shopname', {
+          params: {
+            exceptionType: '2',
+            beginTime: this.beginTime,
+            endTime: this.endTime
+          }
+        })
+        .then((result) => {
+          this.exception2 = result.data.data;
+        });
+    },
+
+    // 椤甸潰鍔犺浇鏃堕粯璁ゅ睍绀�7澶╁紓甯歌〃鏁版嵁
+    getRecentSevenDays() {
+      // 缁欑骇鑱旈�夋嫨鍣ㄨ缃粯璁ょ殑閫夋嫨椤�
+      this.devId = ['浠樺皬濮愬湪鎴愰兘', 'qinshi_31010320210010'];
+      let params = {};
+      params['beginTime'] = this.beginTime;
+      params['endTime'] = this.endTime;
+      axiosInstanceInstance
+        .get('/fume/abnormalone', { params: params })
+        .then((response) => {
+          if (response.data.data.length == 0) {
+            ElMessage('璇ユ椂娈垫棤鏁版嵁');
+            return;
+          }
+          // 淇濆瓨杩斿洖鐨�
+          this.abnormalData = response.data.data;
+          // 鍒嗛〉
+          this.total = this.abnormalData.length;
+          // 榛樿鏄剧ず绗竴椤�
+          this.handleCurrentChange(1);
+          this.loading = false;
+        });
+    }
+  }
+};
+</script>
+
+<style scoped>
+
+.header-container {
+  display: flex;
+  margin-left: 20px;
+  /* flex-wrap: wrap;
+    align-items: center; */
+}
+.ellipsis {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.iconExcel {
+  font-size: 25px;
+  margin-left: 20px;
+  bottom: -6px;
+}
+
+/* 鍙紶鏍囩澶村彉涓哄彲鐐瑰嚮鐘舵�� */
+.clickable {
+  cursor: pointer;
+}
+.card-header {
+  margin: 0;
+}
+
+body {
+  margin: 0;
+}
+.exception-divider-rowline {
+  margin: 10px 0px;
+}
+/* 寮傚父鍒嗘瀽鏁版嵁涓庢寜閽� */
+.exception-container {
+  display: flex;
+}
+.example-showcase .el-loading-mask {
+  z-index: 9;
+}
+
+.scrollbar-demo-item {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 20px;
+  margin: 10px;
+  text-align: center;
   border-radius: 4px;
+  background: var(--el-color-primary-light-9);
+  color: var(--el-color-primary);
+}
+.collapse-header {
+  margin-left: 5px;
+  font-size: 18px;
+}
+.collapse-header-text {
+  margin-top: 5px;
+  font-size: 14px;
+  color: gray;
 }
 
-.chart-title {
-  font-size: 16px;
-  font-weight: 600;
+.box-card-label {
+  font-size: 14px;
+  white-space: nowrap;
+}
+:deep().el-card {
+  border-radius: 9px;
+}
+/* 鈥樻煡鐪嬭鎯呪�� 鐨勫脊鍑烘楂樺害璋冩暣 */
+:deep().el-dialog {
+  height: 98%;
+  /* 涓嶅嚭鐜版粴鍔ㄦ潯 */
+  overflow-y: hidden;
+  border-radius: 9px;
+}
+.table-page {
+  margin-left: 20px;
 }
 
-.chart-content {
-  margin-top: 10px;
+.table-text {
+  font-size: 18px;
+  margin: 5px 0px 10px 20px;
+}
+.text-blank {
+  margin-right: 10px;
+  color: #000000;
+}
+/* 搴楅摵鍚嶉�夋嫨鏂囨湰 */
+.describe-info {
+  margin-top: 5px;
+  font-weight: bold;
+  white-space: nowrap;
+}
+/* 鏃堕棿閫夋嫨鏂囨湰 */
+.describe-time-text {
+  margin-left: 30px;
+  margin-top: 5px;
+  font-weight: bold;
 }
 
-.chartClass {
-  height: 300px;
+/* 寮傚父琛ㄦ牸涓嬫爣绛句腑鐨勬暟缁� */
+.table-line-num {
+  font-weight: bold;
+  color: black;
 }
-</style>
\ No newline at end of file
+.button_info.el-button_inner {
+  text-align: left;
+}
+.el-collapse {
+  margin-left: 20px;
+}
+:deep().el-collapse .el-collapse-item__content {
+  padding-bottom: 0px;
+}
+.box-card {
+  height: 190px;
+}
+
+.sub-box-card {
+  height: 100px;
+  border: 0px;
+}
+
+.mx-1 {
+  margin-bottom: 0px;
+}
+.dialog-button-position {
+  display: flex;
+  justify-content: right;
+  margin-bottom: 10px;
+}
+
+:deep().el-table__row .exceeding-row{
+  background-color:  #F53F3F;
+}
+:deep().el-table__row .abnormal-power-supply{
+  background-color:  #FDF4BF;
+}
+:deep().el-table__row .disconnect{
+  background-color:  #F7BA1E;
+}
+
+
+.el-table {
+  color: #000000;
+}
+/* 琛ㄦ牸鐨勫唴杈硅窛 */
+:deep().el-table .el-table__cell {
+  padding: 2px;
+}
+
+
+/* 琛ㄦ牸涓殑鎸夐挳瀹藉害閾烘弧 */
+.table-button {
+  width: 100%;
+}
+
+</style>
+

--
Gitblit v1.9.3