parkingInfo.vue 31 KB

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