1
0

nitrogenHome2.vue 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344
  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_high_voltage: '蝶阀1电压过高故障',
  579. bv_2_high_voltage: '蝶阀2电压过高故障',
  580. },
  581. {
  582. bv_3_high_voltage: '蝶阀3电压过高故障',
  583. bv_4_high_voltage: '蝶阀4电压过高故障',
  584. },
  585. {
  586. bv_1_motor_leakage: '蝶阀1电机漏电故障',
  587. bv_2_motor_leakage: '蝶阀2电机漏电故障',
  588. },
  589. {
  590. bv_3_motor_leakage: '蝶阀3电机漏电故障',
  591. bv_4_motor_leakage: '蝶阀4电机漏电故障',
  592. },
  593. {
  594. bv_1_supply_phase: '蝶阀1电源缺相故障',
  595. bv_2_supply_phase: '蝶阀2电源缺相故障',
  596. },
  597. {
  598. bv_3_supply_phase: '蝶阀3电源缺相故障',
  599. bv_4_supply_phase: '蝶阀4电源缺相故障',
  600. },
  601. {
  602. bv_1_closing_overtorque: '蝶阀1关向过力矩故障',
  603. bv_2_closing_overtorque: '蝶阀2关向过力矩故障',
  604. },
  605. {
  606. bv_3_closing_overtorque: '蝶阀3关向过力矩故障',
  607. bv_4_closing_overtorque: '蝶阀4关向过力矩故障',
  608. },
  609. {
  610. bv_1_opening_overtorque: '蝶阀1开向过力矩故障',
  611. bv_2_opening_overtorque: '蝶阀2开向过力矩故障',
  612. },
  613. {
  614. bv_3_opening_overtorque: '蝶阀3开向过力矩故障',
  615. bv_4_opening_overtorque: '蝶阀4开向过力矩故障',
  616. },
  617. {
  618. bv_1_closing_overcurrent: '蝶阀1关向过电流故障',
  619. bv_2_closing_overcurrent: '蝶阀2关向过电流故障',
  620. },
  621. {
  622. bv_3_closing_overcurrent: '蝶阀3关向过电流故障',
  623. bv_4_closing_overcurrent: '蝶阀4关向过电流故障',
  624. },
  625. {
  626. bv_1_opening_overcurrent: '蝶阀1开向过电流故障',
  627. bv_2_opening_overcurrent: '蝶阀2开向过电流故障',
  628. },
  629. {
  630. bv_3_opening_overcurrent: '蝶阀3开向过电流故障',
  631. bv_4_opening_overcurrent: '蝶阀4开向过电流故障',
  632. },
  633. {
  634. bv_1_closing_timeout: '蝶阀1关向超时故障',
  635. bv_2_closing_timeout: '蝶阀2关向超时故障',
  636. },
  637. {
  638. bv_3_closing_timeout: '蝶阀3关向超时故障',
  639. bv_4_closing_timeout: '蝶阀4关向超时故障',
  640. },
  641. {
  642. bv_1_opening_timeout: '蝶阀1开向超时故障',
  643. bv_2_opening_timeout: '蝶阀2开向超时故障',
  644. },
  645. {
  646. bv_3_opening_timeout: '蝶阀3开向超时故障',
  647. bv_4_opening_timeout: '蝶阀4开向超时故障',
  648. },
  649. {
  650. bv_1_valve_position: '蝶阀1阀位故障',
  651. bv_2_valve_position: '蝶阀2阀位故障',
  652. },
  653. {
  654. bv_3_valve_position: '蝶阀3阀位故障',
  655. bv_4_valve_position: '蝶阀4阀位故障',
  656. },
  657. {
  658. bv_1_thermal_overload: '蝶阀1热过载故障',
  659. bv_2_thermal_overload: '蝶阀2热过载故障',
  660. },
  661. {
  662. bv_3_thermal_overload: '蝶阀3热过载故障',
  663. bv_4_thermal_overload: '蝶阀4热过载故障',
  664. },
  665. ];
  666. const downWindData = [
  667. {
  668. o2Val: '下风侧氧气(%)',
  669. temperature: '下风测温度(℃)',
  670. },
  671. {
  672. fumes: '下风测烟雾(­%)',
  673. },
  674. ];
  675. const propTypeArr = ref([])
  676. const chartsColumns = ref([])
  677. watch(monitorDataGroupNum, () => {
  678. const arr = <any[]>[]
  679. const item = {
  680. legend: '瞬时流量',
  681. seriesName: '(m³/h)',
  682. ymax: 5,
  683. yname: 'm³/h',
  684. linetype: 'line',
  685. yaxispos: 'left',
  686. color: '#FDB146',
  687. sort: 1,
  688. xRotate: 0,
  689. dataIndex: 'InputFlux',
  690. }
  691. const propTypeList = []
  692. for (let i = 1; i <= monitorDataGroupNum.value; i++) {
  693. const lineType = lodash.cloneDeep(item)
  694. lineType.legend = `制氮机${i}瞬时流量`;
  695. lineType.dataIndex = `InputFlux${i}`
  696. lineType.color = colors[i - 1]
  697. arr.push(lineType)
  698. }
  699. chartsColumns.value = arr
  700. })
  701. const monitorData = ref(
  702. new Array(3).fill({
  703. // strName: '空压机',
  704. // cumulativeFlow: '-',
  705. // centerTemperature: '-',
  706. // outletTemperature: '-',
  707. // Ia: '-',
  708. // Ib: '-',
  709. // Ic: '-',
  710. // Vab: '-',
  711. // Vac: '-',
  712. // Vbc: '-',
  713. // compressGroupName: '',
  714. // compressExhaustPressF1: '-',
  715. // compressSeparatePressF1: '-',
  716. // compressHostTempF1: '-',
  717. // compressCrewTempF1: '-',
  718. // compressRunTimeF1: '-',
  719. // controlModel: 'LOC'
  720. })
  721. );
  722. //图表数据
  723. let echartData = ref<any>([]);
  724. // https获取监测数据
  725. let timer: null | NodeJS.Timeout = null;
  726. async function getMonitor(flag?) {
  727. if (Object.prototype.toString.call(timer) === '[object Null]') {
  728. timer = await setTimeout(
  729. async () => {
  730. if (props.deviceId) {
  731. await getDataSource(props.deviceId);
  732. }
  733. if (timer) {
  734. timer = null;
  735. }
  736. await getMonitor();
  737. },
  738. flag ? 0 : 3000
  739. );
  740. }
  741. }
  742. async function getDataSource(systemID) {
  743. const res = await getDevice({ devicetype: 'sys', systemID, type: 'all' });
  744. console.log(res, 'res---------------');
  745. if (res) {
  746. const result = res;
  747. if (!result || result.msgTxt.length < 1) return;
  748. result.msgTxt.forEach((item) => {
  749. if (item.type && item.type.startsWith('nitrogen')) {
  750. airCompressorState.length = 0;
  751. let netStatus = 0
  752. monitorData.value = item['datalist'].filter((data) => {
  753. const readData = data.readData;
  754. if (data['netStatus'] == 1) {
  755. netStatus = 1
  756. }
  757. airCompressorState.push({
  758. id: data.deviceID,
  759. deviceType: data.deviceType,
  760. HMIReset: readData.HMIReset,
  761. HMIStartStop: readData.HMIStartStop
  762. });
  763. return Object.assign(data, readData);
  764. });
  765. monitorNetStatus.value = netStatus
  766. console.log(monitorData, 'monitorData.value---===')
  767. const airCompressor = { readTime: monitorData.value[0]['readTime'].substring(11) }
  768. const dataArr = lodash.cloneDeep(echartData.value)
  769. //图表数据
  770. if (dataArr.length <= 5) {
  771. monitorData.value.forEach((el, index) => {
  772. airCompressor[`InputFlux${index + 1}`] = el['InputFlux'] || 0
  773. });
  774. dataArr.push(airCompressor)
  775. } else {
  776. dataArr.shift()
  777. dataArr.push(airCompressor)
  778. }
  779. echartData.value = dataArr
  780. }
  781. });
  782. monitorDataGroupNum.value = monitorData.value.length;
  783. refresh.value = true
  784. nextTick(() => {
  785. refresh.value = false
  786. })
  787. }
  788. }
  789. function handlerDevice(data, bol) {
  790. console.log(bol, 'bol-------')
  791. kzParam.data = data;
  792. kzParam.isFw = bol;
  793. console.log(kzParam, 'kz--------')
  794. if (bol) {
  795. modalTitle.value = '一键复位';
  796. modalType.value = '1';
  797. modalIsShow.value = true;
  798. kzParam.data.HMIReset = !data.HMIReset
  799. } else {
  800. modalTitle.value = '一键启停';
  801. modalType.value = '2';
  802. modalIsShow.value = true;
  803. kzParam.data.HMIStartStop = !data.HMIStartStop;
  804. }
  805. }
  806. function handleOK(passWord, handlerState) {
  807. console.log(kzParam, 'kz----------');
  808. // if (passWord !== '123456') {
  809. // message.warning('密码不正确,请重新输入');
  810. // return;
  811. // }
  812. let data = {};
  813. if (kzParam.isFw) {
  814. data = {
  815. deviceid: kzParam.data.id,
  816. devicetype: kzParam.data.deviceType,
  817. password: passWord,
  818. HMIReset: kzParam.data.HMIReset,
  819. };
  820. } else {
  821. data = {
  822. deviceid: kzParam.data.id,
  823. password: passWord,
  824. devicetype: kzParam.data.deviceType,
  825. HMIStartStop: kzParam.data.HMIStartStop,
  826. };
  827. }
  828. deviceControlApi(data).then((res) => {
  829. // 模拟时开启
  830. if (res.success) {
  831. modalIsShow.value = false;
  832. getDataSource(props.deviceId);
  833. if (globalConfig.History_Type == 'remote') {
  834. message.success('指令已下发至生产管控平台成功!')
  835. } else {
  836. message.success('指令已下发成功!')
  837. }
  838. }
  839. });
  840. }
  841. function handleCancel() {
  842. modalIsShow.value = false;
  843. modalTitle.value = '';
  844. modalType.value = '';
  845. }
  846. watch([monitorDataGroupNum, loading], ([newMonitorDataGroupNum, newLoading]) => {
  847. nextTick(() => {
  848. if (newMonitorDataGroupNum && !newLoading) {
  849. setModelType(props.modalType, newMonitorDataGroupNum);
  850. }
  851. });
  852. });
  853. onMounted(async () => {
  854. await getMonitor(true);
  855. await mountedThree().then(() => {
  856. loading.value = false;
  857. });
  858. });
  859. onUnmounted(() => {
  860. destroy();
  861. if (timer) {
  862. clearTimeout(timer);
  863. timer = undefined;
  864. }
  865. });
  866. </script>
  867. <style lang="less" scoped>
  868. @ventSpace: zxm;
  869. .nitrogen-box {
  870. width: 100%;
  871. height: 100%;
  872. display: flex;
  873. justify-content: center;
  874. }
  875. #nitrogenCss3D {
  876. .modal-monitor {
  877. width: 200px;
  878. position: absolute;
  879. left: 0px;
  880. top: 0px;
  881. }
  882. &:deep(.win) {
  883. margin: 0 !important;
  884. background: #00000044;
  885. }
  886. }
  887. .nitrogen-home {
  888. width: 100%;
  889. height: 100%;
  890. position: fixed;
  891. z-index: 9999;
  892. display: flex;
  893. flex-direction: column;
  894. justify-content: center;
  895. align-items: center;
  896. pointer-events: none;
  897. top: 20px;
  898. .nitrogen-container {
  899. width: 100%;
  900. height: calc(100% - 100px);
  901. display: flex;
  902. justify-content: space-between;
  903. margin-bottom: 100px;
  904. .top-box {
  905. margin-top: 40px; //lxh
  906. width: 100%;
  907. padding: 10px;
  908. overflow: hidden;
  909. display: flex;
  910. justify-content: space-between;
  911. .lr-box {
  912. height: fit-content;
  913. display: flex;
  914. flex-direction: column;
  915. position: relative;
  916. overflow: hidden;
  917. z-index: 9999;
  918. pointer-events: auto;
  919. }
  920. .item {
  921. width: 335px;
  922. height: auto;
  923. position: relative;
  924. border-radius: 5px;
  925. margin-top: 10px;
  926. margin-bottom: 0px;
  927. pointer-events: auto;
  928. color: #fff;
  929. overflow: hidden;
  930. &:first-child {
  931. margin-top: 0px;
  932. }
  933. .base-title {
  934. color: #fff;
  935. margin-bottom: 8px;
  936. padding-left: 10px;
  937. position: relative;
  938. font-size: 16px;
  939. &::after {
  940. content: '';
  941. position: absolute;
  942. display: block;
  943. width: 4px;
  944. height: 12px;
  945. top: 7px;
  946. left: 0px;
  947. background: #45d3fd;
  948. border-radius: 4px;
  949. }
  950. }
  951. .state-item {
  952. display: flex;
  953. flex-direction: row;
  954. padding: 5px;
  955. .item-col {
  956. width: calc(50% - 5px);
  957. display: flex;
  958. justify-content: center;
  959. align-items: center;
  960. padding-right: 4px;
  961. background-image: linear-gradient(to right, #39a3ff00, #39a3ff10);
  962. &:first-child {
  963. margin-right: 10px;
  964. }
  965. .state-title {
  966. color: #ffffffcc;
  967. flex: 9;
  968. font-size: 14px;
  969. }
  970. .state-val {
  971. flex: 1;
  972. color: #00eefffe;
  973. margin-right: 5px;
  974. text-align: right;
  975. font-size: 14px;
  976. }
  977. .state-title1 {
  978. color: #ffffffcc;
  979. flex: 5;
  980. font-size: 14px;
  981. }
  982. .state-val1 {
  983. display: flex;
  984. flex: 1;
  985. justify-content: center;
  986. align-items: center;
  987. }
  988. }
  989. }
  990. .signal-box {
  991. margin: 5px 0;
  992. display: flex;
  993. align-items: center;
  994. .signal-title {
  995. color: #7af5ff;
  996. margin: 0 5px;
  997. }
  998. &:last-child {
  999. margin-right: 0px;
  1000. }
  1001. }
  1002. .list-item {
  1003. padding: 0 10px;
  1004. display: flex;
  1005. justify-content: space-between;
  1006. align-items: center;
  1007. .item-data-key {
  1008. color: #ffffff99;
  1009. }
  1010. }
  1011. .item-data-box {
  1012. color: #fff;
  1013. .state-icon {
  1014. display: inline-block;
  1015. width: 12px;
  1016. height: 12px;
  1017. border-radius: 12px;
  1018. }
  1019. .open {
  1020. border: 5px solid #133a56;
  1021. background: #4ecb73;
  1022. }
  1023. .close {
  1024. border: 5px solid #192961;
  1025. background: #6d7898;
  1026. }
  1027. }
  1028. }
  1029. .item-l {
  1030. width: 100%;
  1031. .monitor-box {
  1032. width: 100%;
  1033. .parameter-title {
  1034. position: relative;
  1035. width: 100%;
  1036. height: 14px;
  1037. margin-top: 10px;
  1038. .icon,
  1039. span {
  1040. position: absolute;
  1041. top: -10px;
  1042. }
  1043. }
  1044. .group-parameter-title {
  1045. background-image: linear-gradient(to right, #39a3ff50, #39a3ff00);
  1046. .icon {
  1047. left: -12px;
  1048. top: -17px;
  1049. }
  1050. span {
  1051. left: 18px;
  1052. }
  1053. .item-col {
  1054. background-image: linear-gradient(to right, #39a3ff00, #39a3ff10);
  1055. }
  1056. }
  1057. .device-parameter-title {
  1058. background-image: linear-gradient(to right, #3df6ff40, #3df6ff00);
  1059. .icon {
  1060. left: -10px;
  1061. top: -14px;
  1062. }
  1063. span {
  1064. left: 18px;
  1065. }
  1066. .item-col {
  1067. background-image: linear-gradient(to right, #3df6ff10, #3df6ff00);
  1068. }
  1069. }
  1070. }
  1071. .monitor-box1 {
  1072. height: 126px;
  1073. }
  1074. .state-box {
  1075. height: calc(100% - 24px);
  1076. overflow-y: auto;
  1077. }
  1078. }
  1079. .right-box {
  1080. width: 330px;
  1081. margin-top: 50px;
  1082. .control-group {
  1083. display: flex;
  1084. // justify-content: space-around;
  1085. flex-wrap: wrap;
  1086. height: 262px;
  1087. overflow-y: auto;
  1088. overflow-x: hidden;
  1089. .control-item {
  1090. width: 50%; //lxh
  1091. display: flex;
  1092. flex-direction: column;
  1093. justify-content: center;
  1094. align-items: center;
  1095. padding: 0 4px;
  1096. .control-item-title {
  1097. color: #a6dce9;
  1098. position: relative;
  1099. top: 5px;
  1100. }
  1101. .control-item-state {
  1102. // width: 94px;
  1103. width: 162px;
  1104. // height: 47px;
  1105. height: 36px;
  1106. background: url('/@/assets/images/vent/control-switch-bg.png');
  1107. background-size: 100% 100%;
  1108. display: flex;
  1109. justify-content: center;
  1110. align-items: center;
  1111. color: #fff;
  1112. }
  1113. .button-box {
  1114. position: relative;
  1115. padding: 5px;
  1116. border: 1px transparent solid;
  1117. background-clip: border-box;
  1118. border-radius: 5px;
  1119. margin-left: 8px;
  1120. }
  1121. .a-button {
  1122. pointer-events: auto;
  1123. }
  1124. &::v-deep .a-button--mini {
  1125. padding: 6px 10px;
  1126. }
  1127. &::v-deep .a-button--mini.is-round {
  1128. padding: 6px 10px;
  1129. }
  1130. }
  1131. }
  1132. }
  1133. .left-box {
  1134. width: 365px;
  1135. margin-top: 80px;
  1136. }
  1137. }
  1138. &:deep(.win) {
  1139. width: 100%;
  1140. margin: 0 !important;
  1141. }
  1142. }
  1143. }
  1144. &:deep(.main) {
  1145. .title {
  1146. height: 34px;
  1147. text-align: center;
  1148. font-weight: 600;
  1149. color: #7af5ff;
  1150. // background-image: url('../../../assets/img/yfj/light.png');
  1151. background-repeat: no-repeat;
  1152. background-position-x: center;
  1153. background-position-y: 100%;
  1154. background-size: 80%;
  1155. font-size: 16px;
  1156. }
  1157. .monitor-item {
  1158. width: 200px;
  1159. // width: auto;
  1160. display: flex;
  1161. flex-direction: row;
  1162. justify-content: space-between;
  1163. margin-bottom: 3px;
  1164. .monitor-title {
  1165. display: flex;
  1166. flex: 2;
  1167. justify-content: center;
  1168. align-items: center;
  1169. color: #7af5ff;
  1170. font-weight: 400;
  1171. font-size: 14px;
  1172. }
  1173. .monitor-val {
  1174. color: #ffb700;
  1175. display: flex;
  1176. // width: auto;
  1177. flex: 1;
  1178. justify-content: center;
  1179. align-items: center;
  1180. .val {
  1181. width: 100%;
  1182. text-align: center;
  1183. font-size: 14px;
  1184. }
  1185. // .unit {
  1186. // color: #ffffffbb;
  1187. // font-size: 14px;
  1188. // }
  1189. }
  1190. }
  1191. .signal-item {
  1192. display: flex;
  1193. justify-content: space-between;
  1194. // margin-bottom: 5px;
  1195. .signal-round {
  1196. display: inline-block;
  1197. width: 8px;
  1198. height: 8px;
  1199. border-radius: 50%;
  1200. margin: 0 10px;
  1201. position: relative;
  1202. &::after {
  1203. display: block;
  1204. content: '';
  1205. position: absolute;
  1206. width: 12px;
  1207. height: 12px;
  1208. top: -2px;
  1209. left: -2px;
  1210. border-radius: 50%;
  1211. }
  1212. }
  1213. .signal-round-gry {
  1214. background-color: #858585;
  1215. &::after {
  1216. background-color: #85858544;
  1217. box-shadow: 0 0 1px 1px #85858599;
  1218. }
  1219. }
  1220. .signal-round-run {
  1221. background-color: #67fc00;
  1222. &::after {
  1223. background-color: #67fc0044;
  1224. box-shadow: 0 0 1px 1px #c6ff77;
  1225. }
  1226. }
  1227. .signal-round-warning {
  1228. background-color: #e9170b;
  1229. &::after {
  1230. background-color: #e9170b44;
  1231. box-shadow: 0 0 1px 1px #e9170b;
  1232. }
  1233. }
  1234. }
  1235. }
  1236. :deep(.zxm-radio-wrapper) {
  1237. color: #fff !important;
  1238. }
  1239. </style>