tunnel.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928
  1. <template>
  2. <el-container>
  3. <el-header class="gva-search-box">
  4. <el-form
  5. v-model="searchData"
  6. :inline="true"
  7. style="line-height: 75px"
  8. >
  9. <el-form-item label="名称">
  10. <el-input
  11. v-model="searchData.name"
  12. />
  13. </el-form-item>
  14. <el-form-item label="类型">
  15. <el-select
  16. v-model.number="searchData.regionId"
  17. style="width: 240px"
  18. clearable
  19. >
  20. <el-option
  21. v-for="item in region"
  22. :key="item.ID"
  23. :label="item.name"
  24. :value="item.ID"
  25. />
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item>
  29. <el-button
  30. type="primary"
  31. @click="getData"
  32. >查询</el-button>
  33. </el-form-item>
  34. </el-form>
  35. </el-header>
  36. <el-main class="gva-table-box">
  37. <div style="margin: 0 0 20px 0 ">
  38. <el-button
  39. type="success"
  40. @click="isTunnelAdd"
  41. >添加</el-button>
  42. <el-button
  43. type="primary"
  44. :disabled="tunnelIds.length === 0"
  45. @click="allocationRegionDialog = true"
  46. >分配</el-button>
  47. </div>
  48. <el-table
  49. :data="tunnel"
  50. style="width: 100%;min-height:600px"
  51. row-key="id"
  52. @selection-change="handleSelectionChange"
  53. >
  54. <el-table-column
  55. type="selection"
  56. width="55"
  57. align="center"
  58. />
  59. <el-table-column
  60. prop="tunnelSn"
  61. label="序号"
  62. align="center"
  63. />
  64. <el-table-column
  65. prop="name"
  66. label="名称"
  67. align="center"
  68. />
  69. <el-table-column
  70. prop="region.name"
  71. label="地区"
  72. align="center"
  73. />
  74. <el-table-column
  75. prop="switchType"
  76. label="开关类型"
  77. align="center"
  78. />
  79. <el-table-column
  80. label="策略"
  81. align="center"
  82. >
  83. <template #default="scope">
  84. <el-select
  85. v-model="scope.row.tactics"
  86. style="width: 100px"
  87. @change="changeTactics(scope.row)"
  88. >
  89. <el-option
  90. v-for="item in tacticsOptions"
  91. :key="item.value"
  92. :label="item.label"
  93. :value="item.value"
  94. />
  95. </el-select>
  96. </template>
  97. </el-table-column>
  98. <el-table-column
  99. label="操作"
  100. align="center"
  101. width="500"
  102. >
  103. <template #default="scope">
  104. <el-button
  105. type="primary"
  106. size="small"
  107. @click="jumpScreen"
  108. >
  109. 大屏
  110. </el-button>
  111. <el-button
  112. type="primary"
  113. size="small"
  114. @click="tunnelData = scope.row ; tunnelEditDialog = true"
  115. >
  116. 修改
  117. </el-button>
  118. <el-button
  119. type="danger"
  120. size="small"
  121. @click="tunnelDelete(scope.row)"
  122. >
  123. 删除
  124. </el-button>
  125. <el-button
  126. type="primary"
  127. size="small"
  128. @click="tunnelControlPanel(scope.row)"
  129. >
  130. 控制面板
  131. </el-button>
  132. <el-button
  133. type="success"
  134. size="small"
  135. @click="tunnelDataPanel(scope.row)"
  136. >
  137. 数据面板
  138. </el-button>
  139. <el-button
  140. type="primary"
  141. size="small"
  142. @click="getDeviceFile(scope.row.ID)"
  143. >
  144. 生成设备文件
  145. </el-button>
  146. </template>
  147. </el-table-column>
  148. </el-table>
  149. <div class="gva-pagination">
  150. <el-pagination
  151. :current-page="searchData.pageInfo.page"
  152. :page-size="searchData.pageInfo.pageSize"
  153. :page-sizes="[10, 30, 50, 100]"
  154. :total="total"
  155. layout="total, sizes, prev, pager, next, jumper"
  156. @current-change="handleCurrentChange"
  157. @size-change="handleSizeChange"
  158. />
  159. </div>
  160. </el-main>
  161. <!-- 隧道添加-->
  162. <el-dialog
  163. v-model="tunnelAddDialog"
  164. title="隧道添加"
  165. width="500"
  166. align-center
  167. >
  168. <el-form
  169. v-model="tunnelData"
  170. style="line-height: 75px"
  171. >
  172. <el-form-item label="名称">
  173. <el-input
  174. v-model="tunnelData.name"
  175. style="width: 200px;"
  176. />
  177. </el-form-item>
  178. <el-form-item label="序号">
  179. <el-input
  180. v-model="tunnelData.tunnelSn"
  181. style="width: 200px;"
  182. />
  183. </el-form-item>
  184. <el-form-item label="地区">
  185. <el-select
  186. v-model.number="tunnelData.regionId"
  187. style="width: 240px"
  188. clearable
  189. >
  190. <el-option
  191. v-for="item in region"
  192. :key="item.ID"
  193. :label="item.name"
  194. :value="item.ID"
  195. />
  196. </el-select>
  197. </el-form-item>
  198. <el-form-item
  199. v-if="userInfo.authorityId === 888"
  200. label="开关类型"
  201. >
  202. <el-input
  203. v-model="tunnelData.switchType"
  204. style="width: 200px;"
  205. />
  206. </el-form-item>
  207. </el-form>
  208. <template #footer>
  209. <div class="dialog-footer">
  210. <el-button @click="tunnelAddDialog = false">取消</el-button>
  211. <el-button
  212. type="primary"
  213. @click="tunnelAdd"
  214. >
  215. 确定
  216. </el-button>
  217. </div>
  218. </template>
  219. </el-dialog>
  220. <!-- 隧道修改-->
  221. <el-dialog
  222. v-model="tunnelEditDialog"
  223. title="隧道修改"
  224. width="500"
  225. align-center
  226. >
  227. <el-form
  228. v-model="tunnelData"
  229. style="line-height: 75px"
  230. >
  231. <el-form-item label="名称">
  232. <el-input
  233. v-model="tunnelData.name"
  234. style="width: 200px;"
  235. />
  236. </el-form-item>
  237. <el-form-item label="序号">
  238. <el-input
  239. v-model="tunnelData.tunnelSn"
  240. style="width: 200px;"
  241. />
  242. </el-form-item>
  243. <el-form-item label="地区">
  244. <el-select
  245. v-model.number="tunnelData.regionId"
  246. style="width: 240px"
  247. clearable
  248. >
  249. <el-option
  250. v-for="item in region"
  251. :key="item.ID"
  252. :label="item.name"
  253. :value="item.ID"
  254. />
  255. </el-select>
  256. </el-form-item>
  257. <el-form-item
  258. v-if="userInfo.authorityId === 888"
  259. label="开关类型"
  260. >
  261. <el-input
  262. v-model="tunnelData.switchType"
  263. style="width: 200px;"
  264. />
  265. </el-form-item>
  266. </el-form>
  267. <template #footer>
  268. <div class="dialog-footer">
  269. <el-button @click="tunnelEditDialog = false">取消</el-button>
  270. <el-button
  271. type="primary"
  272. @click="tunnelEdit"
  273. >
  274. 确定
  275. </el-button>
  276. </div>
  277. </template>
  278. </el-dialog>
  279. <!-- 隧道分配-->
  280. <el-dialog
  281. v-model="allocationRegionDialog"
  282. title="隧道分配"
  283. width="500"
  284. align-center
  285. >
  286. <el-form>
  287. <el-form-item label="地区">
  288. <el-select
  289. v-model.number="regionId"
  290. style="width: 240px"
  291. clearable
  292. >
  293. <el-option
  294. v-for="item in region"
  295. :key="item.ID"
  296. :label="item.name"
  297. :value="item.ID"
  298. />
  299. </el-select>
  300. </el-form-item>
  301. </el-form>
  302. <template #footer>
  303. <div class="dialog-footer">
  304. <el-button @click="allocationRegionDialog = false">取消</el-button>
  305. <el-button
  306. type="primary"
  307. @click="allocationRegion"
  308. >
  309. 确定
  310. </el-button>
  311. </div>
  312. </template>
  313. </el-dialog>
  314. <!-- 生成设备文件-->
  315. <el-drawer
  316. v-model="isDeviceFile"
  317. title="设备"
  318. direction="rtl"
  319. size="80%"
  320. >
  321. <el-button @click="downloadDeviceFile">下载</el-button>
  322. </el-drawer>
  323. <!-- 控制面板-->
  324. <el-drawer
  325. v-model="isControlPanel"
  326. title="控制面板"
  327. direction="rtl"
  328. size="80%"
  329. >
  330. <el-collapse
  331. v-model="activeNames"
  332. >
  333. <el-collapse-item
  334. title="开关"
  335. name="1"
  336. >
  337. <div v-if="tunnelTimeData.switchType === '四路控制器'">
  338. <div
  339. v-for="(item, index) in tunnelTimeData.devices"
  340. key="index"
  341. style="margin: 10px 0"
  342. >
  343. <span style="margin: 0 20px 0 0;font-weight: 600;font-size: 16px">道路 {{ item.radarId }}</span>
  344. <el-switch
  345. v-for="(v, k) in item.deviceRelays"
  346. key="k"
  347. v-model="v.state"
  348. class="ml-2"
  349. style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
  350. @click="switchButton(item, v)"
  351. />
  352. </div>
  353. </div>
  354. <div v-if="tunnelTimeData.switchType === '单灯控制器'">
  355. <div style="margin: 0 0 0 20px">
  356. <el-slider
  357. v-model="tunnelTimeData.lampValue1"
  358. :step="10"
  359. style="width: 50%;"
  360. show-stops
  361. />
  362. </div>
  363. <div style="margin: 0 0 0 20px">
  364. <el-slider
  365. v-model="tunnelTimeData.lampValue2"
  366. :step="10"
  367. style="width: 50%;"
  368. show-stops
  369. />
  370. </div>
  371. <el-button
  372. type="success"
  373. @click="lampSet(tunnelTimeData)"
  374. >设定</el-button>
  375. </div>
  376. </el-collapse-item>
  377. <el-collapse-item
  378. title="定时"
  379. name="2"
  380. >
  381. <div style="margin-bottom: 30px">
  382. <span style="margin-right: 30px">开始:</span>
  383. <el-time-select
  384. v-model="tunnelTiming.startTime"
  385. style="width: 150px"
  386. start="00:00"
  387. end="23:55"
  388. step="00:05"
  389. format="HH:mm"
  390. />
  391. </div>
  392. <div style="margin-bottom: 30px">
  393. <span style="margin-right: 30px">结束:</span>
  394. <el-time-select
  395. v-model="tunnelTiming.endTime"
  396. style="width: 150px"
  397. start="00:00"
  398. end="23:55"
  399. step="00:05"
  400. format="HH:mm"
  401. />
  402. </div>
  403. <div>
  404. <el-button
  405. type="success"
  406. @click="editTunnelTiming"
  407. >
  408. 存储数据
  409. </el-button>
  410. <!-- <span style="margin-left: 30px">-->
  411. <!-- &lt;!&ndash; <el-tag&ndash;&gt;-->
  412. <!-- &lt;!&ndash; v-if="tunnelTimeData.tunnelTime.isComplete"&ndash;&gt;-->
  413. <!-- &lt;!&ndash; type="success"&ndash;&gt;-->
  414. <!-- &lt;!&ndash; >完成</el-tag>&ndash;&gt;-->
  415. <!-- <el-tag-->
  416. <!-- v-if="!tunnelTimeData.tunnelTime.isComplete"-->
  417. <!-- type="warning"-->
  418. <!-- >正在发送</el-tag>-->
  419. <!-- </span>-->
  420. </div>
  421. </el-collapse-item>
  422. </el-collapse>
  423. </el-drawer>
  424. <!-- 数据面板-->
  425. <el-drawer
  426. v-model="isDataPanel"
  427. title="数据面板"
  428. direction="rtl"
  429. size="80%"
  430. >
  431. <el-collapse
  432. v-model="dataNames"
  433. >
  434. <el-collapse-item
  435. title="环境"
  436. name="1"
  437. >
  438. <div
  439. v-for="[sn, data] in Array.from(groupedBySn)"
  440. :id="'chart-' + sn"
  441. :key="sn"
  442. style="width: 600px; height: 400px; margin: 10px;"
  443. />
  444. </el-collapse-item>
  445. <el-collapse-item
  446. title="光感"
  447. name="2"
  448. >
  449. <div
  450. v-for="[sn, data] in Array.from(lightBySn)"
  451. :id="'chart-' + sn"
  452. :key="sn"
  453. style="width: 600px; height: 400px; margin: 10px;"
  454. />
  455. </el-collapse-item>
  456. </el-collapse>
  457. </el-drawer>
  458. </el-container>
  459. </template>
  460. <script setup>
  461. import { ref, onMounted } from 'vue'
  462. import { queryAllRegions } from '@/api/region'
  463. import {
  464. createTunnel,
  465. deleteTunnel,
  466. queryTunnelList, updateTactics,
  467. updateTunnel, updateTunnelLamp,
  468. updateTunnelsRegion,
  469. updateTunnelTime
  470. } from '@/api/tunnel'
  471. import { ElMessage, ElMessageBox } from 'element-plus'
  472. import { nextTick } from 'vue'
  473. import { deviceSwitch, generateDeviceFile } from '@/api/device'
  474. import * as echarts from 'echarts'
  475. import { useUserStore } from '@/pinia/modules/user'
  476. const userData = useUserStore()
  477. const userInfo = userData.userInfo
  478. import { useRouter } from 'vue-router'
  479. const router = useRouter()
  480. const searchData = ref({
  481. pageInfo: {
  482. page: 1,
  483. pageSize: 10
  484. },
  485. name: '',
  486. regionId: undefined,
  487. userId: userInfo.ID
  488. })
  489. // 分页
  490. const handleSizeChange = (val) => {
  491. searchData.value.pageInfo.pageSize = val
  492. getData()
  493. }
  494. const handleCurrentChange = (val) => {
  495. searchData.value.pageInfo.page = val
  496. getData()
  497. }
  498. const total = ref(0)
  499. const region = ref()
  500. const tunnel = ref()
  501. const getData = async() => {
  502. await queryAllRegions().then(res => {
  503. region.value = res.data
  504. })
  505. await queryTunnelList(searchData.value).then(res => {
  506. tunnel.value = res.data.list
  507. total.value = res.data.total
  508. searchData.value.pageInfo.page = res.data.page
  509. searchData.value.pageInfo.pageSize = res.data.pageSize
  510. })
  511. }
  512. // 新增
  513. const tunnelAddDialog = ref(false)
  514. const isTunnelAdd = () => {
  515. tunnelAddDialog.value = true
  516. tunnelData.value.tunnelSn = 'LC' + getFormattedDateTime()
  517. }
  518. function getFormattedDateTime() {
  519. const now = new Date()
  520. const year = now.getFullYear()
  521. const month = String(now.getMonth() + 1).padStart(2, '0') // 月份从0开始,所以需要加1
  522. const day = String(now.getDate()).padStart(2, '0')
  523. const hour = String(now.getHours()).padStart(2, '0')
  524. const minute = String(now.getMinutes()).padStart(2, '0')
  525. const second = String(now.getSeconds()).padStart(2, '0')
  526. return `${year}${month}${day}${hour}${minute}${second}`
  527. }
  528. const tunnelData = ref({
  529. id: 0,
  530. name: '',
  531. regionId: undefined,
  532. tunnelSn: '',
  533. switchType: ''
  534. })
  535. const tunnelAdd = async() => {
  536. tunnelData.value.id = 0
  537. await createTunnel(tunnelData.value).then(res => {
  538. if (res.code === 0) {
  539. ElMessage.success('添加成功')
  540. }
  541. tunnelAddDialog.value = false
  542. getData()
  543. })
  544. }
  545. // 修改
  546. const tunnelEditDialog = ref(false)
  547. const tunnelEdit = async() => {
  548. await updateTunnel(tunnelData.value).then(res => {
  549. if (res.code === 0) {
  550. ElMessage.success('修改成功')
  551. }
  552. tunnelEditDialog.value = false
  553. getData()
  554. })
  555. }
  556. // 删除
  557. const tunnelDelete = (val) => {
  558. ElMessageBox.confirm(
  559. '将永久删除改数据,请问继续吗?',
  560. '删除',
  561. {
  562. confirmButtonText: '确定',
  563. cancelButtonText: '取消',
  564. type: 'warning',
  565. }
  566. )
  567. .then(async() => {
  568. await deleteTunnel(val.ID).then(res => {
  569. if (res.code === 0) {
  570. ElMessage.success('删除成功')
  571. }
  572. getData()
  573. })
  574. })
  575. .catch(() => {
  576. ElMessage({
  577. type: 'info',
  578. message: '删除已取消',
  579. })
  580. })
  581. }
  582. // 多选
  583. const tunnelIds = ref([])
  584. const handleSelectionChange = (val) => {
  585. const array = []
  586. for (const i in val) {
  587. array.push(val[i].ID)
  588. }
  589. tunnelIds.value = array
  590. }
  591. // 分配
  592. const allocationRegionDialog = ref(false)
  593. const regionId = ref()
  594. const allocationRegion = async() => {
  595. await updateTunnelsRegion({
  596. tunnelIds: tunnelIds.value,
  597. regionId: regionId.value
  598. }).then(res => {
  599. if (res.code === 0) {
  600. ElMessage.success('分配成功')
  601. tunnelIds.value = []
  602. getData()
  603. }
  604. allocationRegionDialog.value = false
  605. })
  606. }
  607. // 生成设备文件
  608. const isDeviceFile = ref(false)
  609. const fileData = ref()
  610. const getDeviceFile = async(val) => {
  611. isDeviceFile.value = true
  612. await generateDeviceFile(val).then(res => {
  613. fileData.value = res.data
  614. })
  615. }
  616. const downloadDeviceFile = () => {
  617. // 将对象转换为 JSON 字符串
  618. const jsonString = JSON.stringify(fileData.value, null, 2)
  619. // 创建一个新的 Blob 对象
  620. const blob = new Blob([jsonString], { type: 'application/json' })
  621. // 创建一个隐藏的可下载链接
  622. const url = window.URL.createObjectURL(blob)
  623. const link = document.createElement('a')
  624. // 设置链接的 href 和 download 属性
  625. link.href = url
  626. link.setAttribute('download', 'data.json') // 下载文件名
  627. // 将链接添加到 DOM 中
  628. document.body.appendChild(link)
  629. // 触发点击事件,开始下载
  630. link.click()
  631. // 下载完成后移除链接并释放 URL 对象
  632. link.remove()
  633. window.URL.revokeObjectURL(url) // 清理资源
  634. }
  635. // 策略
  636. const tacticsOptions = [
  637. {
  638. value: 1,
  639. label: '环境',
  640. },
  641. {
  642. value: 2,
  643. label: '雷达',
  644. },
  645. {
  646. value: 3,
  647. label: '定时',
  648. }
  649. ]
  650. const changeTactics = (val) => {
  651. ElMessageBox.confirm(
  652. '你确定修改当前策略吗?',
  653. '警告',
  654. {
  655. confirmButtonText: '确定',
  656. cancelButtonText: '取消',
  657. type: 'warning',
  658. }
  659. )
  660. .then(async() => {
  661. await updateTactics({
  662. sn: val.tunnelSn,
  663. tactics: val.tactics
  664. }).then(res => {
  665. if (res.code === 0) {
  666. ElMessage.success('修改成功')
  667. }
  668. getData()
  669. })
  670. })
  671. .catch(() => {
  672. ElMessage({
  673. type: 'info',
  674. message: '取消修改',
  675. })
  676. })
  677. }
  678. // 控制面板
  679. const tunnelTimeData = ref()
  680. const isControlPanel = ref(false)
  681. const tunnelControlPanel = (val) => {
  682. isControlPanel.value = true
  683. tunnelTimeData.value = val
  684. tunnelTiming.value = val.tunnelTime
  685. console.log(val)
  686. }
  687. const activeNames = ref(['1', '2'])
  688. // 定时
  689. const tunnelTiming = ref({
  690. startTime: '00:00',
  691. endTime: '00:00'
  692. })
  693. const editTunnelTiming = async() => {
  694. console.log(tunnelTiming.value)
  695. await updateTunnelTime(tunnelTiming.value).then(res => {
  696. if (res.code === 0) {
  697. ElMessage.success('已发送')
  698. }
  699. getData()
  700. })
  701. }
  702. const lampSet = async(val) => {
  703. await updateTunnelLamp({
  704. id: val.ID,
  705. tunnelSn: val.tunnelSn,
  706. lampValue1: val.lampValue1,
  707. lampValue2: val.lampValue2
  708. }).then(res => {
  709. if (res.code === 0) {
  710. ElMessage.success('已发送')
  711. }
  712. getData()
  713. })
  714. }
  715. // 数据面板
  716. const isDataPanel = ref(false)
  717. const dataNames = ref(['1'])
  718. const groupedBySn = ref()
  719. const lightBySn = ref()
  720. const tunnelDataPanel = (val) => {
  721. isDataPanel.value = true
  722. tunnelTimeData.value = val
  723. console.log(val)
  724. groupedBySn.value = tunnelTimeData.value.envData.reduce((acc, current) => {
  725. const { sn } = current
  726. // 如果 acc(累加器)中没有当前 sn 对应的数组,则创建一个新的数组
  727. if (!acc.has(sn)) {
  728. acc.set(sn, [])
  729. }
  730. // 将当前对象添加到对应 sn 的数组中
  731. acc.get(sn).push(current)
  732. return acc
  733. }, new Map())
  734. lightBySn.value = tunnelTimeData.value.opticalData.reduce((acc, current) => {
  735. const { sn } = current
  736. // 如果 acc(累加器)中没有当前 sn 对应的数组,则创建一个新的数组
  737. if (!acc.has(sn)) {
  738. acc.set(sn, [])
  739. }
  740. // 将当前对象添加到对应 sn 的数组中
  741. acc.get(sn).push(current)
  742. return acc
  743. }, new Map())
  744. nextTick(() => {
  745. groupedBySn.value.forEach((data, index) => {
  746. initChart(index, data)
  747. })
  748. lightBySn.value.forEach((data, index) => {
  749. initLightBySnChart(index, data)
  750. })
  751. })
  752. }
  753. // 环境
  754. function initChart(index, data) {
  755. const chartDom = document.getElementById('chart-' + index)
  756. if (!chartDom) {
  757. console.error(`无法找到元素: chart-${index}`)
  758. return
  759. }
  760. const myChart = echarts.init(chartDom)
  761. const option = {
  762. title: {
  763. text: '环境监测'
  764. },
  765. tooltip: {
  766. trigger: 'axis'
  767. },
  768. legend: {
  769. data: ['温度', '湿度', '光照度']
  770. },
  771. xAxis: {
  772. type: 'time', // 使用时间类型的x轴
  773. boundaryGap: false,
  774. },
  775. yAxis: {},
  776. series: [
  777. {
  778. name: '温度',
  779. type: 'line',
  780. data: data.map(item => [new Date(item.CreatedAt).getTime(), item.temperature])
  781. },
  782. {
  783. name: '湿度',
  784. type: 'line',
  785. data: data.map(item => [new Date(item.CreatedAt).getTime(), item.humidity])
  786. },
  787. {
  788. name: '光照度',
  789. type: 'line',
  790. data: data.map(item => [new Date(item.CreatedAt).getTime(), item.illuminance])
  791. }
  792. ],
  793. dataZoom: [
  794. {
  795. type: 'slider', // 滑动条型数据区域缩放组件
  796. start: 0, // 默认显示数据的起始百分比
  797. end: 100 // 默认显示数据的结束百分比
  798. },
  799. {
  800. type: 'inside', // 支持鼠标滚轮和双指缩放
  801. start: 0,
  802. end: 100
  803. }
  804. ]
  805. }
  806. myChart.setOption(option)
  807. }
  808. // 光感
  809. function initLightBySnChart(index, data) {
  810. const chartDom = document.getElementById('chart-' + index)
  811. if (!chartDom) {
  812. console.error(`无法找到元素: chart-${index}`)
  813. return
  814. }
  815. const myChart = echarts.init(chartDom)
  816. const option = {
  817. title: {
  818. text: '光感监测'
  819. },
  820. tooltip: {
  821. trigger: 'axis'
  822. },
  823. legend: {
  824. data: ['光照度']
  825. },
  826. xAxis: {
  827. type: 'time', // 使用时间类型的x轴
  828. boundaryGap: false,
  829. },
  830. yAxis: {},
  831. series: [
  832. {
  833. name: '光照度',
  834. type: 'line',
  835. data: data.map(item => [new Date(item.CreatedAt).getTime(), item.illuminance])
  836. }
  837. ],
  838. dataZoom: [
  839. {
  840. type: 'slider', // 滑动条型数据区域缩放组件
  841. start: 0, // 默认显示数据的起始百分比
  842. end: 100 // 默认显示数据的结束百分比
  843. },
  844. {
  845. type: 'inside', // 支持鼠标滚轮和双指缩放
  846. start: 0,
  847. end: 100
  848. }
  849. ]
  850. }
  851. myChart.setOption(option)
  852. }
  853. // 开关
  854. const switchButton = async(device, relay) => {
  855. console.log(device, relay)
  856. await deviceSwitch({
  857. tunnelSn: device.tunnel.tunnelSn,
  858. radarId: device.radarId,
  859. relayId: relay.relayId,
  860. state: relay.state
  861. }).then(res => {
  862. if (res.code === 0) {
  863. ElMessage.success('已切换')
  864. }
  865. getData()
  866. })
  867. }
  868. // 大屏
  869. const jumpScreen = () => {
  870. router.push('/dataDashboard')
  871. // const routeData = router.resolve({ name: 'dataDashboard' })
  872. // window.open(routeData.href, '_blank')
  873. }
  874. onMounted(() => {
  875. getData()
  876. })
  877. </script>