nitrogenHome2.vue 57 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267
  1. <template>
  2. <div>{{ Math.random() }}</div>
  3. <div id="nitrogen3D" style="width: 100%; height: 100%; position: absolute; overflow: hidden"></div>
  4. <div id="nitrogenCss3D" class="threejs-Object-CSS"
  5. style="width: 100%; height: 100%; position: absolute; pointer-events: none; overflow: hidden; z-index: 2; top: 0px; left: 0px">
  6. <a-spin :spinning="loading" />
  7. <template>
  8. <div v-for="groupNum in 2" :key="groupNum" class="modal-monitor">
  9. <fourBorderBg :class="`kyj${groupNum}`" :id="`nitrogenMonitor${groupNum}`">
  10. <div class="title">{{ monitorData[groupNum - 1]['strname'] }} </div>
  11. <!-- <div class="monitor-item">
  12. <span class="monitor-title">蝶阀开度:</span>
  13. <span class="monitor-val" v-if="!refresh"><span class="val">{{
  14. monitorData[groupNum - 1]['bv_1_open'] ? monitorData[groupNum -
  15. 1]['bv_1_open'] : '-'
  16. }}</span>
  17. </span>
  18. </div> -->
  19. <div class="monitor-item">
  20. <span class="monitor-title">检修:</span>
  21. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{ monitorData[groupNum -
  22. 1]['FluxTotal1'] ? parseFloat(monitorData[groupNum - 1]['FluxTotal1']).toFixed(2) : '-'
  23. }}</span><span class="unit">m³/h</span></span> -->
  24. <div class="monitor-val">
  25. <span v-if="false"
  26. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  27. <span v-if="true"
  28. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  29. <span v-if="false"
  30. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  31. </div>
  32. </div>
  33. <div class="monitor-item">
  34. <span class="monitor-title">运行:</span>
  35. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{ monitorData[groupNum -
  36. 1]['NitrogenPurity'] ? parseFloat(monitorData[groupNum - 1]['NitrogenPurity']).toFixed(2) :
  37. '-' }}</span>
  38. <span class="unit">%</span></span> -->
  39. <div class="monitor-val">
  40. <span v-if="false"
  41. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  42. <span v-if="true"
  43. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  44. <span v-if="false"
  45. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  46. </div>
  47. </div>
  48. <div class="monitor-item">
  49. <span class="monitor-title">主机进气蝶阀远控:</span>
  50. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{
  51. monitorData[groupNum - 1]['AirCompressor_RunTime'] ? monitorData[groupNum -
  52. 1]['AirCompressor_RunTime'] :
  53. '-'
  54. }}</span><span class="unit">h</span></span> -->
  55. <div class="monitor-val">
  56. <span v-if="false"
  57. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  58. <span v-if="true"
  59. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  60. <span v-if="false"
  61. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  62. </div>
  63. </div>
  64. <div class="monitor-item">
  65. <span class="monitor-title">备机进气蝶阀远控:</span>
  66. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{
  67. monitorData[groupNum - 1]['AirCompressor_LoadTime'] ? monitorData[groupNum -
  68. 1]['AirCompressor_LoadTime']
  69. : '-'
  70. }}</span><span class="unit">h</span></span> -->
  71. <div class="monitor-val">
  72. <span v-if="false"
  73. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  74. <span v-if="true"
  75. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  76. <span v-if="false"
  77. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  78. </div>
  79. </div>
  80. <div class="monitor-item">
  81. <span class="monitor-title">主机进气蝶阀开到位:</span>
  82. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{
  83. monitorData[groupNum - 1]['AirCompressor_LoadTime'] ? monitorData[groupNum -
  84. 1]['AirCompressor_LoadTime']
  85. : '-'
  86. }}</span><span class="unit">h</span></span> -->
  87. <div class="monitor-val">
  88. <span v-if="false"
  89. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  90. <span v-if="true"
  91. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  92. <span v-if="false"
  93. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  94. </div>
  95. </div>
  96. <div class="monitor-item">
  97. <span class="monitor-title">备机进气蝶阀开到位:</span>
  98. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{
  99. monitorData[groupNum - 1]['AirCompressor_LoadTime'] ? monitorData[groupNum -
  100. 1]['AirCompressor_LoadTime']
  101. : '-'
  102. }}</span><span class="unit">h</span></span> -->
  103. <div class="monitor-val">
  104. <span v-if="false"
  105. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  106. <span v-if="true"
  107. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  108. <span v-if="false"
  109. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  110. </div>
  111. </div>
  112. <div class="monitor-item">
  113. <span class="monitor-title">主机进气蝶阀关到位:</span>
  114. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{
  115. monitorData[groupNum - 1]['AirCompressor_LoadTime'] ? monitorData[groupNum -
  116. 1]['AirCompressor_LoadTime']
  117. : '-'
  118. }}</span><span class="unit">h</span></span> -->
  119. <div class="monitor-val">
  120. <span v-if="false"
  121. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  122. <span v-if="true"
  123. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  124. <span v-if="false"
  125. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  126. </div>
  127. </div>
  128. <div class="monitor-item">
  129. <span class="monitor-title">备机进气蝶阀关到位:</span>
  130. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{
  131. monitorData[groupNum - 1]['AirCompressor_LoadTime'] ? monitorData[groupNum -
  132. 1]['AirCompressor_LoadTime']
  133. : '-'
  134. }}</span><span class="unit">h</span></span> -->
  135. <div class="monitor-val">
  136. <span v-if="false"
  137. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  138. <span v-if="true"
  139. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  140. <span v-if="false"
  141. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  142. </div>
  143. </div>
  144. <div class="monitor-item">
  145. <span class="monitor-title">主机出气蝶阀远控:</span>
  146. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{
  147. monitorData[groupNum - 1]['AirCompressor_LoadTime'] ? monitorData[groupNum -
  148. 1]['AirCompressor_LoadTime']
  149. : '-'
  150. }}</span><span class="unit">h</span></span> -->
  151. <div class="monitor-val">
  152. <span v-if="false"
  153. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  154. <span v-if="true"
  155. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  156. <span v-if="false"
  157. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  158. </div>
  159. </div>
  160. <div class="monitor-item">
  161. <span class="monitor-title">备机出气蝶阀远控:</span>
  162. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{
  163. monitorData[groupNum - 1]['AirCompressor_LoadTime'] ? monitorData[groupNum -
  164. 1]['AirCompressor_LoadTime']
  165. : '-'
  166. }}</span><span class="unit">h</span></span> -->
  167. <div class="monitor-val">
  168. <span v-if="false"
  169. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  170. <span v-if="true"
  171. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  172. <span v-if="false"
  173. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  174. </div>
  175. </div>
  176. <div class="monitor-item">
  177. <span class="monitor-title">主机出气蝶阀开到位:</span>
  178. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{
  179. monitorData[groupNum - 1]['AirCompressor_LoadTime'] ? monitorData[groupNum -
  180. 1]['AirCompressor_LoadTime']
  181. : '-'
  182. }}</span><span class="unit">h</span></span> -->
  183. <div class="monitor-val">
  184. <span v-if="false"
  185. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  186. <span v-if="true"
  187. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  188. <span v-if="false"
  189. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  190. </div>
  191. </div>
  192. <div class="monitor-item">
  193. <span class="monitor-title">备机出气蝶阀开到位:</span>
  194. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{
  195. monitorData[groupNum - 1]['AirCompressor_LoadTime'] ? monitorData[groupNum -
  196. 1]['AirCompressor_LoadTime']
  197. : '-'
  198. }}</span><span class="unit">h</span></span> -->
  199. <div class="monitor-val">
  200. <span v-if="false"
  201. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  202. <span v-if="true"
  203. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  204. <span v-if="false"
  205. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  206. </div>
  207. </div>
  208. <div class="monitor-item">
  209. <span class="monitor-title">主机出气蝶阀关到位:</span>
  210. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{
  211. monitorData[groupNum - 1]['AirCompressor_LoadTime'] ? monitorData[groupNum -
  212. 1]['AirCompressor_LoadTime']
  213. : '-'
  214. }}</span><span class="unit">h</span></span> -->
  215. <div class="monitor-val">
  216. <span v-if="false"
  217. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  218. <span v-if="true"
  219. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  220. <span v-if="false"
  221. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  222. </div>
  223. </div>
  224. <div class="monitor-item">
  225. <span class="monitor-title">备机出气蝶阀关到位:</span>
  226. <!-- <span class="monitor-val" v-if="!refresh"><span class="val">{{
  227. monitorData[groupNum - 1]['AirCompressor_LoadTime'] ? monitorData[groupNum -
  228. 1]['AirCompressor_LoadTime']
  229. : '-'
  230. }}</span><span class="unit">h</span></span> -->
  231. <div class="monitor-val">
  232. <span v-if="false"
  233. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  234. <span v-if="true"
  235. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  236. <span v-if="false"
  237. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  238. </div>
  239. </div>
  240. </fourBorderBg>
  241. </div>
  242. </template>
  243. </div>
  244. <div class="nitrogen-home">
  245. <div class="nitrogen-container">
  246. <div v-if="monitorNetStatus == 0" class="device-state">网络断开</div>
  247. <div class="top-box">
  248. <!-- 左边监测数据 -->
  249. <div class="lr-box left-box">
  250. <div class="item item-l" v-for="groupNum in monitorDataGroupNum" :key="groupNum">
  251. <ventBox1>
  252. <template #title>
  253. <div>{{ monitorData[groupNum - 1]['strname'] }}</div>
  254. </template>
  255. <template #container>
  256. <div class="monitor-box">
  257. <div class="parameter-title group-parameter-title">
  258. <SvgIcon class="icon" size="38" name="device-group-paramer" /><span>蝶阀参数</span>
  259. </div>
  260. <div class="state-item" v-for="(data, index) in groupParameterData" :key="index">
  261. <div class="item-col">
  262. <span class="state-title">{{ Object.values(data)[0] }} :</span>
  263. <span class="state-val">{{
  264. (monitorData.length > 0 && monitorData[groupNum - 1][Object.keys(data)[0]])
  265. >= 0
  266. ? monitorData[groupNum - 1][Object.keys(data)[0]] ?
  267. parseFloat(monitorData[groupNum -
  268. 1][Object.keys(data)[0]]).toFixed(2) : '-'
  269. : '-'
  270. }}</span>
  271. </div>
  272. <div class="item-col" v-if="Object.keys(data)[1]">
  273. <span class="state-title">{{ Object.values(data)[1] }} :</span>
  274. <span class="state-val">{{
  275. (monitorData.length > 0 && monitorData[groupNum - 1][Object.keys(data)[1]])
  276. >= 0
  277. ? monitorData[groupNum - 1][Object.keys(data)[1]] ?
  278. parseFloat(monitorData[groupNum -
  279. 1][Object.keys(data)[1]]).toFixed(2) : '-'
  280. : '-'
  281. }}</span>
  282. </div>
  283. </div>
  284. </div>
  285. <div class="monitor-box monitor-box1 ">
  286. <div class="parameter-title device-parameter-title">
  287. <SvgIcon class="icon" size="32" name="device-paramer" /><span>蝶阀故障数据</span>
  288. </div>
  289. <div class="state-box">
  290. <div class="state-item" v-for="(data, index) in deviceParameterData" :key="index">
  291. <div class="item-col">
  292. <span class="state-title1">{{ Object.values(data)[0] }} :</span>
  293. <span class="state-val1">
  294. <!-- {{
  295. (monitorData.length > 0 && monitorData[groupNum - 1][Object.keys(data)[0]]) >= 0
  296. ? monitorData[groupNum - 1][Object.keys(data)[0]]
  297. : '-'
  298. }} -->
  299. <span v-if="monitorData[groupNum - 1][Object.keys(data)[0]] === true"
  300. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  301. <span
  302. v-else-if="monitorData[groupNum - 1][Object.keys(data)[0]] === false"
  303. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  304. <span v-else
  305. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  306. </span>
  307. </div>
  308. <div class="item-col" v-if="Object.keys(data)[1]">
  309. <span class="state-title1">{{ Object.values(data)[1] }} :</span>
  310. <span class="state-val1">
  311. <!-- {{
  312. (monitorData.length > 0 && monitorData[groupNum - 1][Object.keys(data)[1]]) >= 0
  313. ? monitorData[groupNum - 1][Object.keys(data)[1]]
  314. : '-'
  315. }} -->
  316. <span v-if="monitorData[groupNum - 1][Object.keys(data)[1]] === true"
  317. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: red;"></span>
  318. <span
  319. v-else-if="monitorData[groupNum - 1][Object.keys(data)[1]] === false"
  320. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: greenyellow;"></span>
  321. <span v-else
  322. style="display: inline-block; width: 10px;height: 10px;border-radius: 50%;background-color: #ccc;"></span>
  323. </span>
  324. </div>
  325. </div>
  326. </div>
  327. </div>
  328. </template>
  329. </ventBox1>
  330. </div>
  331. <!-- <div class="item item-l">
  332. <ventBox1 class="vent-margin-t-10">
  333. <template #title>
  334. <div>下风测详情</div>
  335. </template>
  336. <template #container>
  337. <div class="monitor-box">
  338. <div class="state-item" v-for="(data, index) in downWindData" :key="index">
  339. <div class="item-col">
  340. <span class="state-title">{{ Object.values(data)[0] }} :</span>
  341. <span class="state-val">{{
  342. (monitorData.length > 0 && monitorData[0][Object.keys(data)[0]]) >= 0
  343. ? monitorData[0][Object.keys(data)[0]] ?
  344. parseFloat(monitorData[0][Object.keys(data)[0]]).toFixed(2) : '-'
  345. : '-'
  346. }}</span>
  347. </div>
  348. <div class="item-col" v-if="Object.keys(data)[1]">
  349. <span class="state-title">{{ Object.values(data)[1] }} :</span>
  350. <span class="state-val">{{
  351. (monitorData.length > 0 && monitorData[0][Object.keys(data)[1]]) >= 0
  352. ? monitorData[0][Object.keys(data)[1]] ?
  353. parseFloat(monitorData[0][Object.keys(data)[1]]).toFixed(2) : '-'
  354. : '-'
  355. }}</span>
  356. </div>
  357. </div>
  358. </div>
  359. </template>
  360. </ventBox1>
  361. </div> -->
  362. </div>
  363. <!-- 右边控制状态 -->
  364. <div class="lr-box right-box">
  365. <ventBox1>
  366. <template #title>
  367. <div>远程控制</div>
  368. </template>
  369. <template #container>
  370. <div class="control-group">
  371. <div class="control-item" v-for="(groupNum, index) in monitorDataGroupNum" :key="groupNum">
  372. <div class="control-item-title">{{ monitorData[groupNum - 1]['strname'] }}</div>
  373. <div class="control-item-state">
  374. <!-- <a-button v-if="index == 0" size="small" type="text" style="color: #fff;"
  375. @click="handlerDevice(airCompressorState[groupNum - 1], false)">主机启动</a-button>
  376. <a-button v-else size="small" type="text" style="color: #fff;"
  377. @click="handlerDevice(airCompressorState[groupNum - 1], false)">备机启动</a-button> -->
  378. <a-radio v-if="index == 0" v-model:checked="checked">主机启动</a-radio>
  379. <a-radio v-else v-model:checked="checked">主机启动</a-radio>
  380. </div>
  381. <div class="control-item-state">
  382. <a-radio v-if="index == 0" v-model:checked="checked">备机启动</a-radio>
  383. <a-radio v-else v-model:checked="checked">备机启动</a-radio>
  384. </div>
  385. </div>
  386. <div class="control-item" v-for="(groupNum, index) in monitorDataGroupNum" :key="groupNum">
  387. <div class="control-item-title">{{ monitorData[groupNum - 1]['strname'] }}</div>
  388. <div class="control-item-state">
  389. <!-- <a-button v-if="index == 0" size="small" type="text" style="color: #fff;"
  390. @click="handlerDevice(airCompressorState[groupNum - 1], true)">主机停止</a-button>
  391. <a-button v-else size="small" type="text" style="color: #fff;"
  392. @click="handlerDevice(airCompressorState[groupNum - 1], true)">备机停止</a-button> -->
  393. <a-radio v-if="index == 0" v-model:checked="checked">主机停止</a-radio>
  394. <a-radio v-else v-model:checked="checked">主机停止</a-radio>
  395. </div>
  396. <div class="control-item-state">
  397. <a-radio v-if="index == 0" v-model:checked="checked">备机停止</a-radio>
  398. <a-radio v-else v-model:checked="checked">备机停止</a-radio>
  399. </div>
  400. </div>
  401. <div class="control-item" v-for="(groupNum, index) in monitorDataGroupNum" :key="groupNum">
  402. <div class="control-item-title">{{ monitorData[groupNum - 1]['strname'] }}</div>
  403. <div class="control-item-state">
  404. <a-radio v-if="index == 0" v-model:checked="checked">主机进气蝶阀开</a-radio>
  405. <a-radio v-else v-model:checked="checked">主机进气蝶阀开</a-radio>
  406. </div>
  407. <div class="control-item-state">
  408. <a-radio v-if="index == 0" v-model:checked="checked">备机进气蝶阀开</a-radio>
  409. <a-radio v-else v-model:checked="checked">备机进气蝶阀开</a-radio>
  410. </div>
  411. </div>
  412. <div class="control-item" v-for="(groupNum, index) in monitorDataGroupNum" :key="groupNum">
  413. <div class="control-item-title">{{ monitorData[groupNum - 1]['strname'] }}</div>
  414. <div class="control-item-state">
  415. <a-radio v-if="index == 0" v-model:checked="checked">主机进气蝶阀关</a-radio>
  416. <a-radio v-else v-model:checked="checked">主机进气蝶阀关</a-radio>
  417. </div>
  418. <div class="control-item-state">
  419. <a-radio v-if="index == 0" v-model:checked="checked">备机进气蝶阀关</a-radio>
  420. <a-radio v-else v-model:checked="checked">备机进气蝶阀关</a-radio>
  421. </div>
  422. </div>
  423. <div class="control-item" v-for="(groupNum, index) in monitorDataGroupNum" :key="groupNum">
  424. <div class="control-item-title">{{ monitorData[groupNum - 1]['strname'] }}</div>
  425. <div class="control-item-state">
  426. <a-radio v-if="index == 0" v-model:checked="checked">主机进气蝶阀停</a-radio>
  427. <a-radio v-else v-model:checked="checked">主机进气蝶阀停</a-radio>
  428. </div>
  429. <div class="control-item-state">
  430. <a-radio v-if="index == 0" v-model:checked="checked">备机进气蝶阀停</a-radio>
  431. <a-radio v-else v-model:checked="checked">备机进气蝶阀停</a-radio>
  432. </div>
  433. </div>
  434. <div class="control-item" v-for="(groupNum, index) in monitorDataGroupNum" :key="groupNum">
  435. <div class="control-item-title">{{ monitorData[groupNum - 1]['strname'] }}</div>
  436. <div class="control-item-state">
  437. <a-radio v-if="index == 0" v-model:checked="checked">主机出气蝶阀开</a-radio>
  438. <a-radio v-else v-model:checked="checked">主机出气蝶阀开</a-radio>
  439. </div>
  440. <div class="control-item-state">
  441. <a-radio v-if="index == 0" v-model:checked="checked">备机出气蝶阀开</a-radio>
  442. <a-radio v-else v-model:checked="checked">备机出气蝶阀开</a-radio>
  443. </div>
  444. </div>
  445. <div class="control-item" v-for="(groupNum, index) in monitorDataGroupNum" :key="groupNum">
  446. <div class="control-item-title">{{ monitorData[groupNum - 1]['strname'] }}</div>
  447. <div class="control-item-state">
  448. <a-radio v-if="index == 0" v-model:checked="checked">主机出气蝶阀关</a-radio>
  449. <a-radio v-else v-model:checked="checked">主机出气蝶阀关</a-radio>
  450. </div>
  451. <div class="control-item-state">
  452. <a-radio v-if="index == 0" v-model:checked="checked">备机出气蝶阀关</a-radio>
  453. <a-radio v-else v-model:checked="checked">备机出气蝶阀关</a-radio>
  454. </div>
  455. </div>
  456. <div class="control-item" v-for="(groupNum, index) in monitorDataGroupNum" :key="groupNum">
  457. <div class="control-item-title">{{ monitorData[groupNum - 1]['strname'] }}</div>
  458. <div class="control-item-state">
  459. <a-radio v-if="index == 0" v-model:checked="checked">主机出气蝶阀停</a-radio>
  460. <a-radio v-else v-model:checked="checked">主机出气蝶阀停</a-radio>
  461. </div>
  462. <div class="control-item-state">
  463. <a-radio v-if="index == 0" v-model:checked="checked">备机出气蝶阀停</a-radio>
  464. <a-radio v-else v-model:checked="checked">备机出气蝶阀停</a-radio>
  465. </div>
  466. </div>
  467. </div>
  468. </template>
  469. </ventBox1>
  470. <ventBox1 class="vent-margin-t-10">
  471. <template #title>
  472. <div>设备实时监测曲线</div>
  473. </template>
  474. <template #container>
  475. <BarAndLine v-if="chartsColumns.length > 0" xAxisPropType="readTime" :dataSource="echartData"
  476. height="340px" :chartsColumns="chartsColumns" chartsType="listMonitor"
  477. :option="echatsOption" />
  478. <!-- :option="zhudanOption" -->
  479. </template>
  480. </ventBox1>
  481. </div>
  482. </div>
  483. </div>
  484. </div>
  485. <HandleModal :modal-is-show="modalIsShow" :modal-title="modalTitle" :modal-type="modalType" @handle-ok="handleOK"
  486. @handle-cancel="handleCancel" />
  487. </template>
  488. <script lang="ts" setup name="nitrogenHome">
  489. import { onMounted, onUnmounted, ref, watch, reactive, defineProps, nextTick, inject, computed } from 'vue';
  490. import ventBox1 from '/@/components/vent/ventBox1.vue';
  491. import fourBorderBg from '../../../comment/components/fourBorderBg.vue';
  492. import { mountedThree, destroy, setModelType, addText } from '../nitrogen.threejs';
  493. import { getDevice } from '../nitrogen.api';
  494. import { SvgIcon } from '/@/components/Icon';
  495. import BarAndLine from '/@/components/chart/BarAndLine.vue';
  496. import HandleModal from './modal.vue';
  497. import { deviceControlApi } from '/@/api/vent/index';
  498. import { message } from 'ant-design-vue';
  499. import lodash from 'lodash';
  500. const globalConfig = inject('globalConfig');
  501. const props = defineProps({
  502. deviceId: {
  503. type: String,
  504. require: true,
  505. },
  506. modalType: {
  507. type: String,
  508. require: true,
  509. },
  510. });
  511. let checked = ref(false)
  512. const refresh = ref(false)
  513. const modalTitle = ref(''); // 模态框标题显示内容,根据设备操作类型决定
  514. const modalType = ref(''); // 模态框内容显示类型,设备操作类型
  515. const modalIsShow = ref<boolean>(false); // 是否显示模态框
  516. const loading = ref(true);
  517. let kzParam = reactive<any>({
  518. data: {},
  519. isFw: null,
  520. });
  521. // const kyjs = ['1号空压机', '1号空压机', '1号空压机', '1号空压机'];
  522. const flvURL1 = () => {
  523. // return `https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv`;
  524. return '';
  525. };
  526. const colors = ['#FDB146', '#EE6666', '#9BCB75', '#03C2EC', '#DA3914', '#9C83D9']
  527. const echatsOption = {
  528. grid: {
  529. top: '35%',
  530. left: '-25px',
  531. right: '10px',
  532. bottom: '3%',
  533. containLabel: true
  534. },
  535. toolbox: {
  536. feature: {}
  537. }
  538. }
  539. const monitorDataGroupNum = ref(0);
  540. const monitorNetStatus = ref(0)
  541. let airCompressorState = reactive<any[]>([]);
  542. const groupParameterData = [
  543. {
  544. flow: '流量(m³/h)',
  545. total_flow: '总流量(m³)',
  546. },
  547. {
  548. single_flow: '单次流量(m³/h)',
  549. oxygen_concentration: '氧浓度(%)',
  550. },
  551. {
  552. bv_1_open: '蝶阀1开度',
  553. bv_2_open: '蝶阀2开度',
  554. },
  555. {
  556. bv_3_open: '蝶阀3开度',
  557. bv_4_open: '蝶阀4开度',
  558. },
  559. ];
  560. const deviceParameterData = [
  561. {
  562. bv_1_load_short: '蝶阀1负载短路故障',
  563. bv_2_load_short: '蝶阀2负载短路故障',
  564. },
  565. {
  566. bv_3_load_short: '蝶阀3负载短路故障',
  567. bv_4_load_short: '蝶阀4负载短路故障',
  568. },
  569. {
  570. bv_1_low_voltage: '蝶阀1电压过低故障',
  571. bv_2_low_voltage: '蝶阀2电压过低故障',
  572. },
  573. {
  574. bv_3_low_voltage: '蝶阀3电压过低故障',
  575. bv_4_low_voltage: '蝶阀4电压过低故障',
  576. },
  577. {
  578. bv_1_closing_overcurrent: '关向过电流故障',
  579. bv_1_opening_overcurrent: '开向过电流故障',
  580. },
  581. {
  582. bv_1_closing_timeout: '关向超时故障',
  583. bv_1_opening_timeout: '开向超时故障',
  584. },
  585. {
  586. bv_1_thermal_overload: '热过载故障',
  587. },
  588. ];
  589. const downWindData = [
  590. {
  591. o2Val: '下风侧氧气(%)',
  592. temperature: '下风测温度(℃)',
  593. },
  594. {
  595. fumes: '下风测烟雾(­%)',
  596. },
  597. ];
  598. const propTypeArr = ref([])
  599. const chartsColumns = ref([])
  600. watch(monitorDataGroupNum, () => {
  601. const arr = <any[]>[]
  602. const item = {
  603. legend: '瞬时流量',
  604. seriesName: '(m³/h)',
  605. ymax: 5,
  606. yname: 'm³/h',
  607. linetype: 'line',
  608. yaxispos: 'left',
  609. color: '#FDB146',
  610. sort: 1,
  611. xRotate: 0,
  612. dataIndex: 'InputFlux',
  613. }
  614. const propTypeList = []
  615. for (let i = 1; i <= monitorDataGroupNum.value; i++) {
  616. const lineType = lodash.cloneDeep(item)
  617. lineType.legend = `制氮机${i}瞬时流量`;
  618. lineType.dataIndex = `InputFlux${i}`
  619. lineType.color = colors[i - 1]
  620. arr.push(lineType)
  621. }
  622. chartsColumns.value = arr
  623. })
  624. const monitorData = ref(
  625. new Array(3).fill({
  626. // strName: '空压机',
  627. // cumulativeFlow: '-',
  628. // centerTemperature: '-',
  629. // outletTemperature: '-',
  630. // Ia: '-',
  631. // Ib: '-',
  632. // Ic: '-',
  633. // Vab: '-',
  634. // Vac: '-',
  635. // Vbc: '-',
  636. // compressGroupName: '',
  637. // compressExhaustPressF1: '-',
  638. // compressSeparatePressF1: '-',
  639. // compressHostTempF1: '-',
  640. // compressCrewTempF1: '-',
  641. // compressRunTimeF1: '-',
  642. // controlModel: 'LOC'
  643. })
  644. );
  645. //图表数据
  646. let echartData = ref<any>([]);
  647. // https获取监测数据
  648. let timer: null | NodeJS.Timeout = null;
  649. async function getMonitor(flag?) {
  650. if (Object.prototype.toString.call(timer) === '[object Null]') {
  651. timer = await setTimeout(
  652. async () => {
  653. if (props.deviceId) {
  654. await getDataSource(props.deviceId);
  655. }
  656. if (timer) {
  657. timer = null;
  658. }
  659. await getMonitor();
  660. },
  661. flag ? 0 : 3000
  662. );
  663. }
  664. }
  665. async function getDataSource(systemID) {
  666. const res = await getDevice({ devicetype: 'sys', systemID, type: 'all' });
  667. console.log(res, 'res---------------');
  668. if (res) {
  669. const result = res;
  670. if (!result || result.msgTxt.length < 1) return;
  671. result.msgTxt.forEach((item) => {
  672. if (item.type && item.type.startsWith('nitrogen')) {
  673. airCompressorState.length = 0;
  674. let netStatus = 0
  675. monitorData.value = item['datalist'].filter((data) => {
  676. const readData = data.readData;
  677. if (data['netStatus'] == 1) {
  678. netStatus = 1
  679. }
  680. airCompressorState.push({
  681. id: data.deviceID,
  682. deviceType: data.deviceType,
  683. HMIReset: readData.HMIReset,
  684. HMIStartStop: readData.HMIStartStop
  685. });
  686. return Object.assign(data, readData);
  687. });
  688. monitorNetStatus.value = netStatus
  689. console.log(monitorData, 'monitorData.value---===')
  690. const airCompressor = { readTime: monitorData.value[0]['readTime'].substring(11) }
  691. const dataArr = lodash.cloneDeep(echartData.value)
  692. //图表数据
  693. if (dataArr.length <= 5) {
  694. monitorData.value.forEach((el, index) => {
  695. airCompressor[`InputFlux${index + 1}`] = el['InputFlux'] || 0
  696. });
  697. dataArr.push(airCompressor)
  698. } else {
  699. dataArr.shift()
  700. dataArr.push(airCompressor)
  701. }
  702. echartData.value = dataArr
  703. }
  704. });
  705. monitorDataGroupNum.value = monitorData.value.length;
  706. refresh.value = true
  707. nextTick(() => {
  708. refresh.value = false
  709. })
  710. }
  711. }
  712. function handlerDevice(data, bol) {
  713. console.log(bol, 'bol-------')
  714. kzParam.data = data;
  715. kzParam.isFw = bol;
  716. console.log(kzParam, 'kz--------')
  717. if (bol) {
  718. modalTitle.value = '一键复位';
  719. modalType.value = '1';
  720. modalIsShow.value = true;
  721. kzParam.data.HMIReset = !data.HMIReset
  722. } else {
  723. modalTitle.value = '一键启停';
  724. modalType.value = '2';
  725. modalIsShow.value = true;
  726. kzParam.data.HMIStartStop = !data.HMIStartStop;
  727. }
  728. }
  729. function handleOK(passWord, handlerState) {
  730. console.log(kzParam, 'kz----------');
  731. // if (passWord !== '123456') {
  732. // message.warning('密码不正确,请重新输入');
  733. // return;
  734. // }
  735. let data = {};
  736. if (kzParam.isFw) {
  737. data = {
  738. deviceid: kzParam.data.id,
  739. devicetype: kzParam.data.deviceType,
  740. password: passWord,
  741. HMIReset: kzParam.data.HMIReset,
  742. };
  743. } else {
  744. data = {
  745. deviceid: kzParam.data.id,
  746. password: passWord,
  747. devicetype: kzParam.data.deviceType,
  748. HMIStartStop: kzParam.data.HMIStartStop,
  749. };
  750. }
  751. deviceControlApi(data).then((res) => {
  752. // 模拟时开启
  753. if (res.success) {
  754. modalIsShow.value = false;
  755. getDataSource(props.deviceId);
  756. if (globalConfig.History_Type == 'remote') {
  757. message.success('指令已下发至生产管控平台成功!')
  758. } else {
  759. message.success('指令已下发成功!')
  760. }
  761. }
  762. });
  763. }
  764. function handleCancel() {
  765. modalIsShow.value = false;
  766. modalTitle.value = '';
  767. modalType.value = '';
  768. }
  769. watch([monitorDataGroupNum, loading], ([newMonitorDataGroupNum, newLoading]) => {
  770. nextTick(() => {
  771. if (newMonitorDataGroupNum && !newLoading) {
  772. setModelType(props.modalType, newMonitorDataGroupNum);
  773. }
  774. });
  775. });
  776. onMounted(async () => {
  777. await getMonitor(true);
  778. await mountedThree().then(() => {
  779. loading.value = false;
  780. });
  781. });
  782. onUnmounted(() => {
  783. destroy();
  784. if (timer) {
  785. clearTimeout(timer);
  786. timer = undefined;
  787. }
  788. });
  789. </script>
  790. <style lang="less" scoped>
  791. @ventSpace: zxm;
  792. .nitrogen-box {
  793. width: 100%;
  794. height: 100%;
  795. display: flex;
  796. justify-content: center;
  797. }
  798. #nitrogenCss3D {
  799. .modal-monitor {
  800. width: 200px;
  801. position: absolute;
  802. left: 0px;
  803. top: 0px;
  804. }
  805. &:deep(.win) {
  806. margin: 0 !important;
  807. background: #00000044;
  808. }
  809. }
  810. .nitrogen-home {
  811. width: 100%;
  812. height: 100%;
  813. position: fixed;
  814. z-index: 9999;
  815. display: flex;
  816. flex-direction: column;
  817. justify-content: center;
  818. align-items: center;
  819. pointer-events: none;
  820. top: 20px;
  821. .nitrogen-container {
  822. width: 100%;
  823. height: calc(100% - 100px);
  824. display: flex;
  825. justify-content: space-between;
  826. margin-bottom: 100px;
  827. .top-box {
  828. margin-top: 40px; //lxh
  829. width: 100%;
  830. padding: 10px;
  831. overflow: hidden;
  832. display: flex;
  833. justify-content: space-between;
  834. .lr-box {
  835. height: fit-content;
  836. display: flex;
  837. flex-direction: column;
  838. position: relative;
  839. overflow: hidden;
  840. z-index: 9999;
  841. pointer-events: auto;
  842. }
  843. .item {
  844. width: 335px;
  845. height: auto;
  846. position: relative;
  847. border-radius: 5px;
  848. margin-top: 10px;
  849. margin-bottom: 0px;
  850. pointer-events: auto;
  851. color: #fff;
  852. overflow: hidden;
  853. &:first-child {
  854. margin-top: 0px;
  855. }
  856. .base-title {
  857. color: #fff;
  858. margin-bottom: 8px;
  859. padding-left: 10px;
  860. position: relative;
  861. font-size: 16px;
  862. &::after {
  863. content: '';
  864. position: absolute;
  865. display: block;
  866. width: 4px;
  867. height: 12px;
  868. top: 7px;
  869. left: 0px;
  870. background: #45d3fd;
  871. border-radius: 4px;
  872. }
  873. }
  874. .state-item {
  875. display: flex;
  876. flex-direction: row;
  877. padding: 5px;
  878. .item-col {
  879. width: calc(50% - 5px);
  880. display: flex;
  881. justify-content: center;
  882. align-items: center;
  883. padding-right: 4px;
  884. background-image: linear-gradient(to right, #39a3ff00, #39a3ff10);
  885. &:first-child {
  886. margin-right: 10px;
  887. }
  888. .state-title {
  889. color: #ffffffcc;
  890. flex: 9;
  891. font-size: 14px;
  892. }
  893. .state-val {
  894. flex: 1;
  895. color: #00eefffe;
  896. margin-right: 5px;
  897. text-align: right;
  898. font-size: 14px;
  899. }
  900. .state-title1 {
  901. color: #ffffffcc;
  902. flex: 2.5;
  903. font-size: 14px;
  904. }
  905. .state-val1 {
  906. display: flex;
  907. flex: 1;
  908. justify-content: center;
  909. align-items: center;
  910. }
  911. }
  912. }
  913. .signal-box {
  914. margin: 5px 0;
  915. display: flex;
  916. align-items: center;
  917. .signal-title {
  918. color: #7af5ff;
  919. margin: 0 5px;
  920. }
  921. &:last-child {
  922. margin-right: 0px;
  923. }
  924. }
  925. .list-item {
  926. padding: 0 10px;
  927. display: flex;
  928. justify-content: space-between;
  929. align-items: center;
  930. .item-data-key {
  931. color: #ffffff99;
  932. }
  933. }
  934. .item-data-box {
  935. color: #fff;
  936. .state-icon {
  937. display: inline-block;
  938. width: 12px;
  939. height: 12px;
  940. border-radius: 12px;
  941. }
  942. .open {
  943. border: 5px solid #133a56;
  944. background: #4ecb73;
  945. }
  946. .close {
  947. border: 5px solid #192961;
  948. background: #6d7898;
  949. }
  950. }
  951. }
  952. .item-l {
  953. width: 100%;
  954. .monitor-box {
  955. width: 100%;
  956. .parameter-title {
  957. position: relative;
  958. width: 100%;
  959. height: 14px;
  960. margin-top: 10px;
  961. .icon,
  962. span {
  963. position: absolute;
  964. top: -10px;
  965. }
  966. }
  967. .group-parameter-title {
  968. background-image: linear-gradient(to right, #39a3ff50, #39a3ff00);
  969. .icon {
  970. left: -12px;
  971. top: -17px;
  972. }
  973. span {
  974. left: 18px;
  975. }
  976. .item-col {
  977. background-image: linear-gradient(to right, #39a3ff00, #39a3ff10);
  978. }
  979. }
  980. .device-parameter-title {
  981. background-image: linear-gradient(to right, #3df6ff40, #3df6ff00);
  982. .icon {
  983. left: -10px;
  984. top: -14px;
  985. }
  986. span {
  987. left: 18px;
  988. }
  989. .item-col {
  990. background-image: linear-gradient(to right, #3df6ff10, #3df6ff00);
  991. }
  992. }
  993. }
  994. .monitor-box1 {
  995. height: 126px;
  996. }
  997. .state-box {
  998. height: calc(100% - 24px);
  999. overflow-y: auto;
  1000. }
  1001. }
  1002. .right-box {
  1003. width: 330px;
  1004. margin-top: 50px;
  1005. .control-group {
  1006. display: flex;
  1007. // justify-content: space-around;
  1008. flex-wrap: wrap;
  1009. height: 262px;
  1010. overflow-y: auto;
  1011. overflow-x: hidden;
  1012. .control-item {
  1013. width: 50%; //lxh
  1014. display: flex;
  1015. flex-direction: column;
  1016. justify-content: center;
  1017. align-items: center;
  1018. padding: 0 4px;
  1019. .control-item-title {
  1020. color: #a6dce9;
  1021. position: relative;
  1022. top: 5px;
  1023. }
  1024. .control-item-state {
  1025. // width: 94px;
  1026. width: 162px;
  1027. // height: 47px;
  1028. height: 36px;
  1029. background: url('/@/assets/images/vent/control-switch-bg.png');
  1030. background-size: 100% 100%;
  1031. display: flex;
  1032. justify-content: center;
  1033. align-items: center;
  1034. color: #fff;
  1035. }
  1036. .button-box {
  1037. position: relative;
  1038. padding: 5px;
  1039. border: 1px transparent solid;
  1040. background-clip: border-box;
  1041. border-radius: 5px;
  1042. margin-left: 8px;
  1043. }
  1044. .a-button {
  1045. pointer-events: auto;
  1046. }
  1047. &::v-deep .a-button--mini {
  1048. padding: 6px 10px;
  1049. }
  1050. &::v-deep .a-button--mini.is-round {
  1051. padding: 6px 10px;
  1052. }
  1053. }
  1054. }
  1055. }
  1056. .left-box {
  1057. width: 365px;
  1058. margin-top: 80px;
  1059. }
  1060. }
  1061. &:deep(.win) {
  1062. width: 100%;
  1063. margin: 0 !important;
  1064. }
  1065. }
  1066. }
  1067. &:deep(.main) {
  1068. .title {
  1069. height: 34px;
  1070. text-align: center;
  1071. font-weight: 600;
  1072. color: #7af5ff;
  1073. // background-image: url('../../../assets/img/yfj/light.png');
  1074. background-repeat: no-repeat;
  1075. background-position-x: center;
  1076. background-position-y: 100%;
  1077. background-size: 80%;
  1078. font-size: 16px;
  1079. }
  1080. .monitor-item {
  1081. width: 200px;
  1082. // width: auto;
  1083. display: flex;
  1084. flex-direction: row;
  1085. justify-content: space-between;
  1086. margin-bottom: 3px;
  1087. .monitor-title {
  1088. display: flex;
  1089. flex: 2;
  1090. justify-content: center;
  1091. align-items: center;
  1092. color: #7af5ff;
  1093. font-weight: 400;
  1094. font-size: 14px;
  1095. }
  1096. .monitor-val {
  1097. color: #ffb700;
  1098. display: flex;
  1099. // width: auto;
  1100. flex: 1;
  1101. justify-content: center;
  1102. align-items: center;
  1103. .val {
  1104. width: 100%;
  1105. text-align: center;
  1106. font-size: 14px;
  1107. }
  1108. // .unit {
  1109. // color: #ffffffbb;
  1110. // font-size: 14px;
  1111. // }
  1112. }
  1113. }
  1114. .signal-item {
  1115. display: flex;
  1116. justify-content: space-between;
  1117. // margin-bottom: 5px;
  1118. .signal-round {
  1119. display: inline-block;
  1120. width: 8px;
  1121. height: 8px;
  1122. border-radius: 50%;
  1123. margin: 0 10px;
  1124. position: relative;
  1125. &::after {
  1126. display: block;
  1127. content: '';
  1128. position: absolute;
  1129. width: 12px;
  1130. height: 12px;
  1131. top: -2px;
  1132. left: -2px;
  1133. border-radius: 50%;
  1134. }
  1135. }
  1136. .signal-round-gry {
  1137. background-color: #858585;
  1138. &::after {
  1139. background-color: #85858544;
  1140. box-shadow: 0 0 1px 1px #85858599;
  1141. }
  1142. }
  1143. .signal-round-run {
  1144. background-color: #67fc00;
  1145. &::after {
  1146. background-color: #67fc0044;
  1147. box-shadow: 0 0 1px 1px #c6ff77;
  1148. }
  1149. }
  1150. .signal-round-warning {
  1151. background-color: #e9170b;
  1152. &::after {
  1153. background-color: #e9170b44;
  1154. box-shadow: 0 0 1px 1px #e9170b;
  1155. }
  1156. }
  1157. }
  1158. }
  1159. :deep(.zxm-radio-wrapper) {
  1160. color: #fff !important;
  1161. }
  1162. </style>