device.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831
  1. <template>
  2. <el-container>
  3. <el-header class="gva-search-box">
  4. <el-form
  5. v-model="deviceSearch"
  6. :inline="true"
  7. style="line-height: 75px"
  8. >
  9. <el-form-item label="名称">
  10. <el-input
  11. v-model="deviceSearch.name"
  12. />
  13. </el-form-item>
  14. <el-form-item label="序号">
  15. <el-input
  16. v-model="deviceSearch.sn"
  17. />
  18. </el-form-item>
  19. <el-form-item label="类型">
  20. <el-select
  21. v-model.number="deviceSearch.genre"
  22. style="width: 240px"
  23. clearable
  24. >
  25. <el-option
  26. v-for="item in deviceGenre"
  27. :key="item.ID"
  28. :label="item.name"
  29. :value="item.ID"
  30. />
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item>
  34. <el-button
  35. type="primary"
  36. @click="getData"
  37. >查询</el-button>
  38. </el-form-item>
  39. </el-form>
  40. </el-header>
  41. <el-main class="gva-table-box">
  42. <div style="margin: 0 0 20px 0 ">
  43. <el-button
  44. type="success"
  45. @click="isDeviceAddDialog"
  46. >添加</el-button>
  47. <el-divider direction="vertical" />
  48. <el-button
  49. type="primary"
  50. @click="deviceGenreDrawer = true"
  51. >类型操作</el-button>
  52. </div>
  53. <el-table
  54. :data="deviceData"
  55. style="width: 100%;min-height:600px"
  56. >
  57. <el-table-column
  58. type="selection"
  59. width="55"
  60. align="center"
  61. />
  62. <el-table-column
  63. prop="name"
  64. label="名称"
  65. align="center"
  66. />
  67. <el-table-column
  68. prop="sn"
  69. label="序号"
  70. align="center"
  71. />
  72. <el-table-column
  73. prop="deviceGenre.name"
  74. label="类型"
  75. align="center"
  76. />
  77. <el-table-column
  78. prop="tunnel.name"
  79. label="隧道"
  80. align="center"
  81. />
  82. <el-table-column
  83. label="操作"
  84. align="center"
  85. >
  86. <template #default="scope">
  87. <el-button
  88. type="primary"
  89. @click="isDeviceEditDialog(scope.row)"
  90. >
  91. 修改
  92. </el-button>
  93. <el-button
  94. type="danger"
  95. @click="deviceDelete(scope.row)"
  96. >
  97. 删除
  98. </el-button>
  99. </template>
  100. </el-table-column>
  101. </el-table>
  102. <div class="gva-pagination">
  103. <el-pagination
  104. :current-page="deviceSearch.pageInfo.page"
  105. :page-size="deviceSearch.pageInfo.pageSize"
  106. :page-sizes="[10, 30, 50, 100]"
  107. :total="total"
  108. layout="total, sizes, prev, pager, next, jumper"
  109. @current-change="handleCurrentChange"
  110. @size-change="handleSizeChange"
  111. />
  112. </div>
  113. </el-main>
  114. <!-- 设备类型操作-->
  115. <el-drawer
  116. v-model="deviceGenreDrawer"
  117. title="设备类型操作"
  118. direction="rtl"
  119. size="30%"
  120. >
  121. <div style="margin: 0 0 20px 0">
  122. <el-button
  123. type="success"
  124. @click="deviceGenreAddDialog=true"
  125. >添加</el-button>
  126. </div>
  127. <el-table
  128. :data="deviceGenre"
  129. style="width: 100%"
  130. >
  131. <el-table-column
  132. prop="name"
  133. label="名称"
  134. />
  135. <el-table-column
  136. prop="type"
  137. label="硬件类型"
  138. />
  139. <el-table-column label="操作">
  140. <template #default="scope">
  141. <el-button
  142. size="small"
  143. @click="isDeviceGenreEditDialog(scope.row)"
  144. >
  145. 修改
  146. </el-button>
  147. <el-button
  148. size="small"
  149. type="danger"
  150. @click="deviceGenreDelete(scope.row)"
  151. >
  152. 删除
  153. </el-button>
  154. </template>
  155. </el-table-column>
  156. </el-table>
  157. </el-drawer>
  158. <!-- 设备类型新增-->
  159. <el-dialog
  160. v-model="deviceGenreAddDialog"
  161. title="设备类型新增"
  162. width="300"
  163. align-center
  164. >
  165. <el-form
  166. ref="deviceGenreRef"
  167. :model="deviceGenreData"
  168. :rules="deviceGenreRules"
  169. >
  170. <el-form-item
  171. label="类型名称"
  172. prop="name"
  173. >
  174. <el-input
  175. v-model="deviceGenreData.name"
  176. label="类型名称"
  177. />
  178. </el-form-item>
  179. <el-form-item
  180. label="硬件类型"
  181. prop="type"
  182. >
  183. <el-select
  184. v-model="deviceGenreData.type"
  185. style="width: 240px"
  186. >
  187. <el-option
  188. v-for="item in genreOptions"
  189. :key="item.value"
  190. :label="item.label"
  191. :value="item.value"
  192. />
  193. </el-select>
  194. </el-form-item>
  195. <el-form-item label="设备图标">
  196. <typeIcon
  197. :meta="iconData"
  198. style="width: 100%"
  199. />
  200. </el-form-item>
  201. </el-form>
  202. <template #footer>
  203. <div class="dialog-footer">
  204. <el-button @click="deviceGenreAddDialog = false;deviceGenreRef.resetFields();">取消</el-button>
  205. <el-button
  206. type="primary"
  207. @click="deviceGenreAdd"
  208. >
  209. 确定
  210. </el-button>
  211. </div>
  212. </template>
  213. </el-dialog>
  214. <!-- 设备类型修改-->
  215. <el-dialog
  216. v-model="deviceGenreEditDialog"
  217. title="设备类型修改"
  218. width="300"
  219. align-center
  220. >
  221. <el-form
  222. ref="deviceGenreRef"
  223. :model="deviceGenreData"
  224. :rules="deviceGenreRules"
  225. >
  226. <el-form-item
  227. label="类型名称"
  228. prop="name"
  229. >
  230. <el-input
  231. v-model="deviceGenreData.name"
  232. label="类型名称"
  233. />
  234. </el-form-item>
  235. <el-form-item
  236. label="硬件类型"
  237. prop="type"
  238. >
  239. <el-select
  240. v-model="deviceGenreData.type"
  241. style="width: 240px"
  242. >
  243. <el-option
  244. v-for="item in genreOptions"
  245. :key="item.value"
  246. :label="item.label"
  247. :value="item.value"
  248. />
  249. </el-select>
  250. </el-form-item>
  251. <el-form-item label="类型图标">
  252. <type-icon
  253. style="width: 100%"
  254. :meta="modifyIcon"
  255. />
  256. </el-form-item>
  257. </el-form>
  258. <template #footer>
  259. <div class="dialog-footer">
  260. <el-button @click="deviceGenreEditDialog = false;deviceGenreRef.resetFields();">取消</el-button>
  261. <el-button
  262. type="primary"
  263. @click="deviceGenreEdit"
  264. >
  265. 确定
  266. </el-button>
  267. </div>
  268. </template>
  269. </el-dialog>
  270. <!-- 设备添加-->
  271. <el-dialog
  272. v-model="deviceAddDialog"
  273. title="设备添加"
  274. width="500"
  275. align-center
  276. >
  277. <el-form
  278. ref="deviceRef"
  279. :model="device"
  280. :rules="deviceRules"
  281. style="line-height: 75px"
  282. >
  283. <el-form-item
  284. label="名称"
  285. prop="name"
  286. >
  287. <el-input
  288. v-model="device.name"
  289. style="width: 200px;"
  290. />
  291. </el-form-item>
  292. <el-form-item
  293. label="序号"
  294. prop="sn"
  295. >
  296. <el-input
  297. v-model="device.sn"
  298. disabled
  299. style="width: 200px;"
  300. />
  301. </el-form-item>
  302. <el-form-item
  303. label="类型"
  304. prop="genre"
  305. >
  306. <el-select
  307. v-model.number="device.genre"
  308. style="width: 240px"
  309. @change="changDevice"
  310. >
  311. <el-option
  312. v-for="item in deviceGenre"
  313. :key="item.ID"
  314. :label="item.name"
  315. :value="item.ID"
  316. />
  317. </el-select>
  318. </el-form-item>
  319. <el-form-item
  320. label="隧道"
  321. prop="tunnel"
  322. >
  323. <el-select
  324. v-model.number="device.tunnelId"
  325. style="width: 240px"
  326. clearable
  327. >
  328. <el-option
  329. v-for="item in tunnel"
  330. :key="item.ID"
  331. :label="item.name"
  332. :value="item.ID"
  333. />
  334. </el-select>
  335. </el-form-item>
  336. <el-form-item
  337. label="设备地址"
  338. prop="address"
  339. >
  340. <el-input
  341. v-model="device.address"
  342. style="width: 200px;"
  343. />
  344. </el-form-item>
  345. <el-form-item
  346. v-if="isDevice === '环境设备'"
  347. label="采集时间"
  348. prop="taskTime"
  349. >
  350. <el-input
  351. v-model.number="device.taskTime"
  352. style="width: 200px;"
  353. />
  354. </el-form-item>
  355. <el-form-item
  356. v-if="isDevice === '环境设备'"
  357. label="延迟时间"
  358. prop="waitTime"
  359. >
  360. <el-input
  361. v-model.number="device.waitTime"
  362. style="width: 200px;"
  363. />
  364. </el-form-item>
  365. <el-form-item
  366. v-if="isDevice === '开关设备'"
  367. label="雷达编号"
  368. prop="radarId"
  369. >
  370. <el-input
  371. v-model.number="device.radarId"
  372. style="width: 200px;"
  373. />
  374. </el-form-item>
  375. <el-form-item
  376. label="串口编号"
  377. prop="serialId"
  378. >
  379. <el-input
  380. v-model.number="device.serialId"
  381. style="width: 200px;"
  382. />
  383. </el-form-item>
  384. </el-form>
  385. <template #footer>
  386. <div class="dialog-footer">
  387. <el-button @click="deviceAddDialog = false;deviceRef.resetFields();">取消</el-button>
  388. <el-button
  389. type="primary"
  390. @click="deviceAdd"
  391. >
  392. 确定
  393. </el-button>
  394. </div>
  395. </template>
  396. </el-dialog>
  397. <!-- 设备修改-->
  398. <el-dialog
  399. v-model="deviceEditDialog"
  400. title="设备修改"
  401. width="500"
  402. align-center
  403. >
  404. <el-form
  405. ref="deviceRef"
  406. :model="device"
  407. :rules="deviceRules"
  408. style="line-height: 75px"
  409. >
  410. <el-form-item
  411. label="名称"
  412. prop="name"
  413. >
  414. <el-input
  415. v-model="device.name"
  416. style="width: 200px;"
  417. />
  418. </el-form-item>
  419. <el-form-item
  420. label="序号"
  421. prop="sn"
  422. >
  423. <el-input
  424. v-model="device.sn"
  425. disabled
  426. style="width: 200px;"
  427. />
  428. </el-form-item>
  429. <el-form-item
  430. label="类型"
  431. prop="genre"
  432. >
  433. <el-select
  434. v-model.number="device.genre"
  435. style="width: 240px"
  436. @change="changDevice"
  437. >
  438. <el-option
  439. v-for="item in deviceGenre"
  440. :key="item.ID"
  441. :label="item.name"
  442. :value="item.ID"
  443. />
  444. </el-select>
  445. </el-form-item>
  446. <el-form-item
  447. label="隧道"
  448. prop="tunnel"
  449. >
  450. <el-select
  451. v-model.number="device.tunnelId"
  452. style="width: 240px"
  453. clearable
  454. >
  455. <el-option
  456. v-for="item in tunnel"
  457. :key="item.ID"
  458. :label="item.name"
  459. :value="item.ID"
  460. />
  461. </el-select>
  462. </el-form-item>
  463. <el-form-item
  464. label="设备地址"
  465. prop="address"
  466. >
  467. <el-input
  468. v-model="device.address"
  469. style="width: 200px;"
  470. />
  471. </el-form-item>
  472. <el-form-item
  473. v-if="isDevice === '环境设备'"
  474. label="采集时间"
  475. prop="taskTime"
  476. >
  477. <el-input
  478. v-model.number="device.taskTime"
  479. style="width: 200px;"
  480. />
  481. </el-form-item>
  482. <el-form-item
  483. v-if="isDevice === '环境设备'"
  484. label="延迟时间"
  485. prop="waitTime"
  486. >
  487. <el-input
  488. v-model.number="device.waitTime"
  489. style="width: 200px;"
  490. />
  491. </el-form-item>
  492. <el-form-item
  493. v-if="isDevice === '开关设备'"
  494. label="雷达编号"
  495. prop="radarId"
  496. >
  497. <el-input
  498. v-model.number="device.radarId"
  499. style="width: 200px;"
  500. />
  501. </el-form-item>
  502. <el-form-item
  503. label="串口编号"
  504. prop="serialId"
  505. >
  506. <el-input
  507. v-model.number="device.serialId"
  508. style="width: 200px;"
  509. />
  510. </el-form-item>
  511. </el-form>
  512. <template #footer>
  513. <div class="dialog-footer">
  514. <el-button @click="deviceEditDialog = false;deviceRef.resetFields();">取消</el-button>
  515. <el-button
  516. type="primary"
  517. @click="deviceEdit"
  518. >
  519. 确定
  520. </el-button>
  521. </div>
  522. </template>
  523. </el-dialog>
  524. </el-container>
  525. </template>
  526. <script setup>
  527. import { ref, reactive, onMounted } from 'vue'
  528. import { ElMessage, ElMessageBox } from 'element-plus'
  529. import {
  530. createDevice,
  531. createDeviceGenre, deleteDevice,
  532. deleteDeviceGenre,
  533. queryAllDeviceGenres,
  534. queryDeviceList, updateDevice,
  535. updateDeviceGenre
  536. } from '@/api/device'
  537. import { queryAllTunnels } from '@/api/tunnel'
  538. import typeIcon from '@/view/superAdmin/menu/icon.vue'
  539. // 搜索条件
  540. const deviceSearch = ref({
  541. pageInfo: {
  542. page: 1,
  543. pageSize: 10
  544. },
  545. name: '',
  546. sn: '',
  547. genre: undefined
  548. })
  549. const total = ref(0)
  550. // 分页
  551. const handleSizeChange = (val) => {
  552. deviceSearch.value.pageInfo.pageSize = val
  553. getData()
  554. }
  555. const handleCurrentChange = (val) => {
  556. deviceSearch.value.pageInfo.page = val
  557. getData()
  558. }
  559. const deviceGenre = ref()
  560. const deviceData = ref()
  561. const tunnel = ref()
  562. const getData = async() => {
  563. await queryAllDeviceGenres().then(res => {
  564. deviceGenre.value = res.data
  565. device.value.genre = res.data[0].ID
  566. })
  567. await queryAllTunnels().then(res => {
  568. tunnel.value = res.data
  569. })
  570. await queryDeviceList(deviceSearch.value).then(res => {
  571. deviceData.value = res.data.list
  572. console.log(deviceData.value)
  573. deviceSearch.value.pageInfo.page = res.data.page
  574. deviceSearch.value.pageInfo.pageSize = res.data.pageSize
  575. total.value = res.data.total
  576. })
  577. }
  578. // 设备类型 --------------------------------------------------------------------
  579. const deviceGenreDrawer = ref(false)
  580. const deviceGenreData = ref({
  581. id: 0,
  582. name: '',
  583. type: '',
  584. iconAddress: ''
  585. })
  586. const genreOptions = [
  587. {
  588. value: '环境设备',
  589. label: '环境设备',
  590. },
  591. {
  592. value: '开关设备',
  593. label: '开关设备',
  594. }
  595. ]
  596. const deviceGenreRef = ref(null)
  597. const deviceGenreRules = reactive({
  598. name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
  599. type: [{ required: true, message: '硬件类型不能为空', trigger: 'blur' }]
  600. })
  601. // 添加
  602. const deviceGenreAddDialog = ref(false)
  603. const deviceGenreAdd = () => {
  604. deviceGenreRef.value.validate(async(valid) => {
  605. if (valid) {
  606. deviceGenreData.value.id = 0
  607. await createDeviceGenre(deviceGenreData.value).then(res => {
  608. deviceGenreAddDialog.value = false
  609. if (res.code === 0) {
  610. ElMessage.success('添加成功')
  611. }
  612. getData()
  613. })
  614. } else {
  615. console.log('验证失败,请检查输入')
  616. return false
  617. }
  618. })
  619. }
  620. // 修改
  621. const deviceGenreEditDialog = ref(false)
  622. const isDeviceGenreEditDialog = (val) => {
  623. deviceGenreEditDialog.value = true
  624. deviceGenreData.value = val
  625. }
  626. const deviceGenreEdit = async() => {
  627. deviceGenreData.value.iconAddress = modifyIcon.icon
  628. deviceGenreRef.value.validate(async(valid) => {
  629. if (valid) {
  630. await updateDeviceGenre(deviceGenreData.value).then(res => {
  631. deviceGenreEditDialog.value = false
  632. Object.assign(modifyIcon, {
  633. activeName: '',
  634. title: '',
  635. icon: '',
  636. defaultMenu: false,
  637. closeTab: false,
  638. keepAlive: false,
  639. })
  640. if (res.code === 0) {
  641. ElMessage.success('修改成功')
  642. }
  643. getData()
  644. })
  645. } else {
  646. console.log('验证失败,请检查输入')
  647. return false
  648. }
  649. })
  650. }
  651. // 删除
  652. const deviceGenreDelete = async(val) => {
  653. ElMessageBox.confirm(
  654. '将永久删除改数据,请问继续吗?',
  655. '删除',
  656. {
  657. confirmButtonText: '确定',
  658. cancelButtonText: '取消',
  659. type: 'warning',
  660. }
  661. )
  662. .then(async() => {
  663. await deleteDeviceGenre(val.ID).then(res => {
  664. if (res.code === 0) {
  665. ElMessage.success('删除成功')
  666. }
  667. getData()
  668. })
  669. })
  670. .catch(() => {
  671. ElMessage({
  672. type: 'info',
  673. message: '删除已取消',
  674. })
  675. })
  676. }
  677. // 设备 -------------------------------------------------------------------
  678. // 初始数据
  679. const device = ref({
  680. id: 0,
  681. name: '',
  682. sn: '',
  683. tunnelId: undefined,
  684. genre: undefined,
  685. address: '',
  686. taskTime: 0,
  687. waitTime: 0,
  688. radarId: 0,
  689. serialId: 1
  690. })
  691. const isDevice = ref('环境设备')
  692. const changDevice = (item) => {
  693. isDevice.value = deviceGenre.value.find(item => item.ID === device.value.genre).type
  694. if (isDevice.value === '环境设备') {
  695. device.value.taskTime = 0
  696. device.value.waitTime = 0
  697. } else if (isDevice.value === '开关设备') {
  698. device.value.radarId = 0
  699. }
  700. }
  701. const deviceRef = ref(null)
  702. const deviceRules = reactive({
  703. name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
  704. sn: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
  705. genre: [{ required: true, message: '设备类型不能为空', trigger: 'blur' }],
  706. address: [{ required: true, message: '设备地址不能为空', trigger: 'blur' }],
  707. serialId: [{ required: true, message: '串口编号不能为空', trigger: 'blur' }],
  708. })
  709. // 新增
  710. const deviceAddDialog = ref(false)
  711. const isDeviceAddDialog = () => {
  712. deviceAddDialog.value = true
  713. device.value.sn = 'LC' + Date.now()
  714. }
  715. const deviceAdd = async() => {
  716. deviceRef.value.validate(async(valid) => {
  717. if (valid) {
  718. device.value.id = 0
  719. await createDevice(device.value).then(res => {
  720. deviceAddDialog.value = false
  721. if (res.code === 0) {
  722. ElMessage.success('添加成功')
  723. }
  724. getData()
  725. })
  726. } else {
  727. console.log('验证失败,请检查输入')
  728. return false
  729. }
  730. })
  731. }
  732. // 修改
  733. const deviceEditDialog = ref(false)
  734. const isDeviceEditDialog = (val) => {
  735. deviceEditDialog.value = true
  736. device.value = val
  737. isDevice.value = deviceGenre.value.find(item => item.ID === device.value.genre).type
  738. }
  739. const deviceEdit = async() => {
  740. deviceRef.value.validate(async(valid) => {
  741. if (valid) {
  742. await updateDevice(device.value).then(res => {
  743. deviceEditDialog.value = false
  744. if (res.code === 0) {
  745. ElMessage.success('修改成功')
  746. }
  747. getData()
  748. })
  749. } else {
  750. console.log('验证失败,请检查输入')
  751. return false
  752. }
  753. })
  754. }
  755. // 删除
  756. const deviceDelete = (val) => {
  757. ElMessageBox.confirm(
  758. '将永久删除改数据,请问继续吗?',
  759. '删除',
  760. {
  761. confirmButtonText: '确定',
  762. cancelButtonText: '取消',
  763. type: 'warning',
  764. }
  765. )
  766. .then(async() => {
  767. await deleteDevice(val.ID).then(res => {
  768. if (res.code === 0) {
  769. ElMessage.success('删除成功')
  770. }
  771. getData()
  772. })
  773. })
  774. .catch(() => {
  775. ElMessage({
  776. type: 'info',
  777. message: '删除已取消',
  778. })
  779. })
  780. }
  781. // 图标
  782. const iconData = reactive({
  783. activeName: '',
  784. title: '',
  785. icon: '',
  786. defaultMenu: false,
  787. closeTab: false,
  788. keepAlive: false,
  789. })
  790. const modifyIcon = reactive({
  791. activeName: '',
  792. title: '',
  793. icon: '',
  794. defaultMenu: false,
  795. closeTab: false,
  796. keepAlive: false,
  797. })
  798. onMounted(() => {
  799. getData()
  800. })
  801. </script>
  802. <style scoped lang="scss">
  803. </style>