nitrogenHome1.vue 33 KB

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