Browse Source

Merge branch 'master' of http://49.4.49.126:3000/GYEE_R.D/neic

# Conflicts:
#	src/components/area/ProblemArea.vue
chenminghua 3 years ago
parent
commit
aa5bd8fc63

BIN
src/assets/img/LabelArea/flag.png


+ 35 - 3
src/assets/script/BackgroundData.js

@@ -88,6 +88,10 @@ export default class BackgroundData {
     Failure = new Array();
     /* 事故数据 */
     Accidents = new Array();
+
+    /* 标记数据 */
+    Marks=[{title:"QG01_01",value:"温度过高"}];
+
     constructor() {
         this.refreshTPData = this.refreshTPData.bind(this);
         this.onTPMessage = this.onTPMessage.bind(this);
@@ -99,6 +103,9 @@ export default class BackgroundData {
         this.isContains = this.isContains.bind(this);
         this.refreshRecommendData = this.refreshRecommendData.bind(this);
         this.onRDMessage = this.onRDMessage.bind(this);
+        this.showdialog = this.showdialog.bind(this);
+        this.windturbineControl=this.windturbineControl.bind(this);
+        this.marking=this.marking.bind(this);
 
         this.refreshTPData();
         this.refreshAlarmData();
@@ -262,10 +269,35 @@ export default class BackgroundData {
         return false;
     }
 
-    login(uname,psd,action){
+    login(uname, psd, action) {
         axios.get(`http://${config.calcUrl}/user/login?userName=${uname}&psd=${psd}`)
-        .then(action)
-        .catch(err=>console.log(err));
+            .then(action)
+            .catch(err => action("登录出现错误:"+err.message));
+    }
+
+    /* 显示提示框 */
+    showdialog(title,message,detail) {
+        const { remote } = require("electron");
+        const { dialog } = remote;
+        dialog.showMessageBox(remote.getCurrentWindow(), {
+            type: "none",
+            title: title,
+            message: message,
+            detail: detail,
+            buttons: ["确定"],
+            noLink: true,
+        });
+    }
+
+    /* 风机控制 */
+    windturbineControl(windturbines){
+        console.log(windturbines);
+    }
+
+    marking(windturbines){
+        for(var v in windturbines){
+            this.Marks.push({title:windturbines[v].windturbineId});
+        }
     }
 
     /* 单例 */

+ 61 - 55
src/components/StatusBar.vue

@@ -13,7 +13,6 @@
           trigger="hover"
           class="popoverBack"
           :show-arrow="false"
-          visible-arrow="false"
         >
           <template #reference>
             <div class="status-list">
@@ -26,44 +25,46 @@
             </div>
           </template>
           <el-scrollbar>
-          <el-table
-            :data="hiddenDangerData"
-            border
-            border-color="rgb(36,36,36)"
-            max-height="650px"
-            :header-cell-style="{
-              background: 'Black',
-              color: 'rgb(220,220,220)',
-              border:'0px'
-            }"
-            :cell-style="{ background: 'Black', color: 'rgb(220,220,220)',}"
-          >
-            <el-table-column
-              width="160"
-              property="lastUpdateTime"
-              label="时间"
-              align="center"
-            ></el-table-column>
-            <el-table-column
-              width="110"
-              property="windturbineId"
-              label="设备"
-              align="center"
-            ></el-table-column>
-            <el-table-column
-              width="250"
-              property="alertText"
-              label="故障信息"
-              align="center"
-            ></el-table-column>
-          </el-table>
+            <el-table
+              :data="hiddenDangerData"
+              border
+              border-color="rgb(36,36,36)"
+              max-height="650px"
+              :header-cell-style="{
+                background: 'Black',
+                color: 'rgb(220,220,220)',
+                border: '0px',
+              }"
+              :cell-style="{ background: 'Black', color: 'rgb(220,220,220)' }"
+            >
+              <el-table-column
+                width="160"
+                property="lastUpdateTime"
+                label="时间"
+                align="center"
+              ></el-table-column>
+              <el-table-column
+                width="110"
+                property="windturbineId"
+                label="设备"
+                align="center"
+              ></el-table-column>
+              <el-table-column
+                width="250"
+                property="alertText"
+                label="故障信息"
+                align="center"
+              ></el-table-column>
+            </el-table>
           </el-scrollbar>
         </el-popover>
-        <el-popover placement="top-start"
+        <el-popover
+          placement="top-start"
           :width="521"
           trigger="hover"
           class="popoverBack"
-          :show-arrow="false">
+          :show-arrow="false"
+        >
           <template #reference>
             <div class="status-list">
               <img
@@ -82,9 +83,10 @@
             :header-cell-style="{
               background: 'Black',
               color: 'rgb(220,220,220)',
-              border:'0px'
+              border: '0px',
             }"
-            :cell-style="{ background: 'Black', color: 'rgb(220,220,220)',}">
+            :cell-style="{ background: 'Black', color: 'rgb(220,220,220)' }"
+          >
             <el-table-column
               width="160"
               property="lastUpdateTime"
@@ -110,7 +112,8 @@
           :width="521"
           trigger="hover"
           class="popoverBack"
-          :show-arrow="false">
+          :show-arrow="false"
+        >
           <template #reference>
             <div class="status-list">
               <img
@@ -129,9 +132,10 @@
             :header-cell-style="{
               background: 'Black',
               color: 'rgb(220,220,220)',
-              border:'0px'
+              border: '0px',
             }"
-            :cell-style="{ background: 'Black', color: 'rgb(220,220,220)',}">
+            :cell-style="{ background: 'Black', color: 'rgb(220,220,220)' }"
+          >
             <el-table-column
               width="160"
               property="lastUpdateTime"
@@ -157,7 +161,8 @@
           :width="521"
           trigger="hover"
           class="popoverBack"
-          :show-arrow="false">
+          :show-arrow="false"
+        >
           <template #reference>
             <div class="status-list">
               <img
@@ -176,9 +181,10 @@
             :header-cell-style="{
               background: 'Black',
               color: 'rgb(220,220,220)',
-              border:'0px'
+              border: '0px',
             }"
-            :cell-style="{ background: 'Black', color: 'rgb(220,220,220)',}">
+            :cell-style="{ background: 'Black', color: 'rgb(220,220,220)' }"
+          >
             <el-table-column
               width="160"
               property="lastUpdateTime"
@@ -205,7 +211,7 @@
 </template>
 
 <script>
-import BackgroundData from '../assets/script/BackgroundData'
+import BackgroundData from "../assets/script/BackgroundData";
 export default {
   data() {
     return {
@@ -216,10 +222,10 @@ export default {
       statusTimer: "",
       currentTime: "",
 
-      hiddenDangerData:new Array(),
-      defectData:new Array(),
-      malfunctionData:new Array(),
-      accidentData:new Array(),
+      hiddenDangerData: new Array(),
+      defectData: new Array(),
+      malfunctionData: new Array(),
+      accidentData: new Array(),
     };
   },
   mounted() {
@@ -254,7 +260,7 @@ export default {
         return obj;
       }
     },
-    refreshData(){
+    refreshData() {
       var bd = BackgroundData.getInstance();
       this.hiddenDangerNum = bd.HiddenProblems.length;
       this.defectNum = bd.Defects.length;
@@ -265,21 +271,23 @@ export default {
       this.defectData = bd.Defects;
       this.malfunctionData = bd.Failure;
       this.accidentData = bd.Accidents;
-      if(this.accidentData.length<=0){
-        this.accidentData=[{lastUpdateTime:"-",stationName:"-",alertText:"-"}];
+      if (this.accidentData.length <= 0) {
+        this.accidentData = [
+          { lastUpdateTime: "-", stationName: "-", alertText: "-" },
+        ];
       }
-    }
+    },
   },
 };
 </script>
 
 <style scoped>
-/deep/ .el-table__body-wrapper::-webkit-scrollbar {
+:deep(.el-table__body-wrapper::-webkit-scrollbar) {
   width: 8px;
   background-color: black;
 }
 
-/deep/ .el-table__body-wrapper::-webkit-scrollbar-thumb  {
+:deep(.el-table__body-wrapper::-webkit-scrollbar-thumb) {
   background-color: #292929;
   border-radius: 6px;
 }
@@ -330,6 +338,4 @@ span {
 .status-label.accident {
   color: #af3e3d;
 }
-
-
 </style>

+ 30 - 30
src/components/TitleBar.vue

@@ -19,8 +19,7 @@
             :show-close="false"
           >
             <el-form :model="form">
-              <el-form-item :label="loginMessage" :label-width="formLabelWidth">
-              </el-form-item>
+              <el-form-item :label="loginMessage"> </el-form-item>
               <el-form-item label="用户名:" :label-width="formLabelWidth">
                 <el-input
                   v-model="form.name"
@@ -72,22 +71,6 @@
               </span>
             </template>
           </el-dialog>
-
-          <el-popover
-          placement="bottom"
-          :width="521"
-          trigger="hover"
-          class="popoverBack"
-          :show-arrow="false"
-          visible-arrow="false"
-          v-model="popovermodel"
-        >          
-          <ul>
-            <li>编辑</li>
-            <li>注销</li>
-          </ul>
-
-        </el-popover>
         </div>
       </el-col>
       <el-col :span="2.3">
@@ -196,9 +179,19 @@
       </el-col>
 
       <el-col :span="1.6">
-        
-        <div @click="userClick" @mouseover="popovermodel=false" style="top: 18px; right: 100px; color: #ffffff; position: absolute">{{usreName}}</div>
-        
+        <el-popover placement="bottom" :width="150" trigger="hover" :show-arrow="false">
+          <template #reference>
+            <el-button @click="userClick" style="top: 10px; right: 76px; color: #ffffff; position: absolute;background-color:black;border:none;font-size:16px;">{{usreName}}</el-button>
+          </template>
+          <form style="background-color: #363636;">
+            <el-button class="loginoption">编&emsp;辑</el-button>
+            <br>
+            <el-button class="loginoption">注&emsp;销</el-button>
+          </form>
+        </el-popover>
+
+        <!-- <div @click="userClick" style="top: 18px; right: 100px; color: #ffffff; position: absolute">{{usreName}}</div> -->
+
         <!-- <el-button
           v-popover:loginref
           type="text"
@@ -226,14 +219,13 @@ export default {
   },
   data() {
     return {
-      popovermodel: false,
       dialogVisible: false,
       dialogFormVisible: false,
       form: {
         name: "",
         psd: "",
       },
-      usreName:"未登录...",
+      usreName: "未登录...",
       loginMessage: "", // 登录提示
       formLabelWidth: "120px",
       totalPower: 0, // 实时功率
@@ -294,24 +286,25 @@ export default {
     /* 登录 */
     login() {
       var bd = BackgroundData.getInstance();
+        this.loginMessage='正在登录...';
       bd.login(this.form.name,this.form.psd,this.onLoged);
     },
 
     onLoged(msg){
       if(!msg.data){
-        this.loginMessage="登录出现错误,请重新登录";
+        this.loginMessage=msg;
         return;
       }
       var user = msg.data;
-      if(!user.isValid){
-        this.loginMessage=user.message;
+      if (!user.isValid) {
+        this.loginMessage = user.message;
         return;
       }
-      BackgroundData.getInstance().LoginUser=user;
-      this.usreName=user.name;
+      BackgroundData.getInstance().LoginUser = user;
+      this.usreName = user.name;
       this.dialogVisible = false;
-      this.loginMessage='';
-      this.form.name=this.form.psd='';
+      this.loginMessage = "";
+      this.form.name = this.form.psd = "";
     },
 
     /* 用户点击 */
@@ -324,6 +317,13 @@ export default {
 
 
 <style scoped>
+.loginoption{
+  font-size:16px;
+  width:150px;
+  background-color: #292929;
+  border:none;
+  color:rgb(220,220,220);
+}
 .title-bar {
   height: 6vh;
   background-color: #000000;

+ 110 - 7
src/components/area/ControlArea.vue

@@ -5,14 +5,14 @@
     area-style="control"
     circle-style="green"
     content-style="44"
+    @contextmenu="contextmenu"
   >
-    <ControlMatrixCard title="待启动" :datas="ls.start"></ControlMatrixCard>
-    <ControlMatrixCard title="待停机" :datas="ls.stop"></ControlMatrixCard>
-    <ControlMatrixCard title="待维护" :datas="ls.maintain"></ControlMatrixCard>
-    <ControlMatrixCard title="待取消维护" :datas="ls.unmaintain"></ControlMatrixCard>
-    <ControlMatrixCard title="待复位" :datas="ls.reset"></ControlMatrixCard>
-    <el-button style="z-index:2;position:absolute;bottom:10px;right:10px;background: #292929;font-size:15px;width:90px;border:none;color:rgb(220,220,220);" size="small">发送</el-button>
-    
+    <ControlMatrixCard title="待启动" :datas="ls.start" ref="start"></ControlMatrixCard>
+    <ControlMatrixCard title="待停机" :datas="ls.stop" ref="stop"></ControlMatrixCard>
+    <ControlMatrixCard title="待维护" :datas="ls.maintain" ref="maintain"></ControlMatrixCard>
+    <ControlMatrixCard title="待取消维护" :datas="ls.unmaintain" ref="unmaintain"></ControlMatrixCard>
+    <ControlMatrixCard title="待复位" :datas="ls.reset" ref="reset"></ControlMatrixCard>
+    <el-button style="z-index:2;position:absolute;bottom:10px;right:10px;background: #292929;font-size:15px;width:90px;border:none;color:rgb(220,220,220);" size="small" @click="menuClicked({type:'marking'})">发送</el-button>
   </gy-card>
   <el-button-group style="z-index:3;position:absolute;top:16px;left:120px;">
       <el-button style="background: black;font-size:14px;width:80px;border:none;color:rgb(220,220,220);" size="mini" round>自动</el-button>
@@ -23,6 +23,7 @@
 <script>
 import ControlMatrixCard from "./windturbine/control/ControlMatrixCard.vue";
 import MessageBridge from "../../assets/script/MessageBridge";
+import BackgroundData from "../../assets/script/BackgroundData";
 
 export default {
   name: "ControlArea",
@@ -83,6 +84,108 @@ export default {
         }
       }
     },
+    /* 右键菜单 */
+    contextmenu() {
+      const { remote } = require("electron");
+      var that = this;
+      const menuTemplate = [
+        {
+          label: "发送",
+          click() {
+            that.menuClicked({ type: "send" });
+          },
+        },
+        {
+          label: "挂牌",
+          submenu: [
+            {
+              label: "检修",
+              click() {
+                that.menuClicked({ type: "lock", value: 8 });
+              },
+            },
+            {
+              label: "故障维修",
+              click() {
+                that.menuClicked({ type: "lock", value: 7 });
+              },
+            },
+            {
+              label: "场内受累检修",
+              click() {
+                that.menuClicked({ type: "lock", value: 2 });
+              },
+            },
+            {
+              label: "场内受累故障",
+              click() {
+                that.menuClicked({ type: "lock", value: 3 });
+              },
+            },
+            {
+              label: "场外受累电网",
+              click() {
+                that.menuClicked({ type: "lock", value: 4 });
+              },
+            },
+            {
+              label: "场外受累天气",
+              click() {
+                that.menuClicked({ type: "lock", value: 5 });
+              },
+            },
+          ],
+        },
+        {
+          label: "标注",
+          click() {
+            that.menuClicked({ type: "marking" });
+          },
+        },
+      ];
+      const menu = remote.Menu.buildFromTemplate(menuTemplate);
+
+      menu.popup(remote.getCurrentWindow());
+    },
+
+    menuClicked(msg) {
+      var bd = BackgroundData.getInstance();
+      if (!bd.LoginUser) {
+        bd.showdialog("提示", "控制出现错误:", "未登录");
+        return;
+      }
+      if (msg.type == "lock") {
+        // 挂牌
+      } else if (msg.type == "send") {
+        // 发送
+      } else if (msg.type == "marking") {
+        // 标注
+        var vs = this.getSelectedItems();
+        bd.marking(vs);
+      }
+      this.clearSelected();
+    },
+
+    /* 获取选中的项目,isControl:是否是控制 */
+    getSelectedItems(isControl){
+      var ls = new Array();
+      this.$refs.start.outputSelectedItems(ls);
+      this.$refs.stop.outputSelectedItems(ls);
+      if(isControl) return ls;
+      this.$refs.maintain.outputSelectedItems(ls);
+      this.$refs.unmaintain.outputSelectedItems(ls);
+      this.$refs.reset.outputSelectedItems(ls);
+      return ls;
+    },
+
+    /* 清除所有选择 */
+    clearSelected(){
+      this.$refs.start.clearSelected();
+      this.$refs.stop.clearSelected();
+      this.$refs.maintain.clearSelected();
+      this.$refs.unmaintain.clearSelected();
+      this.$refs.reset.clearSelected();
+    }
   },
 };
 </script>

+ 30 - 2
src/components/area/LabelArea.vue

@@ -1,8 +1,36 @@
 /* 标注区 */
 <template>
     <gy-card title="标注区" area-style="label" circle-style="yellow" content-style="25">
-        <div>
-            
+        <div v-for="mk in values" :key="mk" style="width:120px;margin-left:10px;margin-top:10px;">
+            <img src="../../assets/img/LabelArea/flag.png" style="float:left;margin-top:5px;margin-left:15px;"/>
+            <div style="text-align:center;">{{mk.title}}</div>
+            <input v-model="mk.value" style="border:none;background-color:#292929;height:30px;border-radius:6px;text-align:center;outline:none;width:120px;color:rgb(220,220,220);"/>
         </div>
     </gy-card>
 </template>
+
+<script>
+import BackgroundData from '../../assets/script/BackgroundData'
+
+export default{
+    name:'LabelArea',
+    data(){
+        return{
+            values:new Array(),
+        }
+    },
+    created(){
+        this.refreshTimer = setInterval(this.refreshData,1000);
+    },
+    methods:{
+        refreshData(){
+            this.values=new Array();
+            this.values=BackgroundData.getInstance().Marks;
+        },
+    }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 85 - 2
src/components/area/ProblemArea.vue

@@ -6,6 +6,7 @@
     circle-style="green"
     content-style="89"
     @parentRun="run"
+    @contextmenu="contextmenu"
   >
     <ProblemMatrixCard title="故障" :type="5"></ProblemMatrixCard>
     <ProblemMatrixCard title="维护" :type="6"></ProblemMatrixCard>
@@ -16,6 +17,7 @@
 
 <script>
 import ProblemMatrixCard from "./windturbine/problem/ProblemMatrixCard.vue";
+import BackgroundData from "../../assets/script/BackgroundData";
 
 export default {
   name: "ProblemArea",
@@ -34,7 +36,88 @@ export default {
     };
   },
   computed: {},
-  created() {},
-  methods: {},
+  created: function () {
+    this.initData();
+  },
+  methods: {
+    /* 右键菜单 */
+    contextmenu() {
+      const { remote } = require("electron");
+      var that = this;
+      const menuTemplate = [
+        {
+          label: "标注",
+          click() {
+            that.menuClicked({ type: "marking" });
+          },
+        },
+        {
+          label: "挂牌",
+          submenu: [
+            {
+              label: "检修",
+              click() {
+                that.menuClicked({ type: "lock", value: 8 });
+              },
+            },
+            {
+              label: "故障维修",
+              click() {
+                that.menuClicked({ type: "lock", value: 7 });
+              },
+            },
+            {
+              label: "场内受累检修",
+              click() {
+                that.menuClicked({ type: "lock", value: 2 });
+              },
+            },
+            {
+              label: "场内受累故障",
+              click() {
+                that.menuClicked({ type: "lock", value: 3 });
+              },
+            },
+            {
+              label: "场外受累电网",
+              click() {
+                that.menuClicked({ type: "lock", value: 4 });
+              },
+            },
+            {
+              label: "场外受累天气",
+              click() {
+                that.menuClicked({ type: "lock", value: 5 });
+              },
+            },
+          ],
+        },
+        {
+          label: "取消挂牌",
+          click() {
+            that.menuClicked({ type: "unlock" });
+          },
+        },
+      ];
+      const menu = remote.Menu.buildFromTemplate(menuTemplate);
+
+      menu.popup(remote.getCurrentWindow());
+    },
+
+    menuClicked(msg) {
+      var bd = BackgroundData.getInstance();
+      if (!bd.LoginUser) {
+        bd.showdialog("提示", "控制出现错误:", "未登录");
+        return;
+      }
+      if (msg.type == "lock") {
+        // 挂牌
+      } else if (msg.type == "unlock") {
+        // 取消挂牌
+      } else if (msg.type == "marking") {
+        // 标注
+      }
+    },
+  },
 };
 </script>

+ 2 - 3
src/components/area/RecommendedArea.vue

@@ -6,14 +6,13 @@
     circle-style="green"
     content-style="37"
   >
+  <div>
   <table v-for="vl in values" :key="vl">
-    
       <tr>{{vl.stationName}}</tr>
       <tr>{{vl.content}}</tr>
       <tr>{{vl.createTime}}</tr>
-    
   </table>
-    
+  </div>
   </gy-card>
 </template>
 

+ 13 - 41
src/components/area/gy-card.vue

@@ -2,8 +2,8 @@
 <template>
     <transition>
         <div :class='areaClass' @mouseover="hover = false"
-             @mouseleave="hover = false" @contextmenu="rightClick" onselectstart="return false">
-            <div :class="headerClass" @dblclick="gyCardDbClick">
+             @mouseleave="hover = false" onselectstart="return false">
+            <div :class="headerClass"> <!-- @dblclick="gyCardDbClick" -->
                 <div :class='circleClass'></div>
                 <span class="gy-card-title">{{ title }}</span>
                 <img class="gy-card-decoration01" src="../../assets/img/controlcenter/decoration01.png">
@@ -73,7 +73,7 @@
                 }
             },
             circleClass() {
-                return `gy-card-circle-${this.circleStyle}`;
+                return `gy-card-circle gy-card-circle-${this.circleStyle}`;
             },
             contentClass() {
                 if (this.big) {
@@ -91,37 +91,14 @@
             }
         },
         methods: {
-            gyCardDbClick() {
+            /* gyCardDbClick() {
                 let big = this.big
                 if (big) {
                     this.big = false
                 } else {
                     this.big = false
                 }
-            },
-            rightClick() {
-                const {remote} = window.require('electron');
-                const {Menu, MenuItem} = remote
-                const menu = new Menu()
-                menu.append(new MenuItem({
-                    label: 'test1',
-                    click: function () {
-                        console.info("右键test1")
-                    }
-                }))
-                menu.append(new MenuItem({type: 'separator'}));
-                menu.append(new MenuItem({
-                    label: 'test2',
-                    click: function () {
-                        console.info("右键test2")
-                    }
-                }))
-                // window.addEventListener('contextmenu', (e) => {
-                //     e.preventDefault();
-                //     menu.popup({window: remote.getCurrentWindow()})
-                // }, false)
-                menu.popup(remote.getCurrentWindow())
-            }
+            }, */
         }
     }
 </script>
@@ -171,28 +148,23 @@
         border-radius: 7px;
     }
 
-    .gy-card-circle-green {
+    .gy-card-circle{
         position: relative;
-        top: 10px;
+        top: 7px;
         display: inline-block;
-        width: 10px;
-        height: 10px;
-        background-color: #008000;
+        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 {
-        position: relative;
-        top: 10px;
-        display: inline-block;
-        width: 10px;
-        height: 10px;
         background-color: #ffff00;
-        -moz-border-radius: 50%;
-        -webkit-border-radius: 50%;
-        border-radius: 50%;
     }
 
     .gy-card-title {

+ 23 - 0
src/components/area/windturbine/control/ControlMatrixCard.vue

@@ -86,6 +86,29 @@ export default {
         });
       },
     },
+    /* 获取选中的项目 */
+    getSelectedItems() {
+      var ls = new Array();
+      this.values.forEach((item) => {
+        if (item.active) {
+          ls.push(item);
+        }
+      });
+      return ls;
+    },
+    /* 将选中的项目填充到数组中 */
+    outputSelectedItems(ls) {
+      this.values.forEach((item) => {
+        if (item.active) {
+          ls.push(item);
+        }
+      });
+    },
+
+    /* 清除选中的项目 */
+    clearSelected() {
+      this.values.forEach((item) => (item.active = false));
+    },
   },
 };
 </script>

+ 363 - 0
src/components/area/windturbine/problem/ProblemMatrixCard.vue

@@ -0,0 +1,363 @@
+<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)"
+      >
+        <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>{{ item.power.toFixed(2) }} kw</div>
+          <div>{{ item.windSpeed.toFixed(2) }} m/s</div>
+          <div>{{ item.rollSpeed.toFixed(2) }} rpm</div>
+        </div>
+      </div>
+    </div>
+    <div class="bottom"></div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "ControlMatrixCard",
+  props: { title: String, type: Number, datas: Object },
+  data() {
+    return {
+      values: [],
+    };
+  },
+  created() {},
+  methods: {
+    // 点击卡片事件
+    onSelectHandler(item) {
+      item.active = !item.active;
+    },
+    filter(value, windturbineId) {
+      var array = [];
+      var flag = false;
+      for (var 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;
+    },
+  },
+  watch: {
+    "$store.getters.windturbinelist": {
+      deep: true,
+      handler: function (json) {
+        for (var id in json) {
+          var val = json[id];
+          if (val.status == this.type) {
+            var active = false;
+            var array = this.filter(this.values, val.windturbineId);
+            if (!array[0]) {
+              // 维护
+              val.active = active;
+              this.values.push(val);
+            } else {
+              val.active = array[2];
+              this.values.splice(array[1], 1, val);
+            }
+          }
+        }
+      },
+    },
+  },
+};
+</script>
+
+<style scoped>
+.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: 50px;
+  font-size: 12px;
+  margin-right: 3px;
+  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-select-0 {
+  border: 2px solid rgb(255, 255, 255, 0.5);
+}
+/*  左边卡片选中和未选中 */
+.card-left-select-0 {
+  background-color: rgb(255, 255, 255, 0.5);
+}
+.card-left-unselect-0 {
+  background-color: rgb(255, 255, 255);
+}
+/*  右边卡片选中和未选中 */
+.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);
+}
+
+/* ***********颜色************ */
+/* *********************** */
+/*  最外层卡片选中和未选中 */
+.card-select-1 {
+  border: 2px solid rgb(121, 73, 81, 0.5);
+}
+.card-unselect-1 {
+  border: 2px solid rgb(121, 73, 81);
+}
+.card-select-1 {
+  border: 2px solid rgb(121, 73, 81, 0.5);
+}
+/*  左边卡片选中和未选中 */
+.card-left-select-1 {
+  background-color: rgb(121, 73, 81, 0.5);
+}
+.card-left-unselect-1 {
+  background-color: rgb(121, 73, 81);
+}
+/*  右边卡片选中和未选中 */
+.card-right-select-1 {
+  border-left: 2px dashed rgb(121, 73, 81, 0.5);
+}
+.card-right-unselect-1 {
+  border-left: 2px dashed rgb(121, 73, 81);
+}
+
+/* ***********颜色************ */
+/* *********************** */
+/*  最外层卡片选中和未选中 */
+.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);
+}
+/*  右边卡片选中和未选中 */
+.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);
+}
+
+/* ***********颜色************ */
+/* *********************** */
+/*  最外层卡片选中和未选中 */
+.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);
+}
+/*  右边卡片选中和未选中 */
+.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);
+}
+
+/* ***********颜色************ */
+/* *********************** */
+/*  最外层卡片选中和未选中 */
+.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);
+}
+/*  右边卡片选中和未选中 */
+.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);
+}
+
+/* ***********颜色************ */
+/* *********************** *
+/*  最外层卡片选中和未选中 */
+.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);
+}
+/*  右边卡片选中和未选中 */
+.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);
+}
+
+/* ***********颜色************ */
+/* *********************** *
+/*  最外层卡片选中和未选中 */
+.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);
+}
+/*  右边卡片选中和未选中 */
+.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);
+}
+
+/* ***********颜色************ */
+/* *********************** *
+/*  最外层卡片选中和未选中 */
+.card-select-7 {
+  border: 2px solid rgb(159, 163, 165, 0.5);
+}
+.card-unselect-7 {
+  border: 2px solid rgb(159, 163, 165);
+}
+.card-select-7 {
+  border: 2px solid rgb(159, 163, 165, 0.5);
+}
+/*  左边卡片选中和未选中 */
+.card-left-select-7 {
+  background-color: rgb(159, 163, 165, 0.5);
+}
+.card-left-unselect-7 {
+  background-color: rgb(2159, 163, 165);
+}
+/*  右边卡片选中和未选中 */
+.card-right-select-7 {
+  border-left: 2px dashed rgb(159, 163, 165, 0.5);
+}
+.card-right-unselect-7 {
+  border-left: 2px dashed rgb(159, 163, 165);
+}
+</style>