yusheng 3 روز پیش
والد
کامیت
0c24360125
2فایلهای تغییر یافته به همراه325 افزوده شده و 288 حذف شده
  1. 9 0
      src/api/pcsData/index.js
  2. 316 288
      src/views/home/yuxin.vue

+ 9 - 0
src/api/pcsData/index.js

@@ -75,3 +75,12 @@ export async function getRealData(id) {
   }
   return ''
 }
+
+// 获取设备告警
+export async function getRealAlarmLogInfo(data) {
+  const res = await request.post(`main/asset/getRealAlarmLogInfo`,data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return ''
+}

+ 316 - 288
src/views/home/yuxin.vue

@@ -62,6 +62,18 @@
             <div class="label device-name" style="left: -0.1%; top: 45%"
               >1#给煤机</div
             >
+            <div
+              style="left: 4.5%; top: 45%"
+              class="alarm-badge"
+              v-if="gmj1.alarm.alarmLevel"
+              :class="{
+                'alarm-yellow': gmj1.alarm.alarmLevel == 1,
+                'alarm-orange': gmj1.alarm.alarmLevel == 2,
+                'alarm-red': gmj1.alarm.alarmLevel == 3
+              }"
+            >
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
             <div class="label data-box" style="left: 7%; top: 41%">{{
               gmj1.频率.value.value + ' ' + gmj1.频率.value.unit
             }}</div>
@@ -69,6 +81,18 @@
             <div class="label device-name" style="left: -0.1%; top: 65%"
               >2#给煤机</div
             >
+            <div
+              style="left: 4.5%; top: 65%"
+              class="alarm-badge"
+              v-if="gmj2.alarm.alarmLevel"
+              :class="{
+                'alarm-yellow': gmj2.alarm.alarmLevel == 1,
+                'alarm-orange': gmj2.alarm.alarmLevel == 2,
+                'alarm-red': gmj2.alarm.alarmLevel == 3
+              }"
+            >
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
             <div class="label data-box" style="left: 7%; top: 59.5%">{{
               gmj2.频率.value.value + ' ' + gmj2.频率.value.unit
             }}</div>
@@ -79,6 +103,20 @@
             <div class="label data-box" style="left: 19%; top: 8%">{{
               lt.炉膛出口温度右.value.value + ' ' + lt.炉膛出口温度右.value.unit
             }}</div>
+
+            <div
+              style="left: 16.5%; top: 20%"
+              class="alarm-badge"
+              v-if="lt.alarm.alarmLevel"
+              :class="{
+                'alarm-yellow': lt.alarm.alarmLevel == 1,
+                'alarm-orange': lt.alarm.alarmLevel == 2,
+                'alarm-red': lt.alarm.alarmLevel == 3
+              }"
+            >
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
+
             <!-- 锅炉上部 -->
             <!-- <div class="label data-box" style="left: 15.5%; top: 22%"
               >+104 Pa</div
@@ -117,6 +155,7 @@
             <div class="label data-box" style="left: 17.5%; top: 71%">{{
               lt.沸下温度右.value.value + ' ' + lt.沸下温度右.value.unit
             }}</div>
+
             <!-- 除尘器 -->
             <div class="label data-box" style="left: 45.4%; top: 0"
               >后烟压:{{
@@ -133,6 +172,18 @@
               style="left: 46.6%; top: 12.6%; color: #333; text-shadow: none"
               >除尘器</div
             >
+            <div
+              style="left: 47.5%; top: 16%"
+              class="alarm-badge"
+              v-if="ccq.alarm.alarmLevel"
+              :class="{
+                'alarm-yellow': ccq.alarm.alarmLevel == 1,
+                'alarm-orange': ccq.alarm.alarmLevel == 2,
+                'alarm-red': ccq.alarm.alarmLevel == 3
+              }"
+            >
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
             <!-- 二次风机 -->
             <div class="label device-name" style="left: 59%; top: 43%"
               >二次风机</div
@@ -141,16 +192,43 @@
               >二次风压:
               {{ ecfj.风压.value.value + ' ' + ecfj.风压.value.unit }}</div
             >
+
+            <div
+              style="left: 60%; top: 62%"
+              class="alarm-badge"
+              v-if="ecfj.alarm.alarmLevel"
+              :class="{
+                'alarm-yellow': ecfj.alarm.alarmLevel == 1,
+                'alarm-orange': ecfj.alarm.alarmLevel == 2,
+                'alarm-red': ecfj.alarm.alarmLevel == 3
+              }"
+            >
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
+
             <!-- 一次风机 -->
             <div class="label device-name" style="left: 48%; top: 70%"
               >一次风机</div
             >
+
             <!-- 底部功率 -->
             <div class="label data-box" style="left: 48%; top: 94%"
               >频率:{{
                 ycfj.频率.value.value + ' ' + ycfj.频率.value.unit
               }}</div
             >
+            <div
+              style="left: 49.5%; top: 88%"
+              class="alarm-badge"
+              v-if="ycfj.alarm.alarmLevel"
+              :class="{
+                'alarm-yellow': ycfj.alarm.alarmLevel == 1,
+                'alarm-orange': ycfj.alarm.alarmLevel == 2,
+                'alarm-red': ycfj.alarm.alarmLevel == 3
+              }"
+            >
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
             <!-- 引风机 -->
             <div class="label device-name" style="left: 72%; top: 31%"
               >引风机</div
@@ -158,6 +236,18 @@
             <div class="label data-box" style="left: 71%; top: 56%"
               >功率: {{ yfj.频率.value.value + ' ' + yfj.频率.value.unit }}</div
             >
+            <div
+              style="left: 73%; top: 47%"
+              class="alarm-badge"
+              v-if="yfj.alarm.alarmLevel"
+              :class="{
+                'alarm-yellow': yfj.alarm.alarmLevel == 1,
+                'alarm-orange': yfj.alarm.alarmLevel == 2,
+                'alarm-red': yfj.alarm.alarmLevel == 3
+              }"
+            >
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
           </div>
         </div>
       </div>
@@ -184,24 +274,23 @@
                 zzq.主蒸汽温度.value.value + ' ' + zzq.主蒸汽温度.value.unit
               }}</div
             >
-            <!-- 高温过热器 -->
-            <!-- <div class="label data-box" style="left: 21%; top: 1%"
-              >温度:
-              {{
-                gwgrq.出口温度.value.value + ' ' + gwgrq.出口温度.value.unit
-              }}</div
+            <div
+              style="left: 6%; top: 17%"
+              class="alarm-badge"
+              v-if="zzq.alarm.alarmLevel"
+              :class="{
+                'alarm-yellow': zzq.alarm.alarmLevel == 1,
+                'alarm-orange': zzq.alarm.alarmLevel == 2,
+                'alarm-red': zzq.alarm.alarmLevel == 3
+              }"
             >
-            <div class="label data-box" style="left: 20.8%; top: 7%"
-              >压力:{{
-                gwgrq.进口蒸汽压力.value.value +
-                ' ' +
-                gwgrq.进口蒸汽压力.value.unit
-              }}</div
-            > -->
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
+
             <div
               class="label device-name"
               style="
-                left: 22%;
+                left: 22.5%;
                 top: 25%;
                 font-size: 18px;
                 color: #000;
@@ -212,7 +301,7 @@
             <div
               class="label device-name"
               style="
-                left: 21.5%;
+                left: 22%;
                 top: 29%;
                 font-size: 18px;
                 color: #000;
@@ -256,6 +345,19 @@
               "
               >过热器</div
             >
+
+            <div
+              style="left: 37%; top: 20%"
+              class="alarm-badge"
+              v-if="dwgrq.alarm.alarmLevel"
+              :class="{
+                'alarm-yellow': dwgrq.alarm.alarmLevel == 1,
+                'alarm-orange': dwgrq.alarm.alarmLevel == 2,
+                'alarm-red': dwgrq.alarm.alarmLevel == 3
+              }"
+            >
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
             <!-- 气包 -->
             <div
               class="label device-name"
@@ -268,6 +370,19 @@
               "
               >汽包</div
             >
+
+            <div
+              style="left: 52%; top: 29%"
+              class="alarm-badge"
+              v-if="qp.alarm.alarmLevel"
+              :class="{
+                'alarm-yellow': qp.alarm.alarmLevel == 1,
+                'alarm-orange': qp.alarm.alarmLevel == 2,
+                'alarm-red': qp.alarm.alarmLevel == 3
+              }"
+            >
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
             <div class="label data-box" style="left: 53%; top: 40%"
               >汽包液位:{{
                 qp.汽包液位.value.value + ' ' + qp.汽包液位.value.unit
@@ -288,6 +403,18 @@
             <div class="label device-name" style="left: 71%; top: 37%"
               >省煤器</div
             >
+            <div
+              style="left: 71%; top: 30%"
+              class="alarm-badge"
+              v-if="smq.alarm.alarmLevel"
+              :class="{
+                'alarm-yellow': smq.alarm.alarmLevel == 1,
+                'alarm-orange': smq.alarm.alarmLevel == 2,
+                'alarm-red': smq.alarm.alarmLevel == 3
+              }"
+            >
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
             <div class="label data-box" style="left: 70%; top: 6%"
               >出口水温:
               {{
@@ -300,6 +427,20 @@
                 sxyw.水位.value.value + ' ' + sxyw.水位.value.unit
               }}</div
             >
+
+            <div
+              style="left: 42%; top: 76%"
+              class="alarm-badge"
+              v-if="sxyw.alarm.alarmLevel"
+              :class="{
+                'alarm-yellow': sxyw.alarm.alarmLevel == 1,
+                'alarm-orange': sxyw.alarm.alarmLevel == 2,
+                'alarm-red': sxyw.alarm.alarmLevel == 3
+              }"
+            >
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
+
             <!-- 给水泵 -->
             <div class="label device-name" style="left: 60%; top: 87%"
               >给水泵</div
@@ -316,6 +457,20 @@
             <div class="label device-name" style="left: 2%; top: 87.6%"
               >给水</div
             >
+
+            <div
+              v-if="gs.alarm.alarmLevel"
+              style="left: 5%; top: 90%"
+              class="alarm-badge"
+              :class="{
+                'alarm-yellow': gs.alarm.alarmLevel == 1,
+                'alarm-orange': gs.alarm.alarmLevel == 2,
+                'alarm-red': gs.alarm.alarmLevel == 3
+              }"
+            >
+              <i class="el-icon-bell alarm-icon"></i>
+            </div>
+
             <div class="label data-box" style="left: 4%; top: 82%"
               >进口流量:
               {{
@@ -365,8 +520,8 @@
 
 <script>
   import { component } from 'vue-fullscreen';
-  import { getRealData } from '@/api/pcsData/index.js';
-  import { values } from 'lodash';
+  import { getRealData, getRealAlarmLogInfo } from '@/api/pcsData/index.js';
+  import C from 'highlight.js/lib/languages/1c';
 
   export default {
     name: 'PcsDataDashboard',
@@ -377,6 +532,7 @@
       return {
         //烟气排放
         yqpf: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2036027830998446082',
             6: '2036033114630303745',
@@ -432,6 +588,7 @@
         },
         //水箱液位
         sxyw: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2008477438320357378',
             6: '2008477438257442817',
@@ -449,6 +606,7 @@
         },
         //主给水
         zgs: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2048945828386091010',
             6: '2048945828440616962',
@@ -466,6 +624,7 @@
         },
         //给水
         gs: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2048945828327370754',
             6: '2048945828289622018',
@@ -492,6 +651,7 @@
         },
         //省煤器
         smq: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2036027830256054273',
             6: '2036033113808220162',
@@ -509,6 +669,7 @@
         },
         //气泡
         qp: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2036027832722305025',
             6: '2036033116354162689',
@@ -545,6 +706,7 @@
 
         //主蒸汽
         zzq: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2036027831287853057',
             6: '2036033114848407554',
@@ -571,6 +733,7 @@
         },
         //高温过热器
         gwgrq: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2036027830004396033',
             6: '2036033113632059394',
@@ -597,6 +760,7 @@
         },
         //低温过热器
         dwgrq: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2036027829865984001',
             6: '2036033113489453058',
@@ -623,6 +787,7 @@
         },
         //给煤机
         gmj1: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2036027831950553090',
             6: '2036033115469164546',
@@ -639,6 +804,7 @@
           }
         },
         gmj2: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2036027831766003713',
             6: '2036033115326558209',
@@ -656,6 +822,7 @@
         },
         //料层
         lc: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2036027832571310081',
             6: '2036033116027006978',
@@ -682,6 +849,7 @@
         },
         //炉膛
         lt: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2036027829618520065',
             6: '2036033113225211905',
@@ -771,6 +939,7 @@
         },
         //除尘器
         ccq: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2008477400542261249',
             6: '2008477400445792258',
@@ -796,6 +965,7 @@
           }
         },
         ycfj: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2008477365637263361',
             6: '2008477365553377282',
@@ -812,6 +982,7 @@
           }
         },
         ecfj: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2008477365368827905',
             6: '2008477365305913345',
@@ -828,6 +999,7 @@
           }
         },
         yfj: {
+          alarm: { alarmLevel: '' },
           deviceId: {
             5: '2008477365154918402',
             6: '2008477365087809538',
@@ -933,23 +1105,64 @@
     },
     methods: {
       init() {
-        this.getYqpf();
-        this.getSxyw();
-        this.getGs();
-        this.getSmq();
-        this.getQp();
-        this.getZzq();
-        // this.getGwgrq();
-        this.getDwgrq();
-        this.getGmj1();
-        this.getGmj2();
-        this.getLc();
-        this.getLt();
-        this.getCcq();
-        this.getYcfj();
-        this.getEcfj();
-        this.getYfj();
-        this.getZgs()
+        const devices = [
+          'yqpf',
+          'sxyw',
+          'zgs',
+          'gs',
+          'smq',
+          'qp',
+          'zzq',
+          'gwgrq',
+          'dwgrq',
+          'gmj1',
+          'gmj2',
+          'lc',
+          'lt',
+          'ccq',
+          'ycfj',
+          'ecfj',
+          'yfj'
+        ];
+
+        let ids = [];
+        devices.forEach((key) => {
+          this.getDeviceData(key);
+          ids.push(this[key].deviceId[this.currentId]);
+        });
+        if (ids.length) {
+          //获取告警
+          getRealAlarmLogInfo(ids).then((res) => {
+            res.forEach((item) => {
+              devices.forEach((key) => {
+                if (item.deviceId == this[key].deviceId[this.currentId]) {
+                  this[key].alarm.alarmLevel = item.alarmId;
+                }
+              });
+            });
+          });
+        }
+      },
+
+      getDeviceData(deviceKey) {
+        const device = this[deviceKey];
+        if (!device || !device.deviceId) return;
+        const keys = Object.keys(device).filter(
+          (k) => k !== 'deviceId' && k !== 'alarm'
+        );
+        getRealData(device.deviceId[this.currentId]).then((res) => {
+          res &&
+            res.forEach((item) => {
+              keys.forEach((key) => {
+                if (item.identifier == device[key][this.currentId]) {
+                  device[key].value = {
+                    value: item.value,
+                    unit: item.unit
+                  };
+                }
+              });
+            });
+        });
       },
 
       onFullscreen() {
@@ -985,259 +1198,6 @@
             (chart) => chart && chart.resize()
           );
         });
-      },
-
-      getYqpf() {
-        const keys = ['颗粒物', 'NOX', 'O2', '排烟温度', 'SO2'];
-        getRealData(this.yqpf.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.yqpf[key][this.currentId]) {
-                this.yqpf[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-                // console.log(this.yqpf[key]);
-                // console.log(key);
-              }
-            });
-          });
-        });
-      },
-      getSxyw() {
-        const keys = ['水位'];
-        getRealData(this.sxyw.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.sxyw[key][this.currentId]) {
-                this.sxyw[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getGs() {
-        const keys = ['给水压力', '出口流量'];
-        getRealData(this.gs.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.gs[key][this.currentId]) {
-                this.gs[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getSmq() {
-        const keys = ['出口水温'];
-        getRealData(this.smq.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.smq[key][this.currentId]) {
-                this.smq[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getQp() {
-        const keys = ['汽包进口温度', '汽包液位', '汽包出口温度'];
-        getRealData(this.qp.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.qp[key][this.currentId]) {
-                this.qp[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getZzq() {
-        const keys = ['主蒸汽压力', '主蒸汽温度'];
-        getRealData(this.zzq.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.zzq[key][this.currentId]) {
-                this.zzq[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getDwgrq() {
-        const keys = ['低温过热器前烟压', '进口温度'];
-        getRealData(this.dwgrq.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.dwgrq[key][this.currentId]) {
-                this.dwgrq[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getGmj1() {
-        const keys = ['频率'];
-        getRealData(this.gmj1.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.gmj1[key][this.currentId]) {
-                this.gmj1[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getGmj2() {
-        const keys = ['频率'];
-        getRealData(this.gmj2.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.gmj2[key][this.currentId]) {
-                this.gmj2[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getLc() {
-        const keys = ['料层差压左', '料层差压右'];
-        getRealData(this.lc.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.lc[key][this.currentId]) {
-                this.lc[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getLt() {
-        const keys = [
-          '下端温度左',
-          '沸中温度左',
-          '沸下温度左',
-          '下端温度右',
-          '沸中温度右',
-          '沸下温度右',
-          '炉膛温度左',
-          '炉膛出口温度右',
-          '炉膛出口压力'
-        ];
-        getRealData(this.lt.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.lt[key][this.currentId]) {
-                this.lt[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getCcq() {
-        const keys = ['后烟压', '出口烟温'];
-        getRealData(this.ccq.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.ccq[key][this.currentId]) {
-                this.ccq[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getYcfj() {
-        const keys = ['频率'];
-        getRealData(this.ycfj.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.ycfj[key][this.currentId]) {
-                this.ycfj[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getEcfj() {
-        const keys = ['风压'];
-        getRealData(this.ecfj.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.ecfj[key][this.currentId]) {
-                this.ecfj[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getYfj() {
-        const keys = ['频率'];
-        getRealData(this.yfj.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.yfj[key][this.currentId]) {
-                this.yfj[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
-      },
-      getZgs() {
-        const keys = ['进口流量'];
-        getRealData(this.zgs.deviceId[this.currentId]).then((res) => {
-          res.forEach((item) => {
-            keys.forEach((key) => {
-              if (item.identifier == this.zgs[key][this.currentId]) {
-                this.zgs[key].value = {
-                  value: item.value,
-                  unit: item.unit
-                };
-              }
-            });
-          });
-        });
       }
     }
   };
@@ -1453,7 +1413,7 @@
               font-size: 14px;
               font-weight: bold;
               text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
-              padding: 2px 4px;
+              // padding: 2px 4px;
             }
           }
         }
@@ -1513,4 +1473,72 @@
   [v-cloak] {
     display: none;
   }
+  .alarm-badge {
+    position: absolute;
+
+    display: flex;
+    align-items: center;
+    gap: 4px;
+    z-index: 2;
+    animation: alarm-pulse 1.5s infinite;
+
+    .alarm-text {
+      font-size: 12px;
+      font-weight: 500;
+    }
+
+    .alarm-icon {
+      font-size: 24px;
+    }
+
+    &.alarm-yellow {
+      color: #ffcc00;
+      text-shadow: 0 0 10px #ffcc00, 0 0 20px #ffcc00;
+    }
+    &.alarm-orange {
+      color: #ff8800;
+      text-shadow: 0 0 10px #ff8800, 0 0 20px #ff8800;
+    }
+    &.alarm-red {
+      color: #ff2222;
+      text-shadow: 0 0 10px #ff2222, 0 0 20px #ff2222;
+    }
+  }
+  @keyframes alarm-pulse {
+    0%,
+    100% {
+      transform: scale(1);
+    }
+    50% {
+      transform: scale(1.2);
+    }
+  }
+  @keyframes bellshake {
+    0%,
+    100% {
+      transform: rotate(0deg);
+    }
+    10%,
+    30%,
+    50%,
+    70%,
+    90% {
+      transform: rotate(-10deg);
+    }
+    20%,
+    40%,
+    60%,
+    80% {
+      transform: rotate(10deg);
+    }
+  }
+  @keyframes blink {
+    0%,
+    100% {
+      opacity: 1;
+    }
+    50% {
+      opacity: 0.3;
+    }
+  }
 </style>