first-left.vue 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150
  1. <template>
  2. <!-- 底部导航栏 -->
  3. <div class="rightfl" v-show="firstshow" >
  4. <div class="rightfl_hei">
  5. <el-aside width="1.7708rem" class="L_aside L_aside1 asideg asidegbg leftbgimg1" v-show="firstshow">
  6. <div class="demo-collapse jiance asideg1 jc_header collapseeion jianstyle">
  7. <el-collapse accordion v-model="activeNames">
  8. <el-collapse-item name="1" class="imgneon">
  9. <template #title>
  10. <el-icon class="iconimg Frame3" fit="contain"></el-icon>
  11. 灾害信息展示
  12. </template>
  13. <div class="rg_content">
  14. <div class="rg-padding">
  15. <div style="display: flex;" >
  16. <span class="gaojing">告警:</span>
  17. <el-switch
  18. v-model="valueswitch"
  19. inline-prompt
  20. @change="swutchfun($event)"
  21. style="--el-switch-on-color:#ff4949; --el-switch-off-color: #525050"
  22. active-text="是"
  23. inactive-text="否"
  24. />
  25. </div>
  26. <div class="he_pading color1 wusele">
  27. <el-form-item label="物理量:" v-if="props.classradio == 'Fire'||props.classradio == 'Gass'">
  28. <el-select
  29. :disabled="disabledshow"
  30. v-model="formInline.region"
  31. @change="regionchange($event)"
  32. placeholder="请选择"
  33. >
  34. <el-option
  35. v-for="item in strResultFormatlist"
  36. :key="item.id"
  37. :label="item.name"
  38. :value="item.value"
  39. ></el-option>
  40. </el-select>
  41. </el-form-item>
  42. <div class="woter" v-else>
  43. <span>物理量:</span>
  44. <span>水位</span>
  45. </div>
  46. </div>
  47. <div class="zongji">
  48. <div class="zongjili img1">{{ warnin2 }}<span>个</span></div>
  49. <div class="zongjili img2">{{ warnin}}<span>个</span></div>
  50. </div>
  51. <div class="asides_content">
  52. <div class="jc_content tablecolor">
  53. <div class="jc_padding">
  54. <div class="xian2 btncolor tablefocus ">
  55. <!-- -->
  56. <el-table
  57. :data="tableData"
  58. style="width: 100%"
  59. :row-class-name="tableRowClassName"
  60. :header-cell-style="{ background: 'rgba(13, 22, 57, 0) ' }"
  61. @row-click="handleDelete($event)"
  62. :highlight-current-row="currentrow1"
  63. :max-height="tableHeight"
  64. >
  65. <el-table-column prop="chname" label="监测点" width="120" />
  66. <el-table-column
  67. v-for="(header, index) in dynamicHeaders"
  68. :key="index"
  69. :prop="header.prop"
  70. :label="header.label"
  71. >
  72. <template #default="scope">
  73. <span>{{Math.abs(Number(scope.row[header.prop]).toFixed(2))}}</span>
  74. </template>
  75. </el-table-column>
  76. <!-- <el-table-column prop="date" label="监测点" />
  77. <el-table-column prop="name" label="水位(m)" />
  78. <el-table-column prop="name" label="流量(m³/s)" /> -->
  79. <el-table-column prop="state" label="预警" >
  80. <template #default="scope">
  81. <el-image v-if="scope.row.state=='0'" style="height: 100%" :src="bt1" fit="contain"></el-image>
  82. <el-image v-if="scope.row.state=='1'" style="height: 100%" :src="bt2" fit="contain"></el-image>
  83. <el-image v-if="scope.row.state=='2'" style="height: 100%" :src="bt3" fit="contain"></el-image>
  84. <el-image v-if="scope.row.state=='3'" style="height: 100%" :src="bt4" fit="contain"></el-image>
  85. </template>
  86. </el-table-column>
  87. </el-table>
  88. </div>
  89. </div>
  90. </div>
  91. </div>
  92. <!-- 监测点 -->
  93. <div>
  94. <div class="hedse">
  95. <el-icon class="iconimg1 Frame3" fit="contain"></el-icon>{{ jcname }}
  96. </div>
  97. <div class="zongji2" v-show="noneshow">
  98. <div class="Firetile" ><span>温度(℃):</span><span class="text">{{ c}}</span></div>
  99. <div class="Firetile"><span>压力(Pa):</span><span class="text2">{{ pa }}</span></div>
  100. </div>
  101. <div class="echart">
  102. <div id="line" style="width: 1.526rem;height:.9375rem;"></div></div>
  103. <div class="zongji" v-if="props.classradio=='Water'" >
  104. <div class="zongjili img3">{{ heightnum }}<span>m</span></div>
  105. <div class="zongjili img4">
  106. <p class="jcshijian">{{datetime}}</p>
  107. <p style="text-align: center;font-size: 0.0625rem;">{{ maxtime.steptime }}</p></div>
  108. </div>
  109. </div>
  110. </div>
  111. </div>
  112. <!-- <div class="mgsnoe" style="height: 200px"></div> -->
  113. </el-collapse-item>
  114. </el-collapse>
  115. </div>
  116. </el-aside>
  117. <!-- 动画 -->
  118. <el-aside width="1.7708rem" class="L_aside L_aside1 asideg asidegbg leftbgimg1" v-show="firstshow">
  119. <div class="demo-collapse jiance asideg1 jc_header collapseeion jianstyle">
  120. <el-collapse accordion v-model="activeNames1" class="bganimation">
  121. <el-collapse-item name="2" class="imgneon">
  122. <template #title>
  123. <el-icon class="iconimg Frame3" fit="contain"></el-icon>
  124. 动画展示
  125. </template>
  126. <div class="rg_content">
  127. <div class="rg-padding">
  128. <div class="animation_s">
  129. <el-slider
  130. :max="endtime"
  131. :min="0"
  132. v-model="count"
  133. @change="sliderchange"
  134. >
  135. </el-slider>
  136. <!-- <el-progress type="line" :percentage="percentage" :color="customColor" :stroke-width="4"/> -->
  137. <div class="tanniu">
  138. <div><el-image :src="t1" fit="contain" @click="Prev" ></el-image></div>
  139. <div v-show="suspendshow"><el-image :src="t2" fit="contain" @click="play(500)" ></el-image></div>
  140. <div v-show="playshow"><el-image :src="t3" fit="contain" @click="play(500)" ></el-image></div>
  141. <div><el-image :src="t4" fit="contain" @click="increment"></el-image></div>
  142. </div>
  143. </div>
  144. </div>
  145. </div>
  146. <!-- <div class="mgsnoe" style="height: 200px"></div> -->
  147. </el-collapse-item>
  148. </el-collapse>
  149. </div>
  150. </el-aside>
  151. </div>
  152. </div>
  153. <div class="timedlgheader" v-show="firstshow">
  154. <div class="timedlg" v-show="timeshow">
  155. <div class="closeimg" @click="timeshow = false"><el-image :src="closeimg" fit="contain"
  156. style="margin-top: -10px;"></el-image></div>
  157. <h4 class="teletdq">指定时间:</h4>
  158. <div class="resultime">
  159. <div class="time">{{ timeline }}</div>
  160. </div>
  161. </div>
  162. <!-- <el-dialog
  163. width="200px"
  164. v-model="timeshow"
  165. :modal="false"
  166. ref="dialogRef"
  167. :close-on-click-modal="false"
  168. :append-to-body="true"
  169. draggable
  170. modal-class="summary-dlg time-dlg"
  171. class=" shubiao log_cla22 tianjia asideg asidegbg leftbgimg1"
  172. >
  173. <template #header="{ titleId, titleClass }">
  174. <div class="my-header">
  175. <h4 class="teletdq" :id="titleId" :class="titleClass">当前步数的时间:</h4>
  176. </div>
  177. </template>
  178. <div class="resultime">
  179. <div class="time">{{ timeline }}</div>
  180. </div>
  181. </el-dialog> -->
  182. <div class="setiao" v-if="valueswitch==true">
  183. <div class="itemcolor" v-for="(item,index) in itemcolorlist" :key="index" >
  184. <div class="yansekuang" :style="{ backgroundColor: item.color }"></div>
  185. <span>{{item.name}} </span>
  186. </div>
  187. <!-- <ul>
  188. <li>
  189. <div ></div>
  190. </li>
  191. </ul> -->
  192. </div>
  193. </div>
  194. <htmldialog ref="htmldialogref" :classradio="props.classradio" :isshow='isshow' @funidshow="funidshow"/>
  195. </template>
  196. <script setup>
  197. import { ref, onMounted, reactive, } from "vue";
  198. import { RouterView, RouterLink } from "vue-router"
  199. import { request, uploadFile } from "@/utils/request";
  200. import { ElMessage, ElButton, ElDialog, ElSelect } from 'element-plus'
  201. import * as echarts from 'echarts'
  202. import { createFireControl } from "@/control/fireControl.js";
  203. import { timestampToTime, timescount } from "@/js/lindex.js";
  204. import { vtkmodel } from "@/control/vtkModel.js";
  205. import vtkDataArray from "@kitware/vtk.js/Common/Core/DataArray.js";
  206. import bt4 from "@/assets/img/Group1376.png"
  207. import bt1 from "@/assets/img/Group1377.png"
  208. import bt3 from "@/assets/img/Group1395.png"
  209. import bt2 from "@/assets/img/Group1396.png"
  210. import closeimg from "@/assets/img/colse.png";
  211. import t1 from "@/assets/img/t1.png";
  212. import t2 from "@/assets/img/t2.png";
  213. import t3 from "@/assets/img/t3.png";
  214. import t4 from "@/assets/img/t4.png";
  215. import htmldialog from "./htmldialog.vue"
  216. import emitter from "@/utils/emitter";
  217. let firstshow = ref(false);
  218. let timeshow=ref(true);
  219. let valueswitch=ref(false);
  220. let disabledshow=ref(false);
  221. let timeline = ref("2024-03-2");
  222. let activeNames = ref(["1"]);
  223. let activeNames1=ref(["2"])
  224. let tableHeight = ref(130);
  225. let playshow=ref(true);
  226. let suspendshow=ref(false);
  227. let showfalse=ref(false);
  228. let c=ref("0");
  229. let htmldialogref=ref();
  230. let pa=ref("30s");
  231. const isstop = ref(false);
  232. let noneshow=ref(false);
  233. const strResultFormatlist = ref([]);
  234. let count=ref(1);
  235. let starttime = ref(1);
  236. let endtime = ref(60);
  237. let timenum = ref(2);
  238. let oldtime = ref('2024-04-25 18:07:08');
  239. let time = ref();
  240. let aid = ref();
  241. let newcount = ref(0);
  242. let timing = ref(null);
  243. let timing3 = ref(null);
  244. let timing2 = ref(null);
  245. let currentrow1 = ref(false);
  246. let steptimes = ref([]);
  247. let series = ref([]);
  248. let heightnum=ref("0");
  249. let maxtime=ref({
  250. steptime:"03:02"
  251. });
  252. let datetime=ref();
  253. let jcname=ref("监测点");
  254. let danwei=ref();
  255. let state=ref();
  256. let warnin=ref(0);
  257. let warnin2=ref(0);
  258. const min = ref(0);
  259. const max = ref(1);
  260. let selelist=ref();
  261. let jgSelectPointId=ref(0);
  262. let selobj=ref([]);
  263. let isshow=ref(false);
  264. let maxindex=ref();
  265. const dynamicHeaders = ref([
  266. ]);
  267. const props = defineProps({
  268. classradio: {
  269. type: String,
  270. // default: '',activeIndex
  271. },
  272. })
  273. let itemcolorlist=ref([
  274. {
  275. name:'安全区 ',
  276. color:'#008003'
  277. },
  278. {
  279. name:'感知区 ',
  280. color:'#6eaa00'
  281. },
  282. {
  283. name:'二级警告 ',
  284. color:'#d48f00'
  285. },
  286. {
  287. name:'一级警告 ',
  288. color:'#ff0000'
  289. },
  290. ])
  291. let classradio=ref();
  292. const job = ref({
  293. jid: 0, // 任务ID
  294. aid: 0, // 事故ID
  295. starttime: "", // 结束时间
  296. endtime: "", // 开始时间
  297. state: "", // 状态
  298. faildes: "", // 失败原因
  299. dt: "", // 时间步长
  300. dx: "", // 空间步长
  301. reportstep: "", // 输出步长
  302. interactionstep: "", // 交互步长
  303. acctime: "", // 事故开始时间
  304. totaltime: "", // 模拟时长
  305. coids: "", // 物理属性ID逗号分隔
  306. cocodes: "", //物理属性code逗号分隔
  307. });
  308. const formInline = ref({
  309. region: "Temperature",
  310. });
  311. const tableData =ref( [
  312. // {
  313. // date: '检测点',
  314. // name: '1',
  315. // state: '1',
  316. // city: 'Los Angeles',
  317. // address: 'No. 189, Grove St, Los Angeles',
  318. // v1: 'CA 90036',
  319. // v2: 'Home',
  320. // },
  321. // {
  322. // date: '检测点',
  323. // name: '1',
  324. // state: '2',
  325. // city: 'Los Angeles',
  326. // address: 'No. 189, Grove St, Los Angeles',
  327. // v1: 'CA 90036',
  328. // v2: 'Office',
  329. // },
  330. ])
  331. let myChart;
  332. onMounted(() => {
  333. // valueswitch.value=false;
  334. lineChart();
  335. // window.onresize = function() {
  336. // // 让图表自适应大小
  337. // myChart.resize();
  338. // };
  339. fcon.step=count.value;
  340. });
  341. const fcon = createFireControl();
  342. // 检测点的结果获取
  343. // 父组件获取的方法初始化
  344. const indexinit= (id,radio)=>{
  345. aid.value=id;
  346. // classradio.value=radio;
  347. //console.log(classradio.value);
  348. // fcon.step=count.value;
  349. // getMonitor();
  350. // vtkmodel.clearModeAddJg();
  351. // vtkGridRead()
  352. if(props.classradio=='Fire'||props.classradio=='Gass'){
  353. formInline.value.region="Temperature";
  354. }else if(props.classradio=='Water'){
  355. formInline.value.region="Height";
  356. }
  357. myChart.clear();
  358. readJob();
  359. }
  360. function regionchange(val) {
  361. let newMap = new Map([
  362. ["Temperature", "(℃)"],
  363. ["Pressure", "(Pa)"],
  364. ["CO", "(ppm)"],
  365. ["CO2", "(%)"],
  366. ["H2S", "(%)"],
  367. ["HCL", "(ppm)"],
  368. ["NO2", "(ppm)"],
  369. ["SO2", "(ppm)"],
  370. ["Flow", "(Pa)"],
  371. ["Height", "(m)"],
  372. ]);
  373. newMap.forEach((value, key) => {
  374. // console.log(key, value);
  375. if (key == val) {
  376. danwei.value = key + value;
  377. }
  378. });
  379. //getMonitor();
  380. vtkShow();
  381. }
  382. //获取任务信息
  383. async function readJob() {
  384. const params = {
  385. transCode: "D10017",
  386. aid: aid.value,
  387. };
  388. await request(params)
  389. .then((res) => {
  390. if (res.returnCode == "000000000") {
  391. //成功
  392. datetime.value=res.endtime.slice(0,10);
  393. if(res.state=='1'){
  394. // vtkmodel.clearModeAddJg(); //隐藏模版显示结果
  395. job.value = res;
  396. getMonitor();
  397. vtkmodel.clearModeAddJg();
  398. reddate(new Date());
  399. vtkGridRead();
  400. jgSelect1();
  401. firstshow.value=true;
  402. endtime.value= Number(res.totaltime)/Number(res.reportstep);
  403. oldtime.value=acctime;
  404. console.log(3333333);
  405. console.log( oldtime.value)
  406. }else if(res.state=='-1'){
  407. firstshow.value=false;
  408. ElMessage({
  409. message: " 求解失败",
  410. type: 'error',
  411. });
  412. }else if(res.state=='0'){
  413. firstshow.value=false;
  414. ElMessage({ message: "求解未完成", type: 'error',
  415. });
  416. }
  417. } else {
  418. ElMessage({
  419. message: res.returnMsg,
  420. type: "error",
  421. });
  422. }
  423. })
  424. .catch((err) => {
  425. if(err.returnMsg=="任务不存在!"){
  426. monitor.value=false;
  427. console.log(1111)
  428. ElMessage({
  429. message: "未求解",
  430. type: 'error',
  431. });
  432. }
  433. });
  434. }
  435. //监测点数据获取
  436. function renderheader(h, { column, $index }) {
  437. // console.log(column.label)
  438. // return h("div", {}, [
  439. // h("div", {}, column.label.split(",")[0]),
  440. // h("div", {}, column.label.split(",")[1]),
  441. // ]);
  442. }
  443. async function getMonitor() {
  444. let cocode;
  445. let name;
  446. let v=1;
  447. newtime();
  448. const params = {
  449. transCode: "D10018",
  450. aid: aid.value,
  451. step: fcon.step,
  452. };
  453. request(params)
  454. .then((res) => {
  455. if (res.returnCode == "000000000") {
  456. strResultFormatlist.value = [];
  457. let headertable=[];
  458. //let s=0;
  459. // dynamicHeaders.value=res.codes;
  460. console.log(res);
  461. for (let i = 0; i < res.codes.length; i++) {
  462. cocode = res.codes[i];
  463. let num=i+1
  464. let newMap = new Map([
  465. ["Temperature", "(℃)"],
  466. ["Pressure", "(Pa)"],
  467. ["CO", "(ppm)"],
  468. ["CO2", "(%)"],
  469. ["H2S", "(%)"],
  470. ["HCL", "(ppm)"],
  471. ["NO2", "(ppm)"],
  472. ["SO2", "(ppm)"],
  473. ["Flow", "(m³/s)"],
  474. ["Height", "(m)"],
  475. ]);
  476. newMap.forEach((value, key) => {
  477. if ( key == res.codes[i].code ) {
  478. if(key=='Temperature'){
  479. key='温度'
  480. }else if(key=='Pressure'){
  481. key='压强'
  482. }else if(key=='CO'){
  483. key= '一氧化碳'
  484. }else if(key=='CO2'){
  485. key= '二氧化碳'
  486. }else if(key=='HCL'){
  487. key= '氯化氢'
  488. }else if(key=='NO2'){
  489. key= '二氧化氮'
  490. }else if(key=='SO2'){
  491. key= '二氧化硫'
  492. }else if(key=='H2S'){
  493. key= '硫化氢'
  494. }else if(key=='Height'){
  495. key= '水位'
  496. }else if(key=='Flow'){
  497. key= '流量'
  498. }else{
  499. }
  500. // res.codes[i].code = key+value;
  501. name = key+'\n'+value
  502. }
  503. });
  504. strResultFormatlist.value.push({
  505. id: i,
  506. name: name,
  507. value: cocode.code,
  508. });
  509. headertable.push(
  510. { prop:'v'+num, label:name},
  511. )
  512. }
  513. dynamicHeaders.value=headertable;
  514. let warning=[];//一级警告
  515. let warning2=[];//二级警告
  516. let warning3=[];//突水发生
  517. let warning4=[];//安全区域
  518. for (let j = 0; j < res.vals.length; j++) {
  519. if(Math.abs(Number(res.vals[j].v1))>1.5){
  520. res.vals[j].state=3;
  521. warning.push(res.vals[j].v1)
  522. }else{
  523. res.vals[j].state=0;
  524. warning4.push(res.vals[j].v1);
  525. }
  526. }
  527. // for (let j = 0; j < res.vals.length; j++) {
  528. // console.log( res.vals[j]);
  529. // if(Number(res.vals[j].v1)==0&&Number(res.vals[j].v1)<=0.1){
  530. // res.vals[j].state=0;
  531. // warning4.push(res.vals[j].v1);
  532. // }else if(Number(res.vals[j].v1)>0.1&&Number(res.vals[j].v1)<=0.5){
  533. // res.vals[j].state=1;
  534. // warning3.push(res.vals[j].v1);
  535. // }else if(Number(res.vals[j].v1)>0.5&&Number(res.vals[j].v1)<=1){
  536. // res.vals[j].state=2;
  537. // warning2.push(res.vals[j].v1);
  538. // }else if(Number(res.vals[j].v1)>1.5){
  539. // res.vals[j].state=3;
  540. // warning.push(res.vals[j].v1);
  541. // }
  542. // }
  543. warnin2.value=warning2.length;
  544. warnin.value=warning.length;
  545. console.log(res.vals);
  546. tableData.value=res.vals;
  547. }
  548. }) .catch((err) => {
  549. tableData.value=[];
  550. ElMessage.error(err.returnMsg);
  551. });
  552. }
  553. //回到上一页
  554. function Prev() {
  555. currentrow1.value=false;
  556. isstop.value = false;
  557. count.value--;
  558. fcon.step = count.value;
  559. newcount.value = count.value;
  560. newtime();
  561. }
  562. // 时间计算
  563. const newtime = () => {
  564. timeshow.value=true;
  565. time.value = null;
  566. oldtime.value= sessionStorage.getItem('acctime');
  567. console.log(222222444444)
  568. console.log(oldtime.value);
  569. time.value = (new Date(oldtime.value).getTime()) / 1000;
  570. console.log( time.value);
  571. if ( count.value == 2) {
  572. let time2 = (count.value - 1) * 60 + time.value;
  573. timeline.value = timescount(time2);
  574. } else {
  575. let time2 = (count.value) * 60 + time.value;
  576. timeline.value = timescount(time2);
  577. }
  578. };
  579. // 下一页
  580. function increment() {
  581. currentrow1.value=false;
  582. isstop.value = false;
  583. if (count.value == endtime.value) {
  584. return;
  585. }
  586. count.value++;
  587. newcount.value = count.value;
  588. fcon.step = count.value;
  589. console.log( newcount.value );
  590. newtime();
  591. }
  592. // 播放暂停
  593. const play =(time)=>{
  594. showfalse.value=!showfalse.value;
  595. currentrow1.value=false;
  596. if(showfalse.value){
  597. suspendshow.value=true;
  598. playshow.value=false;
  599. isstop.value = true;//播放
  600. const sleep = (timeout = time) =>
  601. new Promise((resolve, reject) => {
  602. setTimeout(resolve, timeout);
  603. });
  604. let timer = async (timeout) => {
  605. while (count.value < endtime.value && isstop.value) {
  606. if (isstop.value == true) {
  607. await sleep(time);
  608. count.value++;
  609. fcon.step = count.value;
  610. newcount.value = count.value;
  611. newtime();
  612. }
  613. }
  614. };
  615. console.log(count.value)
  616. timer(time);
  617. }else{
  618. isstop.value = false;//暂停
  619. playshow.value=true;
  620. suspendshow.value=false;
  621. }
  622. }
  623. function sliderchange(val) {
  624. suspendshow.value=false;
  625. playshow.value=true;
  626. isstop.value = false;
  627. newcount.value = count.value;
  628. fcon.step = count.value;
  629. console.log(count.value);
  630. }
  631. const tableRowClassName=()=>{
  632. }
  633. //获取最大值的下标
  634. function firstOccurrenceOfMax(arr) {
  635. var max = arr[0];
  636. //声明了个变量 保存下标值
  637. var index = 0;
  638. for (var i = 0; i < arr.length; i++) {
  639. if (max < arr[i]) {
  640. max = arr[i];
  641. index = i;
  642. }
  643. }
  644. maxindex.value=index
  645. return index;
  646. }
  647. // 随机颜色
  648. const randomColor=()=>{
  649. var letters = '0123456789ABCDEF';
  650. var color = '#';
  651. do {
  652. for (var i = 0; i < 6; i++) {
  653. color += letters[Math.floor(Math.random() * 16)];
  654. }
  655. } while (color === '#FFFFFF' || color === '#000000');
  656. console.log(color);
  657. return color;
  658. }
  659. // 批量数据
  660. const handleDelete=(event)=>{
  661. jcname.value=event.chname;
  662. currentrow1.value=true;
  663. const params = {
  664. transCode: "D10019",
  665. aid: aid.value,
  666. chname: event.chname,
  667. };
  668. request(params)
  669. .then((res) => {
  670. series.value=[];
  671. steptimes.value=[];
  672. if (res.returnCode == "000000000") {
  673. for (let j = 0; j < res.steptimes.length; j++) {
  674. steptimes.value.push(Object.values(res.steptimes[j]));
  675. }
  676. for (let i = 0; i < res.rows.length; i++) {
  677. let arr=[];
  678. for (let k = 0; k < res.rows[i].data.length; k++) {
  679. if(res.rows[i].data[k].val<0){
  680. }
  681. let num=res.rows[i].data[k].val;
  682. ///console.log(parseFloat(num).toFixed(2))
  683. // console.log(num.toFixed(2));
  684. arr.push(Math.abs(parseFloat(num).toFixed(2)));
  685. }
  686. // var arr = Array.from(Object.values(res.rows[i].data),x=>x);
  687. if(res.rows[i].code=='Temperature'){
  688. res.rows[i].code='温度'
  689. }else if(res.rows[i].code=='Pressure'){
  690. res.rows[i].code='压强'
  691. }else if(res.rows[i].code=='CO'){
  692. res.rows[i].code= '一氧化碳'
  693. }else if(res.rows[i].code=='CO2'){
  694. res.rows[i].code= '二氧化碳'
  695. }else if(res.rows[i].code=='HCL'){
  696. res.rows[i].code= '氯化氢'
  697. }else if(res.rows[i].code=='NO2'){
  698. res.rows[i].code= '二氧化氮'
  699. }else if(res.rows[i].code=='SO2'){
  700. res.rows[i].code= '二氧化硫'
  701. }else if(res.rows[i].code=='H2S'){
  702. res.rows[i].code= '硫化氢'
  703. }else if(res.rows[i].code=='Height'){
  704. res.rows[i].code= '水位'
  705. }else if(res.rows[i].code=='Flow'){
  706. res.rows[i].code= '流量'
  707. }else{
  708. }
  709. series.value.push({
  710. name:res.rows[i].code,
  711. type: 'line',
  712. showSymbol: false,
  713. smooth: true,
  714. data:arr,//res.rows[i].data
  715. })
  716. console.log( arr);
  717. console.log(22222);
  718. }
  719. firstOccurrenceOfMax(series.value[0].data)
  720. const max = Math.max(...series.value[0].data);
  721. maxtime.value= res.steptimes[ maxindex.value];
  722. console.log(maxtime.value);
  723. console.log(1111)
  724. heightnum.value=max;
  725. }
  726. lineChart();
  727. }) .catch((err) => {
  728. ElMessage.error(err.returnMsg);
  729. });
  730. }
  731. const funidshow=(val)=>{
  732. isshow.value=val;
  733. }
  734. // 获取点的数据
  735. function jgSelect1(event) {
  736. // console.log(event.pageX);
  737. timing2.value = setInterval(() => {
  738. //定时器
  739. if (jgSelectPointId.value != vtkmodel.selectJgPointId) {
  740. // console.log("pointid",vtkmodel.selectJgPointId);//选择的点数据
  741. //获取点对应的Scalar
  742. isshow.value=true;
  743. htmldialogref.value.X=Number(vtkmodel.epageX)+'px';
  744. htmldialogref.value.Y=Number(vtkmodel.epageY)+'px';
  745. jgSelectPointId.value = vtkmodel.selectJgPointId;
  746. selobj.value = [];
  747. for (const key of fcon.scalar.keys()) {
  748. selobj.value.push({
  749. name: key,
  750. value: fcon.scalar.get(key)[vtkmodel.selectJgPointId],
  751. });
  752. }
  753. console.log(selobj.value);
  754. // console.log(window.style.left )
  755. // msgval.value = selobj.value;
  756. htmldialogref.value.getdatahtml(selobj.value);
  757. }
  758. }, 1000);
  759. }
  760. const linedata=()=>{
  761. }
  762. const lineChart=()=>{
  763. // console.log(series.value);
  764. var chartDom = document.getElementById('line');
  765. myChart = echarts.init(chartDom);
  766. // myChart = echarts.init(document.getElementById('line'));
  767. let option = {
  768. tooltip: {
  769. trigger: 'axis'
  770. },
  771. // legend: {
  772. // data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']
  773. // },
  774. grid: {
  775. left: '3%',
  776. right: '4%',
  777. bottom: '3%',
  778. containLabel: true
  779. },
  780. xAxis: {
  781. type: 'category',
  782. axisLabel: {
  783. color: '#fff' // 设置 X 轴字体颜色为红色
  784. },
  785. boundaryGap: false,
  786. data:steptimes.value,
  787. },
  788. yAxis: {
  789. type: 'value',
  790. axisLabel: {
  791. color: '#fff' // 设置 X 轴字体颜色为红色
  792. },
  793. },
  794. series: series.value
  795. };
  796. option && myChart.setOption(option);
  797. window.onresize = function() {
  798. // 让图表自适应大小
  799. myChart.resize();
  800. };
  801. }
  802. function reddate(date) {
  803. //当前时间
  804. const timestamp = date.getTime();
  805. // newtime.value = timestampToTime(timestamp);
  806. const accstamp = Date.parse(job.value.acctime);
  807. var timeDifference = parseInt((timestamp - accstamp) / 1000);
  808. fcon.stepsum = parseInt(job.value.totaltime) / parseInt(job.value.reportstep);
  809. if (timeDifference < parseInt(job.value.totaltime)) {
  810. //最长时间范围
  811. fcon.step = parseInt(timeDifference / parseInt(job.value.reportstep));
  812. } else {
  813. fcon.step = fcon.stepsum;
  814. }
  815. count.value = fcon.step;
  816. newcount.value = count.value;
  817. }
  818. function velocityRead() {
  819. // return;
  820. // clearInterval(arrowtime.value);
  821. fcon
  822. .getVelocityByStep(fcon.step)
  823. .then((result) => {
  824. vtkmodel.addArrow(fcon.velocitys);
  825. // arrowtimeStart();
  826. })
  827. .catch((err) => {
  828. console.log(err);
  829. });
  830. }
  831. function getMinMax(scalars) {
  832. // console.log("getMinMax:",scalars);
  833. min.value = Math.min(...scalars);
  834. max.value = Math.max(...scalars);
  835. // for (let index = 0; index <= scalars.length; index++) {
  836. // let scalar = scalars[index];
  837. // if (min.value > scalar) {
  838. // min.value = scalar;
  839. // }
  840. // if (max.value < scalar) {
  841. // max.value = scalar;
  842. // }
  843. // }
  844. if( min.value== max.value){
  845. max.value=min.value+1;
  846. }
  847. console.log("max,min:", max.value, min.value);
  848. }
  849. function vtkShow() {
  850. const scalarBarActor = vtkmodel.scalarBarActor;
  851. const mapper = vtkmodel.jgMapper;
  852. const actor = vtkmodel.jgActor;
  853. if (!fcon.scalar) {
  854. return;
  855. }
  856. const scalarArray = fcon.scalar.get(formInline.value.region);
  857. if (!scalarArray || !fcon.polydata) {
  858. return;
  859. }
  860. console.log("scalarArray:", scalarArray);
  861. const dataArray = vtkDataArray.newInstance({
  862. name: formInline.value.region,
  863. size: fcon.polydata.getNumberOfPoints(),
  864. });
  865. console.log("执行了11");
  866. // console.log(dataArray);
  867. dataArray.setData(scalarArray);
  868. fcon.polydata.getPointData().setScalars(dataArray);
  869. // fcon.polydata.getPointData().setOpacity(dataArray);
  870. mapper.setInputData(fcon.polydata);
  871. getMinMax(scalarArray);
  872. mapper.setScalarRange(
  873. parseFloat(min.value.toFixed(3)),
  874. parseFloat(max.value.toFixed(3))
  875. ); //设置范围
  876. // actor.setMapper(mapper);
  877. scalarBarActor.setAxisLabel(formInline.value.region);
  878. mapper.clearColorArrays(); //强制重建颜色
  879. actor.getProperty().setOpacity(count.value); //设置错误的透明度使得页面重新加载 不设置不刷新页面
  880. actor.getProperty().setOpacity(0.5);
  881. // vtkmodel.renderer.resetCamera();
  882. vtkmodel.clearModeAddJg();
  883. vtkmodel.renderWindow.render();
  884. }
  885. //告警数据渲染
  886. function gjVtkShow() {
  887. console.log("告警 执行了");
  888. fcon.intgjScalar(props.classradio);
  889. const scalarBarActor = vtkmodel.gjscalarBarActor;
  890. const mapper = vtkmodel.gjMapper;
  891. const actor = vtkmodel.gjActor;
  892. if (!fcon.scalar) {
  893. return;
  894. }
  895. const scalarArray = fcon.gjScalar;
  896. if (!scalarArray || !fcon.polydata) {
  897. return;
  898. }
  899. console.log("告警"+fcon.gjScalar);
  900. const dataArray = vtkDataArray.newInstance({
  901. name: "告警",
  902. size: fcon.polydata.getNumberOfPoints(),
  903. });
  904. dataArray.setData(scalarArray);
  905. fcon.polydata.getPointData().setScalars(dataArray);
  906. mapper.setInputData(fcon.polydata);
  907. getMinMax(scalarArray);
  908. mapper.setScalarRange(
  909. parseFloat(min.value.toFixed(3)),
  910. parseFloat(max.value.toFixed(3))
  911. ); //设置范围
  912. scalarBarActor.setAxisLabel("告警");
  913. mapper.clearColorArrays(); //强制重建颜色
  914. actor.getProperty().setOpacity(count.value); //设置错误的透明度使得页面重新加载 不设置不刷新页面
  915. actor.getProperty().setOpacity(0.5);
  916. vtkmodel.clearAllShowGj();
  917. vtkmodel.renderWindow.render();
  918. }
  919. function vtkGridRead() {
  920. fcon.aid = aid.value;
  921. fcon
  922. .initGemetry()
  923. .then((result) => {
  924. vtkScalarRead();
  925. vtkmodel.renderWindowWith.resize();
  926. })
  927. .catch((err) => {});
  928. }
  929. // 告警按钮
  930. function swutchfun(val){
  931. vtkScalarRead()
  932. }
  933. function vtkScalarRead() {
  934. fcon
  935. .getScalrsByStep(fcon.step)
  936. .then((result) => {
  937. velocityRead() ;
  938. if(valueswitch.value==false){
  939. disabledshow.value=false;
  940. vtkShow();
  941. }else{
  942. disabledshow.value=true;
  943. gjVtkShow();
  944. }
  945. // vtkShow();
  946. })
  947. .catch((err) => {
  948. // console.log(err);
  949. });
  950. }
  951. watch(
  952. // props.classradio,
  953. // (newVal, oldVal) => {
  954. // console.log("我的值变了"+newVal);
  955. // },
  956. newcount,
  957. (newVal, oldVal) => {
  958. console.log("值改变了", newVal, oldVal);
  959. fcon.step = newVal;
  960. getMonitor();
  961. vtkScalarRead();
  962. // vtkScalarRead();
  963. if( newVal>=endtime.value){
  964. playshow.value=true;
  965. suspendshow.value=false;
  966. isstop.value = false;
  967. }
  968. },
  969. { deep: true }
  970. ); //深度监视
  971. defineExpose({firstshow,isshow,indexinit});
  972. </script>
  973. <style lang="scss" scoped>
  974. .text{
  975. color: #fff;
  976. }
  977. .timedlg{
  978. .time{
  979. font-family: Microsoft YaHei UI, Microsoft YaHei UI;
  980. font-weight: bold;
  981. font-size:13px;
  982. color: #ff0f0f;
  983. line-height:35px;
  984. text-align: left;
  985. font-style: normal;
  986. text-transform: none;
  987. }
  988. .teletdq{
  989. color: #fff;
  990. font-size: 13px;
  991. text-align: left;
  992. }
  993. .closeimg{
  994. position: absolute;
  995. right: 12px;
  996. top: 21px;
  997. }
  998. }
  999. .el-slider {
  1000. width: 100%;
  1001. height: 32px;
  1002. display: flex;
  1003. align-items: center;
  1004. }
  1005. .tanniu{
  1006. display: flex;
  1007. justify-content:space-between;
  1008. align-items: center;
  1009. }
  1010. </style>
  1011. <style>
  1012. .el-table .cell {
  1013. white-space:pre-line;
  1014. text-align: center ;
  1015. }
  1016. .time-dlg .log_cla22{
  1017. position: absolute;
  1018. right: 1.8229rem;
  1019. top: -65px;
  1020. }
  1021. .time-dlg .tianjia .el-dialog__body{
  1022. padding: 10px 20px !important;
  1023. }
  1024. .timedlg{
  1025. /* width: 200px;
  1026. position: absolute;
  1027. right: 1.8229rem;
  1028. top: 77px;
  1029. z-index: 1111; */
  1030. /* /* background-color: rgba(0, 102, 201, 0.5); */
  1031. border-radius: 10px;
  1032. padding: 10px;
  1033. background-image: url(/src/assets/img/tkb.png) !important;
  1034. background-repeat: no-repeat;
  1035. line-height: 30px;
  1036. background-size: 100% 100%;
  1037. position: relative;
  1038. }
  1039. .teletdq{
  1040. position: relative;
  1041. }
  1042. .teletdq::before{
  1043. position: absolute;
  1044. content: "";
  1045. width: 100%;
  1046. height: 1px;
  1047. bottom: 0;
  1048. left: 0;
  1049. background: linear-gradient( 90deg, rgba(93, 144, 194, 0.1), rgba(93, 144, 194, 1), rgba(93, 144, 194, 0.1) );
  1050. }
  1051. .gaojing{
  1052. color: #fff;
  1053. font-size: 12px;
  1054. display: inline-block;
  1055. /* height: 30px; */
  1056. line-height: 35px;
  1057. padding-left: 11px
  1058. }
  1059. .yansekuang{
  1060. width: 50px;
  1061. height: 18px;
  1062. }
  1063. .setiao{
  1064. /* width: 200px;
  1065. position: absolute;
  1066. right: 1.8229rem;
  1067. top: 170px;
  1068. z-index: 1111; */
  1069. border-radius: 10px;
  1070. color: #fff;
  1071. display: flex;
  1072. font-size: 10px;
  1073. margin-top:10px;
  1074. }
  1075. .timedlgheader{
  1076. width: 200px;
  1077. position: absolute;
  1078. right: 2.0229rem;
  1079. top: 77px;
  1080. z-index: 1111;
  1081. }
  1082. .el-table .el-table__body-wrapper .el-table__body tbody tr td .cell{
  1083. white-space: normal !important;
  1084. }
  1085. </style>