syzDetails.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. <template>
  2. <el-dialog
  3. width="90%"
  4. @open="opened"
  5. @closed="closed"
  6. :fullscreen="true"
  7. :show-close="true"
  8. class="dialogs"
  9. >
  10. <template #title>
  11. <div class="showTitles currentShowTitles">
  12. <div class="titles">升压站</div>
  13. </div>
  14. </template>
  15. <div class="bodyy">
  16. <el-tabs
  17. type="border-card"
  18. stretch
  19. lazy
  20. style="width: 100%; height: 100%"
  21. v-model="activeTab"
  22. @tab-click="tabClick"
  23. >
  24. <el-tab-pane
  25. class="syzDetailsPaneItem"
  26. v-for="(item, index) in syzArray"
  27. :key="index"
  28. :name="item.id"
  29. >
  30. <template #label>
  31. <span v-if="pageshowMode % 2">
  32. <el-badge is-dot v-if="item.isWarning === '1'">
  33. <span>{{ item.name }}</span>
  34. </el-badge>
  35. <span v-else>{{ item.name }}</span>
  36. </span>
  37. <span v-else>
  38. <el-badge is-dot v-if="item.isWarning === '1'">
  39. <span>{{ item.name }}</span>
  40. </el-badge>
  41. <span v-else>{{ item.name }}</span>
  42. </span>
  43. </template>
  44. <CL v-if="item.id === 'CL_FDC'" />
  45. <KB v-if="item.id === 'KB_FDC'" />
  46. <KB v-if="item.id === 'DX_FDC'" />
  47. <div class="alarmIconBox" @click="switchAlarmSound(index)">
  48. <el-tooltip
  49. v-if="item.isMute"
  50. effect="light"
  51. :content="`当前${item.name}升压站报警已消音,请注意`"
  52. placement="left"
  53. >
  54. <i
  55. class="el-icon-close-notification"
  56. style="color: orangered"
  57. ></i>
  58. </el-tooltip>
  59. <i v-else class="el-icon-bell" style="color: rgb(219, 215, 0)"></i>
  60. </div>
  61. </el-tab-pane>
  62. </el-tabs>
  63. <CurrentWarningCard
  64. :currentClass="$store.state.currentWarningCardClass"
  65. :activeTab="activeTab || 'MHS_FDC'"
  66. />
  67. </div>
  68. </el-dialog>
  69. </template>
  70. <script>
  71. import CL from "../BoosterStation/cl.vue";
  72. import DX from "../BoosterStation/dx.vue";
  73. import KB from "../BoosterStation/kb.vue";
  74. import CurrentWarningCard from "./currentWarningCard.vue";
  75. export default {
  76. components: {
  77. CL,
  78. DX,
  79. KB,
  80. CurrentWarningCard,
  81. },
  82. data() {
  83. return {
  84. activeTab: this.$store.state.activeTab,
  85. svgVisible: true,
  86. audio: null,
  87. timmer: null,
  88. syzArray: this.$store.getters.syzArray || [],
  89. pageshowMode: 0,
  90. };
  91. },
  92. created() {},
  93. mounted() {},
  94. updated() {},
  95. methods: {
  96. // 初始化第一次报警并判断是否播放声音
  97. initAlarm() {
  98. let syzAlarmArray = this.$store.getters.syzAlarmArray;
  99. const firstAlarmItem = syzAlarmArray.find((ele) => {
  100. return !ele.isConfirm && ele.rank === this.$store.state.syzAlarmRank;
  101. });
  102. firstAlarmItem &&
  103. this.audioPlay(this.getSound(firstAlarmItem.soundSource));
  104. firstAlarmItem &&
  105. this.$store.getters.syzAlarmArray.forEach((ele) => {
  106. if (ele.stationId === firstAlarmItem.stationId) {
  107. ele.isConfirm = true;
  108. }
  109. });
  110. this.activeTab =
  111. firstAlarmItem?.stationId ||
  112. syzAlarmArray.find((ele) => {
  113. return ele.rank === this.$store.state.syzAlarmRank;
  114. })?.stationId ||
  115. this.$store.getters.syzArray[0].id;
  116. syzAlarmArray.forEach((ele) => {
  117. if (ele.stationId === firstAlarmItem?.stationId) {
  118. ele.isConfirm = true;
  119. this.clearWarningTag(ele.stationId);
  120. } else if (
  121. !ele.isConfirm &&
  122. ele.stationId !== firstAlarmItem?.stationId
  123. ) {
  124. this.renderWarningTag(ele.stationId);
  125. }
  126. });
  127. this.$store.commit("syzAlarmArray", syzAlarmArray);
  128. },
  129. // 定时器循环数据判断小红点渲染及是否播放声音
  130. renderAlarm(stationId = "", playSound = true) {
  131. let syzAlarmArray = this.$store.getters.syzAlarmArray;
  132. syzAlarmArray.forEach((ele) => {
  133. if (ele.stationId === stationId) {
  134. ele.isConfirm = true;
  135. this.clearWarningTag(ele.stationId);
  136. } else if (!ele.isConfirm && ele.stationId !== stationId) {
  137. this.renderWarningTag(ele.stationId);
  138. }
  139. });
  140. const res = syzAlarmArray.find((ele) => {
  141. return !ele.isConfirm;
  142. });
  143. if (playSound) {
  144. // this.audioPlay("./static/sound/syz.mp3");
  145. }
  146. this.$store.commit("syzAlarmArray", syzAlarmArray);
  147. },
  148. // 返回音频文件路径
  149. getSound(fileName) {
  150. return `./static/sound/${fileName}.mp3`;
  151. },
  152. // 播放音频
  153. audioPlay(audioPath) {
  154. let soundMuteSelf = [];
  155. let soundMuteOther = [];
  156. this.$store.getters.syzAlarmArray.forEach((ele) => {
  157. if (ele.stationId === this.activeTab) {
  158. soundMuteSelf.push(ele);
  159. } else {
  160. soundMuteOther.push(ele);
  161. }
  162. });
  163. let alarmSelfLock = soundMuteSelf.some((ele) => {
  164. return !ele.isConfirm;
  165. });
  166. let alarmOtherLock = soundMuteOther.some((ele) => {
  167. return !ele.isConfirm;
  168. });
  169. if (alarmOtherLock) {
  170. this.audio = new Audio(audioPath);
  171. this.audio.play();
  172. } else if (alarmSelfLock) {
  173. this.$store.getters.syzArray.forEach((ele) => {
  174. if (ele.stationId === this.activeTab) {
  175. ele.isMute = false;
  176. this.audio = new Audio(audioPath);
  177. this.audio.play();
  178. }
  179. });
  180. } else if (!alarmSelfLock) {
  181. this.$store.getters.syzArray.forEach((ele) => {
  182. if (ele.stationId === this.activeTab) {
  183. if (!ele.isMute) {
  184. this.audio = new Audio(audioPath);
  185. this.audio.play();
  186. }
  187. }
  188. });
  189. }
  190. },
  191. // 显示某个小红点
  192. renderWarningTag(stationId = "") {
  193. this.$store.getters.syzArray.forEach((ele) => {
  194. if (ele.id === stationId) {
  195. ele.isWarning = "1";
  196. }
  197. });
  198. this.pageshowMode++;
  199. },
  200. // 清除某个小红点
  201. clearWarningTag(stationId = "") {
  202. this.$store.getters.syzArray.forEach((ele) => {
  203. if (ele.id === stationId) {
  204. ele.isWarning = "0";
  205. }
  206. });
  207. this.pageshowMode++;
  208. },
  209. // 切换报警声音开关
  210. switchAlarmSound(index) {
  211. this.$store.getters.syzArray[index].isMute =
  212. !this.$store.getters.syzArray[index].isMute;
  213. },
  214. opened() {
  215. this.initAlarm();
  216. this.timmer = setInterval(() => {
  217. this.renderAlarm();
  218. }, 3000);
  219. },
  220. closed() {
  221. clearInterval(this.timmer);
  222. this.timmer = null;
  223. this.$store.commit("activeTab", "");
  224. this.$store.commit("syzDialogShow", false);
  225. },
  226. tabClick(res) {
  227. this.$store.commit("activeTab", res.props.name);
  228. this.renderAlarm(res.props.name, false);
  229. },
  230. },
  231. watch: {
  232. "$store.state.syzArray"(res) {
  233. this.syzArray = res;
  234. },
  235. },
  236. };
  237. </script>
  238. <style lang="less" scoped>
  239. .bodyy {
  240. display: flex;
  241. flex-direction: row;
  242. background-color: black;
  243. width: 98%;
  244. margin-top: -30px;
  245. height: 90vh;
  246. position: relative;
  247. overflow: hidden;
  248. margin-left: 44px;
  249. .syzDetailsPaneItem {
  250. position: relative;
  251. .alarmIconBox {
  252. position: absolute;
  253. right: 0;
  254. top: 0;
  255. cursor: pointer;
  256. i {
  257. font-size: 20px;
  258. }
  259. }
  260. }
  261. }
  262. </style>
  263. <style lang="less">
  264. .bodyy {
  265. .pop-up-main,
  266. .paln-box {
  267. width: 100%;
  268. height: 90vh;
  269. overflow: hidden;
  270. position: relative;
  271. }
  272. .movableItem {
  273. width: 100% !important;
  274. height: 100% !important;
  275. .svg {
  276. width: 100%;
  277. height: 92%;
  278. margin-left: 0;
  279. margin-top: 8%;
  280. }
  281. }
  282. .el-badge__content.is-fixed.is-dot {
  283. right: 0;
  284. top: 10px;
  285. background: #f25656;
  286. animation: twinkle 0.75s infinite;
  287. border-color: transparent;
  288. }
  289. @keyframes twinkle {
  290. 0% {
  291. opacity: 0;
  292. }
  293. 50% {
  294. opacity: 1;
  295. }
  296. 100% {
  297. opacity: 0;
  298. }
  299. }
  300. }
  301. .currentShowTitles {
  302. width: 100%;
  303. position: relative;
  304. .alarIcon {
  305. position: absolute;
  306. right: 50px;
  307. top: 5;
  308. font-size: 20px;
  309. cursor: pointer;
  310. }
  311. }
  312. </style>