first-left.vue 35 KB

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