DeviceAlarm.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. <template>
  2. <div class="device-contents">
  3. <div class="icons-box" @mouseleave="resetScroll">
  4. <template v-for="(item, key) in iconsMonitor" :key="key">
  5. <div class="icon-item" v-if="item.text">
  6. <div class="wrapper">
  7. {{ item.text }}
  8. </div>
  9. <div></div>
  10. <img :src="item.url" :alt="item.text" />
  11. <div class="level-text">
  12. <div class="all-count">
  13. <span>{{ `${item.allText}&nbsp;:&nbsp;` }}</span>
  14. <span class="num-count">{{ item.allCount || 0 }}</span>
  15. </div>
  16. <div class="warn-count">
  17. <span>{{ `${item.warnText}&nbsp;:&nbsp;` }}</span>
  18. <span :class="item.warnCount ? 'num-count1' : 'num-count'">{{ item.warnCount || 0 }}</span>
  19. </div>
  20. <div class="close-count">
  21. <span> {{ `${item.closeText}&nbsp;:&nbsp;` }}</span>
  22. <span :class="item.closeCount ? 'num-count1' : 'num-count'">{{ item.closeCount || 0 }}</span>
  23. </div>
  24. </div>
  25. </div>
  26. </template>
  27. </div>
  28. </div>
  29. </template>
  30. <script lang="ts" setup>
  31. import { reactive, defineProps, watch } from 'vue';
  32. import { getAssetURL } from '/@/utils/ui';
  33. let props = withDefaults(
  34. defineProps<{
  35. devicedata: Object;
  36. config: {
  37. /** 忽略报警数,即报警数设为0 */
  38. ignoreWarning: Boolean;
  39. ignoreClosed: Boolean;
  40. ignoreCount: Boolean;
  41. ignoreKeywords: Array<string>;
  42. };
  43. }>(),
  44. {
  45. config: () => ({
  46. ignoreWarning: false,
  47. ignoreClosed: false,
  48. ignoreCount: false,
  49. ignoreKeywords: [],
  50. }),
  51. }
  52. );
  53. let iconsMonitor = reactive({
  54. fanmain: {
  55. url: getAssetURL('vent/alarm-icons/zhushan.png'),
  56. level: 100,
  57. text: '',
  58. allText: '总数',
  59. warnText: '报警数',
  60. closeText: '断开数',
  61. allCount: 0,
  62. warnCount: 0,
  63. closeCount: 0,
  64. },
  65. fanlocal: {
  66. url: getAssetURL('vent/alarm-icons/js.png'),
  67. level: 100,
  68. text: '',
  69. allText: '总数',
  70. warnText: '报警数',
  71. closeText: '断开数',
  72. allCount: 0,
  73. warnCount: 0,
  74. closeCount: 0,
  75. },
  76. fanlocaldp: {
  77. url: getAssetURL('vent/alarm-icons/js.png'),
  78. level: 100,
  79. text: '',
  80. allText: '总数',
  81. warnText: '报警数',
  82. closeText: '断开数',
  83. allCount: 0,
  84. warnCount: 0,
  85. closeCount: 0,
  86. },
  87. gate: {
  88. url: getAssetURL('vent/alarm-icons/fm.png'),
  89. level: 100,
  90. text: '',
  91. allText: '总数',
  92. warnText: '报警数',
  93. closeText: '断开数',
  94. allCount: 0,
  95. warnCount: 0,
  96. closeCount: 0,
  97. },
  98. window: {
  99. url: getAssetURL('vent/alarm-icons/fc.png'),
  100. level: 100,
  101. text: '',
  102. allText: '总数',
  103. warnText: '报警数',
  104. closeText: '断开数',
  105. allCount: 0,
  106. warnCount: 0,
  107. closeCount: 0,
  108. },
  109. windrect: {
  110. url: getAssetURL('vent/alarm-icons/cf.png'),
  111. level: 100,
  112. text: '',
  113. allText: '总数',
  114. warnText: '报警数',
  115. closeText: '断开数',
  116. allCount: 0,
  117. warnCount: 0,
  118. closeCount: 0,
  119. },
  120. forcFan: {
  121. url: getAssetURL('vent/alarm-icons/yafeng.png'),
  122. level: 100,
  123. text: '',
  124. allText: '总数',
  125. warnText: '报警数',
  126. closeText: '断开数',
  127. allCount: 0,
  128. warnCount: 0,
  129. closeCount: 0,
  130. },
  131. spray: {
  132. url: getAssetURL('vent/alarm-icons/penlin.png'),
  133. level: 100,
  134. text: '',
  135. allText: '总数',
  136. warnText: '报警数',
  137. closeText: '断开数',
  138. allCount: 0,
  139. warnCount: 0,
  140. closeCount: 0,
  141. },
  142. dustdev: {
  143. url: getAssetURL('vent/alarm-icons/penfen.png'),
  144. level: 100,
  145. text: '',
  146. allText: '总数',
  147. warnText: '报警数',
  148. closeText: '断开数',
  149. allCount: 0,
  150. warnCount: 0,
  151. closeCount: 0,
  152. },
  153. nitrogen: {
  154. url: getAssetURL('vent/alarm-icons/zhudan.png'),
  155. level: 100,
  156. text: '',
  157. allText: '总数',
  158. warnText: '报警数',
  159. closeText: '断开数',
  160. allCount: 0,
  161. warnCount: 0,
  162. closeCount: 0,
  163. },
  164. pulping: {
  165. url: getAssetURL('vent/alarm-icons/zhujiang.png'),
  166. level: 100,
  167. text: '',
  168. allText: '总数',
  169. warnText: '报警数',
  170. closeText: '断开数',
  171. allCount: 0,
  172. warnCount: 0,
  173. closeCount: 0,
  174. },
  175. atomizing: {
  176. url: getAssetURL('vent/alarm-icons/pw.png'),
  177. level: 100,
  178. text: '',
  179. allText: '总数',
  180. warnText: '报警数',
  181. closeText: '断开数',
  182. allCount: 0,
  183. warnCount: 0,
  184. closeCount: 0,
  185. },
  186. dustsensor: {
  187. url: getAssetURL('vent/alarm-icons/ccq.png'),
  188. level: 100,
  189. text: '',
  190. allText: '总数',
  191. warnText: '报警数',
  192. closeText: '断开数',
  193. allCount: 0,
  194. warnCount: 0,
  195. closeCount: 0,
  196. },
  197. gas: {
  198. url: getAssetURL('vent/alarm-icons/wasichoucaig.png'),
  199. level: 100,
  200. text: '',
  201. allText: '总数',
  202. warnText: '报警数',
  203. closeText: '断开数',
  204. allCount: 0,
  205. warnCount: 0,
  206. closeCount: 0,
  207. },
  208. pump: {
  209. url: getAssetURL('vent/alarm-icons/wasibeng.png'),
  210. level: 100,
  211. text: '',
  212. allText: '总数',
  213. warnText: '报警数',
  214. closeText: '断开数',
  215. allCount: 0,
  216. warnCount: 0,
  217. closeCount: 0,
  218. },
  219. modelsensor: {
  220. url: getAssetURL('vent/alarm-icons/cf.png'),
  221. level: 100,
  222. text: '',
  223. allText: '总数',
  224. warnText: '报警数',
  225. closeText: '断开数',
  226. allCount: 0,
  227. warnCount: 0,
  228. closeCount: 0,
  229. },
  230. });
  231. const resetScroll = (e: Event) => {
  232. if (e.target && e.target) (e.target as Element).scrollTop = 0;
  233. };
  234. watch(
  235. () => props.devicedata,
  236. (val) => {
  237. Object.keys(iconsMonitor).forEach((el) => {
  238. if (val && val[el] && !props.config.ignoreKeywords.includes(el)) {
  239. iconsMonitor[el].level = val[el].maxLevel;
  240. iconsMonitor[el]['text'] = val[el].name;
  241. // iconsMonitor[el]['count'] = val[el].count;
  242. iconsMonitor[el].allCount = val[el].totalcount;
  243. iconsMonitor[el].warnCount = val[el].count;
  244. iconsMonitor[el].closeCount = val[el].netstatus;
  245. if (props.config.ignoreWarning) {
  246. iconsMonitor[el].warnCount = 0;
  247. }
  248. if (props.config.ignoreClosed) {
  249. iconsMonitor[el].closeCount = 0;
  250. }
  251. if (props.config.ignoreCount) {
  252. iconsMonitor[el].allCount = 0;
  253. }
  254. }
  255. });
  256. },
  257. {
  258. deep: true,
  259. }
  260. );
  261. </script>
  262. <style lang="less" scoped>
  263. @font-face {
  264. font-family: 'douyuFont';
  265. src: url('/@/assets/font/douyuFont.otf');
  266. }
  267. .device-contents {
  268. height: 100%;
  269. padding: 10px 15px;
  270. box-sizing: border-box;
  271. width: 100%;
  272. overflow-y: auto;
  273. .icons-box {
  274. // display: flex; lxh
  275. // flex-wrap: wrap; lxh
  276. // justify-content: space-around;
  277. // justify-content: space-between; lxh
  278. height: 100%;
  279. // overflow-y: hidden;
  280. // align-items: start ;
  281. // &:hover {
  282. // overflow-y: auto;
  283. // & > .icon-item {
  284. // // animation-play-state: paused; lxh
  285. // // animation: move1 2s linear;lxh
  286. // }
  287. // }
  288. .icon-item {
  289. position: relative;
  290. display: flex;
  291. align-items: center;
  292. justify-content: center;
  293. padding: 3px;
  294. // animation: move 10s linear infinite;lxh
  295. .level-text {
  296. width: 220px;
  297. display: flex;
  298. justify-content: space-between;
  299. position: absolute;
  300. // top: 42px;lxh
  301. // right: 25px;lxh
  302. // color: #fff;lxh
  303. // font-family: 'douyuFont';lxh
  304. // font-size: 12px;lxh
  305. top: 37px;
  306. left: 165px;
  307. color: #ffffffe0;
  308. font-size: 13px;
  309. text-align: center;
  310. letter-spacing: 1px;
  311. .num-count,
  312. .num-count1 {
  313. font-family: 'douyuFont';
  314. font-size: 12px;
  315. }
  316. .warn-count,
  317. .close-count {
  318. .num-count {
  319. color: #ffffffe0;
  320. }
  321. .num-count1 {
  322. color: #ff0000;
  323. }
  324. }
  325. }
  326. img {
  327. width: 427px;
  328. height: 64px;
  329. }
  330. }
  331. @keyframes move {
  332. 0% {
  333. transform: translateY(0px);
  334. }
  335. 100% {
  336. transform: translateY(-269px);
  337. }
  338. }
  339. @keyframes move1 {
  340. 0% {
  341. transform: translateY(0px);
  342. }
  343. }
  344. .wrapper {
  345. position: absolute;
  346. top: 37px;
  347. left: 90px;
  348. color: #ffffffe0;
  349. font-size: 13px;
  350. text-align: center;
  351. letter-spacing: 1px;
  352. }
  353. .level-warning {
  354. font-weight: 600;
  355. color: #ff2e2e;
  356. text-shadow: 2px 2px 4px #000000;
  357. }
  358. }
  359. }
  360. </style>