parkingInfo.vue 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240
  1. <template>
  2. <el-row>
  3. <el-col :span="4">
  4. <div class="region">
  5. <div class="regionTitle">
  6. <div class="regionTitle-text">
  7. <el-text style="font-weight: 550">停车区域</el-text>
  8. </div>
  9. <div class="regionTitle-icon">
  10. <el-icon
  11. size="large"
  12. color="#008000"
  13. @click="openRegion('创建区域', '')"
  14. >
  15. <Plus />
  16. </el-icon>
  17. <el-icon
  18. style="padding-left: 5px"
  19. size="large"
  20. color="#4682b4"
  21. >
  22. <Refresh />
  23. </el-icon>
  24. </div>
  25. </div>
  26. <el-menu
  27. default-active="0"
  28. background-color="#f5f5f5"
  29. >
  30. <el-menu-item
  31. v-for="(item,val) in regionList"
  32. :key="item.ID"
  33. :index="val.toString()"
  34. @click="changeRegion(item)"
  35. >
  36. <div style="display: flex;justify-content: space-between; align-items: center;width: 100%">
  37. <span>{{ item.lot_name }}}</span>
  38. <div>
  39. <el-icon @click.stop="openRegion('编辑区域', item)">
  40. <edit />
  41. </el-icon>
  42. <el-icon @click.stop="deleteRegion(item.ID)">
  43. <delete />
  44. </el-icon>
  45. </div>
  46. </div>
  47. </el-menu-item>
  48. </el-menu>
  49. </div>
  50. </el-col>
  51. <el-col
  52. :span="19"
  53. style="margin-left: 40px"
  54. >
  55. <el-tabs
  56. v-model="activeName"
  57. class="demo-tabs"
  58. @tab-click="handleClick"
  59. >
  60. <el-tab-pane
  61. label="岗亭"
  62. name="detail"
  63. >
  64. <el-form inline>
  65. <el-form-item>
  66. <el-button
  67. icon="Plus"
  68. text
  69. type="success"
  70. @click="openPosition('岗亭新增','')"
  71. >
  72. 新增
  73. </el-button>
  74. </el-form-item>
  75. <el-form-item>
  76. <el-button
  77. icon="Refresh"
  78. text
  79. type="primary"
  80. @click="getGuardBoothList"
  81. >刷新
  82. </el-button>
  83. </el-form-item>
  84. </el-form>
  85. <el-table
  86. size="small"
  87. :data="positionList"
  88. height="605"
  89. >
  90. <el-table-column
  91. label="编码"
  92. align="center"
  93. width="100"
  94. prop="booth_code"
  95. />
  96. <el-table-column
  97. label="名称"
  98. align="center"
  99. width="250"
  100. prop="booth_name"
  101. />
  102. <el-table-column
  103. label="IP地址"
  104. align="center"
  105. width="250"
  106. prop="ip_address"
  107. />
  108. <el-table-column
  109. label="备注"
  110. align="center"
  111. prop="description"
  112. />
  113. <el-table-column
  114. label="操作"
  115. align="center"
  116. >
  117. <template #default="scope">
  118. <el-button
  119. text
  120. type="primary"
  121. icon="edit"
  122. @click="openPosition('岗亭编辑', scope.row)"
  123. >
  124. 编辑
  125. </el-button>
  126. <el-button
  127. text
  128. type="primary"
  129. icon="delete"
  130. @click="delPosition(scope.row.ID)"
  131. >
  132. 删除
  133. </el-button>
  134. </template>
  135. </el-table-column>
  136. </el-table>
  137. <div style="width: 100%;display: flex;justify-content: end">
  138. <el-pagination
  139. :current-page="searchGuardBooth.page"
  140. :page-size="searchGuardBooth.page_size"
  141. :page-sizes="[10, 30, 50, 100]"
  142. :total="guardTotal"
  143. layout="total, sizes, prev, pager, next, jumper"
  144. style="padding-right: 10px"
  145. @current-change="handleCurrentChange"
  146. @size-change="handleSizeChange"
  147. />
  148. </div>
  149. </el-tab-pane>
  150. <el-tab-pane
  151. label="通道"
  152. name="people"
  153. >
  154. <el-form inline>
  155. <el-form-item>
  156. <el-button
  157. icon="Plus"
  158. text
  159. type="success"
  160. @click="openChannel('通道新增','')"
  161. >新增
  162. </el-button>
  163. </el-form-item>
  164. <el-form-item>
  165. <el-button
  166. icon="Refresh"
  167. text
  168. type="primary"
  169. @click="getChannelList"
  170. >刷新
  171. </el-button>
  172. </el-form-item>
  173. </el-form>
  174. <el-table
  175. size="small"
  176. :data="channelList"
  177. height="605"
  178. >
  179. <el-table-column
  180. label="编码"
  181. align="center"
  182. width="100"
  183. prop="channel_code"
  184. />
  185. <el-table-column
  186. label="名称"
  187. align="center"
  188. width="250"
  189. prop="channel_name"
  190. />
  191. <el-table-column
  192. v-slot="scope"
  193. label="进出方向"
  194. align="center"
  195. width="150"
  196. >
  197. {{ scope.row.direction === 'in' ? '进' : '出' }}
  198. </el-table-column>
  199. <el-table-column
  200. label="是否允许临时车进出"
  201. align="center"
  202. width="200"
  203. >
  204. <template #default="scope">
  205. <el-button
  206. plain
  207. :type="scope.row.allow_temporary ? 'success' : 'danger'"
  208. >
  209. {{ scope.row.allow_temporary ? '允许' : '不允许' }}
  210. </el-button>
  211. </template>
  212. </el-table-column>
  213. <el-table-column
  214. label="岗亭id"
  215. align="center"
  216. prop="booth_id"
  217. />
  218. <el-table-column
  219. v-slot="scope"
  220. label="操作"
  221. align="center"
  222. >
  223. <el-button
  224. type="primary"
  225. icon="edit"
  226. text
  227. @click="openChannel('通道编辑', scope.row)"
  228. >编辑
  229. </el-button>
  230. <el-button
  231. type="primary"
  232. icon="delete"
  233. text
  234. >删除
  235. </el-button>
  236. </el-table-column>
  237. </el-table>
  238. <div style="width: 100%;display: flex;justify-content: end">
  239. <el-pagination
  240. :current-page="queryChannelData.page"
  241. :page-size="queryChannelData.page_size"
  242. :page-sizes="[10, 30, 50, 100]"
  243. :total="channelTotal"
  244. layout="total, sizes, prev, pager, next, jumper"
  245. style="padding-right: 10px"
  246. @current-change="handleCurrentChannel"
  247. @size-change="handleSizeChannel"
  248. />
  249. </div>
  250. </el-tab-pane>
  251. <el-tab-pane
  252. label="设备"
  253. name="department"
  254. >
  255. <el-form inline>
  256. <el-form-item>
  257. <el-button
  258. icon="Plus"
  259. text
  260. type="success"
  261. @click="openDevice('新增设备','')"
  262. >新增
  263. </el-button>
  264. </el-form-item>
  265. <el-form-item>
  266. <el-button
  267. icon="Refresh"
  268. text
  269. type="primary"
  270. @click="getDeviceList"
  271. >刷新
  272. </el-button>
  273. </el-form-item>
  274. </el-form>
  275. <el-table
  276. size="small"
  277. :data="deviceList"
  278. height="605"
  279. >
  280. <el-table-column
  281. label="编码"
  282. align="center"
  283. width="100"
  284. prop="device_code"
  285. />
  286. <el-table-column
  287. label="名称"
  288. align="center"
  289. width="250"
  290. prop="device_name"
  291. />
  292. <el-table-column
  293. label="类别"
  294. align="center"
  295. width="150"
  296. prop="connect_type"
  297. />
  298. <el-table-column
  299. label="IP地址"
  300. align="center"
  301. width="200"
  302. prop="ip_address"
  303. />
  304. <el-table-column
  305. label="端口"
  306. align="center"
  307. width="150"
  308. prop="port"
  309. />
  310. <el-table-column
  311. label="是否启用"
  312. align="center"
  313. width="150"
  314. >
  315. <template #default="scope">
  316. <el-button
  317. :type="scope.row.is_active ? 'success' : 'danger'"
  318. plain
  319. >
  320. {{ scope.row.is_active ? '启用' : '不启用' }}
  321. </el-button>
  322. </template>
  323. </el-table-column>
  324. <el-table-column
  325. label="操作"
  326. align="center"
  327. >
  328. <template #default="scope">
  329. <el-button
  330. type="primary"
  331. icon="Link"
  332. text
  333. @click="connectDevice(scope.row)"
  334. >连接
  335. </el-button>
  336. <el-button
  337. type="primary"
  338. icon="edit"
  339. text
  340. @click="openDevice('编辑设备', scope.row)"
  341. >编辑
  342. </el-button>
  343. <el-button
  344. type="primary"
  345. icon="delete"
  346. text
  347. @click="removeDevice(scope.row.ID)"
  348. >删除
  349. </el-button>
  350. </template>
  351. </el-table-column>
  352. </el-table>
  353. <div style="width: 100%;display: flex;justify-content: end">
  354. <el-pagination
  355. :current-page="searchDeviceData.page"
  356. :page-size="searchDeviceData.page_size"
  357. :page-sizes="[10, 30, 50, 100]"
  358. :total="deviceTotal"
  359. layout="total, sizes, prev, pager, next, jumper"
  360. style="padding-right: 10px"
  361. @current-change="handleCurrentDevice"
  362. @size-change="handleSizeDevice"
  363. />
  364. </div>
  365. </el-tab-pane>
  366. </el-tabs>
  367. </el-col>
  368. <el-dialog
  369. v-model="positionShow"
  370. :title="positionTitle"
  371. width="500"
  372. >
  373. <el-form label-width="90">
  374. <el-form-item label="停车区域:">
  375. <el-select
  376. v-model="positionRegionName"
  377. placeholder="请选择停车区域"
  378. @change="changePositionRegion"
  379. >
  380. <el-option
  381. v-for="item in regionList"
  382. :key="item.ID"
  383. :value="item.lot_name"
  384. />
  385. </el-select>
  386. </el-form-item>
  387. <el-form-item label="岗亭编码:">
  388. <el-input v-model="positionData.booth_code" />
  389. </el-form-item>
  390. <el-form-item label="岗亭名称:">
  391. <el-input v-model="positionData.booth_name" />
  392. </el-form-item>
  393. <el-form-item label="IP地址:">
  394. <el-input v-model="positionData.ip_address" />
  395. </el-form-item>
  396. <el-form-item label="备注:">
  397. <el-input
  398. v-model="positionData.description"
  399. type="textarea"
  400. />
  401. </el-form-item>
  402. </el-form>
  403. <template #footer>
  404. <div class="dialog-footer">
  405. <el-button @click="positionShow = false">取消</el-button>
  406. <el-button
  407. type="primary"
  408. @click="addPosition"
  409. >
  410. 确认
  411. </el-button>
  412. </div>
  413. </template>
  414. </el-dialog>
  415. <el-dialog
  416. v-model="channelShow"
  417. :title="channelTitle"
  418. width="500"
  419. >
  420. <el-form>
  421. <el-form-item label="通道岗亭:">
  422. <el-select
  423. v-model="channelPositionName"
  424. @change="changeChannelPosition"
  425. >
  426. <el-option
  427. v-for="item in positionList"
  428. :key="item.ID"
  429. :value="item.booth_name"
  430. :label="item.booth_name"
  431. />
  432. </el-select>
  433. </el-form-item>
  434. <el-form-item label="通道编码:">
  435. <el-input v-model="channelData.channel_code" />
  436. </el-form-item>
  437. <el-form-item label="通道名称:">
  438. <el-input v-model="channelData.channel_name" />
  439. </el-form-item>
  440. <el-form-item label="进出方向:">
  441. <el-radio-group
  442. v-model="channelData.direction"
  443. size="large"
  444. fill="#409eff"
  445. >
  446. <el-radio-button
  447. label="进"
  448. value="in"
  449. />
  450. <el-radio-button
  451. label="出"
  452. value="out"
  453. />
  454. </el-radio-group>
  455. </el-form-item>
  456. <el-form-item label="是否允许临时车进出:">
  457. <el-radio-group
  458. v-model="channelData.allow_temporary"
  459. size="large"
  460. fill="#409eff"
  461. >
  462. <el-radio-button
  463. label="否"
  464. :value="false"
  465. />
  466. <el-radio-button
  467. label="是"
  468. :value="true"
  469. />
  470. </el-radio-group>
  471. </el-form-item>
  472. <el-form-item label="备注:">
  473. <el-input
  474. v-model="channelData.description"
  475. type="textarea"
  476. />
  477. </el-form-item>
  478. </el-form>
  479. <template #footer>
  480. <div class="dialog-footer">
  481. <el-button @click="channelShow = false">取消</el-button>
  482. <el-button
  483. type="primary"
  484. @click="channelOperation"
  485. >
  486. 确认
  487. </el-button>
  488. </div>
  489. </template>
  490. </el-dialog>
  491. <el-dialog
  492. v-model="deviceShow"
  493. :title="deviceTitle"
  494. width="500"
  495. >
  496. <el-form label-width="100">
  497. <el-form-item label="设备通道:">
  498. <el-select
  499. v-model="deviceChannelName"
  500. @change="changeDeviceChannel"
  501. >
  502. <el-option
  503. v-for="item in channelList"
  504. :key="item.ID"
  505. :value="item.channel_name"
  506. :label="item.channel_name"
  507. />
  508. </el-select>
  509. </el-form-item>
  510. <el-form-item label="设备名称:">
  511. <el-input v-model="deviceData.device_name" />
  512. </el-form-item>
  513. <el-form-item label="设备编码:">
  514. <el-input v-model="deviceData.device_code" />
  515. </el-form-item>
  516. <el-form-item label="连接方式:">
  517. <el-select v-model="deviceData.connect_type">
  518. <el-option
  519. label="tcp"
  520. value="tcp"
  521. />
  522. <el-option
  523. label="serial"
  524. value="serial"
  525. />
  526. </el-select>
  527. </el-form-item>
  528. <el-form-item
  529. v-show="deviceData.connect_type === 'tcp'"
  530. label="IP地址:"
  531. >
  532. <el-input v-model="deviceData.ip_address" />
  533. </el-form-item>
  534. <el-form-item
  535. v-show="deviceData.connect_type === 'tcp'"
  536. label="端口:"
  537. >
  538. <el-input
  539. v-model="deviceData.port"
  540. type="number"
  541. />
  542. </el-form-item>
  543. <el-form-item
  544. v-show="deviceData.connect_type === 'serial'"
  545. label="串口名称:"
  546. >
  547. <el-input v-model="deviceData.com_port" />
  548. </el-form-item>
  549. <el-form-item
  550. v-show="deviceData.connect_type === 'serial'"
  551. label="串口波特率:"
  552. >
  553. <el-input
  554. v-model="deviceData.baud_rate"
  555. type="number"
  556. />
  557. </el-form-item>
  558. <el-form-item label="是否启用:">
  559. <el-radio-group
  560. v-model="deviceData.is_active"
  561. size="large"
  562. fill="#409eff"
  563. >
  564. <el-radio-button
  565. label="否"
  566. :value="false"
  567. />
  568. <el-radio-button
  569. label="是"
  570. :value="true"
  571. />
  572. </el-radio-group>
  573. </el-form-item>
  574. <el-form-item label="备注:">
  575. <el-input
  576. v-model="deviceData.description"
  577. type="textarea"
  578. />
  579. </el-form-item>
  580. </el-form>
  581. <template #footer>
  582. <div class="dialog-footer">
  583. <el-button @click="deviceShow = false">取消</el-button>
  584. <el-button
  585. type="primary"
  586. @click="deviceOperation"
  587. >
  588. 确认
  589. </el-button>
  590. </div>
  591. </template>
  592. </el-dialog>
  593. <el-dialog
  594. v-model="regionShow"
  595. :title="regionTitle"
  596. width="500"
  597. >
  598. <el-form label-width="90">
  599. <el-form-item label="区域编码:">
  600. <el-input v-model="regionData.lot_code" />
  601. </el-form-item>
  602. <el-form-item label="区域名称:">
  603. <el-input v-model="regionData.lot_name" />
  604. </el-form-item>
  605. <el-form-item label="区域容量:">
  606. <el-input
  607. v-model="regionData.capacity"
  608. type="number"
  609. />
  610. </el-form-item>
  611. <el-form-item label="备注:">
  612. <el-input
  613. v-model="regionData.description"
  614. type="textarea"
  615. />
  616. </el-form-item>
  617. </el-form>
  618. <template #footer>
  619. <div class="dialog-footer">
  620. <el-button @click="regionShow = false">取消</el-button>
  621. <el-button
  622. type="primary"
  623. @click="regionOperation"
  624. >
  625. 确认
  626. </el-button>
  627. </div>
  628. </template>
  629. </el-dialog>
  630. </el-row>
  631. </template>
  632. <script setup>
  633. // import sign from '@/assets/sign.png'
  634. import { ref, reactive, onMounted } from 'vue'
  635. import {
  636. addGuardBooth,
  637. obtainGuardBoothList,
  638. editGuardBooth,
  639. deleteGuardBooth,
  640. } from '@/api/guardBooth'
  641. import {
  642. addChannel,
  643. editChannel,
  644. obtainChannelList,
  645. } from '@/api/channel'
  646. import { addDevice, obtainDeviceList, editDevice, deleteDevice, joinDevice } from '@/api/device'
  647. import { addPullOver, editPullOver, obtainPullOverList, removePullOver } from '@/api/pullOver'
  648. import { ElMessage, ElMessageBox } from 'element-plus'
  649. const activeName = ref('detail')
  650. const handleClick = () => {
  651. }
  652. const positionShow = ref(false)
  653. const positionTitle = ref('岗亭新增')
  654. // 岗亭数据.......................................
  655. const positionRegionName = ref('')
  656. const positionData = reactive({
  657. id: 0,
  658. booth_code: '',
  659. booth_name: '',
  660. ip_address: '',
  661. description: '',
  662. parking_lot_id: 0
  663. })
  664. const guardTotal = ref(0)
  665. const positionList = reactive([])
  666. const addPosition = () => {
  667. if (positionTitle.value === '岗亭新增') {
  668. if (positionData.parking_lot_id === 0) {
  669. ElMessage.error('请选择停车区域')
  670. return
  671. }
  672. if (positionData.booth_name === '' || positionData.booth_code === '' || positionData.ip_address === '') {
  673. ElMessage.error('请将除备注以外的信息填写完整')
  674. return
  675. }
  676. addGuardBooth(positionData).then(res => {
  677. if (res.code === 0) {
  678. ElMessage.success('添加成功')
  679. positionShow.value = false
  680. getGuardBoothList()
  681. }
  682. })
  683. } else {
  684. if (positionData.parking_lot_id === 0) {
  685. ElMessage.error('请选择停车区域')
  686. return
  687. }
  688. if (positionData.booth_name === '' || positionData.booth_code === '' || positionData.ip_address === '') {
  689. ElMessage.error('请将除备注以外的信息填写完整')
  690. return
  691. }
  692. editGuardBooth(positionData).then(res => {
  693. if (res.code === 0) {
  694. ElMessage.success('更新成功')
  695. positionShow.value = false
  696. getGuardBoothList()
  697. }
  698. })
  699. }
  700. }
  701. const changePositionRegion = (val) => {
  702. regionList.forEach(item => {
  703. if (item.lot_name === val) {
  704. positionData.parking_lot_id = item.ID
  705. }
  706. })
  707. }
  708. const openPosition = (head, data) => {
  709. positionTitle.value = head
  710. positionShow.value = true
  711. if (head === '岗亭编辑') {
  712. positionData.id = data.ID
  713. positionData.booth_code = data.booth_code
  714. positionData.booth_name = data.booth_name
  715. positionData.ip_address = data.ip_address
  716. positionData.description = data.description
  717. positionData.parking_lot_id = data.parking_lot_id
  718. regionList.forEach(item => {
  719. if (item.ID === data.parking_lot_id) {
  720. positionRegionName.value = item.lot_name
  721. }
  722. })
  723. } else {
  724. positionData.ip_address = ''
  725. positionData.description = ''
  726. positionData.booth_code = ''
  727. positionData.booth_name = ''
  728. positionData.parking_lot_id = 0
  729. positionRegionName.value = ''
  730. }
  731. }
  732. const searchGuardBooth = reactive({
  733. parking_lot_id: 0,
  734. booth_code: '',
  735. booth_name: '',
  736. page: 1,
  737. page_size: 10
  738. })
  739. const handleCurrentChange = (val) => {
  740. searchGuardBooth.page = val
  741. getGuardBoothList()
  742. }
  743. const handleSizeChange = (val) => {
  744. searchGuardBooth.page_size = val
  745. searchGuardBooth.page = 1
  746. getGuardBoothList()
  747. }
  748. const getGuardBoothList = () => {
  749. obtainGuardBoothList(searchGuardBooth).then(res => {
  750. if (res.code === 0) {
  751. positionList.length = 0
  752. positionList.push(...res.data.list)
  753. guardTotal.value = res.data.total
  754. }
  755. })
  756. }
  757. const delPosition = (id) => {
  758. ElMessageBox.confirm(
  759. '确定要删除该岗亭吗?',
  760. '提示',
  761. {
  762. confirmButtonText: '确认',
  763. cancelButtonText: '取消',
  764. type: 'warning',
  765. }
  766. )
  767. .then(() => {
  768. deleteGuardBooth(id).then(res => {
  769. if (res.code === 0) {
  770. ElMessage({
  771. type: 'success',
  772. message: '删除成功',
  773. })
  774. getGuardBoothList()
  775. } else {
  776. ElMessage({
  777. type: 'error',
  778. message: '删除失败',
  779. })
  780. }
  781. })
  782. })
  783. .catch(() => {
  784. ElMessage({
  785. type: 'info',
  786. message: '取消删除',
  787. })
  788. })
  789. }
  790. // 通道管理...................................................
  791. // 通道数据
  792. const channelShow = ref(false)
  793. const deviceTitle = ref('')
  794. const queryChannelData = reactive({
  795. parking_lot_id: 0,
  796. channel_code: '',
  797. channel_name: '',
  798. direction: '',
  799. page: 1,
  800. page_size: 10,
  801. allow_temporary: false
  802. })
  803. const channelPositionName = ref('')
  804. const channelData = reactive({
  805. id: 0,
  806. channel_code: '',
  807. channel_name: '',
  808. direction: 'in',
  809. allow_temporary: false,
  810. description: '',
  811. booth_id: 0,
  812. })
  813. const channelTitle = ref('通道新增')
  814. const channelList = reactive([])
  815. const changeChannelPosition = (val) => {
  816. positionList.forEach(item => {
  817. if (item.booth_name === val) {
  818. channelData.booth_id = item.ID
  819. }
  820. })
  821. }
  822. const channelTotal = ref(0)
  823. const openChannel = (head, data) => {
  824. channelTitle.value = head
  825. channelShow.value = true
  826. if (head === '通道编辑') {
  827. channelData.id = data.ID
  828. channelData.channel_code = data.channel_code
  829. channelData.channel_name = data.channel_name
  830. channelData.allow_temporary = data.allow_temporary
  831. channelData.direction = data.direction
  832. channelData.description = data.description
  833. channelData.booth_id = data.booth_id
  834. channelList.forEach(item => {
  835. if (item.ID === data.booth_id) {
  836. channelPositionName.value = item.booth_name
  837. }
  838. })
  839. } else {
  840. channelData.channel_code = ''
  841. channelData.channel_name = ''
  842. channelData.allow_temporary = false
  843. channelData.direction = 'in'
  844. channelData.description = ''
  845. channelData.booth_id = 0
  846. channelPositionName.value = ''
  847. }
  848. }
  849. const channelOperation = () => {
  850. if (channelTitle.value === '通道新增') {
  851. if (channelData.booth_id === 0) {
  852. ElMessage.error('请选择岗亭')
  853. return
  854. }
  855. if (channelData.channel_name === '' || channelData.channel_code === '') {
  856. ElMessage.error('请将除备注以外的信息填写完整')
  857. return
  858. }
  859. addChannel(channelData).then(res => {
  860. console.log('添加通道操作', res.data)
  861. if (res.code === 0) {
  862. ElMessage.success('添加成功')
  863. channelShow.value = false
  864. getChannelList()
  865. }
  866. })
  867. } else {
  868. if (channelData.booth_id === 0) {
  869. ElMessage.error('请选择岗亭')
  870. return
  871. }
  872. if (channelData.channel_name === '' || channelData.channel_code === '') {
  873. ElMessage.error('请将除备注以外的信息填写完整')
  874. return
  875. }
  876. editChannel(channelData).then(res => {
  877. if (res.code === 0) {
  878. ElMessage.success('更新成功')
  879. channelShow.value = false
  880. getChannelList()
  881. }
  882. })
  883. }
  884. }
  885. const handleCurrentChannel = (val) => {
  886. queryChannelData.page = val
  887. getChannelList()
  888. }
  889. const handleSizeChannel = (val) => {
  890. queryChannelData.page_size = val
  891. queryChannelData.page = 1
  892. getChannelList()
  893. }
  894. const getChannelList = () => {
  895. obtainChannelList(queryChannelData).then(res => {
  896. if (res.code === 0) {
  897. console.log(res.data)
  898. channelList.length = 0
  899. channelList.push(...res.data.list)
  900. channelTotal.value = res.data.total
  901. }
  902. })
  903. }
  904. // 设备管理...............................................
  905. const deviceData = reactive({
  906. id: 0,
  907. parking_lot_id: 0,
  908. device_code: '',
  909. device_name: '',
  910. baud_rate: 0,
  911. ip_address: '',
  912. port: 0,
  913. com_port: '',
  914. description: '',
  915. connect_type: '',
  916. is_active: false,
  917. channel_id: 0
  918. })
  919. const deviceChannelName = ref('')
  920. const deviceShow = ref(false)
  921. const openDevice = (head, data) => {
  922. deviceTitle.value = head
  923. deviceShow.value = true
  924. if (head === '编辑设备') {
  925. deviceData.id = data.ID
  926. deviceData.device_code = data.device_code
  927. deviceData.device_name = data.device_name
  928. deviceData.baud_rate = data.baud_rate
  929. deviceData.ip_address = data.ip_address
  930. deviceData.port = data.port
  931. deviceData.com_port = data.com_port
  932. deviceData.description = data.description
  933. deviceData.connect_type = data.connect_type
  934. deviceData.channel_id = data.channel_id
  935. deviceData.is_active = data.is_active
  936. channelList.forEach(item => {
  937. if (item.ID === data.channel_id) {
  938. deviceChannelName.value = item.channel_name
  939. }
  940. })
  941. } else {
  942. deviceData.device_code = ''
  943. deviceData.device_name = ''
  944. deviceData.baud_rate = 0
  945. deviceData.ip_address = ''
  946. deviceData.port = 0
  947. deviceData.com_port = ''
  948. deviceData.description = ''
  949. deviceData.connect_type = 'tcp'
  950. deviceData.channel_id = 0
  951. deviceData.is_active = false
  952. deviceChannelName.value = ''
  953. }
  954. }
  955. const deviceOperation = async() => {
  956. deviceData.baud_rate = Number(deviceData.baud_rate)
  957. deviceData.port = Number(deviceData.port)
  958. if (deviceTitle.value === '新增设备') {
  959. await addDevice(deviceData).then(res => {
  960. if (res.code === 0) {
  961. ElMessage.success('添加成功')
  962. deviceShow.value = false
  963. getDeviceList()
  964. } else {
  965. ElMessage.error(res.data.msg)
  966. }
  967. })
  968. } else {
  969. await editDevice(deviceData).then(res => {
  970. if (res.code === 0) {
  971. ElMessage.success('编辑成功')
  972. deviceShow.value = false
  973. getDeviceList()
  974. } else {
  975. ElMessage.error('编辑失败')
  976. }
  977. })
  978. }
  979. }
  980. const deviceList = reactive([])
  981. const changeDeviceChannel = (val) => {
  982. channelList.forEach(item => {
  983. if (item.channel_name === val) {
  984. deviceData.channel_id = item.ID
  985. }
  986. })
  987. }
  988. const deviceTotal = ref(0)
  989. const handleCurrentDevice = (val) => {
  990. searchDeviceData.page = val
  991. getDeviceList()
  992. }
  993. const handleSizeDevice = (val) => {
  994. searchDeviceData.page_size = val
  995. searchDeviceData.page = 1
  996. getDeviceList()
  997. }
  998. const searchDeviceData = reactive({
  999. parking_lot_id: 0,
  1000. device_code: '',
  1001. device_type: '',
  1002. device_name: '',
  1003. status: '',
  1004. page: 1,
  1005. page_size: 10
  1006. })
  1007. const getDeviceList = async() => {
  1008. await obtainDeviceList(searchDeviceData).then(res => {
  1009. if (res.code === 0) {
  1010. deviceList.length = 0
  1011. if (res.data.list !== null) {
  1012. deviceList.push(...res.data.list)
  1013. deviceTotal.value = res.data.total
  1014. }
  1015. }
  1016. })
  1017. }
  1018. const removeDevice = async(id) => {
  1019. ElMessageBox.confirm(
  1020. '确定要删除该设备吗?',
  1021. '提示',
  1022. {
  1023. confirmButtonText: '确认',
  1024. cancelButtonText: '取消',
  1025. type: 'warning',
  1026. }
  1027. )
  1028. .then(() => {
  1029. deleteDevice(id).then(res => {
  1030. if (res.code === 0) {
  1031. ElMessage({
  1032. type: 'success',
  1033. message: '删除成功',
  1034. })
  1035. getDeviceList()
  1036. } else {
  1037. ElMessage({
  1038. type: 'error',
  1039. message: '删除失败',
  1040. })
  1041. }
  1042. })
  1043. })
  1044. .catch(() => {
  1045. ElMessage({
  1046. type: 'info',
  1047. message: '取消删除',
  1048. })
  1049. })
  1050. }
  1051. const connectDevice = async(data) => {
  1052. await joinDevice(data.ID).then(res => {
  1053. if (res.code === 0) {
  1054. ElMessage.success('连接成功')
  1055. } else {
  1056. ElMessage.error(res.data.msg)
  1057. }
  1058. })
  1059. }
  1060. // 停车区域....................................
  1061. const regionList = reactive([])
  1062. // 查询停车区域
  1063. const getRegionList = async() => {
  1064. await obtainPullOverList().then(res => {
  1065. if (res.code === 0) {
  1066. regionList.length = 0
  1067. regionList.push(...res.data.list)
  1068. }
  1069. })
  1070. }
  1071. // 停车区域操作
  1072. const regionData = reactive({
  1073. id: 0,
  1074. lot_code: '',
  1075. lot_name: '',
  1076. capacity: 0,
  1077. description: ''
  1078. })
  1079. const regionShow = ref(false)
  1080. const regionTitle = ref('创建区域')
  1081. const openRegion = (head, data) => {
  1082. regionTitle.value = head
  1083. regionShow.value = true
  1084. if (head === '编辑区域') {
  1085. regionData.id = data.ID
  1086. regionData.lot_code = data.lot_code
  1087. regionData.lot_name = data.lot_name
  1088. regionData.capacity = data.capacity
  1089. regionData.description = data.description
  1090. } else {
  1091. regionData.lot_code = ''
  1092. regionData.lot_name = ''
  1093. regionData.capacity = 0
  1094. regionData.description = ''
  1095. }
  1096. }
  1097. const regionOperation = async() => {
  1098. if (regionTitle.value === '创建区域') {
  1099. regionData.capacity = Number(regionData.capacity)
  1100. await addPullOver(regionData).then(res => {
  1101. if (res.code === 0) {
  1102. getRegionList()
  1103. ElMessage.success('创建成功')
  1104. regionShow.value = false
  1105. }
  1106. })
  1107. } else {
  1108. await editPullOver(regionData).then(res => {
  1109. if (res.code === 0) {
  1110. getRegionList()
  1111. ElMessage.success('修改成功')
  1112. regionShow.value = false
  1113. }
  1114. })
  1115. }
  1116. }
  1117. const deleteRegion = (id) => {
  1118. ElMessageBox.confirm(
  1119. '确定要删除该停车区域吗?',
  1120. '提示',
  1121. {
  1122. confirmButtonText: '确认',
  1123. cancelButtonText: '取消',
  1124. type: 'warning',
  1125. }
  1126. )
  1127. .then(() => {
  1128. removePullOver(id).then(res => {
  1129. if (res.code === 0) {
  1130. ElMessage({
  1131. type: 'success',
  1132. message: '删除成功',
  1133. })
  1134. getRegionList()
  1135. } else {
  1136. ElMessage({
  1137. type: 'error',
  1138. message: '删除失败',
  1139. })
  1140. }
  1141. })
  1142. })
  1143. .catch(() => {
  1144. ElMessage({
  1145. type: 'info',
  1146. message: '取消删除',
  1147. })
  1148. })
  1149. }
  1150. const changeRegion = async(item) => {
  1151. searchGuardBooth.parking_lot_id = item.ID
  1152. queryChannelData.parking_lot_id = item.ID
  1153. searchDeviceData.parking_lot_id = item.ID
  1154. await getGuardBoothList()
  1155. await getChannelList()
  1156. await getDeviceList()
  1157. }
  1158. onMounted(async() => {
  1159. await getRegionList()
  1160. if (regionList.length !== 0) {
  1161. searchGuardBooth.parking_lot_id = regionList[0].ID
  1162. queryChannelData.parking_lot_id = regionList[0].ID
  1163. searchDeviceData.parking_lot_id = regionList[0].ID
  1164. await getGuardBoothList()
  1165. await getChannelList()
  1166. await getDeviceList()
  1167. }
  1168. })
  1169. </script>
  1170. <style scoped lang="scss">
  1171. .region {
  1172. width: 100%;
  1173. height: 800px;
  1174. background-color: #f5f5f5;
  1175. .regionTitle {
  1176. width: 100%;
  1177. height: 40px;
  1178. display: flex;
  1179. border-bottom: 1px solid;
  1180. background-color: #b9b8b8;
  1181. .regionTitle-text {
  1182. width: 70%;
  1183. height: 40px;
  1184. display: flex;
  1185. align-items: center;
  1186. padding-left: 10px;
  1187. }
  1188. .regionTitle-icon {
  1189. width: 20%;
  1190. height: 40px;
  1191. display: flex;
  1192. align-items: center;
  1193. }
  1194. }
  1195. }
  1196. .basicInformation {
  1197. height: 40px;
  1198. background-color: #f8fafd;
  1199. display: flex;
  1200. }
  1201. .operation {
  1202. width: 100%;
  1203. height: 50px;
  1204. margin-top: 5px;
  1205. }
  1206. </style>