lining 3 years ago
parent
commit
2abfae1bc1

+ 1 - 1
.env.development

@@ -3,4 +3,4 @@ VUE_APP_WARNING=http://10.83.68.205:8075
 VUE_APP_SHARDINGURL=http://10.83.68.205:8075
 VUE_APP_ADAPTERURL=http://10.83.68.205:8011
 VUE_APP_APIS=10.83.68.205:8099
-VUE_APP_ADAPTERURLS=10.83.68.205:8011
+VUE_APP_ADAPTERURLS=10.83.68.205:8011

+ 1 - 1
.env.production

@@ -3,4 +3,4 @@ VUE_APP_WARNING=http://192.168.2.205:8070
 VUE_APP_SHARDINGURL=http://192.168.2.205:8075
 VUE_APP_ADAPTERURL=http://192.168.2.205:8011
 VUE_APP_APIS=192.168.2.205:8099
-VUE_APP_ADAPTERURLS=192.168.2.205:8011
+VUE_APP_ADAPTERURLS=192.168.2.205:8011

+ 6 - 1
.gitignore

@@ -23,4 +23,9 @@ pnpm-debug.log*
 *.sw?
 
 #Electron-builder output
-/dist_electron
+/dist_electron
+
+#压缩包
+*.zip
+*.rar
+*.7z

+ 1 - 1
README.md

@@ -1,4 +1,4 @@
-# neic
+# newneic
 
 ## Project setup
 ```

File diff suppressed because it is too large
+ 2083 - 110
package-lock.json


+ 1 - 1
package.json

@@ -1,5 +1,5 @@
 {
-  "name": "neic",
+  "name": "newneic",
   "version": "0.1.0",
   "private": true,
   "scripts": {

BIN
public/static/sound/syz.mp3


BIN
public/static/sound/track.mp3


BIN
public/static/sound/wd.mp3


+ 3 - 0
public/static/sound/音频说明.txt

@@ -0,0 +1,3 @@
+track.mp3 - 测试用音频
+syz.mp3 - 升压站报警音频
+wd.mp3 - 温度报警音频

+ 5 - 4
src/App.vue

@@ -23,9 +23,9 @@
       </el-row>
     </el-col>
   </div>
-  <!-- <div class="Dialog" v-show="state">
+  <div class="Dialog" v-show="state">
     <div class="D-" @click="none">-</div>
-  </div> -->
+  </div>
   <StatusBar class="statusBar" @getData="getData" />
   <router-view />
 </template>
@@ -65,6 +65,7 @@ export default {
     none() {
       this.state = false;
     },
+
     initData: function () {
       let mb = MessageBridge.getInstance();
       let windturbine = [
@@ -122,7 +123,7 @@ body {
 .Dialog {
   width: 520px;
   height: 800px;
-background-color: rgb(250, 249, 249);
+  background-color: rgb(250, 249, 249);
   position: absolute;
   right: 30px;
   z-index: 999;
@@ -140,7 +141,7 @@ background-color: rgb(250, 249, 249);
   line-height: 30px;
   text-align: center;
 }
-.D-:hover{
+.D-:hover {
   background-color: #999999;
 }
 .right {

BIN
src/assets/sound/Track52.mp3


File diff suppressed because it is too large
+ 5930 - 0
src/components/BoosterStation/dwk.vue


File diff suppressed because it is too large
+ 4944 - 0
src/components/BoosterStation/hzj.vue


File diff suppressed because it is too large
+ 2844 - 0
src/components/BoosterStation/mch.vue


File diff suppressed because it is too large
+ 9139 - 0
src/components/BoosterStation/mhs.vue


File diff suppressed because it is too large
+ 5432 - 0
src/components/BoosterStation/nss.vue


File diff suppressed because it is too large
+ 5304 - 0
src/components/BoosterStation/pl1.vue


File diff suppressed because it is too large
+ 3617 - 0
src/components/BoosterStation/pl2.vue


File diff suppressed because it is too large
+ 4050 - 0
src/components/BoosterStation/qs.vue


File diff suppressed because it is too large
+ 2502 - 0
src/components/BoosterStation/sbdl.vue


File diff suppressed because it is too large
+ 4403 - 0
src/components/BoosterStation/sbq.vue


File diff suppressed because it is too large
+ 12163 - 0
src/components/BoosterStation/xh.vue


File diff suppressed because it is too large
+ 10411 - 0
src/components/BoosterStation/xs.vue


+ 730 - 0
src/components/areaCard.vue

@@ -0,0 +1,730 @@
+/* 自定义tabs */
+<template>
+    <!-- <transition>
+        <div :class='areaClass' @mouseover="hover = false" @mouseleave="hover = false" onselectstart="return false">
+            <div :class="headerClass">
+                <div :class='circleClass'></div>
+                <span class="gy-card-title">{{ title }}</span>
+                <img class="gy-card-decoration01" src="../../assets/img/controlcenter/decoration01.png">
+                <img class="gy-card-decoration02" src="../../assets/img/controlcenter/decoration02.png">
+            </div>
+            <div :class='contentClass'>
+                <el-scrollbar style="height: 100%">
+                    <slot></slot>
+                </el-scrollbar>
+            </div>
+        </div>
+    </transition> -->
+    <div class="body" :style="style">
+        <img class="logo" src="../assets/img/logo.png" alt="">
+        <div class="title">{{ title }}</div>
+        <div style="margin-top: 50px; height: 91%;">
+            <el-scrollbar>
+                <div class="scoll">
+                    <div class="matrix" v-if="faultList.length>0">
+                        <div class="problemTitle">故障</div>
+                        <MatrixBlock @on-click="handleClick" :dataList="faultList"></MatrixBlock>
+                    </div>
+                    <div class="matrix" v-if="maintainList.length>0">
+                        <div class="problemTitle">维护</div>
+                        <MatrixBlock @on-click="handleClick" :dataList="maintainList"></MatrixBlock>
+                    </div>
+                    <div class="matrix" v-if="offlineList.length>0">
+                        <div class="problemTitle">离线</div>
+                        <MatrixBlock @on-click="handleClick" :dataList="offlineList"></MatrixBlock>
+                    </div>
+                    <div class="matrix" v-if="listedList.length>0">
+                        <div class="problemTitle">挂牌</div>
+                        <MatrixBlock @on-click="handleClick" :dataList="listedList"></MatrixBlock>
+                    </div>
+                    <div class="matrix" v-if="listedList.length>0">
+                        <div class="problemTitle">挂牌</div>
+                        <MatrixBlock @on-click="handleClick" :dataList="listedList"></MatrixBlock>
+                    </div>
+                </div>
+            </el-scrollbar>
+        </div>
+    </div>
+</template>
+
+<script>
+    import BackgroundData from 'utils/BackgroundData'
+    // import ProblemMatrixCard from "./problem/ProblemMatrixCard.vue";
+    import MatrixBlock from "./matrixBlock.vue";
+    export default {
+        name: 'gy-card',
+        components: {
+            // ProblemMatrixCard,
+            MatrixBlock
+        },
+        emits: ["parentRun"],
+        props: {
+            title: {
+                type: String,
+                default: '校验区',
+                required: true
+            },
+            height: {
+                type: Number,
+                default: 200,
+            },
+            areaStyle: {
+                type: String,
+                default: 'check',
+                required: true
+            },
+            circleStyle: {
+                type: String,
+                default: 'green',
+                required: true
+            },
+            contentStyle: {
+                type: String,
+                default: '44',
+                required: true
+            },
+            showFlag: {
+                type: Boolean,
+                default: false,
+            }
+        },
+        data() {
+            return {
+                dialogVisible: false,
+                currentWindturbine: {},
+                values: [],
+                hover: false,
+                big: false,
+                current: 0,
+                faultList: [],
+                maintainList: [],
+                offlineList: [],
+                listedList: [],
+                chooseList: [],
+                titleList: [
+                    {
+                        id: 0,
+                        title: '麻黄山',
+                    },
+                    {
+                        id: 1,
+                        title: '牛首山',
+                    },
+                    {
+                        id: 2,
+                        title: '青山',
+                    },
+                    {
+                        id: 3,
+                        title: '石板泉',
+                    },
+                    {
+                        id: 4,
+                        title: '香山',
+                    },
+                ],
+            }
+        },
+        computed: {
+            style() {
+                return `width: 100%; height: 82%;`
+            },
+            areaClass() {
+                if (this.big) {
+                    return `gy-card-area-big`;
+                } else {
+                    return `gy-card-area-${this.areaStyle}`;
+                }
+            },
+            circleClass() {
+                return `gy-card-circle gy-card-circle-${this.circleStyle}`;
+            },
+            contentClass() {
+                if (this.big) {
+                    return `gy-card-content-big`;
+                } else {
+                    return `gy-card-content-${this.contentStyle}`;
+                }
+            },
+            headerClass() {
+                if (this.hover) {
+                    return `gy-card-header-hover`;
+                } else {
+                    return `gy-card-header`;
+                }
+            }
+        },
+        methods: {
+            handleClick(values) {
+                if (values.active) {
+                    let showIndex = null
+                    this.chooseList.forEach((item, index) => {
+                        if (item.windturbineId === values.windturbineId) {
+                            showIndex = index
+                        }
+                    })
+                    this.chooseList.splice(showIndex, 1);
+                } else {
+                    this.chooseList.push(values)
+                }
+            },
+            /* 右键菜单 */
+            contextmenu() {
+                const { remote } = require("electron");
+                let that = this;
+                const menuTemplate = [
+                    {
+                        label: "启动",
+                        click() {
+                            that.menuClicked({ type: "send", controlType: '1' });
+                        },
+                    },
+                    {
+                        label: "停机",
+                        click() {
+                            that.menuClicked({ type: "send", controlType: '2' });
+                        },
+                    },
+                    {
+                        label: "复位",
+                        click() {
+                            that.menuClicked({ type: "send", controlType: '5' });
+                        },
+                    },
+                    {
+                        label: "维护",
+                        click() {
+                            that.menuClicked({ type: "send", controlType: '6' });
+                        },
+                    },
+                    {
+                        label: "取消维护",
+                        click() {
+                            that.menuClicked({ type: "send", controlType: '8' });
+                        },
+                    },
+                    {
+                        label: "挂牌",
+                        submenu: [
+                            {
+                                label: "检修",
+                                click() {
+                                    that.menuClicked({ type: "lock", value: "CheckLock" });
+                                },
+                            },
+                            {
+                                label: "故障维修",
+                                click() {
+                                    that.menuClicked({ type: "lock", value: "FaultLock" });
+                                },
+                            },
+                            {
+                                label: "场内受累检修",
+                                click() {
+                                    that.menuClicked({ type: "lock", value: "StationCheckLock" });
+                                },
+                            },
+                            {
+                                label: "场内受累故障",
+                                click() {
+                                    that.menuClicked({ type: "lock", value: "StationFaulLock" });
+                                },
+                            },
+                            {
+                                label: "场外受累电网",
+                                click() {
+                                    that.menuClicked({
+                                        type: "lock",
+                                        value: "StationPowerLineLock",
+                                    });
+                                },
+                            },
+                            {
+                                label: "场外受累天气",
+                                click() {
+                                    that.menuClicked({ type: "lock", value: "StationWeatherLock" });
+                                },
+                            },
+                        ],
+                    },
+                    {
+                        label: "取消挂牌",
+                        click() {
+                            that.menuClicked({ type: 'lock', value: 'UnLock' });
+                        },
+                    },
+                    // {
+                    //     label: "标注",
+                    //     click() {
+                    //         that.menuClicked({ type: "marking" });
+                    //     },
+                    // },
+                ];
+                const menu = remote.Menu.buildFromTemplate(menuTemplate);
+
+                menu.popup(remote.getCurrentWindow());
+            },
+            menuClicked(msg) {
+                let bd = BackgroundData.getInstance();
+                
+                if (msg.type == "lock") {
+                    // 挂牌
+                    let los = this.getSelectedItems();
+                    for (let id in los) {
+                        los[id].lockType = msg.value;
+                    }
+                    bd.windturbineControl(
+                        los,
+                        true,
+                        '',
+                        this.controlSuccess,
+                        this.controlError
+                    );
+                } else if (msg.type == "send") {
+                    // 发送
+                    let vs = this.getSelectedItems(true);
+                    for (let item in los) {
+                        los[item].controlType = Number(msg.controlType)
+                    }
+                    bd.windturbineControl(
+                        vs,
+                        false,
+                        '',
+                        '',
+                        this.controlSuccess,
+                        this.controlError
+                    );
+                } else if (msg.type == "marking") {
+                    // 标注
+                    let vvs = this.getSelectedItems();
+                    bd.marking(vvs);
+                }
+                this.clearSelected();
+            },
+            /* 获取选中的项目,isControl:是否是控制 */
+            getSelectedItems() {
+                // isControl
+                let ls = new Array();
+                this.$refs.malfunction.outputSelectedItems(ls);
+                return ls;
+            },
+            /* 清除所有选择 */
+            clearSelected() {
+                this.$refs.malfunction.clearSelected();
+            },
+            filter(value, windturbineId) {
+                let array = [];
+                let flag = false;
+                for (let i = 0; i < value.length; i++) {
+                    if (value[i].windturbineId == windturbineId) {
+                        flag = true;
+                        array.push(flag); // 风机是否已经存在
+                        array.push(i); // 风机在values数组的位置
+                        array.push(value[i].active); // 当前风机是否被选中
+                        break;
+                    }
+                }
+                return array;
+            },
+            changeTitle(id) {
+                this.current = id
+                this.$refs.malfunction.dateClick(id)
+            },
+            addCard(val) {
+                let active = false;
+                let array = this.filter(this.values, val.windturbineId);
+                if (!array[0]) {
+                    // 维护
+                    val.active = active;
+                    if (val.modelId.indexOf("105") >= 0) {
+                        val.rollSpeed *= 9.55;
+                    }
+                    this.values.push(val);
+                } else {
+                    val.active = array[2];
+                    this.values.splice(array[1], 1, val);
+                }
+            },
+            showWindows(item) {
+                this.dialogVisible = true;
+                this.currentWindturbine = item;
+            }
+        },
+        watch: {
+            "$store.getters.windturbinelist": {
+                deep: true,
+                handler: function (json) {
+                    let vs = {};
+                    this.faultList = []
+                    this.maintainList = []
+                    this.offlineList = []
+                    this.listedList = []
+                    let arr = Object.keys(json).sort()
+                    for (let id of arr) {
+                        let val = json[id];
+                        this.chooseList.forEach(item => {
+                            if (item.windturbineId === val.windturbineId) {
+                                val.active = true
+                            }
+                        })
+                        switch (val.status) {
+                            case 5:
+                                this.faultList.push(val)
+                                break;
+                            case 6:
+                                this.maintainList.push(val)
+                                break;
+                            case 7:
+                                this.offlineList.push(val)
+                                break;
+                        }
+                        if (val.lockValue > 0) {
+                            this.listedList.push(val)
+                        }
+                    }
+                },
+            },
+        },
+    }
+</script>
+
+<style scoped="scoped">
+    .body {
+        border: 1px solid #373737;
+        width: 100%;
+        margin-left: 15px;
+        margin-top: 10px;
+    }
+
+    .body .scoll {
+        height: 91%;
+    }
+
+    .title {
+        color: #ffffff;
+        font-size: 14px;
+        margin-left: 32px;
+        /* margin-top: 12px; */
+        margin-bottom: 10px;
+        width: 570px;
+        height: 50px;
+        display: flex;
+        align-items: center;
+        position: absolute;
+        background-color: #000000;
+    }
+
+    .title::before {
+        z-index: 1;
+        content: '';
+        position: absolute;
+        left: -18px !important;
+        /* top: 30px !important; */
+        width: 5px;
+        height: 5px;
+        background-color: #54B75A;
+        border-radius: 50%;
+    }
+
+    .logo {
+        position: absolute;
+        top: 2px;
+        left: 18px;
+    }
+
+    .matrix {
+        margin-left: 20px;
+        margin-right: 10px;
+        padding-bottom: 20px;
+        border-bottom: 1px solid rgba(31, 31, 31, 1);
+    }
+
+    .problemTitle {
+        font-size: 12px;
+        color: #BFBFBF;
+        margin-top: 20px;
+        margin-bottom: 20px;
+        margin-left: 12px;
+    }
+
+    .gy-card-header {
+        position: relative;
+        height: 40px;
+        background-color: #292929;
+        color: white;
+        box-sizing: border-box;
+    }
+
+    .gy-card-content-89 {
+        position: relative;
+        height: calc(89vh - 50px);
+        background-color: #000000;
+        color: white;
+        box-sizing: border-box;
+        border-radius: 7px;
+    }
+
+    .gy-card-content-44 {
+        position: relative;
+        height: calc(44vh - 50px);
+        background-color: #000000;
+        color: white;
+        box-sizing: border-box;
+        border-radius: 7px;
+    }
+
+    .gy-card-content-37 {
+        position: relative;
+        height: calc(37vh - 50px);
+        background-color: #000000;
+        color: white;
+        box-sizing: border-box;
+        border-radius: 7px;
+    }
+
+    .gy-card-content-25 {
+        position: relative;
+        height: calc(25vh - 50px);
+        background-color: #000000;
+        color: white;
+        box-sizing: border-box;
+        border-radius: 7px;
+    }
+
+    .gy-card-circle {
+        position: relative;
+        top: 7px;
+        display: inline-block;
+        width: 7px;
+        height: 7px;
+        -moz-border-radius: 50%;
+        -webkit-border-radius: 50%;
+        border-radius: 50%;
+    }
+
+    .gy-card-circle-green {
+        background-color: #008000;
+    }
+
+    .gy-card-circle-yellow {
+        background-color: #ffff00;
+    }
+
+    .gy-card-title {
+        position: relative;
+        top: 10px;
+        left: 10px;
+    }
+
+    .gy-card-decoration01 {
+        position: absolute;
+        right: 80px;
+    }
+
+    .gy-card-decoration02 {
+        position: absolute;
+        top: 20px;
+        right: 20px;
+    }
+
+    .gy-card-area-problem {
+        position: relative;
+        height: 89vh;
+        background-color: #292929;
+        border-radius: 7px;
+        margin: 0px;
+        padding-top: 0;
+        padding-left: 10px;
+        padding-right: 10px;
+        padding-bottom: 10px;
+        box-sizing: border-box;
+    }
+
+    .gy-card-area-alarm {
+        position: relative;
+        height: 25vh;
+        margin-top: 10px;
+        background-color: #292929;
+        border-radius: 7px;
+        padding-left: 10px;
+        padding-right: 10px;
+        padding-bottom: 10px;
+        box-sizing: border-box;
+    }
+
+    .gy-card-area-check {
+        position: relative;
+        height: 44vh;
+        background-color: #292929;
+        border-radius: 7px;
+        margin-top: 10px;
+        padding-top: 0;
+        padding-left: 10px;
+        padding-right: 10px;
+        padding-bottom: 10px;
+        box-sizing: border-box;
+    }
+
+    .gy-card-area-control {
+        position: relative;
+        width: 100%;
+        height: 44vh;
+        background-color: #292929;
+        border-radius: 7px;
+        margin: 0px;
+        padding-top: 0;
+        padding-left: 10px;
+        padding-right: 10px;
+        padding-bottom: 10px;
+        box-sizing: border-box;
+    }
+
+    .gy-card-area-label {
+        position: relative;
+        height: 25vh;
+        margin-top: 10px;
+        background-color: #292929;
+        border-radius: 7px;
+        padding-left: 10px;
+        padding-right: 10px;
+        padding-bottom: 10px;
+        box-sizing: border-box;
+    }
+
+    .gy-card-area-recommended {
+        position: relative;
+        height: 37vh;
+        background-color: #292929;
+        border-radius: 7px;
+        padding-left: 10px;
+        padding-right: 10px;
+        padding-bottom: 10px;
+        box-sizing: border-box;
+    }
+
+    .gy-card-header-hover {
+        position: relative;
+        height: 40px;
+        background-color: #292929;
+        color: white;
+        box-sizing: border-box;
+    }
+
+    .gy-card-area-problem:hover {
+        position: relative;
+        height: 89vh;
+        background-color: #292929;
+        border-radius: 7px;
+        margin: 0px;
+        padding-top: 0;
+        padding-left: 10px;
+        padding-right: 10px;
+        padding-bottom: 10px;
+        box-sizing: border-box;
+    }
+
+    .gy-card-area-alarm:hover {
+        position: relative;
+        height: 25vh;
+        margin-top: 10px;
+        background-color: #292929;
+        border-radius: 7px;
+        padding-left: 10px;
+        padding-right: 10px;
+        padding-bottom: 10px;
+        box-sizing: border-box;
+    }
+
+    .gy-card-area-label:hover {
+        position: relative;
+        height: 25vh;
+        margin-top: 10px;
+        background-color: #292929;
+        border-radius: 7px;
+        padding-left: 10px;
+        padding-right: 10px;
+        padding-bottom: 10px;
+        box-sizing: border-box;
+    }
+
+    .gy-card-area-recommended:hover {
+        position: relative;
+        height: 37vh;
+        background-color: #292929;
+        border-radius: 7px;
+        padding-left: 10px;
+        padding-right: 10px;
+        padding-bottom: 10px;
+        box-sizing: border-box;
+    }
+
+
+    .gy-card-area-big {
+        position: fixed;
+        top: 0px;
+        left: 0px;
+        width: 100vw;
+        height: 100vh;
+        background-color: #292929;
+        border-radius: 7px;
+        margin: 0px;
+        padding-top: 0;
+        padding-left: 10px;
+        padding-right: 10px;
+        padding-bottom: 10px;
+        box-sizing: border-box;
+        z-index: 900;
+    }
+
+    .gy-card-content-big {
+        position: relative;
+        height: calc(100vh - 50px);
+        background-color: #000000;
+        color: white;
+        box-sizing: border-box;
+        border-radius: 7px;
+    }
+
+    .el-scrollbar__wrap {
+        overflow: scroll;
+        width: 110%;
+        height: 120%;
+    }
+
+    ::-webkit-scrollbar {
+        width: 0;
+        height: 0;
+    }
+
+    .scroll {
+        color: #ffffff;
+        min-height: 300px;
+        height: 400px;
+    }
+
+
+    .content {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        width: 80px;
+        color: #ffffff;
+        height: 25px;
+        border: 1px solid blue;
+        margin-right: 10px;
+        margin-bottom: 10px;
+    }
+
+    .content_on {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        width: 80px;
+        color: #ffffff;
+        height: 25px;
+        border: 1px solid blue;
+        margin-right: 10px;
+        margin-bottom: 10px;
+        background-color: chartreuse;
+    }
+</style>

+ 37 - 40
src/components/control/controlAllArea.vue

@@ -32,48 +32,45 @@
           <div class="scoll"> -->
         <div class="matrix" v-if="showList.length > 0">
           <!-- 简单矩阵 -->
-          <box-select
-            node=".box"
-            @selectList="selectList"
-            v-if="selectValue === '0'"
-            v-for="(item, index) in allList" :key="index"
-          >
-            <div class="box1">
-              {{ key }}
+          <box-select node=".box" @selectList="selectList">
+            <div v-if="selectValue === '0'">
+              <div v-for="(item, key) of allList">
+                <div class="box1">
+                  {{ key }}
+                </div>
+                <EaxyMatrxBlock
+                  @choose-click="handleClick"
+                  @on-click="handleDetails"
+                  :dataList="item"
+                >
+                </EaxyMatrxBlock>
+              </div>
             </div>
-            <EaxyMatrxBlock
-              @choose-click="handleClick"
-              @on-click="handleDetails"
-              :dataList="item"
-            >
-            </EaxyMatrxBlock>
-          </box-select>
-          <!-- 全部矩阵 -->
-          <box-select
-            node=".box"
-            @selectList="selectList"
-            v-else-if="selectValue === '1'"
-            v-for="(item, key) of allList"
-          >
-            <div class="box1">
-              {{ key }}
+            <!-- 全部矩阵 -->
+            <div v-if="selectValue === '1'">
+              <div v-for="(item, key) of allList">
+                <div class="box1">
+                  {{ key }}
+                </div>
+                <MatrixBlock
+                  @choose-click="handleClick"
+                  @on-click="handleDetails"
+                  :dataList="item"
+                >
+                </MatrixBlock>
+              </div>
+            </div>
+            <!-- 其他 -->
+            <div v-if="selectValue != '0' && selectValue != '1'">
+              <MatrixBlock
+                @choose-click="handleClick"
+                @on-click="handleDetails"
+                :dataList="showList"
+              >
+              </MatrixBlock>
             </div>
-            <MatrixBlock
-              @choose-click="handleClick"
-              @on-click="handleDetails"
-              :dataList="item"
-            >
-            </MatrixBlock>
-          </box-select>
-          <!-- 其他 -->
-          <box-select node=".box" @selectList="selectList" v-else>
-            <MatrixBlock
-              @choose-click="handleClick"
-              @on-click="handleDetails"
-              :dataList="showList"
-            >
-            </MatrixBlock>
           </box-select>
+
         </div>
         <!-- </div>
         </el-scrollbar> -->
@@ -884,6 +881,6 @@ export default {
   line-height: 40px;
   color: #fff;
   box-sizing: border-box;
-    padding-left: 20px;
+  padding-left: 20px;
 }
 </style>

+ 287 - 0
src/components/focus/currentWarningCard.vue

@@ -0,0 +1,287 @@
+<template>
+  <div
+    class="currentWarningCardTableBox"
+    :class="$store.state.currentWarningCardClass"
+  >
+    <el-table
+      :data="tableData"
+      class="table"
+      height="30vh"
+      :header-cell-style="{
+        background: '#000000',
+        color: 'rgb(220,220,220)',
+        padding: '4px',
+        fontSize: '14px',
+        'border-bottom': 'solid 1px black',
+      }"
+      :cell-class-name="setCellClassName"
+    >
+      <el-table-column
+        prop="lastUpdateTime"
+        align="center"
+        label="时间"
+        width="150"
+      >
+      </el-table-column>
+      <el-table-column prop="alertText" align="center" label="描述" width="280">
+      </el-table-column>
+      <el-table-column prop="isSelected" align="center" label="确认">
+        <template v-slot="scope">
+          <input
+            type="checkbox"
+            v-model="scope.row.isSelected"
+            @click="itemChecked(scope.row)"
+          />
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+import MessageBridge from "utils/MessageBridge";
+import BackgroundData from "utils/BackgroundData";
+import api from "api/index";
+
+export default {
+  name: "AlarmArea",
+  components: {},
+  created() {
+    this.initData();
+    this.faultMessage();
+  },
+  props: {
+    activeTab: {
+      type: String,
+      default: "",
+    },
+  },
+  data() {
+    return {
+      values: [],
+      tableData: [],
+      dialogVisible: false,
+      showSvg: false,
+      svgVisible: false,
+      svgWeb: "",
+      stationName: "",
+      currentWindturbine: {},
+      audio: null,
+    };
+  },
+  methods: {
+    filtrationData(activeTab) {
+      let syzAlarm = [];
+      let syzBase = [];
+      this.values.forEach((ele) => {
+        if (
+          ele.stationId === activeTab &&
+          ele.rank === this.$store.state.syzAlarmRank &&
+          ele.category1 === "SYZ"
+        ) {
+          syzAlarm.push(ele);
+        } else if (ele.stationId === activeTab && ele.category1 === "SYZ") {
+          syzBase.push(ele);
+        }
+      });
+
+      this.$store.commit(
+        "currentWarningCardClass",
+        syzAlarm.length ? "show" : ""
+      );
+
+      this.tableData = [].concat(syzAlarm, syzBase);
+    },
+    initData() {
+      let mb = MessageBridge.getInstance();
+      let vs = [
+        {
+          key: "/topic/fault-popup",
+          action: this.faultMessage,
+        },
+      ];
+      mb.register(vs);
+    },
+    faultMessage(json) {
+      let val = json ? JSON.parse(json) : this.$store.state.warning;
+      if (Object.keys(val).length > 0) {
+        let sleected = {};
+        this.values.forEach((it) => {
+          if (it.isSelected) {
+            sleected[it.id] = 0;
+          }
+        });
+        this.values = new Array();
+        for (let v in val) {
+          let vl = val[v];
+          if (vl.stationId != "QS_FDC" && vl.category1 == "FJ") {
+            vl.alertText = vl.windturbineName + "-" + vl.alertText;
+          }
+          if (sleected[vl.id] == 0 && BackgroundData.getInstance().LoginUser) {
+            vl.isSelected = true;
+          }
+          if (vl.category1 !== "GF" && vl.objectId.indexOf("GDC") === -1) {
+            this.values.push(vl);
+          }
+        }
+        this.filtrationData(this.activeTab);
+      }
+    },
+    close() {
+      this.dialogVisible = false;
+      this.svgVisible = false;
+    },
+    itemChecked(row) {
+      if (row.isSelected == true) {
+        row.isSelected = false;
+        return;
+      }
+      let bd = BackgroundData.getInstance();
+      if (!bd.LoginUser) {
+        this.$notify({
+          title: "请登录",
+          message: "确认报警需要先登录!",
+          type: "warning",
+          position: "bottom-right",
+          offset: 60,
+          duration: 3000,
+        });
+        row.isSelected = false;
+        return;
+      }
+      row.isSelected = true;
+      this.confirm(row);
+    },
+    confirm(item) {
+      api
+        .sendWarning({
+          snapID: item.snapIDString,
+          faultID: item.idString,
+          userName: BackgroundData.getInstance().LoginUser.name,
+        })
+        .then((msg) => {
+          let mms = msg.data > 0 ? "报警确认成功!" : "报警确认出现错误!";
+          let tp = msg.data > 0 ? "success" : "error";
+          msg.data === 0 ? (item.isSelected = false) : "";
+          this.$notify({
+            title: "报警",
+            message: mms,
+            type: tp,
+            position: "bottom-right",
+            offset: 60,
+            duration: 3000,
+          });
+        });
+    },
+    setCellClassName({ row }) {
+      if (row.rank === this.$store.state.syzAlarmRank) {
+        return "cellBase flicker";
+      } else {
+        return "cellBase";
+      }
+    },
+  },
+  watch: {
+    activeTab(res) {
+      this.filtrationData(res);
+    },
+  },
+};
+</script>
+<style scoped>
+.el-table::before {
+  width: 0;
+}
+
+.table {
+  background-color: rgba(0, 0, 0, 0.5);
+}
+
+:deep(.el-table__body-wrapper::-webkit-scrollbar) {
+  width: 8px;
+  height: 0px;
+  background-color: black;
+}
+
+:deep(.el-table__body-wrapper::-webkit-scrollbar-thumb) {
+  background-color: #292929;
+  border-radius: 6px;
+}
+
+:deep(.el-table td, .el-table th) {
+  border-bottom: 2px solid black;
+}
+.el-table__body-wrapper {
+  background-color: black;
+}
+tr {
+  line-height: 1.5;
+  background: #1e1e1e;
+  margin-bottom: 2px;
+  border-radius: 5px;
+}
+
+/* .ToolBar {
+  position: absolute;
+  right: 12px;
+  width: 586px;
+  text-align: center;
+  z-index: 2;
+  font-size: 14px;
+  height: 28px;
+  margin: 5px;
+  background: #1e1e1e;
+} */
+.table-main {
+  font-size: 14px;
+  width: 600px;
+  text-align: center;
+  background: #000000;
+  margin: 5px;
+  border-collapse: separate;
+  border-spacing: 0px 5px;
+}
+
+.currentWarningCardTableBox {
+  position: absolute;
+  right: -400px;
+  bottom: 40px;
+  padding-left: 5px;
+  padding-right: 5px;
+  opacity: 0.3;
+  transition: 0.3s;
+}
+.currentWarningCardTableBox:hover,
+.currentWarningCardTableBox.show {
+  right: 10px;
+  transition: 0.3s;
+  opacity: 1;
+}
+.currentWarningCardTableBox.hide {
+  opacity: 0.3;
+  transition: 0.3s;
+  right: -200px;
+}
+</style>
+<style lang="less">
+.cellBase {
+  background: rgb(30, 30, 30) !important;
+  color: rgb(220, 220, 220);
+  padding: 3px;
+  font-size: 12px;
+}
+.cellBase.flicker {
+  animation: flicker 0.6s infinite;
+}
+@keyframes flicker {
+  0% {
+    color: rgb(220, 220, 220);
+  }
+  50% {
+    color: orangered;
+  }
+  100% {
+    color: rgb(220, 220, 220);
+  }
+}
+</style>

+ 367 - 0
src/components/focus/syzDetails.vue

@@ -0,0 +1,367 @@
+<template>
+  <el-dialog
+    width="90%"
+    @open="opened"
+    @closed="closed"
+    :fullscreen="true"
+    :show-close="true"
+    class="dialogs"
+  >
+    <template #title>
+      <div class="showTitles currentShowTitles">
+        <div class="titles">升压站</div>
+      </div>
+    </template>
+    <div class="bodyy">
+      <el-tabs
+        type="border-card"
+        stretch
+        lazy
+        style="width: 100%; height: 100%"
+        v-model="activeTab"
+        @tab-click="tabClick"
+      >
+        <el-tab-pane
+          class="syzDetailsPaneItem"
+          v-for="(item, index) in syzArray"
+          :key="index"
+          :name="item.id"
+        >
+          <template #label>
+            <span v-if="pageshowMode % 2">
+              <el-badge is-dot v-if="item.isWarning === '1'">
+                <span>{{ item.name }}</span>
+              </el-badge>
+              <span v-else>{{ item.name }}</span>
+            </span>
+            <span v-else>
+              <el-badge is-dot v-if="item.isWarning === '1'">
+                <span>{{ item.name }}</span>
+              </el-badge>
+              <span v-else>{{ item.name }}</span>
+            </span>
+          </template>
+          <Mhs v-if="item.id === 'MHS_FDC'" />
+          <Nss v-if="item.id === 'NSS_FDC'" />
+          <Qs v-if="item.id === 'QS_FDC'" />
+          <Sbq v-if="item.id === 'SBQ_FDC'" />
+          <Xs v-if="item.id === 'XS_FDC'" />
+          <Pl1 v-if="item.id === 'PL1_GDC'" />
+          <Pl2 v-if="item.id === 'PL2_GDC'" />
+          <Dwk v-if="item.id === 'DWK_GDC'" />
+          <Mch v-if="item.id === 'MCH_GDC'" />
+          <Xh v-if="item.id === 'XH_GDC'" />
+          <Sbdl v-if="item.id === 'QS3_FDC'" />
+          <div class="alarmIconBox" @click="switchAlarmSound(index)">
+            <el-tooltip
+              v-if="item.isMute"
+              effect="light"
+              :content="`当前${item.name}升压站报警已消音,请注意`"
+              placement="left"
+            >
+              <i
+                class="el-icon-close-notification"
+                style="color: orangered"
+              ></i>
+            </el-tooltip>
+            <i v-else class="el-icon-bell" style="color: rgb(219, 215, 0)"></i>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+      <CurrentWarningCard
+        :currentClass="$store.state.currentWarningCardClass"
+        :activeTab="activeTab || 'MHS_FDC'"
+      />
+    </div>
+  </el-dialog>
+</template>
+<script>
+import Mhs from "../BoosterStation/mhs.vue";
+import Nss from "../BoosterStation/nss.vue";
+import Qs from "../BoosterStation/qs.vue";
+import Sbq from "../BoosterStation/sbq.vue";
+import Xs from "../BoosterStation/xs.vue";
+import Dwk from "../BoosterStation/dwk.vue";
+import Sbdl from "../BoosterStation/sbdl.vue";
+import Pl1 from "../BoosterStation/pl1.vue";
+import Pl2 from "../BoosterStation/pl2.vue";
+import Mch from "../BoosterStation/mch.vue";
+import Xh from "../BoosterStation/xh.vue";
+
+import CurrentWarningCard from "./currentWarningCard.vue";
+export default {
+  components: {
+    Mhs,
+    Nss,
+    Qs,
+    Sbq,
+    Xs,
+    Dwk,
+    Sbdl,
+    Pl1,
+    Pl2,
+    Mch,
+    Xh,
+    CurrentWarningCard,
+  },
+  data() {
+    return {
+      activeTab: this.$store.state.activeTab,
+      svgVisible: true,
+      audio: null,
+      timmer: null,
+      syzArray: this.$store.getters.syzArray || [],
+      pageshowMode: 0,
+    };
+  },
+  created() {},
+  mounted() {},
+  updated() {},
+  methods: {
+    // 初始化第一次报警并判断是否播放声音
+    initAlarm() {
+      let syzAlarmArray = this.$store.getters.syzAlarmArray;
+
+      const firstAlarmItem = syzAlarmArray.find((ele) => {
+        return !ele.isConfirm && ele.rank === this.$store.state.syzAlarmRank;
+      });
+
+      firstAlarmItem &&
+        this.audioPlay(this.getSound(firstAlarmItem.soundSource));
+
+      firstAlarmItem &&
+        this.$store.getters.syzAlarmArray.forEach((ele) => {
+          if (ele.stationId === firstAlarmItem.stationId) {
+            ele.isConfirm = true;
+          }
+        });
+
+      this.activeTab =
+        firstAlarmItem?.stationId ||
+        syzAlarmArray.find((ele) => {
+          return ele.rank === this.$store.state.syzAlarmRank;
+        })?.stationId ||
+        this.$store.getters.syzArray[0].id;
+
+      syzAlarmArray.forEach((ele) => {
+        if (ele.stationId === firstAlarmItem?.stationId) {
+          ele.isConfirm = true;
+          this.clearWarningTag(ele.stationId);
+        } else if (
+          !ele.isConfirm &&
+          ele.stationId !== firstAlarmItem?.stationId
+        ) {
+          this.renderWarningTag(ele.stationId);
+        }
+      });
+
+      this.$store.commit("syzAlarmArray", syzAlarmArray);
+    },
+
+    // 定时器循环数据判断小红点渲染及是否播放声音
+    renderAlarm(stationId = "", playSound = true) {
+      let syzAlarmArray = this.$store.getters.syzAlarmArray;
+
+      syzAlarmArray.forEach((ele) => {
+        if (ele.stationId === stationId) {
+          ele.isConfirm = true;
+          this.clearWarningTag(ele.stationId);
+        } else if (!ele.isConfirm && ele.stationId !== stationId) {
+          this.renderWarningTag(ele.stationId);
+        }
+      });
+
+      const res = syzAlarmArray.find((ele) => {
+        return !ele.isConfirm;
+      });
+
+      if (playSound) {
+        // this.audioPlay("./static/sound/syz.mp3");
+      }
+
+      this.$store.commit("syzAlarmArray", syzAlarmArray);
+    },
+
+    // 返回音频文件路径
+    getSound(fileName) {
+      return `./static/sound/${fileName}.mp3`;
+    },
+
+    // 播放音频
+    audioPlay(audioPath) {
+      let soundMuteSelf = [];
+      let soundMuteOther = [];
+
+      this.$store.getters.syzAlarmArray.forEach((ele) => {
+        if (ele.stationId === this.activeTab) {
+          soundMuteSelf.push(ele);
+        } else {
+          soundMuteOther.push(ele);
+        }
+      });
+
+      let alarmSelfLock = soundMuteSelf.some((ele) => {
+        return !ele.isConfirm;
+      });
+
+      let alarmOtherLock = soundMuteOther.some((ele) => {
+        return !ele.isConfirm;
+      });
+
+      if (alarmOtherLock) {
+        this.audio = new Audio(audioPath);
+        this.audio.play();
+      } else if (alarmSelfLock) {
+        this.$store.getters.syzArray.forEach((ele) => {
+          if (ele.stationId === this.activeTab) {
+            ele.isMute = false;
+            this.audio = new Audio(audioPath);
+            this.audio.play();
+          }
+        });
+      } else if (!alarmSelfLock) {
+        this.$store.getters.syzArray.forEach((ele) => {
+          if (ele.stationId === this.activeTab) {
+            if (!ele.isMute) {
+              this.audio = new Audio(audioPath);
+              this.audio.play();
+            }
+          }
+        });
+      }
+    },
+
+    // 显示某个小红点
+    renderWarningTag(stationId = "") {
+      this.$store.getters.syzArray.forEach((ele) => {
+        if (ele.id === stationId) {
+          ele.isWarning = "1";
+        }
+      });
+      this.pageshowMode++;
+    },
+
+    // 清除某个小红点
+    clearWarningTag(stationId = "") {
+      this.$store.getters.syzArray.forEach((ele) => {
+        if (ele.id === stationId) {
+          ele.isWarning = "0";
+        }
+      });
+      this.pageshowMode++;
+    },
+
+    // 切换报警声音开关
+    switchAlarmSound(index) {
+      this.$store.getters.syzArray[index].isMute =
+        !this.$store.getters.syzArray[index].isMute;
+    },
+
+    opened() {
+      this.initAlarm();
+      this.timmer = setInterval(() => {
+        this.renderAlarm();
+      }, 3000);
+    },
+
+    closed() {
+      clearInterval(this.timmer);
+      this.timmer = null;
+      this.$store.commit("activeTab", "");
+      this.$store.commit("syzDialogShow", false);
+    },
+
+    tabClick(res) {
+      this.$store.commit("activeTab", res.props.name);
+      this.renderAlarm(res.props.name, false);
+    },
+  },
+  watch: {
+    "$store.state.syzArray"(res) {
+      this.syzArray = res;
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.bodyy {
+  display: flex;
+  flex-direction: row;
+  background-color: black;
+  width: 100%;
+  margin-top: -30px;
+  height: 91vh;
+  position: relative;
+  overflow: hidden;
+
+  .syzDetailsPaneItem {
+    position: relative;
+
+    .alarmIconBox {
+      position: absolute;
+      right: 0;
+      top: 0;
+      cursor: pointer;
+
+      i {
+        font-size: 20px;
+      }
+    }
+  }
+}
+</style>
+<style lang="less">
+.bodyy {
+  .pop-up-main,
+  .paln-box {
+    width: 100%;
+    height: 90vh;
+    overflow: hidden;
+    position: relative;
+  }
+  .movableItem {
+    width: 100% !important;
+    height: 100% !important;
+
+    .svg {
+      width: 100%;
+      height: 92%;
+      margin-left: 0;
+      margin-top: 8%;
+    }
+  }
+
+  .el-badge__content.is-fixed.is-dot {
+    right: 0;
+    top: 10px;
+    background: #f25656;
+    animation: twinkle 0.75s infinite;
+    border-color: transparent;
+  }
+
+  @keyframes twinkle {
+    0% {
+      opacity: 0;
+    }
+    50% {
+      opacity: 1;
+    }
+    100% {
+      opacity: 0;
+    }
+  }
+}
+
+.currentShowTitles {
+  width: 100%;
+  position: relative;
+  .alarIcon {
+    position: absolute;
+    right: 50px;
+    top: 5;
+    font-size: 20px;
+    cursor: pointer;
+  }
+}
+</style>

+ 1 - 1
src/components/matrixBlock.vue

@@ -125,7 +125,7 @@ export default {
   updated() {},
   methods: {
     handleDeal(val) {
-      let data = dayjs(val).format("YYYY-MM-DD HH:mm:ss");;
+      let data = dayjs(val).format("YYYY-MM-DD HH:mm:ss");
       this.showVlaues = this.timeFn(data);
       // return `该状态共持续:`
     },

+ 562 - 0
src/components/problem/ProblemMatrixCard.vue

@@ -0,0 +1,562 @@
+<template>
+  <div class="main" v-if="values.length > 0">
+    <div>{{ title }}</div>
+    <div class="content">
+      <div class="card" v-for="(item, index) in values" :key="index" :class="
+          item.active
+            ? 'card-select-' + item.status
+            : 'card-unselect-' + item.status
+        " @click="onSelectHandler(item)" @dblclick="sendMsg(item)">
+        <div class="card-left" :class="
+            item.active
+              ? 'card-left-select-' + item.status
+              : 'card-left-unselect-' + item.status
+          ">
+          <div>{{ item.windturbineId.slice(0, 2) }}</div>
+          <div>{{ item.windturbineId.slice(5) }}</div>
+        </div>
+        <div class="card-right" :class="
+            item.active
+              ? 'card-right-select-' + item.status
+              : 'card-right-unselect-' + item.status
+          ">
+          <div class="rightrow">{{ item.windSpeed.toFixed(2) }} m/s</div>
+          <div class="rightrow">{{ item.power.toFixed(2) }} kw</div>
+          <div class="rightrow">{{ item.rollSpeed.toFixed(2) }} rpm</div>
+        </div>
+      </div>
+    </div>
+    <div class="bottom"></div>
+  </div>
+  <!-- <WindturbineDetailPages v-model="dialogVisible" :windturbine="currentWindturbine"></WindturbineDetailPages> -->
+</template>
+
+<script>
+  // import WindturbineDetailPages from "../WindturbineDetailPages.vue";
+  export default {
+    name: "ControlMatrixCard",
+    props: {
+      // dateClick,
+      title: String,
+      type: Number,
+      datas: Object,
+      flag: {
+        type: Boolean,
+        default: false,
+      }
+    },
+    data() {
+      return {
+        values: [],
+        dialogVisible: false,
+        currentWindturbine: {},
+        cacheFlag: false,
+      };
+    },
+    components: {
+      // WindturbineDetailPages,
+    },
+    methods: {
+      
+      // 点击卡片事件
+      onSelectHandler(item) {
+        item.active = !item.active;
+      },
+      sendMsg: function (itm) {
+        if (this.flag) {
+          this.$emit("showWindows", itm);
+        } else {
+          this.dialogVisible = true;
+          this.currentWindturbine = itm;
+        }
+      },
+      filter(value, windturbineId) {
+        let array = [];
+        let flag = false;
+        for (let i = 0; i < value.length; i++) {
+          if (value[i].windturbineId == windturbineId) {
+            flag = true;
+            array.push(flag); // 风机是否已经存在
+            array.push(i); // 风机在values数组的位置
+            array.push(value[i].active); // 当前风机是否被选中
+            break;
+          }
+        }
+        return array;
+      },
+      addCard(val) {
+        let active = false;
+        let array = this.filter(this.values, val.windturbineId);
+        if (!array[0]) {
+          // 维护
+          val.active = active;
+          if (val.modelId.indexOf("105") >= 0) {
+            val.rollSpeed *= 9.55;
+          }
+          this.values.push(val);
+        } else {
+          val.active = array[2];
+          this.values.splice(array[1], 1, val);
+        }
+      },
+      /* 获取选中的项目 */
+      getSelectedItems() {
+        let ls = new Array();
+        this.values.forEach((item) => {
+          if (item.active) {
+            ls.push(item);
+          }
+        });
+        return ls;
+      },
+      /* 将选中的项目填充到数组中 */
+      outputSelectedItems(ls) {
+        this.values.forEach((item) => {
+          if (item.active && !this.isHas(item, ls)) {
+            ls.push(item);
+          }
+        });
+      },
+
+      /* 清除选中的项目 */
+      clearSelected() {
+        this.values.forEach((item) => (item.active = false));
+      },
+
+      isHas(item, ls) {
+        for (let id in ls) {
+          if (ls[id].windturbineId == item.windturbineId) {
+            return true;
+          }
+        }
+        return false;
+      },
+
+      clear(vs) {
+        let ll = new Array();
+        this.values.forEach((item) => {
+          let it = vs[item.windturbineId];
+          if (typeof it === "undefined") {
+            ll.push(item);
+          }
+        });
+        for (let v1 in ll) {
+          let ind = this.values.indexOf(ll[v1]);
+          if (ind < 0) continue;
+          this.values.splice(ind, 1);
+        }
+      },
+      dateClick(type){
+        console.log(this.cacheDate);
+        let vs = {};
+        let address = ''
+          switch (type) {
+            case 0:
+              address = 'MG'
+              break;
+            case 1:
+              address = 'NG'
+              break;
+            case 2:
+              address = 'QG'
+              break;
+            case 3:
+              address = 'SG'
+              break;
+            case 4:
+              address = 'XG'
+              break;
+          }
+          let arr = Object.keys(this.cacheDate).sort()
+          for (let id of arr) {
+            let val = this.cacheDate[id];
+            if (val.windturbineId.substring(0, 2) === address) {
+                this.addCard(val);
+                vs[val.windturbineId] = 0;
+              }
+          }
+          this.clear(vs);
+      },
+    },
+    watch: {
+      "$store.getters.windturbinelist": {
+        deep: true,
+        handler: function (json) {
+          let vs = {};
+          let address = ''
+          switch (this.type) {
+            case 0:
+              address = 'MG'
+              break;
+            case 1:
+              address = 'NG'
+              break;
+            case 2:
+              address = 'QG'
+              break;
+            case 3:
+              address = 'SG'
+              break;
+            case 4:
+              address = 'XG'
+              break;
+          }
+          if (this.flag && !this.cacheFlag){
+            this.cacheDate = json
+            this.cacheFlag = true
+          }
+          let arr = Object.keys(json).sort()
+          for (let id of arr) {
+            let val = json[id];
+            if (this.flag) {
+              if (val.windturbineId.substring(0, 2) === address) {
+                this.addCard(val);
+                vs[val.windturbineId] = 0;
+              }
+            } else {
+              if (val.status == this.type) {
+                this.addCard(val);
+                vs[val.windturbineId] = 0;
+              }
+              if (this.type < 0 && val.lockValue) {
+                this.addCard(val);
+                vs[val.windturbineId] = 0;
+              }
+            }
+          }
+          // console.log(this.values);
+          this.clear(vs);
+        },
+      },
+    },
+  };
+</script>
+
+<style scoped>
+  .rightrow {
+    margin-right: 3px;
+  }
+
+  .content {
+    display: flex;
+    flex-direction: row;
+    flex-wrap: wrap;
+  }
+
+  .bottom {
+    background-color: #292929;
+    width: 100%;
+    height: 2px;
+    margin-top: 5px;
+  }
+
+  .main {
+    margin: 0 5px 15px 5px;
+  }
+
+  /*  最外层卡片 */
+  .card {
+    width: 112px;
+    height: 49px;
+    font-size: 12px;
+    margin-left: 3px;
+    margin-top: 4px;
+    display: flex;
+    flex-direction: row;
+    cursor: pointer;
+    /* border: 2px solid rgb(75, 85, 174); */
+  }
+
+  /*  卡片左边部分 */
+  .card-left {
+    width: 25px;
+    margin: 3px;
+    font-size: 14px;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+    align-items: center;
+    /* background-color: rgb(75, 85, 174); */
+  }
+
+  /* 卡片右边部分 */
+  .card-right {
+    display: flex;
+    flex: 1;
+    flex-direction: column;
+    justify-content: space-around;
+    align-items: flex-end;
+    padding-right: 3px;
+    /* border-left: 2px dashed rgb(75, 85, 174); */
+  }
+
+  /* ***********颜色************ */
+  /* *********************** */
+  /*  最外层卡片选中和未选中 */
+  .card-select-0 {
+    border: 2px solid rgb(255, 255, 255, 0.5);
+  }
+
+  .card-unselect-0 {
+    border: 2px solid rgb(255, 255, 255);
+  }
+
+  /*  左边卡片选中和未选中 */
+  .card-left-select-0 {
+    background-color: rgb(255, 255, 255, 0.5);
+    color: rgb(0, 0, 0, 0.5);
+  }
+
+  .card-left-unselect-0 {
+    background-color: rgb(255, 255, 255, .5);
+    color: rgb(0, 0, 0);
+  }
+
+  /*  右边卡片选中和未选中 */
+  .card-right-select-0 {
+    border-left: 2px dashed rgb(255, 255, 255, 0.5);
+  }
+
+  .card-right-unselect-0 {
+    border-left: 2px dashed rgb(255, 255, 255, .5);
+    background-color: rgb(255, 255, 255, .15);
+  }
+
+  /* ***********颜色************ */
+  /* *********************** */
+  /*  最外层卡片选中和未选中 */
+  .card-select-1 {
+    border: 2px solid rgb(197, 48, 200, 0.5);
+  }
+
+  .card-unselect-1 {
+    border: 2px solid rgb(197, 48, 200);
+  }
+
+  .card-select-1 {
+    border: 2px solid rgb(197, 48, 200, 0.5);
+  }
+
+  /*  左边卡片选中和未选中 */
+  .card-left-select-1 {
+    background-color: rgb(197, 48, 200, 0.5);
+  }
+
+  .card-left-unselect-1 {
+    background-color: rgb(197, 48, 200, .5);
+  }
+
+  /*  右边卡片选中和未选中 */
+  .card-right-select-1 {
+    border-left: 2px dashed rgb(197, 48, 200, 0.5);
+  }
+
+  .card-right-unselect-1 {
+    border-left: 2px dashed rgb(197, 48, 200, .5);
+    background-color: rgb(197, 48, 200, .15);
+  }
+
+  /* ***********颜色************ */
+  /* *********************** */
+  /*  最外层卡片选中和未选中 */
+  .card-select-2 {
+    border: 2px solid rgb(05, 187, 76, 0.5);
+  }
+
+  .card-unselect-2 {
+    border: 2px solid rgb(05, 187, 76);
+  }
+
+  .card-select-2 {
+    border: 2px solid rgb(05, 187, 76, 0.5);
+  }
+
+  /*  左边卡片选中和未选中 */
+  .card-left-select-2 {
+    background-color: rgb(05, 187, 76, 0.5);
+  }
+
+  .card-left-unselect-2 {
+    background-color: rgb(05, 187, 76, .5);
+  }
+
+  /*  右边卡片选中和未选中 */
+  .card-right-select-2 {
+    border-left: 2px dashed rgb(05, 187, 76, 0.5);
+  }
+
+  .card-right-unselect-2 {
+    border-left: 2px dashed rgb(05, 187, 76, .5);
+    background-color: rgb(05, 187, 76, .15);
+  }
+
+  /* ***********颜色************ */
+  /* *********************** */
+  /*  最外层卡片选中和未选中 */
+  .card-select-3 {
+    border: 2px solid rgb(05, 187, 76, 0.5);
+  }
+
+  .card-unselect-3 {
+    border: 2px solid rgb(05, 187, 76);
+  }
+
+  .card-select-3 {
+    border: 2px solid rgb(05, 187, 76, 0.5);
+  }
+
+  /*  左边卡片选中和未选中 */
+  .card-left-select-3 {
+    background-color: rgb(05, 187, 76, 0.5);
+  }
+
+  .card-left-unselect-3 {
+    background-color: rgb(05, 187, 76, .5);
+  }
+
+  /*  右边卡片选中和未选中 */
+  .card-right-select-3 {
+    border-left: 2px dashed rgb(05, 187, 76, 0.5);
+  }
+
+  .card-right-unselect-3 {
+    border-left: 2px dashed rgb(05, 187, 76, .5);
+    background-color: rgb(05, 187, 76, .15);
+  }
+
+  /* ***********颜色************ */
+  /* *********************** */
+  /*  最外层卡片选中和未选中 */
+  .card-select-4 {
+    border: 2px solid rgb(75, 85, 174, 0.5);
+  }
+
+  .card-unselect-4 {
+    border: 2px solid rgb(75, 85, 174);
+  }
+
+  .card-select-4 {
+    border: 2px solid rgb(75, 85, 174, 0.5);
+  }
+
+  /*  左边卡片选中和未选中 */
+  .card-left-select-4 {
+    background-color: rgb(75, 85, 174, 0.5);
+  }
+
+  .card-left-unselect-4 {
+    background-color: rgb(75, 85, 174, .5);
+  }
+
+  /*  右边卡片选中和未选中 */
+  .card-right-select-4 {
+    border-left: 2px dashed rgb(75, 85, 174, 0.5);
+  }
+
+  .card-right-unselect-4 {
+    border-left: 2px dashed rgb(75, 85, 174, .5);
+    background-color: rgb(75, 85, 174, .15);
+  }
+
+  /* ***********颜色************ */
+  /* *********************** *
+/*  最外层卡片选中和未选中 */
+  .card-select-5 {
+    border: 2px solid rgb(186, 50, 55, 0.5);
+  }
+
+  .card-unselect-5 {
+    border: 2px solid rgb(186, 50, 55);
+  }
+
+  .card-select-5 {
+    border: 2px solid rgb(186, 50, 55, 0.5);
+  }
+
+  /*  左边卡片选中和未选中 */
+  .card-left-select-5 {
+    background-color: rgb(186, 50, 55, 0.5);
+  }
+
+  .card-left-unselect-5 {
+    background-color: rgb(186, 50, 55, .5);
+  }
+
+  /*  右边卡片选中和未选中 */
+  .card-right-select-5 {
+    border-left: 2px dashed rgb(186, 50, 55, 0.5);
+  }
+
+  .card-right-unselect-5 {
+    border-left: 2px dashed rgb(186, 50, 55, .5);
+    background-color: rgb(186, 50, 55, .15);
+  }
+
+  /* ***********颜色************ */
+  /* *********************** *
+/*  最外层卡片选中和未选中 */
+  .card-select-6 {
+    border: 2px solid rgb(225, 125, 36, 0.5);
+  }
+
+  .card-unselect-6 {
+    border: 2px solid rgb(225, 125, 36);
+  }
+
+  .card-select-6 {
+    border: 2px solid rgb(225, 125, 36, 0.5);
+  }
+
+  /*  左边卡片选中和未选中 */
+  .card-left-select-6 {
+    background-color: rgb(225, 125, 36, 0.5);
+  }
+
+  .card-left-unselect-6 {
+    background-color: rgb(225, 125, 36, .5);
+  }
+
+  /*  右边卡片选中和未选中 */
+  .card-right-select-6 {
+    border-left: 2px dashed rgb(225, 125, 36, 0.5);
+  }
+
+  .card-right-unselect-6 {
+    border-left: 2px dashed rgb(225, 125, 36, .5);
+    background-color: rgb(225, 125, 36, .15);
+  }
+
+  /* ***********颜色************ */
+  /* *********************** *
+/*  最外层卡片选中和未选中 */
+  .card-select-7 {
+    border: 2px solid rgb(96, 103, 105, 0.5);
+  }
+
+  .card-unselect-7 {
+    border: 2px solid rgb(96, 103, 105);
+  }
+
+  .card-select-7 {
+    border: 2px solid rgb(96, 103, 105, 0.5);
+  }
+
+  /*  左边卡片选中和未选中 */
+  .card-left-select-7 {
+    background-color: rgb(96, 103, 105, 0.5);
+  }
+
+  .card-left-unselect-7 {
+    background-color: rgb(96, 103, 105, .5);
+  }
+
+  /*  右边卡片选中和未选中 */
+  .card-right-select-7 {
+    border-left: 2px dashed rgb(96, 103, 105, 0.5);
+  }
+
+  .card-right-unselect-7 {
+    border-left: 2px dashed rgb(96, 103, 105, .5);
+    background-color: rgb(96, 103, 105, .15);
+  }
+</style>

+ 2 - 3
src/components/problem/areaCard.vue

@@ -489,13 +489,12 @@ export default {
 </script>
 
 <style scoped="scoped">
-.title{
-  flex-grow: 1;
-}
+
 .tit1{
   width: 92%;
   display: flex;
   align-items: center;
+  justify-content: space-between;
 }
 .num {
   color: #fff;

+ 146 - 0
src/utils/PhotoelectricDetailPages.js

@@ -0,0 +1,146 @@
+// import axios from 'axios';
+// import {config} from '../../config';
+
+export const Photoelectric = {
+	'MHS_BT': [
+		{ name: "有功设定限值", tag: "PowerSet", value: "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_AI0296", calc: "1" },
+		{ name: "AGC可调上限", tag: "AgcUp", value: "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_AI0294", calc: "0.1" },
+		{ name: "AGC可调下限", tag: "AgcLower", value: "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_AI0295", calc: "0.01" },
+		{ name: "实发有功", tag: "ActualPower", value: "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_AI0013", calc: "0.833" },
+		{ name: "理论功率", tag: "TheoryPower", value: "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0193", calc: "0.001" },
+		{ name: "预测功率", tag: "ForecastPower", value: "MHSFGL.NX_GD_MHSF_YC_P1_L1_001_CDQ001", calc: "1" },
+		{ name: "AGC投入", tag: "AgcIn", value: "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI1207" },
+		{ name: "AGC远方", tag: "AgcFar", value: "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI1208" },
+		{ name: "有功增闭锁", tag: "SumLock", value: "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI1209" },
+		{ name: "有功减闭锁", tag: "SubLock", value: "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI1210" },
+		{ name: "状态", tag: "Status", value: "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0263" },
+		{ name: "装机容量", tag: "InstalledCapacity", value: "69.5" },
+	],
+	'QS_BT': [
+		{ name: "有功设定限值", tag: "PowerSet", value: "QSDQ.NX_GD_QSF_DQ_P1_L1_001_AI1281", calc: "1" },
+		{ name: "AGC可调上限", tag: "AgcUp", value: "QSDQ.NX_GD_QSF_DQ_P1_L1_001_AI1284", calc: "1" },
+		{ name: "AGC可调下限", tag: "AgcLower", value: "QSDQ.NX_GD_QSF_DQ_P1_L1_001_AI1285", calc: "0.1" },
+		{ name: "实发有功", tag: "ActualPower", value: "QSDQ.NX_GD_QSF_DQ_P1_L1_001_AI1282", calc: "1" },
+		{ name: "理论功率", tag: "TheoryPower", value: "QSFCJSFW.NX_GD_QSF_FJ_P1_XXX_XXX_CI0192", calc: "0.001" },
+		{ name: "预测功率", tag: "ForecastPower", value: "QSFGL.NX_GD_QSF_YC_P1_L1_001_CDQ001", calc: "1" },
+		{ name: "AGC投入", tag: "AgcIn", value: "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI2442" },
+		{ name: "AGC远方", tag: "AgcFar", value: "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI2443" },
+		{ name: "有功增闭锁", tag: "SumLock", value: "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI2444" },
+		{ name: "有功减闭锁", tag: "SubLock", value: "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI2445" },
+		{ name: "状态", tag: "Status", value: "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0263" },
+		{ name: "装机容量", tag: "InstalledCapacity", value: "99" },
+	],
+	'NSS_BT': [
+		{ name: "有功设定限值", tag: "PowerSet", value: "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_AI1019", calc: "1" },
+		{ name: "AGC可调上限", tag: "AgcUp", value: "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_AI1010", calc: "0.001" },
+		{ name: "AGC可调下限", tag: "AgcLower", value: "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_AI1011", calc: "0.001" },
+		{ name: "实发有功", tag: "ActualPower", value: "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_AI1009", calc: "0.001" },
+		{ name: "理论功率", tag: "TheoryPower", value: "NSSFCJSFW.NX_GD_NSSF_XX_XX_XXX_XXX_CI0193", calc: "0.001" },
+		{ name: "预测功率", tag: "ForecastPower", value: "NSSFGL.NX_GD_NSSF_YC_P1_L1_001_CDQ001", calc: "0.001" },
+		{ name: "AGC投入", tag: "AgcIn", value: "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI1547" },
+		{ name: "AGC远方", tag: "AgcFar", value: "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI1556" },
+		{ name: "有功增闭锁", tag: "SumLock", value: "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI1567" },
+		{ name: "有功减闭锁", tag: "SubLock", value: "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI1568" },
+		{ name: "状态", tag: "Status", value: "NSSFCJSFW.NX_GD_NSSF_XX_XX_XXX_XXX_CI0263" },
+		{ name: "装机容量", tag: "InstalledCapacity", value: "148.5" },
+	],
+	"XN6_BT": [
+		{ name: "有功设定限值", tag: "PowerSet", value: "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0818", calc: "1" },
+		{ name: "AGC可调上限", tag: "AgcUp", value: "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0819", calc: "0.1" },
+		{ name: "AGC可调下限", tag: "AgcLower", value: "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0820", calc: "0.1" },
+		{ name: "实发有功", tag: "ActualPower", value: "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0012", calc: "0.001" },
+		{ name: "理论功率", tag: "TheoryPower", value: "SBQFCJSFW.NX_GD_SBQF_FJ_P1_XXX_XXX_CI0192", calc: "0.001" },
+		{ name: "预测功率", tag: "ForecastPower", value: "SBQFGL.NX_GD_SBQF_YC_P1_L1_001_CDQ001", calc: "1" },
+		{ name: "AGC投入", tag: "AgcIn", value: "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_DI3831" },
+		{ name: "AGC远方", tag: "AgcFar", value: "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_DI3832" },
+		{ name: "有功增闭锁", tag: "SumLock", value: "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_DI3833" },
+		{ name: "有功减闭锁", tag: "SubLock", value: "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_DI3834" },
+		{ name: "状态", tag: "Status", value: "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0263" },
+		{ name: "装机容量", tag: "InstalledCapacity", value: "49.5" },
+	],
+	'N5_BT': [
+		{ name: "有功设定限值", tag: "PowerSet", value: "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0818", calc: "1" },
+		{ name: "AGC可调上限", tag: "AgcUp", value: "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0819", calc: "1" },
+		{ name: "AGC可调下限", tag: "AgcLower", value: "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0820", calc: "1" },
+		{ name: "实发有功", tag: "ActualPower", value: "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0817", calc: "1" },
+		{ name: "理论功率", tag: "TheoryPower", value: "SBQFCJSFW.NX_GD_SBQF_FJ_P2_XXX_XXX_CI0192,SBQFCJSFW.NX_GD_SBQF_FJ_P3_XXX_XXX_CI0192,SBQFCJSFW.NX_GD_SBQF_FJ_P4_XXX_XXX_CI0192", calc: "0.001" },
+		{ name: "预测功率", tag: "ForecastPower", value: "SBQFGL.NX_GD_SBQF_YC_P1_L1_001_CDQ001", calc: "1" },
+		{ name: "AGC投入", tag: "AgcIn", value: "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI3831" },
+		{ name: "AGC远方", tag: "AgcFar", value: "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI3832" },
+		{ name: "有功增闭锁", tag: "SumLock", value: "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI3833" },
+		{ name: "有功减闭锁", tag: "SubLock", value: "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI3834" },
+		{ name: "状态", tag: "Status", value: "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI026X" },
+		{ name: "装机容量", tag: "InstalledCapacity", value: "149" },
+	],
+	'XS_BT': [
+		{ name: "有功设定限值", tag: "PowerSet", value: "XSDQ.NX_GD_XSF_DQ_P1_L1_001_AI0411", calc: "1" },
+		{ name: "AGC可调上限", tag: "AgcUp", value: "XSDQ.NX_GD_XSF_DQ_P1_L1_001_AI0412", calc: "1" },
+		{ name: "AGC可调下限", tag: "AgcLower", value: "XSDQ.NX_GD_XSF_DQ_P1_L1_001_AI0413", calc: "1" },
+		{ name: "实发有功", tag: "ActualPower", value: "XSDQ.NX_GD_XSF_DQ_P1_L1_001_AI0415", calc: "1" },
+		{ name: "理论功率", tag: "TheoryPower", value: "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0193", calc: "0.001" },
+		{ name: "预测功率", tag: "ForecastPower", value: "XSFGL.NX_G D_XSF_YC_P1_L1_001_CDQ001", calc: "1" },
+		{ name: "AGC投入", tag: "AgcIn", value: "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI1749" },
+		{ name: "AGC远方", tag: "AgcFar", value: "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI1750" },
+		{ name: "有功增闭锁", tag: "SumLock", value: "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI1753" },
+		{ name: "有功减闭锁", tag: "SubLock", value: "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI1754" },
+		{ name: "状态", tag: "Status", value: "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0263" },
+		{ name: "装机容量", tag: "InstalledCapacity", value: "99" },
+	],
+	'SL_BT': [
+		{ name: "有功设定限值", tag: "PowerSet", value: "SLAGC.NX_GD_QSF_DQ_P1_L1_001_AI0052", calc: "1" },
+		{ name: "AGC可调上限", tag: "AgcUp", value: "SLAGC.NX_GD_QSF_DQ_P1_L1_001_AI0053", calc: "1" },
+		{ name: "AGC可调下限", tag: "AgcLower", value: "SLAGC.NX_GD_QSF_DQ_P1_L1_001_AI0054", calc: "1" },
+		{ name: "实发有功", tag: "ActualPower", value: "SLDQ.NX_GD_QSF_DQ_P1_L1_001_AI0013", calc: "1" },
+		{ name: "理论功率", tag: "TheoryPower", value: "QSFCJSFW.NX_GD_QSF_FJ_P3_XXX_XXX_CI0192", calc: "0.001" },
+		{ name: "预测功率", tag: "ForecastPower", value: "SLFGL.NX_GD_QSF_YC_P1_L1_001_LCDQ01", calc: "1" },
+		{ name: "AGC投入", tag: "AgcIn", value: "SLAGC.NX_GD_QSF_DQ_P1_L1_001_DI0142" },
+		{ name: "AGC远方", tag: "AgcFar", value: "SLAGC.NX_GD_QSF_DQ_P1_L1_001_DI0143" },
+		{ name: "有功增闭锁", tag: "SumLock", value: "SLAGC.NX_GD_QSF_DQ_P1_L1_001_DI0162" },
+		{ name: "有功减闭锁", tag: "SubLock", value: "SLAGC.NX_GD_QSF_DQ_P1_L1_001_DI0163" },
+		{ name: "状态", tag: "Status", value: "SLAGC.NX_GD_QSF_DQ_P1_L1_001_DI0165" },
+		{ name: "装机容量", tag: "InstalledCapacity", value: "49.5" },
+	],
+	"DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0263": [
+		{ name: "有功设定限值", tag: "PowerSet", value: "DWKDQ.NX_GD_DWKG_DQ_P1_L1_001_AI0837" },
+		{ name: "AGC可调上限", tag: "AgcUp", value: "DWKDQ.NX_GD_DWKG_DQ_P1_L1_001_AI0838" },
+		{ name: "AGC可调下限", tag: "AgcLower", value: "DWKDQ.NX_GD_DWKG_DQ_P1_L1_001_AI0839" },
+		{ name: "实发有功", tag: "ActualPower", value: "DWKDQ.NX_GD_DWKG_DQ_P1_L1_001_AI0842", calc: "0.01" },
+		{ name: "理论功率", tag: "TheoryPower", value: "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0192" },
+		{ name: "预测功率", tag: "ForecastPower", value: "DWKGGL.NX_GD_DWKG_YC_P1_L1_001_CDQ001" },
+		{ name: "AGC投入", tag: "AgcIn", value: "DWKDQ.NX_GD_DWKG_DQ_P1_L1_001_DI0761" },
+		{ name: "AGC远方", tag: "AgcFar", value: "DWKDQ.NX_GD_DWKG_DQ_P1_L1_001_DI0767" },
+		{ name: "有功增闭锁", tag: "SumLock", value: "" },
+		{ name: "有功减闭锁", tag: "SubLock", value: "" },
+	],
+	'PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0263': [
+		{ name: "有功设定限值", tag: "PowerSet", value: "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_AI0838" },
+		{ name: "AGC可调上限", tag: "AgcUp", value: "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_AI0836" },
+		{ name: "AGC可调下限", tag: "AgcLower", value: "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_AI0837" },
+		{ name: "实发有功", tag: "ActualPower", value: "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_AI0835" },
+		{ name: "理论功率", tag: "TheoryPower", value: "PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0192" },
+		{ name: "预测功率", tag: "ForecastPower", value: "PLGGL.NX_GD_PLG_YC_P1_L1_001_CDQ0001" },
+		{ name: "AGC投入", tag: "AgcIn", value: "" },
+		{ name: "AGC远方", tag: "AgcFar", value: "" },
+		{ name: "有功增闭锁", tag: "SumLock", value: "" },
+		{ name: "有功减闭锁", tag: "SubLock", value: "" },
+	],
+	'XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0263': [
+		{ name: "有功设定限值", tag: "PowerSet", value: "XHDQ.NX_GD_XHG_DQ_P1_L1_001_AI0204" },
+		{ name: "AGC可调上限", tag: "AgcUp", value: "XHDQ.NX_GD_XHG_DQ_P1_L1_001_AI0194" },
+		{ name: "AGC可调下限", tag: "AgcLower", value: "XHDQ.NX_GD_XHG_DQ_P1_L1_001_AI0195" },
+		{ name: "实发有功", tag: "ActualPower", value: "XHDQ.NX_GD_XHG_DQ_P1_L1_001_AI0193" },
+		{ name: "理论功率", tag: "TheoryPower", value: "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0192" },
+		{ name: "预测功率", tag: "ForecastPower", value: "XHGGL.NX_GD_XHG_YC_P1_L1_001_CDQ001" },
+		{ name: "AGC投入", tag: "AgcIn", value: "XHDQ.NX_GD_XHG_DQ_P1_L1_001_DI0099" },
+		{ name: "AGC远方", tag: "AgcFar", value: "XHDQ.NX_GD_XHG_DQ_P1_L1_001_DI0100" },
+		{ name: "有功增闭锁", tag: "SumLock", value: "" },
+		{ name: "有功减闭锁", tag: "SubLock", value: "" },
+	],
+	// constructor(){
+	// 	this.getDatas = this.getDatas.bind(this);
+	// 	this.getTags=this.getTags.bind(this);
+	// }
+	// getDatas(){
+	// 	return this.tags;
+	// }
+}

+ 268 - 0
src/utils/baseTool.js

@@ -0,0 +1,268 @@
+
+let loadingStatus = null;
+
+import { ElMessage } from 'element-plus';
+import { ElLoading } from 'element-plus';
+
+export default {
+  /**
+   * 页面顶部出现消息提示
+   * @param {Object} options 传入一个对象为配置项,其中:
+   * @param {Boolean} showClose 是否显示可手动关闭的 x 于提示框右侧,默认 false
+   * @param {Boolean} center 消息提示内容是否居中,默认 true
+   * @param {String} msg 消息提示的内容
+   * @param {String} type 消息提示的类型,可选值为 ['success(成功)','warning(警告)','error(错误)',或者直接传入空字符串],默认 error
+   */
+  showMsg(options) {
+    
+    ElMessage({
+      showClose: (options.showClose == true || options.showClose == false) ? options.showClose : false,
+      center: (options.center == true || options.center == false) ? options.center : true,
+      message: options.msg,
+      type: (options.type || options.type === '') ? options.type : 'error'
+    });
+  },
+
+  /**
+   * 显示防穿透点击 loading 蒙版
+   * @param {Objectr} opt 传入一个对象为配置项,其中:
+   * @param {String} target 此蒙版需要绑定的 DOM 标签 ID 或者 CLASS 或者 TAGNAME,默认绑在 body 上
+   * @param {Boolean} body 是否插入蒙版至 boyd 上,默认 true
+   * @param {Boolean} fullscreen 蒙版是否全屏蒙住整个 html 页面,默认 true
+   * @param {Boolean} lock 蒙版出现时,是否锁定屏幕滚动,默认 false
+   * @param {String} text 蒙版上显示的提示文本
+   * @param {String} background 蒙版的背景颜色,写死 50% 透明度的纯黑色
+   */
+  showLoading(opt) {
+    let options = opt || {};
+    loadingStatus = ElLoading.service({
+      target: options.target || 'body',
+      body: (options.body == true || options.body == false) ? options.body : false,
+      fullscreen: (options.fullscreen == true || options.fullscreen == false) ? options.fullscreen : true,
+      lock: (options.lock == true || options.lock == false) ? options.lock : false,
+      text: options.text || '请稍等...',
+      background: 'rgba(0,0,0,.5)',
+    });
+  },
+
+  /**
+   * 获取标签上的自定义属性
+   * @param {any} node 传入 字符串 或 标准DOM对象 或 jQuery DOM对象 ,函数自动判断传入的类型并返回其 dataset 属性。
+   */
+  getCurrentData(node) {
+    // 如果传入的是 jQuery 对象
+    if (window.jQuery && node instanceof jQuery) {
+      return node[0].dataset;
+    } else {
+      // 判断传入的是否是标准 DOM 对象
+      let isDom = (typeof node === 'object') ?
+        function (obj) {
+          return obj instanceof HTMLElement;
+        } :
+        function (obj) {
+          return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
+        };
+
+      // 如果是标准 DOM 对象,输出 dataset
+      if (isDom(node)) {
+        return node.dataset;
+      } else {
+        // 如果是不是,则表示传入的是字符串,根据字符串取 DOM 后输出 dataset
+        let dom = document.querySelector(node);
+        return dom.dataset;
+      }
+    }
+  },
+
+  /**
+   * 关闭loading
+   */
+  closeLoading() {
+    loadingStatus.close();
+  },
+
+  /**
+   * 深拷贝 json 数组
+   * @param {Array} jsonArray 传入 Json 数组,返回一个指向新指针拷贝份数据
+   */
+  deepCopy(jsonArray) {
+    return JSON.parse(JSON.stringify(jsonArray));
+  },
+
+  /**
+   * 根据后端返回的 ID 遍历树形结构包装组件编辑用数据函数
+   * @param {String} key 需要找到的 ID
+   * @param {Array} treeData 树形 Array
+   */
+  getTreeDeepArr(key, treeData) {
+
+    let arr = []; // 在递归时操作的数组
+    let returnArr = []; // 存放结果的数组
+    let depth = 0; // 定义全局层级
+
+    // 定义递归函数
+    function childrenEach(childrenData, depthN) {
+
+      for (var j = 0; j < childrenData.length; j++) {
+
+        depth = depthN; // 将执行的层级赋值 到 全局层级
+        arr[depthN] = (childrenData[j].id);
+
+        if (childrenData[j].id == key) {
+
+          returnArr = arr.slice(0, depthN + 1); //将目前匹配的数组,截断并保存到结果数组
+          break;
+
+        } else {
+
+          if (childrenData[j].children) {
+
+            depth++;
+            childrenEach(childrenData[j].children, depth);
+
+          }
+
+        }
+
+      }
+
+      return returnArr;
+
+    }
+
+    return childrenEach(treeData, depth);
+
+  },
+
+  /**
+   * 获取数据的类型
+   * @param {any} options 传入一个数据,返回其类型 (object, array, string, number等)
+   */
+  getType(options) {
+    return Object.prototype.toString.call(options).slice(8, Object.prototype.toString.call(options).length - 1).toLowerCase();
+  },
+
+  /**
+   * 控制页面滚动到指定位置
+   * @param {Object} options 传入一个配置项,其中:
+   * @param {String} el 需要滚动的 DOM 元素选择器,可以为 CLASS 或 ID
+   * @param {Number} scrollTop 需要滚动到顶部的位置,数值越低滚动的越靠近顶部,默认 0
+   * @param {Number} scrollLeft 需要滚动到顶部的位置,数值越低滚动的越靠近顶部,默认 0
+   * @param {Number} speed 滚动到指定位置需要的时间 (动画时间),默认 200
+   * @param {Function} success 滚动执行完毕后的回调函数
+   */
+  scrollTo(options) {
+    if (!options || !options.el) {
+      this.showMsg({
+        msg: 'scrollTo() 方法需要传入 el 属性'
+      });
+      return;
+    }
+    if ($(options.el)[0] && ($(options.el)[0].scrollHeight > (window.innerHeight || document.documentElement.clientHeight))) {
+      $(options.el).animate({
+        scrollTop: options.scrollTop || 0,
+        scrollLeft: options.scrollLeft || 0,
+      }, options.speed || 200, () => {
+        options.success && options.success();
+      });
+    } else {
+      options.success && options.success();
+    }
+  },
+
+  /**
+   * JS 触发全屏功能
+   */
+  requestFullscreen() {
+    //全屏
+    const docElm = document.documentElement;
+    //W3C
+    if (docElm.requestFullscreen) {
+      docElm.requestFullscreen();
+    }
+
+    //FireFox
+    else if (docElm.mozRequestFullScreen) {
+      docElm.mozRequestFullScreen();
+    }
+
+    //Chrome等
+    else if (docElm.webkitRequestFullScreen) {
+      docElm.webkitRequestFullScreen();
+    }
+
+    //IE11
+    else if (docElm.msRequestFullscreen) {
+      docElm.msRequestFullscreen();
+    }
+  },
+
+  /**
+   * 颜色进制转换  16 <--> 10 互转
+   * @param {String} colorStr 传入一个颜色字符串, 16进制 或者 10进制 ,返回转换后的结果,例:传入 #1890ff ,返回 rgb(24, 144, 255),反之亦然
+   */
+  replaceColor(colorStr) {
+    if (!colorStr) return '';
+
+    let colorString = colorStr.replace(/#|rgb|\(|\)|\|;|\s+/g, "");
+
+    if (colorString.indexOf(",") === -1) {
+      let color10 = [];
+      for (let i = 0; i < colorString.length; i++) {
+        if (!((i + 1) % 2)) {
+          color10.push(parseInt((colorString[i - 1] + colorString[i]), 16));
+        }
+      }
+      return "rgb(" + color10.toString() + ")";
+    } else {
+      let colorArray = colorString.split(',');
+      let color16 = '';
+      colorArray.forEach(ele => {
+        color16 += (parseInt(ele).toString(16));
+      });
+      return "#" + color16;
+    }
+  },
+
+  /**
+   * 生成指定范围内的随机数
+   * @param {Int} minNum 范围下限
+   * @param {Int} maxNum 范围上限
+   * @returns 
+   */
+  randomNum(minNum, maxNum) {
+    switch (arguments.length) {
+      case 1:
+        return parseInt(Math.random() * minNum + 1, 10);
+      case 2:
+        return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
+      default:
+        return 0;
+    }
+  },
+
+  // 正则表达式
+  regs: {
+    // 是否为手机号
+    isPhone: /^1(3|4|5|6|7|8|9)\d{9}$/,
+    // 是否为合法 15 或 18 位身份证号
+    isIdentityCard: /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/,
+    // 是否是邮箱
+    isMail: /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/,
+    // 是否是数字
+    isNumber: /^(-?\d+)(\.\d+)?$/
+  },
+
+  // elementUI 自定义表单效验规则
+  elCkeck: {
+    isNumber(rule, value, callback) {
+      if (value === '') {
+        callback(new Error('该值不可为空'));
+      } else if (!/^(-?\d+)(\.\d+)?$/.test(value)) {
+        callback(new Error('输入有误,仅支持输入数字'));
+      } else {
+        callback();
+      }
+    }
+  }
+}

+ 11 - 0
src/utils/config.js

@@ -0,0 +1,11 @@
+export const config = {
+    shardingUrl:"192.168.10.18:8075",// 报警地址
+    calcUrl:"192.168.10.18:8099",// 大后台地址
+    adapterUrl:"192.168.10.18:8011",// 数据适配器地址
+};
+
+// export const config = {
+//     shardingUrl:"18.6.30.53:8075",// 报警地址
+//     calcUrl:"18.6.30.63:8099",// 大后台地址
+//     adapterUrl:"18.6.30.63:8011",// 数据适配器地址
+// };

+ 419 - 0
src/utils/warningInfo.js

@@ -0,0 +1,419 @@
+export default class warningInfo {
+    warning =[
+        {"SNAPID":"1","COUNT":"35","TIME":"1057.617","WINDTURBINEID":"XG01_11","ALERTTEXT":"三相电流不平衡","CATEGORY":"1"}
+        ,
+        {"SNAPID":"2","COUNT":"163","TIME":"748.783","WINDTURBINEID":"NG01_01","ALERTTEXT":"三相电流不平衡","CATEGORY":"1"}
+        ,
+        {"SNAPID":"3","COUNT":"70","TIME":"639.417","WINDTURBINEID":"NG01_87","ALERTTEXT":"三相电流不平衡","CATEGORY":"1"}
+        ,
+        {"SNAPID":"4","COUNT":"242","TIME":"627.867","WINDTURBINEID":"SG01_101","ALERTTEXT":"三相电流不平衡","CATEGORY":"1"}
+        ,
+        {"SNAPID":"5","COUNT":"137","TIME":"622.933","WINDTURBINEID":"MG01_42","ALERTTEXT":"三相电流不平衡","CATEGORY":"1"}
+        ,
+        {"SNAPID":"6","COUNT":"369","TIME":"590.8","WINDTURBINEID":"MG01_43","ALERTTEXT":"三相电流不平衡","CATEGORY":"1"}
+        ,
+        {"SNAPID":"7","COUNT":"140","TIME":"584.617","WINDTURBINEID":"NG01_42","ALERTTEXT":"三相电流不平衡","CATEGORY":"1"}
+        ,
+        {"SNAPID":"8","COUNT":"126","TIME":"536.833","WINDTURBINEID":"XG01_30","ALERTTEXT":"三相电流不平衡","CATEGORY":"1"}
+        ,
+        {"SNAPID":"9","COUNT":"1","TIME":"5.25","WINDTURBINEID":"NG01_88","ALERTTEXT":"主轴温升速度大于1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"10","COUNT":"1","TIME":"5.25","WINDTURBINEID":"XG01_31","ALERTTEXT":"主轴温升速度大于1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"11","COUNT":"1","TIME":"5.25","WINDTURBINEID":"NG01_12","ALERTTEXT":"主轴温升速度大于1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"12","COUNT":"1","TIME":"5.25","WINDTURBINEID":"NG01_85","ALERTTEXT":"主轴温升速度大于1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"13","COUNT":"1","TIME":"5.25","WINDTURBINEID":"NG01_01","ALERTTEXT":"主轴温升速度大于1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"14","COUNT":"15","TIME":"955.75","WINDTURBINEID":"XG01_29","ALERTTEXT":"主轴温度温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"15","COUNT":"15","TIME":"900.55","WINDTURBINEID":"XG01_30","ALERTTEXT":"主轴温度温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"16","COUNT":"18","TIME":"858.033","WINDTURBINEID":"SG01_75","ALERTTEXT":"主轴温度温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"17","COUNT":"38","TIME":"850.3","WINDTURBINEID":"SG01_95","ALERTTEXT":"主轴温度温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"18","COUNT":"14","TIME":"836.05","WINDTURBINEID":"SG01_67","ALERTTEXT":"主轴温度温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"19","COUNT":"12","TIME":"829.35","WINDTURBINEID":"XG01_28","ALERTTEXT":"主轴温度温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"20","COUNT":"17","TIME":"825.15","WINDTURBINEID":"SG01_72","ALERTTEXT":"主轴温度温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"21","COUNT":"9","TIME":"154.517","WINDTURBINEID":"SG01_71","ALERTTEXT":"主轴温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"22","COUNT":"1","TIME":"1.4","WINDTURBINEID":"SG01_71","ALERTTEXT":"主轴齿轮箱侧温度传感器异常值","CATEGORY":"1"}
+        ,
+        {"SNAPID":"23","COUNT":"34","TIME":"1073.15","WINDTURBINEID":"QG01_71","ALERTTEXT":"停机收浆超时","CATEGORY":"2"}
+        ,
+        {"SNAPID":"24","COUNT":"36","TIME":"1061.417","WINDTURBINEID":"QG01_70","ALERTTEXT":"停机收浆超时","CATEGORY":"2"}
+        ,
+        {"SNAPID":"25","COUNT":"33","TIME":"1056.85","WINDTURBINEID":"QG01_75","ALERTTEXT":"停机收浆超时","CATEGORY":"2"}
+        ,
+        {"SNAPID":"26","COUNT":"34","TIME":"1046.15","WINDTURBINEID":"QG01_82","ALERTTEXT":"停机收浆超时","CATEGORY":"2"}
+        ,
+        {"SNAPID":"27","COUNT":"33","TIME":"1045.117","WINDTURBINEID":"QG01_67","ALERTTEXT":"停机收浆超时","CATEGORY":"2"}
+        ,
+        {"SNAPID":"28","COUNT":"36","TIME":"1023.117","WINDTURBINEID":"QG01_81","ALERTTEXT":"停机收浆超时","CATEGORY":"2"}
+        ,
+        {"SNAPID":"29","COUNT":"35","TIME":"1021.033","WINDTURBINEID":"QG01_86","ALERTTEXT":"停机收浆超时","CATEGORY":"2"}
+        ,
+        {"SNAPID":"30","COUNT":"36","TIME":"1015.933","WINDTURBINEID":"QG01_77","ALERTTEXT":"停机收浆超时","CATEGORY":"2"}
+        ,
+        {"SNAPID":"31","COUNT":"26","TIME":"850.133","WINDTURBINEID":"NG01_15","ALERTTEXT":"单机发电机U2绕组温度传感器异常值","CATEGORY":"2"}
+        ,
+        {"SNAPID":"32","COUNT":"39","TIME":"960.167","WINDTURBINEID":"NG01_15","ALERTTEXT":"单机发电机U2绕组温度预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"33","COUNT":"7","TIME":"8.917","WINDTURBINEID":"MG01_13","ALERTTEXT":"单机发电机U2绕组温度预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"34","COUNT":"22","TIME":"67.733","WINDTURBINEID":"MG01_17","ALERTTEXT":"单机发电机V2绕组温度传感器异常值","CATEGORY":"2"}
+        ,
+        {"SNAPID":"35","COUNT":"20","TIME":"1069.233","WINDTURBINEID":"NG01_73","ALERTTEXT":"单机发电机V2绕组温度预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"36","COUNT":"34","TIME":"476.533","WINDTURBINEID":"MG01_17","ALERTTEXT":"单机发电机V2绕组温度预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"37","COUNT":"21","TIME":"1063.15","WINDTURBINEID":"NG01_73","ALERTTEXT":"单机发电机V2绕组超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"38","COUNT":"40","TIME":"437.183","WINDTURBINEID":"MG01_17","ALERTTEXT":"单机发电机V2绕组超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"39","COUNT":"51","TIME":"476.3","WINDTURBINEID":"SG01_26","ALERTTEXT":"单机发电机W2绕组温度传感器异常值","CATEGORY":"2"}
+        ,
+        {"SNAPID":"40","COUNT":"33","TIME":"315.733","WINDTURBINEID":"NG01_07","ALERTTEXT":"单机发电机W2绕组温度传感器异常值","CATEGORY":"2"}
+        ,
+        {"SNAPID":"41","COUNT":"45","TIME":"132.017","WINDTURBINEID":"NG01_73","ALERTTEXT":"单机发电机W2绕组温度传感器异常值","CATEGORY":"2"}
+        ,
+        {"SNAPID":"42","COUNT":"33","TIME":"486","WINDTURBINEID":"SG01_26","ALERTTEXT":"单机发电机W2绕组温度预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"43","COUNT":"13","TIME":"462.183","WINDTURBINEID":"SG01_31","ALERTTEXT":"单机发电机W2绕组温度预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"44","COUNT":"107","TIME":"448.767","WINDTURBINEID":"NG01_07","ALERTTEXT":"单机发电机W2绕组温度预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"45","COUNT":"75","TIME":"400.95","WINDTURBINEID":"NG01_73","ALERTTEXT":"单机发电机W2绕组温度预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"46","COUNT":"31","TIME":"171.75","WINDTURBINEID":"NG01_05","ALERTTEXT":"单机发电机W2绕组温度预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"47","COUNT":"33","TIME":"482.1","WINDTURBINEID":"SG01_26","ALERTTEXT":"单机发电机W2绕组超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"48","COUNT":"14","TIME":"449.267","WINDTURBINEID":"SG01_31","ALERTTEXT":"单机发电机W2绕组超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"49","COUNT":"108","TIME":"436.333","WINDTURBINEID":"NG01_07","ALERTTEXT":"单机发电机W2绕组超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"50","COUNT":"74","TIME":"383.517","WINDTURBINEID":"NG01_73","ALERTTEXT":"单机发电机W2绕组超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"51","COUNT":"30","TIME":"122.85","WINDTURBINEID":"NG01_05","ALERTTEXT":"单机发电机W2绕组超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"52","COUNT":"1","TIME":"1.4","WINDTURBINEID":"SG01_79","ALERTTEXT":"单机发电机W2绕组超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"53","COUNT":"1","TIME":"1.217","WINDTURBINEID":"SG01_70","ALERTTEXT":"单机发电机W2绕组超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"54","COUNT":"1","TIME":"73.083","WINDTURBINEID":"SG01_94","ALERTTEXT":"单机发电机轴a温度预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"55","COUNT":"1","TIME":"26.85","WINDTURBINEID":"SG01_30","ALERTTEXT":"单机发电机轴a温度预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"56","COUNT":"9","TIME":"153.8","WINDTURBINEID":"SG01_71","ALERTTEXT":"单机发电机轴b温度超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"57","COUNT":"1","TIME":"42.983","WINDTURBINEID":"SG01_15","ALERTTEXT":"单机发电机轴b温度预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"58","COUNT":"18","TIME":"36.767","WINDTURBINEID":"NG01_29","ALERTTEXT":"单机变桨电池柜温度1温度传感器异常值","CATEGORY":"2"}
+        ,
+        {"SNAPID":"59","COUNT":"1","TIME":"1.7","WINDTURBINEID":"SG01_17","ALERTTEXT":"单机变桨电池柜温度2预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"60","COUNT":"263","TIME":"85.617","WINDTURBINEID":"NG01_11","ALERTTEXT":"单机变桨电池柜温度3温度传感器异常值","CATEGORY":"2"}
+        ,
+        {"SNAPID":"61","COUNT":"298","TIME":"98.25","WINDTURBINEID":"NG01_11","ALERTTEXT":"单机变桨电池柜温度3超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"62","COUNT":"13","TIME":"716.05","WINDTURBINEID":"NG01_02","ALERTTEXT":"单机变桨电池柜温度3预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"63","COUNT":"2","TIME":"75.2","WINDTURBINEID":"SG01_26","ALERTTEXT":"单机变桨电池柜温度3预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"64","COUNT":"2","TIME":"11.217","WINDTURBINEID":"SG01_17","ALERTTEXT":"单机变桨电池柜温度3预警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"65","COUNT":"367","TIME":"1143","WINDTURBINEID":"NG01_05","ALERTTEXT":"单机风向标故障","CATEGORY":"2"}
+        ,
+        {"SNAPID":"66","COUNT":"432","TIME":"1136.383","WINDTURBINEID":"NG01_02","ALERTTEXT":"单机风向标故障","CATEGORY":"2"}
+        ,
+        {"SNAPID":"67","COUNT":"23","TIME":"954.583","WINDTURBINEID":"NG01_18","ALERTTEXT":"单机风向标故障","CATEGORY":"2"}
+        ,
+        {"SNAPID":"68","COUNT":"923","TIME":"902.1","WINDTURBINEID":"NG01_37","ALERTTEXT":"单机风向标故障","CATEGORY":"2"}
+        ,
+        {"SNAPID":"69","COUNT":"16","TIME":"887.617","WINDTURBINEID":"XG01_41","ALERTTEXT":"单机风向标故障","CATEGORY":"2"}
+        ,
+        {"SNAPID":"70","COUNT":"379","TIME":"341.567","WINDTURBINEID":"SG01_47","ALERTTEXT":"单机风向标故障","CATEGORY":"2"}
+        ,
+        {"SNAPID":"71","COUNT":"818","TIME":"334.3","WINDTURBINEID":"NG01_33","ALERTTEXT":"单机风向标故障","CATEGORY":"2"}
+        ,
+        {"SNAPID":"72","COUNT":"399","TIME":"317.85","WINDTURBINEID":"SG01_45","ALERTTEXT":"单机风向标故障","CATEGORY":"2"}
+        ,
+        {"SNAPID":"73","COUNT":"355","TIME":"310.467","WINDTURBINEID":"SG01_50","ALERTTEXT":"单机风向标故障","CATEGORY":"2"}
+        ,
+        {"SNAPID":"74","COUNT":"9","TIME":"154.15","WINDTURBINEID":"SG01_71","ALERTTEXT":"单机齿轮箱油温超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"75","COUNT":"2","TIME":"1.683","WINDTURBINEID":"SG01_25","ALERTTEXT":"单机齿轮箱油温超限报警","CATEGORY":"1"}
+        ,
+        {"SNAPID":"76","COUNT":"13","TIME":"91.167","WINDTURBINEID":"QG01_75","ALERTTEXT":"发电机转速超速","CATEGORY":"1"}
+        ,
+        {"SNAPID":"77","COUNT":"10","TIME":"80.05","WINDTURBINEID":"QG01_79","ALERTTEXT":"发电机转速超速","CATEGORY":"1"}
+        ,
+        {"SNAPID":"78","COUNT":"8","TIME":"76.15","WINDTURBINEID":"QG01_76","ALERTTEXT":"发电机转速超速","CATEGORY":"1"}
+        ,
+        {"SNAPID":"79","COUNT":"6","TIME":"73.933","WINDTURBINEID":"QG01_78","ALERTTEXT":"发电机转速超速","CATEGORY":"1"}
+        ,
+        {"SNAPID":"80","COUNT":"14","TIME":"73.4","WINDTURBINEID":"QG01_73","ALERTTEXT":"发电机转速超速","CATEGORY":"1"}
+        ,
+        {"SNAPID":"81","COUNT":"11","TIME":"799.283","WINDTURBINEID":"NG01_45","ALERTTEXT":"发电机轴A损坏或碳刷室温度过高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"82","COUNT":"11","TIME":"598.717","WINDTURBINEID":"NG01_33","ALERTTEXT":"发电机轴A损坏或碳刷室温度过高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"83","COUNT":"14","TIME":"465.75","WINDTURBINEID":"SG01_116","ALERTTEXT":"发电机轴A损坏或碳刷室温度过高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"84","COUNT":"14","TIME":"438.967","WINDTURBINEID":"NG01_46","ALERTTEXT":"发电机轴A损坏或碳刷室温度过高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"85","COUNT":"6","TIME":"419.033","WINDTURBINEID":"NG01_20","ALERTTEXT":"发电机轴A损坏或碳刷室温度过高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"86","COUNT":"13","TIME":"413.517","WINDTURBINEID":"NG01_42","ALERTTEXT":"发电机轴A损坏或碳刷室温度过高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"87","COUNT":"3","TIME":"5.267","WINDTURBINEID":"SG01_30","ALERTTEXT":"发电机轴a每分钟温升超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"88","COUNT":"1","TIME":"4.617","WINDTURBINEID":"SG01_05","ALERTTEXT":"发电机轴a每分钟温升超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"89","COUNT":"1","TIME":"4.617","WINDTURBINEID":"SG01_13","ALERTTEXT":"发电机轴a每分钟温升超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"90","COUNT":"1","TIME":"4.617","WINDTURBINEID":"SG01_18","ALERTTEXT":"发电机轴a每分钟温升超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"91","COUNT":"1","TIME":"4.617","WINDTURBINEID":"SG01_32","ALERTTEXT":"发电机轴a每分钟温升超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"92","COUNT":"1","TIME":"4.617","WINDTURBINEID":"SG01_14","ALERTTEXT":"发电机轴a每分钟温升超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"93","COUNT":"1","TIME":"4.617","WINDTURBINEID":"SG01_04","ALERTTEXT":"发电机轴a每分钟温升超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"94","COUNT":"5","TIME":"119.283","WINDTURBINEID":"NG01_01","ALERTTEXT":"发电机轴承温升大于40度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"95","COUNT":"2","TIME":"89.4","WINDTURBINEID":"SG01_15","ALERTTEXT":"发电机轴承温升大于40度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"96","COUNT":"1","TIME":"81.217","WINDTURBINEID":"SG01_30","ALERTTEXT":"发电机轴承温升大于40度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"97","COUNT":"22","TIME":"26.933","WINDTURBINEID":"NG01_01","ALERTTEXT":"发电机轴承温升速度大于1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"98","COUNT":"1","TIME":"11","WINDTURBINEID":"NG01_25","ALERTTEXT":"发电机轴承温升速度大于1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"99","COUNT":"1","TIME":"10.283","WINDTURBINEID":"NG01_76","ALERTTEXT":"发电机轴承温升速度大于1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"100","COUNT":"2","TIME":"9.467","WINDTURBINEID":"NG01_05","ALERTTEXT":"发电机轴承温升速度大于1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"101","COUNT":"2","TIME":"77.067","WINDTURBINEID":"SG01_15","ALERTTEXT":"发电机轴承温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"102","COUNT":"1","TIME":"66.133","WINDTURBINEID":"SG01_30","ALERTTEXT":"发电机轴承温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"103","COUNT":"3","TIME":"43.65","WINDTURBINEID":"SG01_29","ALERTTEXT":"发电机轴承温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"104","COUNT":"1","TIME":"1.733","WINDTURBINEID":"SG01_07","ALERTTEXT":"发电机轴承温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"105","COUNT":"2","TIME":"253","WINDTURBINEID":"SG01_71","ALERTTEXT":"变桨电容电压低","CATEGORY":"1"}
+        ,
+        {"SNAPID":"106","COUNT":"1","TIME":"1.167","WINDTURBINEID":"NG01_06","ALERTTEXT":"变桨电容电压低","CATEGORY":"1"}
+        ,
+        {"SNAPID":"107","COUNT":"2","TIME":"252.767","WINDTURBINEID":"SG01_71","ALERTTEXT":"变桨电容电压高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"108","COUNT":"1","TIME":"1","WINDTURBINEID":"SG01_84","ALERTTEXT":"变桨电容电压高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"109","COUNT":"9","TIME":"1235.967","WINDTURBINEID":"MG01_03","ALERTTEXT":"变桨通信不良","CATEGORY":"2"}
+        ,
+        {"SNAPID":"110","COUNT":"13","TIME":"1217.117","WINDTURBINEID":"MG01_04","ALERTTEXT":"变桨通信不良","CATEGORY":"2"}
+        ,
+        {"SNAPID":"111","COUNT":"13","TIME":"1199.65","WINDTURBINEID":"MG01_05","ALERTTEXT":"变桨通信不良","CATEGORY":"2"}
+        ,
+        {"SNAPID":"112","COUNT":"9","TIME":"1156.35","WINDTURBINEID":"MG01_23","ALERTTEXT":"变桨通信不良","CATEGORY":"2"}
+        ,
+        {"SNAPID":"113","COUNT":"12","TIME":"1156.183","WINDTURBINEID":"MG01_15","ALERTTEXT":"变桨通信不良","CATEGORY":"2"}
+        ,
+        {"SNAPID":"114","COUNT":"8","TIME":"1155.367","WINDTURBINEID":"MG01_02","ALERTTEXT":"变桨通信不良","CATEGORY":"2"}
+        ,
+        {"SNAPID":"115","COUNT":"9","TIME":"1151.533","WINDTURBINEID":"MG01_25","ALERTTEXT":"变桨通信不良","CATEGORY":"2"}
+        ,
+        {"SNAPID":"116","COUNT":"1","TIME":"1.45","WINDTURBINEID":"SG01_20","ALERTTEXT":"叶轮转速超速","CATEGORY":"1"}
+        ,
+        {"SNAPID":"117","COUNT":"1","TIME":"1.4","WINDTURBINEID":"SG01_71","ALERTTEXT":"夏季单机齿轮箱油温温度传感器异常值","CATEGORY":"1"}
+        ,
+        {"SNAPID":"118","COUNT":"1","TIME":"1.217","WINDTURBINEID":"SG01_30","ALERTTEXT":"大风引起震动","CATEGORY":"1"}
+        ,
+        {"SNAPID":"119","COUNT":"271","TIME":"1100.55","WINDTURBINEID":"MG01_07","ALERTTEXT":"断轴或联轴器打滑","CATEGORY":"2"}
+        ,
+        {"SNAPID":"120","COUNT":"299","TIME":"1032.717","WINDTURBINEID":"SG01_30","ALERTTEXT":"断轴或联轴器打滑","CATEGORY":"2"}
+        ,
+        {"SNAPID":"121","COUNT":"701","TIME":"755.233","WINDTURBINEID":"SG01_66","ALERTTEXT":"断轴或联轴器打滑","CATEGORY":"2"}
+        ,
+        {"SNAPID":"122","COUNT":"654","TIME":"722.317","WINDTURBINEID":"XG01_29","ALERTTEXT":"断轴或联轴器打滑","CATEGORY":"2"}
+        ,
+        {"SNAPID":"123","COUNT":"343","TIME":"705.417","WINDTURBINEID":"QG01_79","ALERTTEXT":"断轴或联轴器打滑","CATEGORY":"2"}
+        ,
+        {"SNAPID":"124","COUNT":"1","TIME":"1.483","WINDTURBINEID":"SG01_26","ALERTTEXT":"机端过电压","CATEGORY":"2"}
+        ,
+        {"SNAPID":"125","COUNT":"11","TIME":"5.017","WINDTURBINEID":"NG01_44","ALERTTEXT":"机组逆功率","CATEGORY":"2"}
+        ,
+        {"SNAPID":"126","COUNT":"10","TIME":"3.667","WINDTURBINEID":"MG01_21","ALERTTEXT":"机组逆功率","CATEGORY":"2"}
+        ,
+        {"SNAPID":"127","COUNT":"2","TIME":"2.233","WINDTURBINEID":"NG01_37","ALERTTEXT":"机组逆功率","CATEGORY":"2"}
+        ,
+        {"SNAPID":"128","COUNT":"3","TIME":"2","WINDTURBINEID":"NG01_96","ALERTTEXT":"机组逆功率","CATEGORY":"2"}
+        ,
+        {"SNAPID":"129","COUNT":"8","TIME":"153.583","WINDTURBINEID":"SG01_71","ALERTTEXT":"机舱温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"130","COUNT":"12","TIME":"32.683","WINDTURBINEID":"SG01_79","ALERTTEXT":"机舱温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"131","COUNT":"225","TIME":"81.35","WINDTURBINEID":"NG01_85","ALERTTEXT":"机舱震动幅度超限","CATEGORY":"1"}
+        ,
+        {"SNAPID":"132","COUNT":"102","TIME":"31.733","WINDTURBINEID":"XG01_10","ALERTTEXT":"机舱震动幅度超限","CATEGORY":"1"}
+        ,
+        {"SNAPID":"133","COUNT":"74","TIME":"28.95","WINDTURBINEID":"XG01_19","ALERTTEXT":"机舱震动幅度超限","CATEGORY":"1"}
+        ,
+        {"SNAPID":"134","COUNT":"92","TIME":"28.883","WINDTURBINEID":"NG01_78","ALERTTEXT":"机舱震动幅度超限","CATEGORY":"1"}
+        ,
+        {"SNAPID":"135","COUNT":"64","TIME":"24.15","WINDTURBINEID":"SG01_01","ALERTTEXT":"机舱震动幅度超限","CATEGORY":"1"}
+        ,
+        {"SNAPID":"136","COUNT":"63","TIME":"23.983","WINDTURBINEID":"XG01_25","ALERTTEXT":"机舱震动幅度超限","CATEGORY":"1"}
+        ,
+        {"SNAPID":"137","COUNT":"63","TIME":"23.983","WINDTURBINEID":"XG01_25","ALERTTEXT":"机舱震动幅度超限","CATEGORY":"1"}
+        ,
+        {"SNAPID":"138","COUNT":"63","TIME":"22.55","WINDTURBINEID":"SG01_19","ALERTTEXT":"机舱震动幅度超限","CATEGORY":"1"}
+        ,
+        {"SNAPID":"139","COUNT":"63","TIME":"21.25","WINDTURBINEID":"XG01_08","ALERTTEXT":"机舱震动幅度超限","CATEGORY":"1"}
+        ,
+        {"SNAPID":"140","COUNT":"2","TIME":"11.183","WINDTURBINEID":"NG01_70","ALERTTEXT":"桨叶角度差","CATEGORY":"1"}
+        ,
+        {"SNAPID":"141","COUNT":"3","TIME":"9.567","WINDTURBINEID":"SG01_71","ALERTTEXT":"桨叶角度差","CATEGORY":"1"}
+        ,
+        {"SNAPID":"142","COUNT":"2","TIME":"8.417","WINDTURBINEID":"NG01_61","ALERTTEXT":"桨叶角度差","CATEGORY":"1"}
+        ,
+        {"SNAPID":"143","COUNT":"2","TIME":"8.1","WINDTURBINEID":"NG01_73","ALERTTEXT":"桨叶角度差","CATEGORY":"1"}
+        ,
+        {"SNAPID":"144","COUNT":"2","TIME":"8.083","WINDTURBINEID":"NG01_78","ALERTTEXT":"桨叶角度差","CATEGORY":"1"}
+        ,
+        {"SNAPID":"145","COUNT":"2","TIME":"7.2","WINDTURBINEID":"NG01_28","ALERTTEXT":"桨叶角度差","CATEGORY":"1"}
+        ,
+        {"SNAPID":"146","COUNT":"16","TIME":"939.983","WINDTURBINEID":"XG01_02","ALERTTEXT":"桨叶角过小","CATEGORY":"1"}
+        ,
+        {"SNAPID":"147","COUNT":"15","TIME":"931.35","WINDTURBINEID":"XG01_09","ALERTTEXT":"桨叶角过小","CATEGORY":"1"}
+        ,
+        {"SNAPID":"148","COUNT":"6","TIME":"879.167","WINDTURBINEID":"XG01_14","ALERTTEXT":"桨叶角过小","CATEGORY":"1"}
+        ,
+        {"SNAPID":"149","COUNT":"14","TIME":"868.917","WINDTURBINEID":"XG01_04","ALERTTEXT":"桨叶角过小","CATEGORY":"1"}
+        ,
+        {"SNAPID":"150","COUNT":"6","TIME":"849.1","WINDTURBINEID":"XG01_15","ALERTTEXT":"桨叶角过小","CATEGORY":"1"}
+        ,
+        {"SNAPID":"151","COUNT":"1","TIME":"103.55","WINDTURBINEID":"SG01_15","ALERTTEXT":"石板泉发电机轴承温度超过70度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"152","COUNT":"1","TIME":"101.083","WINDTURBINEID":"SG01_30","ALERTTEXT":"石板泉发电机轴承温度超过70度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"153","COUNT":"1","TIME":"95.117","WINDTURBINEID":"SG01_29","ALERTTEXT":"石板泉发电机轴承温度超过70度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"154","COUNT":"1","TIME":"59.733","WINDTURBINEID":"SG01_07","ALERTTEXT":"石板泉发电机轴承温度超过70度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"155","COUNT":"113","TIME":"63.85","WINDTURBINEID":"NG01_17","ALERTTEXT":"风机偏航过程震动","CATEGORY":"1"}
+        ,
+        {"SNAPID":"156","COUNT":"22","TIME":"7.05","WINDTURBINEID":"NG01_27","ALERTTEXT":"风机偏航过程震动","CATEGORY":"1"}
+        ,
+        {"SNAPID":"157","COUNT":"16","TIME":"6.3","WINDTURBINEID":"NG01_06","ALERTTEXT":"风机偏航过程震动","CATEGORY":"1"}
+        ,
+        {"SNAPID":"158","COUNT":"15","TIME":"6.05","WINDTURBINEID":"NG01_55","ALERTTEXT":"风机偏航过程震动","CATEGORY":"1"}
+        ,
+        {"SNAPID":"159","COUNT":"15","TIME":"5.367","WINDTURBINEID":"NG01_85","ALERTTEXT":"风机偏航过程震动","CATEGORY":"1"}
+        ,
+        {"SNAPID":"160","COUNT":"5","TIME":"75.95","WINDTURBINEID":"SG01_94","ALERTTEXT":"风机轴a轴b温差大","CATEGORY":"1"}
+        ,
+        {"SNAPID":"161","COUNT":"1","TIME":"1.2","WINDTURBINEID":"SG01_06","ALERTTEXT":"风机轴a轴b温差大","CATEGORY":"1"}
+        ,
+        {"SNAPID":"162","COUNT":"229","TIME":"74.883","WINDTURBINEID":"NG01_22","ALERTTEXT":"风速突变","CATEGORY":"1"}
+        ,
+        {"SNAPID":"163","COUNT":"51","TIME":"60.333","WINDTURBINEID":"QG01_78","ALERTTEXT":"风速突变","CATEGORY":"1"}
+        ,
+        {"SNAPID":"164","COUNT":"39","TIME":"59.017","WINDTURBINEID":"QG01_77","ALERTTEXT":"风速突变","CATEGORY":"1"}
+        ,
+        {"SNAPID":"165","COUNT":"42","TIME":"58.783","WINDTURBINEID":"QG01_77","ALERTTEXT":"风速突变","CATEGORY":"1"}
+        ,
+        {"SNAPID":"166","COUNT":"44","TIME":"58.333","WINDTURBINEID":"QG01_76","ALERTTEXT":"风速突变","CATEGORY":"1"}
+        ,
+        {"SNAPID":"167","COUNT":"38","TIME":"57.917","WINDTURBINEID":"QG01_76","ALERTTEXT":"风速突变","CATEGORY":"1"}
+        ,
+        {"SNAPID":"168","COUNT":"31","TIME":"56.983","WINDTURBINEID":"QG01_79","ALERTTEXT":"风速突变","CATEGORY":"1"}
+        ,
+        {"SNAPID":"169","COUNT":"37","TIME":"55.767","WINDTURBINEID":"QG01_79","ALERTTEXT":"风速突变","CATEGORY":"1"}
+        ,
+        {"SNAPID":"170","COUNT":"69","TIME":"94.183","WINDTURBINEID":"XG01_21","ALERTTEXT":"齿轮箱油温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"171","COUNT":"2","TIME":"80.2","WINDTURBINEID":"XG01_06","ALERTTEXT":"齿轮箱油温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"172","COUNT":"8","TIME":"39.45","WINDTURBINEID":"XG01_04","ALERTTEXT":"齿轮箱油温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"173","COUNT":"4","TIME":"12.9","WINDTURBINEID":"XG01_18","ALERTTEXT":"齿轮箱油温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"174","COUNT":"2","TIME":"1.65","WINDTURBINEID":"SG01_25","ALERTTEXT":"齿轮箱油温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"175","COUNT":"98","TIME":"717.85","WINDTURBINEID":"XG01_09","ALERTTEXT":"齿轮箱温控阀故障或换热器效率低","CATEGORY":"2"}
+        ,
+        {"SNAPID":"176","COUNT":"145","TIME":"636.117","WINDTURBINEID":"XG01_05","ALERTTEXT":"齿轮箱温控阀故障或换热器效率低","CATEGORY":"2"}
+        ,
+        {"SNAPID":"177","COUNT":"220","TIME":"611.05","WINDTURBINEID":"XG01_01","ALERTTEXT":"齿轮箱温控阀故障或换热器效率低","CATEGORY":"2"}
+        ,
+        {"SNAPID":"178","COUNT":"177","TIME":"552.133","WINDTURBINEID":"XG01_08","ALERTTEXT":"齿轮箱温控阀故障或换热器效率低","CATEGORY":"2"}
+        ,
+        {"SNAPID":"179","COUNT":"127","TIME":"466.717","WINDTURBINEID":"XG01_06","ALERTTEXT":"齿轮箱温控阀故障或换热器效率低","CATEGORY":"2"}
+        ,
+        {"SNAPID":"180","COUNT":"103","TIME":"419.083","WINDTURBINEID":"XG01_13","ALERTTEXT":"齿轮箱温控阀故障或换热器效率低","CATEGORY":"2"}
+        ,
+        {"SNAPID":"181","COUNT":"26","TIME":"838.017","WINDTURBINEID":"XG01_09","ALERTTEXT":"齿轮箱轴承温升超过40度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"182","COUNT":"15","TIME":"820.867","WINDTURBINEID":"XG01_25","ALERTTEXT":"齿轮箱轴承温升超过40度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"183","COUNT":"17","TIME":"676.2","WINDTURBINEID":"XG01_08","ALERTTEXT":"齿轮箱轴承温升超过40度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"184","COUNT":"17","TIME":"658.5","WINDTURBINEID":"XG01_06","ALERTTEXT":"齿轮箱轴承温升超过40度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"185","COUNT":"39","TIME":"626.133","WINDTURBINEID":"XG01_12","ALERTTEXT":"齿轮箱轴承温升超过40度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"186","COUNT":"16","TIME":"27.183","WINDTURBINEID":"XG01_04","ALERTTEXT":"齿轮箱轴承温升速度超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"187","COUNT":"25","TIME":"26.8","WINDTURBINEID":"SG01_90","ALERTTEXT":"齿轮箱轴承温升速度超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"188","COUNT":"10","TIME":"26.517","WINDTURBINEID":"MG01_19","ALERTTEXT":"齿轮箱轴承温升速度超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"189","COUNT":"27","TIME":"25.717","WINDTURBINEID":"SG01_103","ALERTTEXT":"齿轮箱轴承温升速度超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"190","COUNT":"18","TIME":"25.467","WINDTURBINEID":"XG01_21","ALERTTEXT":"齿轮箱轴承温升速度超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"191","COUNT":"14","TIME":"25.35","WINDTURBINEID":"MG01_22","ALERTTEXT":"齿轮箱轴承温升速度超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"192","COUNT":"21","TIME":"23.4","WINDTURBINEID":"QG01_79","ALERTTEXT":"齿轮箱轴承温升速度超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"193","COUNT":"16","TIME":"23.317","WINDTURBINEID":"SG01_107","ALERTTEXT":"齿轮箱轴承温升速度超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"194","COUNT":"13","TIME":"21.65","WINDTURBINEID":"SG01_97","ALERTTEXT":"齿轮箱轴承温升速度超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"195","COUNT":"21","TIME":"20.483","WINDTURBINEID":"NG01_01","ALERTTEXT":"齿轮箱轴承温升速度超过1.5","CATEGORY":"1"}
+        ,
+        {"SNAPID":"196","COUNT":"17","TIME":"947.717","WINDTURBINEID":"XG01_25","ALERTTEXT":"齿轮箱轴承温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"197","COUNT":"17","TIME":"947.717","WINDTURBINEID":"XG01_25","ALERTTEXT":"齿轮箱轴承温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"198","COUNT":"14","TIME":"852.633","WINDTURBINEID":"XG01_35","ALERTTEXT":"齿轮箱轴承温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"199","COUNT":"39","TIME":"756.067","WINDTURBINEID":"NG01_89","ALERTTEXT":"齿轮箱轴承温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"200","COUNT":"29","TIME":"615.25","WINDTURBINEID":"XG01_09","ALERTTEXT":"齿轮箱轴承温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"201","COUNT":"26","TIME":"604","WINDTURBINEID":"SG01_90","ALERTTEXT":"齿轮箱轴承温差大于8度","CATEGORY":"1"}
+        ,
+        {"SNAPID":"202","COUNT":"10","TIME":"328.7","WINDTURBINEID":"XG01_21","ALERTTEXT":"齿轮箱轴承温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"203","COUNT":"2","TIME":"80.667","WINDTURBINEID":"XG01_06","ALERTTEXT":"齿轮箱轴承温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"204","COUNT":"1","TIME":"72.733","WINDTURBINEID":"SG01_103","ALERTTEXT":"齿轮箱轴承温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"205","COUNT":"1","TIME":"71.067","WINDTURBINEID":"SG01_97","ALERTTEXT":"齿轮箱轴承温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"206","COUNT":"9","TIME":"60.95","WINDTURBINEID":"XG01_28","ALERTTEXT":"齿轮箱轴承温度高","CATEGORY":"1"}
+        ,
+        {"SNAPID":"207","COUNT":"9","TIME":"154.183","WINDTURBINEID":"SG01_71","ALERTTEXT":"齿轮箱高速轴轴温大于90度","CATEGORY":"1"}
+        
+        ]
+        
+}

+ 4 - 4
src/views/StatusBar.vue

@@ -2,13 +2,13 @@
 <template>
   <div class="status-bar" onselectstart="return false">
     <el-row>
-      <el-col :span="22" style="margin-top: 8px">
+      <el-col :span="24" style="margin-top: 8px">
         <div class="Bbox">
           <span style="color: white; margin-left: 20px">系统时间:</span>
           <span style="color: white">{{ currentTime }}</span>
-          <!-- <div class="bottom-right" @click="block">
+          <div class="bottom-right" @click="block">
             <span>新增报警数量</span>
-          </div> -->
+          </div>
         </div>
       </el-col>
 
@@ -163,7 +163,7 @@ export default {
 .bottom-right {
   display: inline-block;
   position: absolute;
-  right: 0;
+  right: 200px;
   color: blue;
 }
 .Bbox {