浏览代码

巡检前端

jiangbiao 1 年之前
父节点
当前提交
fea0e6a2f9
共有 100 个文件被更改,包括 14940 次插入0 次删除
  1. 44 0
      ui/src/api/patrol/commonuse/bicycle.js
  2. 44 0
      ui/src/api/patrol/commonuse/cover.js
  3. 44 0
      ui/src/api/patrol/commonuse/downspout.js
  4. 44 0
      ui/src/api/patrol/commonuse/earplug.js
  5. 44 0
      ui/src/api/patrol/commonuse/movement.js
  6. 44 0
      ui/src/api/patrol/commonuse/pump.js
  7. 44 0
      ui/src/api/patrol/commonuse/safetyBelt.js
  8. 44 0
      ui/src/api/patrol/commonuse/tester.js
  9. 44 0
      ui/src/api/patrol/commonuse/walkitTalkie.js
  10. 44 0
      ui/src/api/patrol/dev/alarm.js
  11. 44 0
      ui/src/api/patrol/dev/annihilator.js
  12. 44 0
      ui/src/api/patrol/dev/bicycle.js
  13. 44 0
      ui/src/api/patrol/dev/cabinet.js
  14. 44 0
      ui/src/api/patrol/dev/cannon.js
  15. 44 0
      ui/src/api/patrol/dev/cctv.js
  16. 44 0
      ui/src/api/patrol/dev/cofferdam.js
  17. 44 0
      ui/src/api/patrol/dev/cover.js
  18. 44 0
      ui/src/api/patrol/dev/curtain.js
  19. 44 0
      ui/src/api/patrol/dev/door.js
  20. 44 0
      ui/src/api/patrol/dev/downspout.js
  21. 44 0
      ui/src/api/patrol/dev/earplug.js
  22. 44 0
      ui/src/api/patrol/dev/eyewash.js
  23. 44 0
      ui/src/api/patrol/dev/hoseBox.js
  24. 44 0
      ui/src/api/patrol/dev/movement.js
  25. 44 0
      ui/src/api/patrol/dev/paga.js
  26. 44 0
      ui/src/api/patrol/dev/postFire.js
  27. 44 0
      ui/src/api/patrol/dev/pump.js
  28. 44 0
      ui/src/api/patrol/dev/safetyBelt.js
  29. 44 0
      ui/src/api/patrol/dev/sandbox.js
  30. 44 0
      ui/src/api/patrol/dev/shield.js
  31. 44 0
      ui/src/api/patrol/dev/sprinkler.js
  32. 44 0
      ui/src/api/patrol/dev/standpipe.js
  33. 44 0
      ui/src/api/patrol/dev/tester.js
  34. 44 0
      ui/src/api/patrol/dev/walkieTalkie.js
  35. 44 0
      ui/src/api/patrol/dev/weathervane.js
  36. 44 0
      ui/src/api/patrol/emergency/cabinet.js
  37. 44 0
      ui/src/api/patrol/emergency/cctv.js
  38. 44 0
      ui/src/api/patrol/emergency/cofferdam.js
  39. 44 0
      ui/src/api/patrol/emergency/eyewash.js
  40. 44 0
      ui/src/api/patrol/emergency/paga.js
  41. 44 0
      ui/src/api/patrol/fire/alarm.js
  42. 44 0
      ui/src/api/patrol/fire/annihilator.js
  43. 44 0
      ui/src/api/patrol/fire/cannon.js
  44. 44 0
      ui/src/api/patrol/fire/curtain.js
  45. 44 0
      ui/src/api/patrol/fire/door.js
  46. 44 0
      ui/src/api/patrol/fire/hoseBox.js
  47. 44 0
      ui/src/api/patrol/fire/postFire.js
  48. 44 0
      ui/src/api/patrol/fire/sandbox.js
  49. 44 0
      ui/src/api/patrol/fire/shield.js
  50. 44 0
      ui/src/api/patrol/fire/sprinkler.js
  51. 44 0
      ui/src/api/patrol/fire/standpipe.js
  52. 44 0
      ui/src/api/patrol/fire/weathervane.js
  53. 44 0
      ui/src/api/patrol/patrol/file.js
  54. 44 0
      ui/src/api/patrol/patrol/issues.js
  55. 52 0
      ui/src/api/patrol/patrol/main.js
  56. 60 0
      ui/src/api/patrol/patrol/plan.js
  57. 49 0
      ui/src/components/DictData/index.js
  58. 92 0
      ui/src/components/DictTag/index.vue
  59. 6 0
      ui/src/main.js
  60. 82 0
      ui/src/utils/dict/Dict.js
  61. 17 0
      ui/src/utils/dict/DictConverter.js
  62. 13 0
      ui/src/utils/dict/DictData.js
  63. 38 0
      ui/src/utils/dict/DictMeta.js
  64. 51 0
      ui/src/utils/dict/DictOptions.js
  65. 33 0
      ui/src/utils/dict/index.js
  66. 16 0
      ui/src/utils/ruoyi.js
  67. 454 0
      ui/src/views/patrol/commonuse/bicycle/index.vue
  68. 369 0
      ui/src/views/patrol/commonuse/cover/index.vue
  69. 364 0
      ui/src/views/patrol/commonuse/downspout/index.vue
  70. 371 0
      ui/src/views/patrol/commonuse/earplug/index.vue
  71. 385 0
      ui/src/views/patrol/commonuse/movement/index.vue
  72. 375 0
      ui/src/views/patrol/commonuse/pump/index.vue
  73. 382 0
      ui/src/views/patrol/commonuse/safetyBelt/index.vue
  74. 475 0
      ui/src/views/patrol/commonuse/tester/index.vue
  75. 378 0
      ui/src/views/patrol/commonuse/walkitTalkie/index.vue
  76. 338 0
      ui/src/views/patrol/dev/alarm/index.vue
  77. 388 0
      ui/src/views/patrol/dev/annihilator/index.vue
  78. 316 0
      ui/src/views/patrol/dev/bicycle/index.vue
  79. 437 0
      ui/src/views/patrol/dev/cabinet/index.vue
  80. 331 0
      ui/src/views/patrol/dev/cannon/index.vue
  81. 319 0
      ui/src/views/patrol/dev/cctv/index.vue
  82. 328 0
      ui/src/views/patrol/dev/cofferdam/index.vue
  83. 333 0
      ui/src/views/patrol/dev/cover/index.vue
  84. 319 0
      ui/src/views/patrol/dev/curtain/index.vue
  85. 372 0
      ui/src/views/patrol/dev/door/index.vue
  86. 319 0
      ui/src/views/patrol/dev/downspout/index.vue
  87. 333 0
      ui/src/views/patrol/dev/earplug/index.vue
  88. 332 0
      ui/src/views/patrol/dev/eyewash/index.vue
  89. 341 0
      ui/src/views/patrol/dev/hoseBox/index.vue
  90. 360 0
      ui/src/views/patrol/dev/movement/index.vue
  91. 333 0
      ui/src/views/patrol/dev/paga/index.vue
  92. 333 0
      ui/src/views/patrol/dev/postFire/index.vue
  93. 336 0
      ui/src/views/patrol/dev/pump/index.vue
  94. 345 0
      ui/src/views/patrol/dev/safetyBelt/index.vue
  95. 333 0
      ui/src/views/patrol/dev/sandbox/index.vue
  96. 321 0
      ui/src/views/patrol/dev/shield/index.vue
  97. 333 0
      ui/src/views/patrol/dev/sprinkler/index.vue
  98. 333 0
      ui/src/views/patrol/dev/standpipe/index.vue
  99. 350 0
      ui/src/views/patrol/dev/tester/index.vue
  100. 319 0
      ui/src/views/patrol/dev/walkieTalkie/index.vue

+ 44 - 0
ui/src/api/patrol/commonuse/bicycle.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询自行车列表
+export function listBicycle(query) {
+  return request({
+    url: '/commonuse/bicycle/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询自行车详细
+export function getBicycle(id) {
+  return request({
+    url: '/commonuse/bicycle/' + id,
+    method: 'get'
+  })
+}
+
+// 新增自行车
+export function addBicycle(data) {
+  return request({
+    url: '/commonuse/bicycle',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改自行车
+export function updateBicycle(data) {
+  return request({
+    url: '/commonuse/bicycle',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除自行车
+export function delBicycle(id) {
+  return request({
+    url: '/commonuse/bicycle/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/commonuse/cover.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询地井盖列表
+export function listCover(query) {
+  return request({
+    url: '/commonuse/cover/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询地井盖详细
+export function getCover(id) {
+  return request({
+    url: '/commonuse/cover/' + id,
+    method: 'get'
+  })
+}
+
+// 新增地井盖
+export function addCover(data) {
+  return request({
+    url: '/commonuse/cover',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改地井盖
+export function updateCover(data) {
+  return request({
+    url: '/commonuse/cover',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除地井盖
+export function delCover(id) {
+  return request({
+    url: '/commonuse/cover/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/commonuse/downspout.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询落水管列表
+export function listDownspout(query) {
+  return request({
+    url: '/commonuse/downspout/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询落水管详细
+export function getDownspout(id) {
+  return request({
+    url: '/commonuse/downspout/' + id,
+    method: 'get'
+  })
+}
+
+// 新增落水管
+export function addDownspout(data) {
+  return request({
+    url: '/commonuse/downspout',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改落水管
+export function updateDownspout(data) {
+  return request({
+    url: '/commonuse/downspout',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除落水管
+export function delDownspout(id) {
+  return request({
+    url: '/commonuse/downspout/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/commonuse/earplug.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询耳塞分配器检查记录列表
+export function listEarplug(query) {
+  return request({
+    url: '/commonuse/earplug/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询耳塞分配器检查记录详细
+export function getEarplug(id) {
+  return request({
+    url: '/commonuse/earplug/' + id,
+    method: 'get'
+  })
+}
+
+// 新增耳塞分配器检查记录
+export function addEarplug(data) {
+  return request({
+    url: '/commonuse/earplug',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改耳塞分配器检查记录
+export function updateEarplug(data) {
+  return request({
+    url: '/commonuse/earplug',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除耳塞分配器检查记录
+export function delEarplug(id) {
+  return request({
+    url: '/commonuse/earplug/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/commonuse/movement.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询移动平台及移动梯列表
+export function listMovement(query) {
+  return request({
+    url: '/commonuse/movement/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询移动平台及移动梯详细
+export function getMovement(id) {
+  return request({
+    url: '/commonuse/movement/' + id,
+    method: 'get'
+  })
+}
+
+// 新增移动平台及移动梯
+export function addMovement(data) {
+  return request({
+    url: '/commonuse/movement',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改移动平台及移动梯
+export function updateMovement(data) {
+  return request({
+    url: '/commonuse/movement',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除移动平台及移动梯
+export function delMovement(id) {
+  return request({
+    url: '/commonuse/movement/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/commonuse/pump.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询水泵接合器列表
+export function listPump(query) {
+  return request({
+    url: '/commonuse/pump/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询水泵接合器详细
+export function getPump(id) {
+  return request({
+    url: '/commonuse/pump/' + id,
+    method: 'get'
+  })
+}
+
+// 新增水泵接合器
+export function addPump(data) {
+  return request({
+    url: '/commonuse/pump',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改水泵接合器
+export function updatePump(data) {
+  return request({
+    url: '/commonuse/pump',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除水泵接合器
+export function delPump(id) {
+  return request({
+    url: '/commonuse/pump/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/commonuse/safetyBelt.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询安全带列表
+export function listSafetyBelt(query) {
+  return request({
+    url: '/commonuse/safetyBelt/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询安全带详细
+export function getSafetyBelt(id) {
+  return request({
+    url: '/commonuse/safetyBelt/' + id,
+    method: 'get'
+  })
+}
+
+// 新增安全带
+export function addSafetyBelt(data) {
+  return request({
+    url: '/commonuse/safetyBelt',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改安全带
+export function updateSafetyBelt(data) {
+  return request({
+    url: '/commonuse/safetyBelt',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除安全带
+export function delSafetyBelt(id) {
+  return request({
+    url: '/commonuse/safetyBelt/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/commonuse/tester.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询检测仪检查记录列表
+export function listTester(query) {
+  return request({
+    url: '/commonuse/tester/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询检测仪检查记录详细
+export function getTester(id) {
+  return request({
+    url: '/commonuse/tester/' + id,
+    method: 'get'
+  })
+}
+
+// 新增检测仪检查记录
+export function addTester(data) {
+  return request({
+    url: '/commonuse/tester',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改检测仪检查记录
+export function updateTester(data) {
+  return request({
+    url: '/commonuse/tester',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除检测仪检查记录
+export function delTester(id) {
+  return request({
+    url: '/commonuse/tester/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/commonuse/walkitTalkie.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询对讲机列表
+export function listWalkitTalkie(query) {
+  return request({
+    url: '/commonuse/walkitTalkie/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询对讲机详细
+export function getWalkitTalkie(id) {
+  return request({
+    url: '/commonuse/walkitTalkie/' + id,
+    method: 'get'
+  })
+}
+
+// 新增对讲机
+export function addWalkitTalkie(data) {
+  return request({
+    url: '/commonuse/walkitTalkie',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改对讲机
+export function updateWalkitTalkie(data) {
+  return request({
+    url: '/commonuse/walkitTalkie',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除对讲机
+export function delWalkitTalkie(id) {
+  return request({
+    url: '/commonuse/walkitTalkie/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/alarm.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询现场可燃气体检测器/火灾报警系统列表
+export function listAlarm(query) {
+  return request({
+    url: '/dev/alarm/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询现场可燃气体检测器/火灾报警系统详细
+export function getAlarm(id) {
+  return request({
+    url: '/dev/alarm/' + id,
+    method: 'get'
+  })
+}
+
+// 新增现场可燃气体检测器/火灾报警系统
+export function addAlarm(data) {
+  return request({
+    url: '/dev/alarm',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改现场可燃气体检测器/火灾报警系统
+export function updateAlarm(data) {
+  return request({
+    url: '/dev/alarm',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除现场可燃气体检测器/火灾报警系统
+export function delAlarm(id) {
+  return request({
+    url: '/dev/alarm/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/annihilator.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询灭火器材列表
+export function listAnnihilator(query) {
+  return request({
+    url: '/dev/annihilator/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询灭火器材详细
+export function getAnnihilator(id) {
+  return request({
+    url: '/dev/annihilator/' + id,
+    method: 'get'
+  })
+}
+
+// 新增灭火器材
+export function addAnnihilator(data) {
+  return request({
+    url: '/dev/annihilator',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改灭火器材
+export function updateAnnihilator(data) {
+  return request({
+    url: '/dev/annihilator',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除灭火器材
+export function delAnnihilator(id) {
+  return request({
+    url: '/dev/annihilator/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/bicycle.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询自行车列表
+export function listBicycle(query) {
+  return request({
+    url: '/dev/bicycle/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询自行车详细
+export function getBicycle(id) {
+  return request({
+    url: '/dev/bicycle/' + id,
+    method: 'get'
+  })
+}
+
+// 新增自行车
+export function addBicycle(data) {
+  return request({
+    url: '/dev/bicycle',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改自行车
+export function updateBicycle(data) {
+  return request({
+    url: '/dev/bicycle',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除自行车
+export function delBicycle(id) {
+  return request({
+    url: '/dev/bicycle/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/cabinet.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询应急事故柜列表
+export function listCabinet(query) {
+  return request({
+    url: '/dev/cabinet/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询应急事故柜详细
+export function getCabinet(id) {
+  return request({
+    url: '/dev/cabinet/' + id,
+    method: 'get'
+  })
+}
+
+// 新增应急事故柜
+export function addCabinet(data) {
+  return request({
+    url: '/dev/cabinet',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改应急事故柜
+export function updateCabinet(data) {
+  return request({
+    url: '/dev/cabinet',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除应急事故柜
+export function delCabinet(id) {
+  return request({
+    url: '/dev/cabinet/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/cannon.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询消防水炮检查记录列表
+export function listCannon(query) {
+  return request({
+    url: '/dev/cannon/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询消防水炮检查记录详细
+export function getCannon(id) {
+  return request({
+    url: '/dev/cannon/' + id,
+    method: 'get'
+  })
+}
+
+// 新增消防水炮检查记录
+export function addCannon(data) {
+  return request({
+    url: '/dev/cannon',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改消防水炮检查记录
+export function updateCannon(data) {
+  return request({
+    url: '/dev/cannon',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除消防水炮检查记录
+export function delCannon(id) {
+  return request({
+    url: '/dev/cannon/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/cctv.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询CCTV系统列表
+export function listCctv(query) {
+  return request({
+    url: '/dev/cctv/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询CCTV系统详细
+export function getCctv(id) {
+  return request({
+    url: '/dev/cctv/' + id,
+    method: 'get'
+  })
+}
+
+// 新增CCTV系统
+export function addCctv(data) {
+  return request({
+    url: '/dev/cctv',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改CCTV系统
+export function updateCctv(data) {
+  return request({
+    url: '/dev/cctv',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除CCTV系统
+export function delCctv(id) {
+  return request({
+    url: '/dev/cctv/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/cofferdam.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询蒸汽裂解装置各区域围堰列表
+export function listCofferdam(query) {
+  return request({
+    url: '/dev/cofferdam/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询蒸汽裂解装置各区域围堰详细
+export function getCofferdam(id) {
+  return request({
+    url: '/dev/cofferdam/' + id,
+    method: 'get'
+  })
+}
+
+// 新增蒸汽裂解装置各区域围堰
+export function addCofferdam(data) {
+  return request({
+    url: '/dev/cofferdam',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改蒸汽裂解装置各区域围堰
+export function updateCofferdam(data) {
+  return request({
+    url: '/dev/cofferdam',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除蒸汽裂解装置各区域围堰
+export function delCofferdam(id) {
+  return request({
+    url: '/dev/cofferdam/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/cover.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询地井盖列表
+export function listCover(query) {
+  return request({
+    url: '/dev/cover/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询地井盖详细
+export function getCover(id) {
+  return request({
+    url: '/dev/cover/' + id,
+    method: 'get'
+  })
+}
+
+// 新增地井盖
+export function addCover(data) {
+  return request({
+    url: '/dev/cover',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改地井盖
+export function updateCover(data) {
+  return request({
+    url: '/dev/cover',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除地井盖
+export function delCover(id) {
+  return request({
+    url: '/dev/cover/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/curtain.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询蒸汽幕列表
+export function listCurtain(query) {
+  return request({
+    url: '/dev/curtain/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询蒸汽幕详细
+export function getCurtain(id) {
+  return request({
+    url: '/dev/curtain/' + id,
+    method: 'get'
+  })
+}
+
+// 新增蒸汽幕
+export function addCurtain(data) {
+  return request({
+    url: '/dev/curtain',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改蒸汽幕
+export function updateCurtain(data) {
+  return request({
+    url: '/dev/curtain',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除蒸汽幕
+export function delCurtain(id) {
+  return request({
+    url: '/dev/curtain/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/door.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询常闭式防爆门/防火门列表
+export function listDoor(query) {
+  return request({
+    url: '/dev/door/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询常闭式防爆门/防火门详细
+export function getDoor(id) {
+  return request({
+    url: '/dev/door/' + id,
+    method: 'get'
+  })
+}
+
+// 新增常闭式防爆门/防火门
+export function addDoor(data) {
+  return request({
+    url: '/dev/door',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改常闭式防爆门/防火门
+export function updateDoor(data) {
+  return request({
+    url: '/dev/door',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除常闭式防爆门/防火门
+export function delDoor(id) {
+  return request({
+    url: '/dev/door/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/downspout.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询落水管列表
+export function listDownspout(query) {
+  return request({
+    url: '/dev/downspout/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询落水管详细
+export function getDownspout(id) {
+  return request({
+    url: '/dev/downspout/' + id,
+    method: 'get'
+  })
+}
+
+// 新增落水管
+export function addDownspout(data) {
+  return request({
+    url: '/dev/downspout',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改落水管
+export function updateDownspout(data) {
+  return request({
+    url: '/dev/downspout',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除落水管
+export function delDownspout(id) {
+  return request({
+    url: '/dev/downspout/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/earplug.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询耳塞分配器列表
+export function listEarplug(query) {
+  return request({
+    url: '/dev/earplug/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询耳塞分配器详细
+export function getEarplug(id) {
+  return request({
+    url: '/dev/earplug/' + id,
+    method: 'get'
+  })
+}
+
+// 新增耳塞分配器
+export function addEarplug(data) {
+  return request({
+    url: '/dev/earplug',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改耳塞分配器
+export function updateEarplug(data) {
+  return request({
+    url: '/dev/earplug',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除耳塞分配器
+export function delEarplug(id) {
+  return request({
+    url: '/dev/earplug/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/eyewash.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询洗眼器列表
+export function listEyewash(query) {
+  return request({
+    url: '/dev/eyewash/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询洗眼器详细
+export function getEyewash(id) {
+  return request({
+    url: '/dev/eyewash/' + id,
+    method: 'get'
+  })
+}
+
+// 新增洗眼器
+export function addEyewash(data) {
+  return request({
+    url: '/dev/eyewash',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改洗眼器
+export function updateEyewash(data) {
+  return request({
+    url: '/dev/eyewash',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除洗眼器
+export function delEyewash(id) {
+  return request({
+    url: '/dev/eyewash/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/hoseBox.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询消防水带箱检查记录列表
+export function listHoseBox(query) {
+  return request({
+    url: '/dev/hoseBox/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询消防水带箱检查记录详细
+export function getHoseBox(id) {
+  return request({
+    url: '/dev/hoseBox/' + id,
+    method: 'get'
+  })
+}
+
+// 新增消防水带箱检查记录
+export function addHoseBox(data) {
+  return request({
+    url: '/dev/hoseBox',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改消防水带箱检查记录
+export function updateHoseBox(data) {
+  return request({
+    url: '/dev/hoseBox',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除消防水带箱检查记录
+export function delHoseBox(id) {
+  return request({
+    url: '/dev/hoseBox/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/movement.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询移动平台及移动梯列表
+export function listMovement(query) {
+  return request({
+    url: '/dev/movement/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询移动平台及移动梯详细
+export function getMovement(id) {
+  return request({
+    url: '/dev/movement/' + id,
+    method: 'get'
+  })
+}
+
+// 新增移动平台及移动梯
+export function addMovement(data) {
+  return request({
+    url: '/dev/movement',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改移动平台及移动梯
+export function updateMovement(data) {
+  return request({
+    url: '/dev/movement',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除移动平台及移动梯
+export function delMovement(id) {
+  return request({
+    url: '/dev/movement/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/paga.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询PAGA列表
+export function listPaga(query) {
+  return request({
+    url: '/dev/paga/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询PAGA详细
+export function getPaga(id) {
+  return request({
+    url: '/dev/paga/' + id,
+    method: 'get'
+  })
+}
+
+// 新增PAGA
+export function addPaga(data) {
+  return request({
+    url: '/dev/paga',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改PAGA
+export function updatePaga(data) {
+  return request({
+    url: '/dev/paga',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除PAGA
+export function delPaga(id) {
+  return request({
+    url: '/dev/paga/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/postFire.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询地上消火栓检查记录列表
+export function listPostFire(query) {
+  return request({
+    url: '/dev/postFire/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询地上消火栓检查记录详细
+export function getPostFire(id) {
+  return request({
+    url: '/dev/postFire/' + id,
+    method: 'get'
+  })
+}
+
+// 新增地上消火栓检查记录
+export function addPostFire(data) {
+  return request({
+    url: '/dev/postFire',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改地上消火栓检查记录
+export function updatePostFire(data) {
+  return request({
+    url: '/dev/postFire',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除地上消火栓检查记录
+export function delPostFire(id) {
+  return request({
+    url: '/dev/postFire/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/pump.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询水泵接合器列表
+export function listPump(query) {
+  return request({
+    url: '/dev/pump/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询水泵接合器详细
+export function getPump(id) {
+  return request({
+    url: '/dev/pump/' + id,
+    method: 'get'
+  })
+}
+
+// 新增水泵接合器
+export function addPump(data) {
+  return request({
+    url: '/dev/pump',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改水泵接合器
+export function updatePump(data) {
+  return request({
+    url: '/dev/pump',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除水泵接合器
+export function delPump(id) {
+  return request({
+    url: '/dev/pump/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/safetyBelt.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询安全带列表
+export function listSafetyBelt(query) {
+  return request({
+    url: '/dev/safetyBelt/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询安全带详细
+export function getSafetyBelt(id) {
+  return request({
+    url: '/dev/safetyBelt/' + id,
+    method: 'get'
+  })
+}
+
+// 新增安全带
+export function addSafetyBelt(data) {
+  return request({
+    url: '/dev/safetyBelt',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改安全带
+export function updateSafetyBelt(data) {
+  return request({
+    url: '/dev/safetyBelt',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除安全带
+export function delSafetyBelt(id) {
+  return request({
+    url: '/dev/safetyBelt/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/sandbox.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询应急沙箱列表
+export function listSandbox(query) {
+  return request({
+    url: '/dev/sandbox/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询应急沙箱详细
+export function getSandbox(id) {
+  return request({
+    url: '/dev/sandbox/' + id,
+    method: 'get'
+  })
+}
+
+// 新增应急沙箱
+export function addSandbox(data) {
+  return request({
+    url: '/dev/sandbox',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改应急沙箱
+export function updateSandbox(data) {
+  return request({
+    url: '/dev/sandbox',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除应急沙箱
+export function delSandbox(id) {
+  return request({
+    url: '/dev/sandbox/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/shield.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询CO2气体保护系统列表
+export function listShield(query) {
+  return request({
+    url: '/dev/shield/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询CO2气体保护系统详细
+export function getShield(id) {
+  return request({
+    url: '/dev/shield/' + id,
+    method: 'get'
+  })
+}
+
+// 新增CO2气体保护系统
+export function addShield(data) {
+  return request({
+    url: '/dev/shield',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改CO2气体保护系统
+export function updateShield(data) {
+  return request({
+    url: '/dev/shield',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除CO2气体保护系统
+export function delShield(id) {
+  return request({
+    url: '/dev/shield/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/sprinkler.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询自动喷淋灭火系统列表
+export function listSprinkler(query) {
+  return request({
+    url: '/dev/sprinkler/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询自动喷淋灭火系统详细
+export function getSprinkler(id) {
+  return request({
+    url: '/dev/sprinkler/' + id,
+    method: 'get'
+  })
+}
+
+// 新增自动喷淋灭火系统
+export function addSprinkler(data) {
+  return request({
+    url: '/dev/sprinkler',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改自动喷淋灭火系统
+export function updateSprinkler(data) {
+  return request({
+    url: '/dev/sprinkler',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除自动喷淋灭火系统
+export function delSprinkler(id) {
+  return request({
+    url: '/dev/sprinkler/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/standpipe.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询消防竖管列表
+export function listStandpipe(query) {
+  return request({
+    url: '/dev/standpipe/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询消防竖管详细
+export function getStandpipe(id) {
+  return request({
+    url: '/dev/standpipe/' + id,
+    method: 'get'
+  })
+}
+
+// 新增消防竖管
+export function addStandpipe(data) {
+  return request({
+    url: '/dev/standpipe',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改消防竖管
+export function updateStandpipe(data) {
+  return request({
+    url: '/dev/standpipe',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除消防竖管
+export function delStandpipe(id) {
+  return request({
+    url: '/dev/standpipe/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/tester.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询检测仪列表
+export function listTester(query) {
+  return request({
+    url: '/dev/tester/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询检测仪详细
+export function getTester(id) {
+  return request({
+    url: '/dev/tester/' + id,
+    method: 'get'
+  })
+}
+
+// 新增检测仪
+export function addTester(data) {
+  return request({
+    url: '/dev/tester',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改检测仪
+export function updateTester(data) {
+  return request({
+    url: '/dev/tester',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除检测仪
+export function delTester(id) {
+  return request({
+    url: '/dev/tester/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/walkieTalkie.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询对讲机列表
+export function listWalkieTalkie(query) {
+  return request({
+    url: '/dev/walkieTalkie/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询对讲机详细
+export function getWalkieTalkie(id) {
+  return request({
+    url: '/dev/walkieTalkie/' + id,
+    method: 'get'
+  })
+}
+
+// 新增对讲机
+export function addWalkieTalkie(data) {
+  return request({
+    url: '/dev/walkieTalkie',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改对讲机
+export function updateWalkieTalkie(data) {
+  return request({
+    url: '/dev/walkieTalkie',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除对讲机
+export function delWalkieTalkie(id) {
+  return request({
+    url: '/dev/walkieTalkie/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/dev/weathervane.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询风向标/风向袋/新风系统正压计列表
+export function listWeathervane(query) {
+  return request({
+    url: '/dev/weathervane/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询风向标/风向袋/新风系统正压计详细
+export function getWeathervane(id) {
+  return request({
+    url: '/dev/weathervane/' + id,
+    method: 'get'
+  })
+}
+
+// 新增风向标/风向袋/新风系统正压计
+export function addWeathervane(data) {
+  return request({
+    url: '/dev/weathervane',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改风向标/风向袋/新风系统正压计
+export function updateWeathervane(data) {
+  return request({
+    url: '/dev/weathervane',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除风向标/风向袋/新风系统正压计
+export function delWeathervane(id) {
+  return request({
+    url: '/dev/weathervane/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/emergency/cabinet.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询应急事故柜列表
+export function listCabinet(query) {
+  return request({
+    url: '/emergency/cabinet/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询应急事故柜详细
+export function getCabinet(id) {
+  return request({
+    url: '/emergency/cabinet/' + id,
+    method: 'get'
+  })
+}
+
+// 新增应急事故柜
+export function addCabinet(data) {
+  return request({
+    url: '/emergency/cabinet',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改应急事故柜
+export function updateCabinet(data) {
+  return request({
+    url: '/emergency/cabinet',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除应急事故柜
+export function delCabinet(id) {
+  return request({
+    url: '/emergency/cabinet/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/emergency/cctv.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询CCTV系统列表
+export function listCctv(query) {
+  return request({
+    url: '/emergency/cctv/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询CCTV系统详细
+export function getCctv(id) {
+  return request({
+    url: '/emergency/cctv/' + id,
+    method: 'get'
+  })
+}
+
+// 新增CCTV系统
+export function addCctv(data) {
+  return request({
+    url: '/emergency/cctv',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改CCTV系统
+export function updateCctv(data) {
+  return request({
+    url: '/emergency/cctv',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除CCTV系统
+export function delCctv(id) {
+  return request({
+    url: '/emergency/cctv/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/emergency/cofferdam.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询蒸汽裂解装置各区域围堰列表
+export function listCofferdam(query) {
+  return request({
+    url: '/emergency/cofferdam/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询蒸汽裂解装置各区域围堰详细
+export function getCofferdam(id) {
+  return request({
+    url: '/emergency/cofferdam/' + id,
+    method: 'get'
+  })
+}
+
+// 新增蒸汽裂解装置各区域围堰
+export function addCofferdam(data) {
+  return request({
+    url: '/emergency/cofferdam',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改蒸汽裂解装置各区域围堰
+export function updateCofferdam(data) {
+  return request({
+    url: '/emergency/cofferdam',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除蒸汽裂解装置各区域围堰
+export function delCofferdam(id) {
+  return request({
+    url: '/emergency/cofferdam/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/emergency/eyewash.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询洗眼器检查记录列表
+export function listEyewash(query) {
+  return request({
+    url: '/emergency/eyewash/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询洗眼器检查记录详细
+export function getEyewash(id) {
+  return request({
+    url: '/emergency/eyewash/' + id,
+    method: 'get'
+  })
+}
+
+// 新增洗眼器检查记录
+export function addEyewash(data) {
+  return request({
+    url: '/emergency/eyewash',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改洗眼器检查记录
+export function updateEyewash(data) {
+  return request({
+    url: '/emergency/eyewash',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除洗眼器检查记录
+export function delEyewash(id) {
+  return request({
+    url: '/emergency/eyewash/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/emergency/paga.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询PAGA系统列表
+export function listPaga(query) {
+  return request({
+    url: '/emergency/paga/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询PAGA系统详细
+export function getPaga(id) {
+  return request({
+    url: '/emergency/paga/' + id,
+    method: 'get'
+  })
+}
+
+// 新增PAGA系统
+export function addPaga(data) {
+  return request({
+    url: '/emergency/paga',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改PAGA系统
+export function updatePaga(data) {
+  return request({
+    url: '/emergency/paga',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除PAGA系统
+export function delPaga(id) {
+  return request({
+    url: '/emergency/paga/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/fire/alarm.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询现场可燃气体检测器/火灾报警系统列表
+export function listAlarm(query) {
+  return request({
+    url: '/fire/alarm/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询现场可燃气体检测器/火灾报警系统详细
+export function getAlarm(id) {
+  return request({
+    url: '/fire/alarm/' + id,
+    method: 'get'
+  })
+}
+
+// 新增现场可燃气体检测器/火灾报警系统
+export function addAlarm(data) {
+  return request({
+    url: '/fire/alarm',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改现场可燃气体检测器/火灾报警系统
+export function updateAlarm(data) {
+  return request({
+    url: '/fire/alarm',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除现场可燃气体检测器/火灾报警系统
+export function delAlarm(id) {
+  return request({
+    url: '/fire/alarm/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/fire/annihilator.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询手提式/小推车式灭火器/灭火器材箱列表
+export function listAnnihilator(query) {
+  return request({
+    url: '/fire/annihilator/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询手提式/小推车式灭火器/灭火器材箱详细
+export function getAnnihilator(id) {
+  return request({
+    url: '/fire/annihilator/' + id,
+    method: 'get'
+  })
+}
+
+// 新增手提式/小推车式灭火器/灭火器材箱
+export function addAnnihilator(data) {
+  return request({
+    url: '/fire/annihilator',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改手提式/小推车式灭火器/灭火器材箱
+export function updateAnnihilator(data) {
+  return request({
+    url: '/fire/annihilator',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除手提式/小推车式灭火器/灭火器材箱
+export function delAnnihilator(id) {
+  return request({
+    url: '/fire/annihilator/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/fire/cannon.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询消防水炮检查记录列表
+export function listCannon(query) {
+  return request({
+    url: '/fire/cannon/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询消防水炮检查记录详细
+export function getCannon(id) {
+  return request({
+    url: '/fire/cannon/' + id,
+    method: 'get'
+  })
+}
+
+// 新增消防水炮检查记录
+export function addCannon(data) {
+  return request({
+    url: '/fire/cannon',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改消防水炮检查记录
+export function updateCannon(data) {
+  return request({
+    url: '/fire/cannon',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除消防水炮检查记录
+export function delCannon(id) {
+  return request({
+    url: '/fire/cannon/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/fire/curtain.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询蒸汽幕检查记录列表
+export function listCurtain(query) {
+  return request({
+    url: '/fire/curtain/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询蒸汽幕检查记录详细
+export function getCurtain(id) {
+  return request({
+    url: '/fire/curtain/' + id,
+    method: 'get'
+  })
+}
+
+// 新增蒸汽幕检查记录
+export function addCurtain(data) {
+  return request({
+    url: '/fire/curtain',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改蒸汽幕检查记录
+export function updateCurtain(data) {
+  return request({
+    url: '/fire/curtain',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除蒸汽幕检查记录
+export function delCurtain(id) {
+  return request({
+    url: '/fire/curtain/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/fire/door.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询常闭式防爆门/防火门列表
+export function listDoor(query) {
+  return request({
+    url: '/fire/door/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询常闭式防爆门/防火门详细
+export function getDoor(id) {
+  return request({
+    url: '/fire/door/' + id,
+    method: 'get'
+  })
+}
+
+// 新增常闭式防爆门/防火门
+export function addDoor(data) {
+  return request({
+    url: '/fire/door',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改常闭式防爆门/防火门
+export function updateDoor(data) {
+  return request({
+    url: '/fire/door',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除常闭式防爆门/防火门
+export function delDoor(id) {
+  return request({
+    url: '/fire/door/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/fire/hoseBox.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询消防水带箱检查记录列表
+export function listHoseBox(query) {
+  return request({
+    url: '/fire/hoseBox/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询消防水带箱检查记录详细
+export function getHoseBox(id) {
+  return request({
+    url: '/fire/hoseBox/' + id,
+    method: 'get'
+  })
+}
+
+// 新增消防水带箱检查记录
+export function addHoseBox(data) {
+  return request({
+    url: '/fire/hoseBox',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改消防水带箱检查记录
+export function updateHoseBox(data) {
+  return request({
+    url: '/fire/hoseBox',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除消防水带箱检查记录
+export function delHoseBox(id) {
+  return request({
+    url: '/fire/hoseBox/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/fire/postFire.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询地上消火栓检查记录列表
+export function listPostFire(query) {
+  return request({
+    url: '/fire/postFire/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询地上消火栓检查记录详细
+export function getPostFire(id) {
+  return request({
+    url: '/fire/postFire/' + id,
+    method: 'get'
+  })
+}
+
+// 新增地上消火栓检查记录
+export function addPostFire(data) {
+  return request({
+    url: '/fire/postFire',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改地上消火栓检查记录
+export function updatePostFire(data) {
+  return request({
+    url: '/fire/postFire',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除地上消火栓检查记录
+export function delPostFire(id) {
+  return request({
+    url: '/fire/postFire/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/fire/sandbox.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询应急沙箱列表
+export function listSandbox(query) {
+  return request({
+    url: '/fire/sandbox/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询应急沙箱详细
+export function getSandbox(id) {
+  return request({
+    url: '/fire/sandbox/' + id,
+    method: 'get'
+  })
+}
+
+// 新增应急沙箱
+export function addSandbox(data) {
+  return request({
+    url: '/fire/sandbox',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改应急沙箱
+export function updateSandbox(data) {
+  return request({
+    url: '/fire/sandbox',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除应急沙箱
+export function delSandbox(id) {
+  return request({
+    url: '/fire/sandbox/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/fire/shield.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询CO2气体保护系统列表
+export function listShield(query) {
+  return request({
+    url: '/fire/shield/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询CO2气体保护系统详细
+export function getShield(id) {
+  return request({
+    url: '/fire/shield/' + id,
+    method: 'get'
+  })
+}
+
+// 新增CO2气体保护系统
+export function addShield(data) {
+  return request({
+    url: '/fire/shield',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改CO2气体保护系统
+export function updateShield(data) {
+  return request({
+    url: '/fire/shield',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除CO2气体保护系统
+export function delShield(id) {
+  return request({
+    url: '/fire/shield/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/fire/sprinkler.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询自动喷淋灭火系统检查记录列表
+export function listSprinkler(query) {
+  return request({
+    url: '/fire/sprinkler/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询自动喷淋灭火系统检查记录详细
+export function getSprinkler(id) {
+  return request({
+    url: '/fire/sprinkler/' + id,
+    method: 'get'
+  })
+}
+
+// 新增自动喷淋灭火系统检查记录
+export function addSprinkler(data) {
+  return request({
+    url: '/fire/sprinkler',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改自动喷淋灭火系统检查记录
+export function updateSprinkler(data) {
+  return request({
+    url: '/fire/sprinkler',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除自动喷淋灭火系统检查记录
+export function delSprinkler(id) {
+  return request({
+    url: '/fire/sprinkler/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/fire/standpipe.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询消防竖管列表
+export function listStandpipe(query) {
+  return request({
+    url: '/fire/standpipe/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询消防竖管详细
+export function getStandpipe(id) {
+  return request({
+    url: '/fire/standpipe/' + id,
+    method: 'get'
+  })
+}
+
+// 新增消防竖管
+export function addStandpipe(data) {
+  return request({
+    url: '/fire/standpipe',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改消防竖管
+export function updateStandpipe(data) {
+  return request({
+    url: '/fire/standpipe',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除消防竖管
+export function delStandpipe(id) {
+  return request({
+    url: '/fire/standpipe/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/fire/weathervane.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询风向标/风向袋/新风系统正压计列表
+export function listWeathervane(query) {
+  return request({
+    url: '/fire/weathervane/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询风向标/风向袋/新风系统正压计详细
+export function getWeathervane(id) {
+  return request({
+    url: '/fire/weathervane/' + id,
+    method: 'get'
+  })
+}
+
+// 新增风向标/风向袋/新风系统正压计
+export function addWeathervane(data) {
+  return request({
+    url: '/fire/weathervane',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改风向标/风向袋/新风系统正压计
+export function updateWeathervane(data) {
+  return request({
+    url: '/fire/weathervane',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除风向标/风向袋/新风系统正压计
+export function delWeathervane(id) {
+  return request({
+    url: '/fire/weathervane/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/patrol/file.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询附件列表
+export function listFile(query) {
+  return request({
+    url: '/patrol/file/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询附件详细
+export function getFile(id) {
+  return request({
+    url: '/patrol/file/' + id,
+    method: 'get'
+  })
+}
+
+// 新增附件
+export function addFile(data) {
+  return request({
+    url: '/patrol/file',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改附件
+export function updateFile(data) {
+  return request({
+    url: '/patrol/file',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除附件
+export function delFile(id) {
+  return request({
+    url: '/patrol/file/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
ui/src/api/patrol/patrol/issues.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询检查问题记录列表
+export function listIssues(query) {
+  return request({
+    url: '/patrol/issues/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询检查问题记录详细
+export function getIssues(id) {
+  return request({
+    url: '/patrol/issues/' + id,
+    method: 'get'
+  })
+}
+
+// 新增检查问题记录
+export function addIssues(data) {
+  return request({
+    url: '/patrol/issues',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改检查问题记录
+export function updateIssues(data) {
+  return request({
+    url: '/patrol/issues',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除检查问题记录
+export function delIssues(id) {
+  return request({
+    url: '/patrol/issues/' + id,
+    method: 'delete'
+  })
+}

+ 52 - 0
ui/src/api/patrol/patrol/main.js

@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 查询消气防设施和器材检查计划总列表
+export function listMain(query) {
+  return request({
+    url: '/patrol/main/list',
+    method: 'get',
+    params: query
+  })
+}
+// 查询消气防设施和器材检查计划总列表
+export function listAllMain(query) {
+  return request({
+    url: '/patrol/main/listAll',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询消气防设施和器材检查计划总详细
+export function getMain(id) {
+  return request({
+    url: '/patrol/main/' + id,
+    method: 'get'
+  })
+}
+
+// 新增消气防设施和器材检查计划总
+export function addMain(data) {
+  return request({
+    url: '/patrol/main',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改消气防设施和器材检查计划总
+export function updateMain(data) {
+  return request({
+    url: '/patrol/main',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除消气防设施和器材检查计划总
+export function delMain(id) {
+  return request({
+    url: '/patrol/main/' + id,
+    method: 'delete'
+  })
+}

+ 60 - 0
ui/src/api/patrol/patrol/plan.js

@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询检查计划列表
+export function listPlan(query) {
+  return request({
+    url: '/patrol/plan/list',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 查询所有检查计划列表
+export function listAllPlan(query) {
+  return request({
+    url: '/patrol/plan/allPlan',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询检查计划详细
+export function getPlan(id) {
+  return request({
+    url: '/patrol/plan/' + id,
+    method: 'get'
+  })
+}
+
+// 新增检查计划
+export function addPlan(data) {
+  return request({
+    url: '/patrol/plan',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改检查计划
+export function updatePlan(data) {
+  return request({
+    url: '/patrol/plan',
+    method: 'put',
+    data: data
+  })
+}export function conformPlan(data) {
+  return request({
+    url: '/patrol/plan/conform',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除检查计划
+export function delPlan(id) {
+  return request({
+    url: '/patrol/plan/' + id,
+    method: 'delete'
+  })
+}

+ 49 - 0
ui/src/components/DictData/index.js

@@ -0,0 +1,49 @@
+import Vue from 'vue'
+import store from '@/store'
+import DataDict from '@/utils/dict'
+import { getDicts as getDicts } from '@/api/system/dict/data'
+
+function searchDictByKey(dict, key) {
+  if (key == null && key == "") {
+    return null
+  }
+  try {
+    for (let i = 0; i < dict.length; i++) {
+      if (dict[i].key == key) {
+        return dict[i].value
+      }
+    }
+  } catch (e) {
+    return null
+  }
+}
+
+function install() {
+  Vue.use(DataDict, {
+    metas: {
+      '*': {
+        labelField: 'dictLabel',
+        valueField: 'dictValue',
+        request(dictMeta) {
+          const storeDict = searchDictByKey(store.getters.dict, dictMeta.type)
+          if (storeDict) {
+            return new Promise(resolve => { resolve(storeDict) })
+          } else {
+            return new Promise((resolve, reject) => {
+              getDicts(dictMeta.type).then(res => {
+                store.dispatch('dict/setDict', { key: dictMeta.type, value: res.data })
+                resolve(res.data)
+              }).catch(error => {
+                reject(error)
+              })
+            })
+          }
+        },
+      },
+    },
+  })
+}
+
+export default {
+  install,
+}

+ 92 - 0
ui/src/components/DictTag/index.vue

@@ -0,0 +1,92 @@
+<template>
+  <div>
+    <template v-for="(item, index) in options">
+      <!--      <template v-if="v == item.value" v-for="v in values">-->
+      <template v-if="values.includes(item.value)">
+        <span
+          v-if="item.raw.listClass == 'default' || item.raw.listClass == ''"
+          :key="item.value"
+          :class="item.raw.cssClass"
+          :index="index"
+        >{{ item.label + " " }}</span>
+        <el-tag
+          v-else
+          :key="item.value"
+          :class="item.raw.cssClass"
+          :disable-transitions="true"
+          :index="index"
+          :type="item.raw.listClass == 'primary' ? '' : item.raw.listClass"
+        >
+          {{ item.label + " " }}
+        </el-tag>
+      </template>
+    </template>
+    <template v-if="unmatch && showValue">
+      {{ unmatchArray | handleArray }}
+    </template>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "DictTag",
+  props: {
+    options: {
+      type: Array,
+      default: null,
+    },
+    value: [Number, String, Array],
+    // 当未找到匹配的数据时,显示value
+    showValue: {
+      type: Boolean,
+      default: true,
+    }
+  },
+  data() {
+    return {
+      unmatchArray: [], // 记录未匹配的项
+    }
+  },
+  computed: {
+    values() {
+      if (this.value !== null && typeof this.value !== "undefined") {
+        return Array.isArray(this.value) ? this.value : [String(this.value)];
+      } else {
+        return [];
+      }
+    },
+    unmatch() {
+      this.unmatchArray = [];
+      if (this.value !== null && typeof this.value !== "undefined") {
+        // 传入值为非数组
+        if (!Array.isArray(this.value)) {
+          if (this.options.some((v) => v.value == this.value)) return false;
+          this.unmatchArray.push(this.value);
+          return true;
+        }
+        // 传入值为Array
+        this.value.forEach((item) => {
+          if (!this.options.some((v) => v.value == item))
+            this.unmatchArray.push(item);
+        });
+        return true;
+      }
+      // 没有value不显示
+      return false;
+    },
+  },
+  filters: {
+    handleArray(array) {
+      if (array.length === 0) return "";
+      return array.reduce((pre, cur) => {
+        return pre + " " + cur;
+      })
+    }
+  }
+};
+</script>
+<style scoped>
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+</style>

+ 6 - 0
ui/src/main.js

@@ -40,6 +40,10 @@ import '@/assets/iconfont/iconfont.css'
 import '@/assets/iconfont/iconfont.js'
 // 适配flex
 import { UTable, UTableColumn } from 'umy-ui';
+// 字典标签组件
+import DictTag from '@/components/DictTag'
+// 字典数据组件
+import DictData from '@/components/DictData'
 
 // 函数节流
 import throttle from "@/utils/throttle";
@@ -76,6 +80,7 @@ Vue.prototype.msgInfo = function (msg) {
 }
 
 // 全局组件挂载
+Vue.component('DictTag', DictTag)
 Vue.component('Pagination', Pagination)
 Vue.component('RightToolbar', RightToolbar)
 
@@ -83,6 +88,7 @@ Vue.use(permission)
 Vue.use(dataV)
 Vue.use(UTable)
 Vue.use(UTableColumn)
+DictData.install()
 /**
  * If you don't want to use mock-server
  * you want to use MockJs for mock api

+ 82 - 0
ui/src/utils/dict/Dict.js

@@ -0,0 +1,82 @@
+import Vue from 'vue'
+import { mergeRecursive } from "@/utils/ruoyi";
+import DictMeta from './DictMeta'
+import DictData from './DictData'
+
+const DEFAULT_DICT_OPTIONS = {
+  types: [],
+}
+
+/**
+ * @classdesc 字典
+ * @property {Object} label 标签对象,内部属性名为字典类型名称
+ * @property {Object} dict 字段数组,内部属性名为字典类型名称
+ * @property {Array.<DictMeta>} _dictMetas 字典元数据数组
+ */
+export default class Dict {
+  constructor() {
+    this.owner = null
+    this.label = {}
+    this.type = {}
+  }
+
+  init(options) {
+    if (options instanceof Array) {
+      options = { types: options }
+    }
+    const opts = mergeRecursive(DEFAULT_DICT_OPTIONS, options)
+    if (opts.types === undefined) {
+      throw new Error('need dict types')
+    }
+    const ps = []
+    this._dictMetas = opts.types.map(t => DictMeta.parse(t))
+    this._dictMetas.forEach(dictMeta => {
+      const type = dictMeta.type
+      Vue.set(this.label, type, {})
+      Vue.set(this.type, type, [])
+      if (dictMeta.lazy) {
+        return
+      }
+      ps.push(loadDict(this, dictMeta))
+    })
+    return Promise.all(ps)
+  }
+
+  /**
+   * 重新加载字典
+   * @param {String} type 字典类型
+   */
+  reloadDict(type) {
+    const dictMeta = this._dictMetas.find(e => e.type === type)
+    if (dictMeta === undefined) {
+      return Promise.reject(`the dict meta of ${type} was not found`)
+    }
+    return loadDict(this, dictMeta)
+  }
+}
+
+/**
+ * 加载字典
+ * @param {Dict} dict 字典
+ * @param {DictMeta} dictMeta 字典元数据
+ * @returns {Promise}
+ */
+function loadDict(dict, dictMeta) {
+  return dictMeta.request(dictMeta)
+    .then(response => {
+      const type = dictMeta.type
+      let dicts = dictMeta.responseConverter(response, dictMeta)
+      if (!(dicts instanceof Array)) {
+        console.error('the return of responseConverter must be Array.<DictData>')
+        dicts = []
+      } else if (dicts.filter(d => d instanceof DictData).length !== dicts.length) {
+        console.error('the type of elements in dicts must be DictData')
+        dicts = []
+      }
+      dict.type[type].splice(0, Number.MAX_SAFE_INTEGER, ...dicts)
+      dicts.forEach(d => {
+        Vue.set(dict.label[type], d.value, d.label)
+      })
+      return dicts
+    })
+}

+ 17 - 0
ui/src/utils/dict/DictConverter.js

@@ -0,0 +1,17 @@
+import DictOptions from './DictOptions'
+import DictData from './DictData'
+
+export default function(dict, dictMeta) {
+  const label = determineDictField(dict, dictMeta.labelField, ...DictOptions.DEFAULT_LABEL_FIELDS)
+  const value = determineDictField(dict, dictMeta.valueField, ...DictOptions.DEFAULT_VALUE_FIELDS)
+  return new DictData(dict[label], dict[value], dict)
+}
+
+/**
+ * 确定字典字段
+ * @param {DictData} dict
+ * @param  {...String} fields
+ */
+function determineDictField(dict, ...fields) {
+  return fields.find(f => Object.prototype.hasOwnProperty.call(dict, f))
+}

+ 13 - 0
ui/src/utils/dict/DictData.js

@@ -0,0 +1,13 @@
+/**
+ * @classdesc 字典数据
+ * @property {String} label 标签
+ * @property {*} value 标签
+ * @property {Object} raw 原始数据
+ */
+export default class DictData {
+  constructor(label, value, raw) {
+    this.label = label
+    this.value = value
+    this.raw = raw
+  }
+}

+ 38 - 0
ui/src/utils/dict/DictMeta.js

@@ -0,0 +1,38 @@
+import { mergeRecursive } from "@/utils/ruoyi";
+import DictOptions from './DictOptions'
+
+/**
+ * @classdesc 字典元数据
+ * @property {String} type 类型
+ * @property {Function} request 请求
+ * @property {String} label 标签字段
+ * @property {String} value 值字段
+ */
+export default class DictMeta {
+  constructor(options) {
+    this.type = options.type
+    this.request = options.request
+    this.responseConverter = options.responseConverter
+    this.labelField = options.labelField
+    this.valueField = options.valueField
+    this.lazy = options.lazy === true
+  }
+}
+
+
+/**
+ * 解析字典元数据
+ * @param {Object} options
+ * @returns {DictMeta}
+ */
+DictMeta.parse= function(options) {
+  let opts = null
+  if (typeof options === 'string') {
+    opts = DictOptions.metas[options] || {}
+    opts.type = options
+  } else if (typeof options === 'object') {
+    opts = options
+  }
+  opts = mergeRecursive(DictOptions.metas['*'], opts)
+  return new DictMeta(opts)
+}

+ 51 - 0
ui/src/utils/dict/DictOptions.js

@@ -0,0 +1,51 @@
+import { mergeRecursive } from "@/utils/ruoyi";
+import dictConverter from './DictConverter'
+
+export const options = {
+  metas: {
+    '*': {
+      /**
+       * 字典请求,方法签名为function(dictMeta: DictMeta): Promise
+       */
+      request: (dictMeta) => {
+        console.log(`load dict ${dictMeta.type}`)
+        return Promise.resolve([])
+      },
+      /**
+       * 字典响应数据转换器,方法签名为function(response: Object, dictMeta: DictMeta): DictData
+       */
+      responseConverter,
+      labelField: 'label',
+      valueField: 'value',
+    },
+  },
+  /**
+   * 默认标签字段
+   */
+  DEFAULT_LABEL_FIELDS: ['label', 'name', 'title'],
+  /**
+   * 默认值字段
+   */
+  DEFAULT_VALUE_FIELDS: ['value', 'id', 'uid', 'key'],
+}
+
+/**
+ * 映射字典
+ * @param {Object} response 字典数据
+ * @param {DictMeta} dictMeta 字典元数据
+ * @returns {DictData}
+ */
+function responseConverter(response, dictMeta) {
+  const dicts = response.content instanceof Array ? response.content : response
+  if (dicts === undefined) {
+    console.warn(`no dict data of "${dictMeta.type}" found in the response`)
+    return []
+  }
+  return dicts.map(d => dictConverter(d, dictMeta))
+}
+
+export function mergeOptions(src) {
+  mergeRecursive(options, src)
+}
+
+export default options

+ 33 - 0
ui/src/utils/dict/index.js

@@ -0,0 +1,33 @@
+import Dict from './Dict'
+import { mergeOptions } from './DictOptions'
+
+export default function(Vue, options) {
+  mergeOptions(options)
+  Vue.mixin({
+    data() {
+      if (this.$options === undefined || this.$options.dicts === undefined || this.$options.dicts === null) {
+        return {}
+      }
+      const dict = new Dict()
+      dict.owner = this
+      return {
+        dict
+      }
+    },
+    created() {
+      if (!(this.dict instanceof Dict)) {
+        return
+      }
+      options.onCreated && options.onCreated(this.dict)
+      this.dict.init(this.$options.dicts).then(() => {
+        options.onReady && options.onReady(this.dict)
+        this.$nextTick(() => {
+          this.$emit('dictReady', this.dict)
+          if (this.$options.methods && this.$options.methods.onDictReady instanceof Function) {
+            this.$options.methods.onDictReady.call(this, this.dict)
+          }
+        })
+      })
+    },
+  })
+}

+ 16 - 0
ui/src/utils/ruoyi.js

@@ -149,3 +149,19 @@ export function handleTree(data, id, parentId, children, rootId) {
 	});
 	return treeData != '' ? treeData : data;
 }
+
+// 数据合并
+export function mergeRecursive(source, target) {
+  for (var p in target) {
+    try {
+      if (target[p].constructor == Object) {
+        source[p] = mergeRecursive(source[p], target[p]);
+      } else {
+        source[p] = target[p];
+      }
+    } catch (e) {
+      source[p] = target[p];
+    }
+  }
+  return source;
+};

+ 454 - 0
ui/src/views/patrol/commonuse/bicycle/index.vue

@@ -0,0 +1,454 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="自行车编号" prop="devNo" label-width="90px">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入自行车编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="年" prop="planYear">
+        <el-date-picker
+          v-model="year"
+          :clearable="false"
+          format="yyyy"
+          placeholder="请选择年份"
+          type="year"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="月" prop="planQuarter">
+        <el-date-picker
+          v-model="month"
+          :clearable="false"
+          format="MM"
+          placeholder="选择月"
+          popper-class="picker-date"
+          type="month"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="计划名称" prop="planId">
+        <el-select v-model="queryParams.planId" clearable
+                   @change="handleQuery">
+          <el-option v-for="item in planList"
+                     :key="item.id"
+                     :label="item.planName"
+                     :value="item.id"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['commonuse:bicycle:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="bicycleList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="自行车编号" align="center" prop="devNo" />
+      <el-table-column label="外观检查完好" align="center" prop="appearance">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.appearance"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="前后轮车胎气压正常" align="center" prop="normobaria">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.normobaria"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="脚蹬无破损" align="center" prop="pedalCondition">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.pedalCondition"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="前后手刹完好,功能正常" align="center" prop="handbrakeIntact">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.handbrakeIntact"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="车铃铛完好,能正常使用" align="center" prop="bellIntact">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.bellIntact"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="自行车链条完好" align="center" prop="hingeIntact">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.hingeIntact"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="反光贴正常" align="center" prop="normalReflector">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.normalReflector"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="自行车支架完好" align="center" prop="supportIntact">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.supportIntact"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="车坐垫完好,无损坏" align="center" prop="cushionIntact">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.cushionIntact"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="前后轮挡泥板完好" align="center" prop="fenderIntact">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.fenderIntact"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="前后轮车辐条完好" align="center" prop="spokeStripIntact">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.spokeStripIntact"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="前后轮钢圈完好" align="center" prop="steelRingIntact">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.steelRingIntact"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="车锁完好,功能正常" align="center" prop="lockIntact">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.lockIntact"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="自行车编号清晰,无污损" align="center" prop="clearlyNumbered">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.clearlyNumbered"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="自行车后座支架完好,无松动" align="center" prop="supportNoLoose">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.supportNoLoose"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="确认人" align="center" prop="confirmed" />
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            icon="el-icon-picture-outline"
+            size="mini"
+            type="text"
+            @click="openFileDialog(scope.row)"
+          >附件
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <el-dialog :close-on-click-modal="false":visible.sync="file.open" append-to-body title="附件详情" width="50%">
+      <el-tabs v-model="tabName" :stretch="true" type="border-card">
+        <el-tab-pane label="常规附件" name="a">
+          <el-empty v-if="file.files.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.files" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常附件" name="b">
+          <el-empty v-if="file.issuesFiles.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.issuesFiles" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常整改后附件" name="c">
+          <el-empty v-if="file.repairFile.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.repairFile" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import { listBicycle, getBicycle, delBicycle, addBicycle, updateBicycle } from "@/api/patrol/commonuse/bicycle";
+import {listAllPlan} from "@/api/patrol/patrol/plan";
+
+export default {
+  name: "Bicycle",
+  dicts: ['inspection_status'],
+  data() {
+    return {
+      tabName: 'a',
+      planList: [],
+      file: {
+        open: false,
+        issuesFiles: [],
+        repairFile: [],
+        files: []
+      },
+      month: new Date(),
+      year: new Date(),
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 自行车表格数据
+      bicycleList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        id: null,
+        devNo: null,
+        appearance: null,
+        normobaria: null,
+        pedalCondition: null,
+        handbrakeIntact: null,
+        bellIntact: null,
+        checkStatus: null,
+        checkDate: null,
+        confirmed: null,
+        updaterCode: null,
+        updatedate: null,
+        month: null,
+        year: null,
+        remarks: null,
+        createdate: null,
+        createrCode: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null,
+        hingeIntact: null,
+        normalReflector: null,
+        supportIntact: null,
+        cushionIntact: null,
+        fenderIntact: null,
+        spokeStripIntact: null,
+        steelRingIntact: null,
+        lockIntact: null,
+        clearlyNumbered: null,
+        supportNoLoose: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "自行车编号不能为空", trigger: "blur" }
+        ],
+        delFlag: [
+          { required: true, message: "删除标识0未删除不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    if (this.$route.query.year && this.$route.query.month) {
+      this.year.setFullYear(this.$route.query.year, this.$route.query.month, 1);
+      this.month.setMonth(this.$route.query.month, 1);
+    }
+    if (this.$route.query.planId) {
+      this.queryParams.planId = parseInt(this.$route.query.planId)
+    }
+    if (this.$route.query.id) {
+      this.queryParams.id = parseInt(this.$route.query.id)
+      this.queryParams.issuesFlag = '1';
+    }
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+
+    if (!this.queryParams.id) {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '21'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+        if (res.data.length > 0) {
+          this.queryParams.planId = res.data[0].id;
+        }
+        this.getList();
+      })
+    }else{
+      this.getList();
+    }
+  },
+  methods: {
+    openFileDialog(row) {
+      this.tabName = 'a'
+      this.file.issuesFiles = []
+      this.file.files = []
+      this.file.repairFile = []
+      this.file.open = true;
+      if (row.problemFileUrl)
+        this.file.issuesFiles = row.problemFileUrl.split(',');
+      if (row.fileUrl)
+        this.file.files = row.fileUrl.split(',');
+      if (row.repairFile)
+        this.file.repairFile = row.repairFile.split(',');
+    },
+    getPlanList() {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '21'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+      })
+    },
+    /** 查询自行车列表 */
+    getList() {
+      this.loading = true;
+      if (!this.queryParams.id) {
+        this.queryParams.month = this.month.getMonth() + 1;
+        this.queryParams.year = this.year.getFullYear();
+      }
+      listBicycle(this.queryParams).then(response => {
+        this.bicycleList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        appearance: null,
+        normobaria: null,
+        pedalCondition: null,
+        handbrakeIntact: null,
+        bellIntact: null,
+        checkStatus: null,
+        checkDate: null,
+        confirmed: null,
+        updaterCode: null,
+        updatedate: null,
+        month: null,
+        year: null,
+        remarks: null,
+        createdate: null,
+        delFlag: null,
+        createrCode: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null,
+        hingeIntact: null,
+        normalReflector: null,
+        supportIntact: null,
+        cushionIntact: null,
+        fenderIntact: null,
+        spokeStripIntact: null,
+        steelRingIntact: null,
+        lockIntact: null,
+        clearlyNumbered: null,
+        supportNoLoose: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.getPlanList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加自行车";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getBicycle(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改自行车";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateBicycle(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addBicycle(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除自行车编号为"' + ids + '"的数据项?').then(function() {
+        return delBicycle(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('commonuse/bicycle/export', {
+        ...this.queryParams
+      }, `bicycle_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 369 - 0
ui/src/views/patrol/commonuse/cover/index.vue

@@ -0,0 +1,369 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="年" prop="planYear">
+        <el-date-picker
+          v-model="year"
+          :clearable="false"
+          format="yyyy"
+          placeholder="请选择年份"
+          type="year"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="月" prop="planQuarter">
+        <el-date-picker
+          v-model="month"
+          :clearable="false"
+          format="MM"
+          placeholder="选择月"
+          popper-class="picker-date"
+          type="month"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="计划名称" prop="planId">
+        <el-select v-model="queryParams.planId" clearable
+                   @change="handleQuery">
+          <el-option v-for="item in planList"
+                     :key="item.id"
+                     :label="item.planName"
+                     :value="item.id"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['commonuse:cover:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="coverList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="地井盖是否缺失" align="center" prop="deficiency">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.deficiency"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="地井盖外观" align="center" prop="appearance">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.appearance"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="确认人" align="center" prop="confirmed" />
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            icon="el-icon-picture-outline"
+            size="mini"
+            type="text"
+            @click="openFileDialog(scope.row)"
+          >附件
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog :close-on-click-modal="false":visible.sync="file.open" append-to-body title="附件详情" width="50%">
+      <el-tabs v-model="tabName" :stretch="true" type="border-card">
+        <el-tab-pane label="常规附件" name="a">
+          <el-empty v-if="file.files.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.files" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常附件" name="b">
+          <el-empty v-if="file.issuesFiles.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.issuesFiles" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常整改后附件" name="c">
+          <el-empty v-if="file.repairFile.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.repairFile" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+  </div>
+</template>
+
+<script>
+import { listCover, getCover, delCover, addCover, updateCover } from "@/api/patrol/commonuse/cover";
+import {listAllPlan} from "@/api/patrol/patrol/plan";
+
+export default {
+  name: "Cover",
+  dicts: ['inspection_status'],
+  data() {
+    return {
+      tabName: 'a',
+      planList: [],
+      file: {
+        open: false,
+        issuesFiles: [],
+        repairFile: [],
+        files: []
+      },
+      month: new Date(),
+      year: new Date(),
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 地井盖表格数据
+      coverList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        id: null,
+        devNo: null,
+        position: null,
+        deficiency: null,
+        appearance: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    if (this.$route.query.year && this.$route.query.month) {
+      this.year.setFullYear(this.$route.query.year, this.$route.query.month, 1);
+      this.month.setMonth(this.$route.query.month, 1);
+    }
+    if (this.$route.query.planId) {
+      this.queryParams.planId = parseInt(this.$route.query.planId)
+    }
+    if (this.$route.query.id) {
+      this.queryParams.id = parseInt(this.$route.query.id)
+      this.queryParams.issuesFlag = '1';
+    }
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+
+    if (!this.queryParams.id) {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '22'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+        if (res.data.length > 0) {
+          this.queryParams.planId = res.data[0].id;
+        }
+        this.getList();
+      })
+    }else{
+      this.getList();
+    }
+  },
+  methods: {
+    openFileDialog(row) {
+      this.tabName = 'a'
+      this.file.issuesFiles = []
+      this.file.files = []
+      this.file.repairFile = []
+      this.file.open = true;
+      if (row.problemFileUrl)
+        this.file.issuesFiles = row.problemFileUrl.split(',');
+      if (row.fileUrl)
+        this.file.files = row.fileUrl.split(',');
+      if (row.repairFile)
+        this.file.repairFile = row.repairFile.split(',');
+    },
+    getPlanList() {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '22'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+      })
+    },
+    /** 查询地井盖列表 */
+    getList() {
+      this.loading = true;
+      if (!this.queryParams.id) {
+        this.queryParams.month = this.month.getMonth() + 1;
+        this.queryParams.year = this.year.getFullYear();
+      }
+      listCover(this.queryParams).then(response => {
+        this.coverList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        deficiency: null,
+        appearance: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.getPlanList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加地井盖";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCover(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改地井盖";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateCover(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCover(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除地井盖编号为"' + ids + '"的数据项?').then(function() {
+        return delCover(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('commonuse/cover/export', {
+        ...this.queryParams
+      }, `cover_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 364 - 0
ui/src/views/patrol/commonuse/downspout/index.vue

@@ -0,0 +1,364 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="年" prop="planYear">
+        <el-date-picker
+          v-model="year"
+          :clearable="false"
+          format="yyyy"
+          placeholder="请选择年份"
+          type="year"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="月" prop="planQuarter">
+        <el-date-picker
+          v-model="month"
+          :clearable="false"
+          format="MM"
+          placeholder="选择月"
+          popper-class="picker-date"
+          type="month"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="计划名称" prop="planId">
+        <el-select v-model="queryParams.planId" clearable
+                   @change="handleQuery">
+          <el-option v-for="item in planList"
+                     :key="item.id"
+                     :label="item.planName"
+                     :value="item.id"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['commonuse:downspout:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="downspoutList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="落水管外观" align="center" prop="appearance">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.appearance"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="管道是否破损" align="center" prop="damaged">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.damaged"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="紧固件是否松动" align="center" prop="becomeFlexible">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.becomeFlexible"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="确认人" align="center" prop="confirmed" />
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            icon="el-icon-picture-outline"
+            size="mini"
+            type="text"
+            @click="openFileDialog(scope.row)"
+          >附件
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog :close-on-click-modal="false":visible.sync="file.open" append-to-body title="附件详情" width="50%">
+      <el-tabs v-model="tabName" :stretch="true" type="border-card">
+        <el-tab-pane label="常规附件" name="a">
+          <el-empty v-if="file.files.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.files" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常附件" name="b">
+          <el-empty v-if="file.issuesFiles.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.issuesFiles" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常整改后附件" name="c">
+          <el-empty v-if="file.repairFile.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.repairFile" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+  </div>
+</template>
+
+<script>
+import { listDownspout, getDownspout, delDownspout, addDownspout, updateDownspout } from "@/api/patrol/commonuse/downspout";
+import {listAllPlan} from "@/api/patrol/patrol/plan";
+
+export default {
+  name: "Downspout",
+  dicts: ['inspection_status'],
+  data() {
+    return {
+      tabName: 'a',
+      planList: [],
+      file: {
+        open: false,
+        issuesFiles: [],
+        repairFile: [],
+        files: []
+      },
+      month: new Date(),
+      year: new Date(),
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 落水管表格数据
+      downspoutList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        id: null,
+        position: null,
+        appearance: null,
+        damaged: null,
+        becomeFlexible: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    if (this.$route.query.year && this.$route.query.month) {
+      this.year.setFullYear(this.$route.query.year, this.$route.query.month, 1);
+      this.month.setMonth(this.$route.query.month, 1);
+    }
+    if (this.$route.query.planId) {
+      this.queryParams.planId = parseInt(this.$route.query.planId)
+    }
+    if (this.$route.query.id) {
+      this.queryParams.id = parseInt(this.$route.query.id)
+      this.queryParams.issuesFlag = '1';
+    }
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+
+    if (!this.queryParams.id) {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '25'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+        if (res.data.length > 0) {
+          this.queryParams.planId = res.data[0].id;
+        }
+        this.getList();
+      })
+    }else{
+      this.getList();
+    }
+  },
+  methods: {
+    openFileDialog(row) {
+      this.tabName = 'a'
+      this.file.issuesFiles = []
+      this.file.files = []
+      this.file.repairFile = []
+      this.file.open = true;
+      if (row.problemFileUrl)
+        this.file.issuesFiles = row.problemFileUrl.split(',');
+      if (row.fileUrl)
+        this.file.files = row.fileUrl.split(',');
+      if (row.repairFile)
+        this.file.repairFile = row.repairFile.split(',');
+    },
+    getPlanList() {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '25'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+      })
+    },
+    /** 查询落水管列表 */
+    getList() {
+      this.loading = true;
+      if (!this.queryParams.id) {
+        this.queryParams.month = this.month.getMonth() + 1;
+        this.queryParams.year = this.year.getFullYear();
+      }
+      listDownspout(this.queryParams).then(response => {
+        this.downspoutList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        position: null,
+        appearance: null,
+        damaged: null,
+        becomeFlexible: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.getPlanList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加落水管";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getDownspout(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改落水管";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateDownspout(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addDownspout(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除落水管编号为"' + ids + '"的数据项?').then(function() {
+        return delDownspout(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('commonuse/downspout/export', {
+        ...this.queryParams
+      }, `downspout_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 371 - 0
ui/src/views/patrol/commonuse/earplug/index.vue

@@ -0,0 +1,371 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="年" prop="planYear">
+        <el-date-picker
+          v-model="year"
+          :clearable="false"
+          format="yyyy"
+          placeholder="请选择年份"
+          type="year"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="月" prop="planQuarter">
+        <el-date-picker
+          v-model="month"
+          :clearable="false"
+          format="MM"
+          placeholder="选择月"
+          popper-class="picker-date"
+          type="month"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="计划名称" prop="planId">
+        <el-select v-model="queryParams.planId" clearable
+                   @change="handleQuery">
+          <el-option v-for="item in planList"
+                     :key="item.id"
+                     :label="item.planName"
+                     :value="item.id"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['commonuse:earplug:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="earplugList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="外观情况" align="center" prop="appearance" />
+      <el-table-column label="标识清晰度" align="center" prop="identificationClarity">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.identificationClarity"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="耳塞内分配器数量是否充足" align="center" prop="adequacyOrNot">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.adequacyOrNot"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="确认人" align="center" prop="confirmed" />
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            icon="el-icon-picture-outline"
+            size="mini"
+            type="text"
+            @click="openFileDialog(scope.row)"
+          >附件
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog :close-on-click-modal="false":visible.sync="file.open" append-to-body title="附件详情" width="50%">
+      <el-tabs v-model="tabName" :stretch="true" type="border-card">
+        <el-tab-pane label="常规附件" name="a">
+          <el-empty v-if="file.files.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.files" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常附件" name="b">
+          <el-empty v-if="file.issuesFiles.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.issuesFiles" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常整改后附件" name="c">
+          <el-empty v-if="file.repairFile.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.repairFile" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    </div>
+</template>
+
+<script>
+import { listEarplug, getEarplug, delEarplug, addEarplug, updateEarplug } from "@/api/patrol/commonuse/earplug";
+import {listAllPlan} from "@/api/patrol/patrol/plan";
+
+export default {
+  name: "Earplug",
+  dicts: ['inspection_status'],
+  data() {
+    return {
+      tabName: 'a',
+      planList: [],
+      file: {
+        open: false,
+        issuesFiles: [],
+        repairFile: [],
+        files: []
+      },
+      month: new Date(),
+      year: new Date(),
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 耳塞分配器检查记录表格数据
+      earplugList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        id: null,
+        devNo: null,
+        position: null,
+        appearance: null,
+        identificationClarity: null,
+        adequacyOrNot: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    if (this.$route.query.year && this.$route.query.month) {
+      this.year.setFullYear(this.$route.query.year, this.$route.query.month, 1);
+      this.month.setMonth(this.$route.query.month, 1);
+    }
+    if (this.$route.query.planId) {
+      this.queryParams.planId = parseInt(this.$route.query.planId)
+    }
+    if (this.$route.query.id) {
+      this.queryParams.id = parseInt(this.$route.query.id)
+      this.queryParams.issuesFlag = '1';
+    }
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+
+    if (!this.queryParams.id) {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '19'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+        if (res.data.length > 0) {
+          this.queryParams.planId = res.data[0].id;
+        }
+        this.getList();
+      })
+    }else{
+      this.getList();
+    }
+  },
+  methods: {
+    openFileDialog(row) {
+      this.tabName = 'a'
+      this.file.issuesFiles = []
+      this.file.files = []
+      this.file.repairFile = []
+      this.file.open = true;
+      if (row.problemFileUrl)
+        this.file.issuesFiles = row.problemFileUrl.split(',');
+      if (row.fileUrl)
+        this.file.files = row.fileUrl.split(',');
+      if (row.repairFile)
+        this.file.repairFile = row.repairFile.split(',');
+    },
+    getPlanList() {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '19'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+      })
+    },
+    /** 查询耳塞分配器检查记录列表 */
+    getList() {
+      this.loading = true;
+      if (!this.queryParams.id) {
+        this.queryParams.month = this.month.getMonth() + 1;
+        this.queryParams.year = this.year.getFullYear();
+      }
+      listEarplug(this.queryParams).then(response => {
+        this.earplugList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        appearance: null,
+        identificationClarity: null,
+        adequacyOrNot: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.getPlanList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加耳塞分配器检查记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getEarplug(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改耳塞分配器检查记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateEarplug(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addEarplug(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除耳塞分配器检查记录编号为"' + ids + '"的数据项?').then(function() {
+        return delEarplug(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('commonuse/earplug/export', {
+        ...this.queryParams
+      }, `earplug_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 385 - 0
ui/src/views/patrol/commonuse/movement/index.vue

@@ -0,0 +1,385 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="年" prop="planYear">
+        <el-date-picker
+          v-model="year"
+          :clearable="false"
+          format="yyyy"
+          placeholder="请选择年份"
+          type="year"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="月" prop="planQuarter">
+        <el-date-picker
+          v-model="month"
+          :clearable="false"
+          format="MM"
+          placeholder="选择月"
+          popper-class="picker-date"
+          type="month"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="计划名称" prop="planId">
+        <el-select v-model="queryParams.planId" clearable
+                   @change="handleQuery">
+          <el-option v-for="item in planList"
+                     :key="item.id"
+                     :label="item.planName"
+                     :value="item.id"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['commonuse:movement:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="movementList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="外观情况" align="center" prop="appearance">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.appearance"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="踏板情况" align="center" prop="footboard">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.footboard"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="锈蚀情况" align="center" prop="corrosion">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.corrosion"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="移动梯扶手" align="center" prop="handrail">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.handrail"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="万向轮功能" align="center" prop="universalWheel" />
+      <el-table-column label="确认人" align="center" prop="confirmed" />
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            icon="el-icon-picture-outline"
+            size="mini"
+            type="text"
+            @click="openFileDialog(scope.row)"
+          >附件
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog :close-on-click-modal="false":visible.sync="file.open" append-to-body title="附件详情" width="50%">
+      <el-tabs v-model="tabName" :stretch="true" type="border-card">
+        <el-tab-pane label="常规附件" name="a">
+          <el-empty v-if="file.files.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.files" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常附件" name="b">
+          <el-empty v-if="file.issuesFiles.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.issuesFiles" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常整改后附件" name="c">
+          <el-empty v-if="file.repairFile.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.repairFile" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+  </div>
+</template>
+
+<script>
+import { listMovement, getMovement, delMovement, addMovement, updateMovement } from "@/api/patrol/commonuse/movement";
+import {listAllPlan} from "@/api/patrol/patrol/plan";
+
+export default {
+  name: "Movement",
+  dicts: ['inspection_status'],
+  data() {
+    return {
+      tabName: 'a',
+      planList: [],
+      file: {
+        open: false,
+        issuesFiles: [],
+        repairFile: [],
+        files: []
+      },
+      month: new Date(),
+      year: new Date(),
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 移动平台及移动梯表格数据
+      movementList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        id: null,
+        devNo: null,
+        position: null,
+        appearance: null,
+        footboard: null,
+        corrosion: null,
+        handrail: null,
+        universalWheel: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    if (this.$route.query.year && this.$route.query.month) {
+      this.year.setFullYear(this.$route.query.year, this.$route.query.month, 1);
+      this.month.setMonth(this.$route.query.month, 1);
+    }
+    if (this.$route.query.planId) {
+      this.queryParams.planId = parseInt(this.$route.query.planId)
+    }
+    if (this.$route.query.id) {
+      this.queryParams.id = parseInt(this.$route.query.id)
+      this.queryParams.issuesFlag = '1';
+    }
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+
+    if (!this.queryParams.id) {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '20'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+        if (res.data.length > 0) {
+          this.queryParams.planId = res.data[0].id;
+        }
+        this.getList();
+      })
+    }else{
+      this.getList();
+    }
+  },
+  methods: {
+    openFileDialog(row) {
+      this.tabName = 'a'
+      this.file.issuesFiles = []
+      this.file.files = []
+      this.file.repairFile = []
+      this.file.open = true;
+      if (row.problemFileUrl)
+        this.file.issuesFiles = row.problemFileUrl.split(',');
+      if (row.fileUrl)
+        this.file.files = row.fileUrl.split(',');
+      if (row.repairFile)
+        this.file.repairFile = row.repairFile.split(',');
+    },
+    getPlanList() {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '20'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+      })
+    },
+    /** 查询移动平台及移动梯列表 */
+    getList() {
+      this.loading = true;
+      if (!this.queryParams.id) {
+        this.queryParams.month = this.month.getMonth() + 1;
+        this.queryParams.year = this.year.getFullYear();
+      }
+      listMovement(this.queryParams).then(response => {
+        this.movementList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        appearance: null,
+        footboard: null,
+        corrosion: null,
+        handrail: null,
+        universalWheel: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.getPlanList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加移动平台及移动梯";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getMovement(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改移动平台及移动梯";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateMovement(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addMovement(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除移动平台及移动梯编号为"' + ids + '"的数据项?').then(function() {
+        return delMovement(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('commonuse/movement/export', {
+        ...this.queryParams
+      }, `movement_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 375 - 0
ui/src/views/patrol/commonuse/pump/index.vue

@@ -0,0 +1,375 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="年" prop="planYear">
+        <el-date-picker
+          v-model="year"
+          :clearable="false"
+          format="yyyy"
+          placeholder="请选择年份"
+          type="year"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="月" prop="planQuarter">
+        <el-date-picker
+          v-model="month"
+          :clearable="false"
+          format="MM"
+          placeholder="选择月"
+          popper-class="picker-date"
+          type="month"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="计划名称" prop="planId">
+        <el-select v-model="queryParams.planId" clearable
+                   @change="handleQuery">
+          <el-option v-for="item in planList"
+                     :key="item.id"
+                     :label="item.planName"
+                     :value="item.id"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['commonuse:pump:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="pumpList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="接合器外观" align="center" prop="appearance">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.appearance"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="接合器编号标识" align="center" prop="numberingIdentification">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.numberingIdentification"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="接合器闷盖及接口" align="center" prop="coverInterface">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.coverInterface"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="确认人" align="center" prop="confirmed" />
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            icon="el-icon-picture-outline"
+            size="mini"
+            type="text"
+            @click="openFileDialog(scope.row)"
+          >附件
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog :close-on-click-modal="false":visible.sync="file.open" append-to-body title="附件详情" width="50%">
+      <el-tabs v-model="tabName" :stretch="true" type="border-card">
+        <el-tab-pane label="常规附件" name="a">
+          <el-empty v-if="file.files.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.files" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常附件" name="b">
+          <el-empty v-if="file.issuesFiles.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.issuesFiles" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常整改后附件" name="c">
+          <el-empty v-if="file.repairFile.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.repairFile" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+  </div>
+</template>
+
+<script>
+import { listPump, getPump, delPump, addPump, updatePump } from "@/api/patrol/commonuse/pump";
+import {listAllPlan} from "@/api/patrol/patrol/plan";
+
+export default {
+  name: "Pump",
+  dicts: ['inspection_status'],
+  data() {
+    return {
+      tabName: 'a',
+      planList: [],
+      file: {
+        open: false,
+        issuesFiles: [],
+        repairFile: [],
+        files: []
+      },
+      month: new Date(),
+      year: new Date(),
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 水泵接合器表格数据
+      pumpList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        id: null,
+        devNo: null,
+        position: null,
+        appearance: null,
+        numberingIdentification: null,
+        coverInterface: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    if (this.$route.query.year && this.$route.query.month) {
+      this.year.setFullYear(this.$route.query.year, this.$route.query.month, 1);
+      this.month.setMonth(this.$route.query.month, 1);
+    }
+    if (this.$route.query.planId) {
+      this.queryParams.planId = parseInt(this.$route.query.planId)
+    }
+    if (this.$route.query.id) {
+      this.queryParams.id = parseInt(this.$route.query.id)
+      this.queryParams.issuesFlag = '1';
+    }
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+
+    if (!this.queryParams.id) {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '26'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+        if (res.data.length > 0) {
+          this.queryParams.planId = res.data[0].id;
+        }
+        this.getList();
+      })
+    }else{
+      this.getList();
+    }
+  },
+  methods: {
+    openFileDialog(row) {
+      this.tabName = 'a'
+      this.file.issuesFiles = []
+      this.file.files = []
+      this.file.repairFile = []
+      this.file.open = true;
+      if (row.problemFileUrl)
+        this.file.issuesFiles = row.problemFileUrl.split(',');
+      if (row.fileUrl)
+        this.file.files = row.fileUrl.split(',');
+      if (row.repairFile)
+        this.file.repairFile = row.repairFile.split(',');
+    },
+    getPlanList() {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '26'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+      })
+    },
+    /** 查询水泵接合器列表 */
+    getList() {
+      this.loading = true;
+      if (!this.queryParams.id) {
+        this.queryParams.month = this.month.getMonth() + 1;
+        this.queryParams.year = this.year.getFullYear();
+      }
+      listPump(this.queryParams).then(response => {
+        this.pumpList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        appearance: null,
+        numberingIdentification: null,
+        coverInterface: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.getPlanList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加水泵接合器";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getPump(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改水泵接合器";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updatePump(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addPump(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除水泵接合器编号为"' + ids + '"的数据项?').then(function() {
+        return delPump(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('commonuse/pump/export', {
+        ...this.queryParams
+      }, `pump_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 382 - 0
ui/src/views/patrol/commonuse/safetyBelt/index.vue

@@ -0,0 +1,382 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="年" prop="planYear">
+        <el-date-picker
+          v-model="year"
+          :clearable="false"
+          format="yyyy"
+          placeholder="请选择年份"
+          type="year"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="月" prop="planQuarter">
+        <el-date-picker
+          v-model="month"
+          :clearable="false"
+          format="MM"
+          placeholder="选择月"
+          popper-class="picker-date"
+          type="month"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="计划名称" prop="planId">
+        <el-select v-model="queryParams.planId" clearable
+                   @change="handleQuery">
+          <el-option v-for="item in planList"
+                     :key="item.id"
+                     :label="item.planName"
+                     :value="item.id"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['commonuse:safetyBelt:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="safetyBeltList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="安全带腰带、背带的外观,无破损、变色、发霉、断线" align="center" prop="noDamage">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.noDamage"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="安全带扣件无松动,卡扣牢固可靠" align="center" prop="fastness">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.fastness"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="安全带缓冲安全绳及保护套" align="center" prop="protectiveJacket">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.protectiveJacket"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="编号准确,在有效期内" align="center" prop="validity">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.validity"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="确认人" align="center" prop="confirmed" />
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            icon="el-icon-picture-outline"
+            size="mini"
+            type="text"
+            @click="openFileDialog(scope.row)"
+          >附件
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog :close-on-click-modal="false":visible.sync="file.open" append-to-body title="附件详情" width="50%">
+      <el-tabs v-model="tabName" :stretch="true" type="border-card">
+        <el-tab-pane label="常规附件" name="a">
+          <el-empty v-if="file.files.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.files" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常附件" name="b">
+          <el-empty v-if="file.issuesFiles.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.issuesFiles" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常整改后附件" name="c">
+          <el-empty v-if="file.repairFile.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.repairFile" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+  </div>
+</template>
+
+<script>
+import { listSafetyBelt, getSafetyBelt, delSafetyBelt, addSafetyBelt, updateSafetyBelt } from "@/api/patrol/commonuse/safetyBelt";
+import {listAllPlan} from "@/api/patrol/patrol/plan";
+
+export default {
+  name: "SafetyBelt",
+  dicts: ['inspection_status'],
+  data() {
+    return {
+      tabName: 'a',
+      planList: [],
+      file: {
+        open: false,
+        issuesFiles: [],
+        repairFile: [],
+        files: []
+      },
+      month: new Date(),
+      year: new Date(),
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 安全带表格数据
+      safetyBeltList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        id: null,
+        devNo: null,
+        position: null,
+        noDamage: null,
+        fastness: null,
+        protectiveJacket: null,
+        validity: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    if (this.$route.query.year && this.$route.query.month) {
+      this.year.setFullYear(this.$route.query.year, this.$route.query.month, 1);
+      this.month.setMonth(this.$route.query.month, 1);
+    }
+    if (this.$route.query.planId) {
+      this.queryParams.planId = parseInt(this.$route.query.planId)
+    }
+    if (this.$route.query.id) {
+      this.queryParams.id = parseInt(this.$route.query.id)
+      this.queryParams.issuesFlag = '1';
+    }
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+
+    if (!this.queryParams.id) {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '24'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+        if (res.data.length > 0) {
+          this.queryParams.planId = res.data[0].id;
+        }
+        this.getList();
+      })
+    }else{
+      this.getList();
+    }
+  },
+  methods: {
+    openFileDialog(row) {
+      this.tabName = 'a'
+      this.file.issuesFiles = []
+      this.file.files = []
+      this.file.repairFile = []
+      this.file.open = true;
+      if (row.problemFileUrl)
+        this.file.issuesFiles = row.problemFileUrl.split(',');
+      if (row.fileUrl)
+        this.file.files = row.fileUrl.split(',');
+      if (row.repairFile)
+        this.file.repairFile = row.repairFile.split(',');
+    },
+    getPlanList() {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '24'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+      })
+    },
+    /** 查询安全带列表 */
+    getList() {
+      this.loading = true;
+      if (!this.queryParams.id) {
+        this.queryParams.month = this.month.getMonth() + 1;
+        this.queryParams.year = this.year.getFullYear();
+      }
+      listSafetyBelt(this.queryParams).then(response => {
+        this.safetyBeltList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        noDamage: null,
+        fastness: null,
+        protectiveJacket: null,
+        validity: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.getPlanList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加安全带";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getSafetyBelt(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改安全带";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateSafetyBelt(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addSafetyBelt(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除安全带编号为"' + ids + '"的数据项?').then(function() {
+        return delSafetyBelt(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('commonuse/safetyBelt/export', {
+        ...this.queryParams
+      }, `safetyBelt_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 475 - 0
ui/src/views/patrol/commonuse/tester/index.vue

@@ -0,0 +1,475 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="检测仪类型" prop="testerType" label-width="90px">
+        <el-input
+          v-model="queryParams.testerType"
+          placeholder="请输入检测仪类型"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="型号" prop="testerModel">
+        <el-input
+          v-model="queryParams.testerModel"
+          placeholder="请输入型号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="编号" prop="testerNo">
+        <el-input
+          v-model="queryParams.testerNo"
+          placeholder="请输入编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="年" prop="planYear">
+        <el-date-picker
+          v-model="year"
+          :clearable="false"
+          format="yyyy"
+          placeholder="请选择年份"
+          type="year"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="月" prop="planQuarter">
+        <el-date-picker
+          v-model="month"
+          :clearable="false"
+          format="MM"
+          placeholder="选择月"
+          popper-class="picker-date"
+          type="month"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="计划名称" prop="planId">
+        <el-select v-model="queryParams.planId" clearable
+                   @change="handleQuery">
+          <el-option v-for="item in planList"
+                     :key="item.id"
+                     :label="item.planName"
+                     :value="item.id"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['commonuse:tester:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="testerList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="检测仪类型" align="center" prop="testerType" />
+      <el-table-column label="型号" align="center" prop="testerModel" />
+      <el-table-column label="编号" align="center" prop="testerNo" />
+      <el-table-column label="检测仪外观及背夹完好度" align="center" prop="testerBody">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.testerBody"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="检测仪显示屏及电量" align="center" prop="testerEnergy">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.testerEnergy"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="检测仪有效期" align="center" prop="testerSafeDate">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.testerSafeDate"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="确认人" align="center" prop="confirmed" />
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            icon="el-icon-picture-outline"
+            size="mini"
+            type="text"
+            @click="openFileDialog(scope.row)"
+          >附件
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog :close-on-click-modal="false":visible.sync="file.open" append-to-body title="附件详情" width="50%">
+      <el-tabs v-model="tabName" :stretch="true" type="border-card">
+        <el-tab-pane label="常规附件" name="a">
+          <el-empty v-if="file.files.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.files" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常附件" name="b">
+          <el-empty v-if="file.issuesFiles.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.issuesFiles" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常整改后附件" name="c">
+          <el-empty v-if="file.repairFile.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.repairFile" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改检测仪检查记录对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="型号" prop="testerModel">
+          <el-input v-model="form.testerModel" placeholder="请输入型号" />
+        </el-form-item>
+        <el-form-item label="编号" prop="testerNo">
+          <el-input v-model="form.testerNo" placeholder="请输入编号" />
+        </el-form-item>
+        <el-form-item label="检测仪外观及背夹完好度" prop="testerBody">
+          <el-input v-model="form.testerBody" placeholder="请输入检测仪外观及背夹完好度" />
+        </el-form-item>
+        <el-form-item label="检测仪显示屏及电量" prop="testerEnergy">
+          <el-input v-model="form.testerEnergy" placeholder="请输入检测仪显示屏及电量" />
+        </el-form-item>
+        <el-form-item label="检测仪有效期" prop="testerSafeDate">
+          <el-input v-model="form.testerSafeDate" placeholder="请输入检测仪有效期" />
+        </el-form-item>
+        <el-form-item label="确认人" prop="confirmed">
+          <el-input v-model="form.confirmed" placeholder="请输入确认人" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+        <el-form-item label="检查时间" prop="checkDate">
+          <el-date-picker clearable
+            v-model="form.checkDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择检查时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="月度" prop="month">
+          <el-input v-model="form.month" placeholder="请输入月度" />
+        </el-form-item>
+        <el-form-item label="年度" prop="year">
+          <el-input v-model="form.year" placeholder="请输入年度" />
+        </el-form-item>
+        <el-form-item label="删除标识0未删除" prop="delFlag">
+          <el-input v-model="form.delFlag" placeholder="请输入删除标识0未删除" />
+        </el-form-item>
+        <el-form-item label="创建人" prop="createrCode">
+          <el-input v-model="form.createrCode" placeholder="请输入创建人" />
+        </el-form-item>
+        <el-form-item label="创建时间" prop="createdate">
+          <el-date-picker clearable
+            v-model="form.createdate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择创建时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="修改人" prop="updaterCode">
+          <el-input v-model="form.updaterCode" placeholder="请输入修改人" />
+        </el-form-item>
+        <el-form-item label="修改时间" prop="updatedate">
+          <el-date-picker clearable
+            v-model="form.updatedate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择修改时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="部门编号" prop="deptId">
+          <el-input v-model="form.deptId" placeholder="请输入部门编号" />
+        </el-form-item>
+        <el-form-item label="计划id" prop="planId">
+          <el-input v-model="form.planId" placeholder="请输入计划id" />
+        </el-form-item>
+        <el-form-item label="问题文件地址" prop="problemFileUrl">
+          <el-input v-model="form.problemFileUrl" placeholder="请输入问题文件地址" />
+        </el-form-item>
+        <el-form-item label="文件地址" prop="fileUrl">
+          <el-input v-model="form.fileUrl" placeholder="请输入文件地址" />
+        </el-form-item>
+        <el-form-item label="是否为问题记录数据" prop="issuesFlag">
+          <el-input v-model="form.issuesFlag" placeholder="请输入是否为问题记录数据" />
+        </el-form-item>
+        <el-form-item label="问题修复附件" prop="repairFile">
+          <file-upload v-model="form.repairFile"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listTester, getTester, delTester, addTester, updateTester } from "@/api/patrol/commonuse/tester";
+import {listAllPlan} from "@/api/patrol/patrol/plan";
+
+export default {
+  name: "Tester",
+  dicts: ['inspection_status'],
+  data() {
+    return {
+      tabName: 'a',
+      planList: [],
+      file: {
+        open: false,
+        issuesFiles: [],
+        repairFile: [],
+        files: []
+      },
+      month: new Date(),
+      year: new Date(),
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 检测仪检查记录表格数据
+      testerList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        testerType: null,
+        testerModel: null,
+        testerNo: null,
+        testerBody: null,
+        testerEnergy: null,
+        testerSafeDate: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        delFlag: [
+          { required: true, message: "删除标识0未删除不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    if (this.$route.query.year && this.$route.query.month) {
+      this.year.setFullYear(this.$route.query.year, this.$route.query.month, 1);
+      this.month.setMonth(this.$route.query.month, 1);
+    }
+    if (this.$route.query.planId) {
+      this.queryParams.planId = parseInt(this.$route.query.planId)
+    }
+    if (this.$route.query.id) {
+      this.queryParams.id = parseInt(this.$route.query.id)
+      this.queryParams.issuesFlag = '1';
+    }
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+
+    if (!this.queryParams.id) {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '18'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+        if (res.data.length > 0) {
+          this.queryParams.planId = res.data[0].id;
+        }
+        this.getList();
+      })
+    }else{
+      this.getList();
+    }
+  },
+  methods: {
+    openFileDialog(row) {
+      this.tabName = 'a'
+      this.file.issuesFiles = []
+      this.file.files = []
+      this.file.repairFile = []
+      this.file.open = true;
+      if (row.problemFileUrl)
+        this.file.issuesFiles = row.problemFileUrl.split(',');
+      if (row.fileUrl)
+        this.file.files = row.fileUrl.split(',');
+      if (row.repairFile)
+        this.file.repairFile = row.repairFile.split(',');
+    },
+    getPlanList() {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '18'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+      })
+    },
+    /** 查询检测仪检查记录列表 */
+    getList() {
+      this.loading = true;
+      if (!this.queryParams.id) {
+        this.queryParams.month = this.month.getMonth() + 1;
+        this.queryParams.year = this.year.getFullYear();
+      }
+      listTester(this.queryParams).then(response => {
+        this.testerList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        testerType: null,
+        testerModel: null,
+        testerNo: null,
+        testerBody: null,
+        testerEnergy: null,
+        testerSafeDate: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.getPlanList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加检测仪检查记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getTester(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改检测仪检查记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateTester(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addTester(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除检测仪检查记录编号为"' + ids + '"的数据项?').then(function() {
+        return delTester(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('commonuse/tester/export', {
+        ...this.queryParams
+      }, `tester_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 378 - 0
ui/src/views/patrol/commonuse/walkitTalkie/index.vue

@@ -0,0 +1,378 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="年" prop="planYear">
+        <el-date-picker
+          v-model="year"
+          :clearable="false"
+          format="yyyy"
+          placeholder="请选择年份"
+          type="year"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="月" prop="planQuarter">
+        <el-date-picker
+          v-model="month"
+          :clearable="false"
+          format="MM"
+          placeholder="选择月"
+          popper-class="picker-date"
+          type="month"
+          @change="handleQuery">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="计划名称" prop="planId">
+        <el-select v-model="queryParams.planId" clearable
+                   @change="handleQuery">
+          <el-option v-for="item in planList"
+                     :key="item.id"
+                     :label="item.planName"
+                     :value="item.id"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['commonuse:walkitTalkie:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="walkitTalkieList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="外观情况" align="center" prop="appearance">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.appearance"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="编号标签" align="center" prop="numberingLabel">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.numberingLabel"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="电池状况" align="center" prop="batteryCondition">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.batteryCondition"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="显示屏状况" align="center" prop="displayScreen">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.displayScreen"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="通话音质" align="center" prop="voiceQuality">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.inspection_status" :value="scope.row.voiceQuality"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="确认人" align="center" prop="confirmed" />
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            icon="el-icon-picture-outline"
+            size="mini"
+            type="text"
+            @click="openFileDialog(scope.row)"
+          >附件
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog :close-on-click-modal="false":visible.sync="file.open" append-to-body title="附件详情" width="50%">
+      <el-tabs v-model="tabName" :stretch="true" type="border-card">
+        <el-tab-pane label="常规附件" name="a">
+          <el-empty v-if="file.files.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.files" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常附件" name="b">
+          <el-empty v-if="file.issuesFiles.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.issuesFiles" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+        <el-tab-pane label="异常整改后附件" name="c">
+          <el-empty v-if="file.repairFile.length==0" description="如你所见,这里什么都没有"></el-empty>
+          <el-image v-for="url in file.repairFile" v-else :key="url" :src="url"></el-image>
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+  </div>
+</template>
+
+<script>
+import { listWalkitTalkie, getWalkitTalkie, delWalkitTalkie, addWalkitTalkie, updateWalkitTalkie } from "@/api/patrol/commonuse/walkitTalkie";
+import {listAllPlan} from "@/api/patrol/patrol/plan";
+
+export default {
+  name: "WalkitTalkie",
+  dicts: ['inspection_status'],
+  data() {
+    return {
+      tabName: 'a',
+      planList: [],
+      file: {
+        open: false,
+        issuesFiles: [],
+        repairFile: [],
+        files: []
+      },
+      month: new Date(),
+      year: new Date(),
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 对讲机表格数据
+      walkitTalkieList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        id: null,
+        devNo: null,
+        appearance: null,
+        numberingLabel: null,
+        batteryCondition: null,
+        displayScreen: null,
+        voiceQuality: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    if (this.$route.query.year && this.$route.query.month) {
+      this.year.setFullYear(this.$route.query.year, this.$route.query.month, 1);
+      this.month.setMonth(this.$route.query.month, 1);
+    }
+    if (this.$route.query.planId) {
+      this.queryParams.planId = parseInt(this.$route.query.planId)
+    }
+    if (this.$route.query.id) {
+      this.queryParams.id = parseInt(this.$route.query.id)
+      this.queryParams.issuesFlag = '1';
+    }
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+
+    if (!this.queryParams.id) {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '23'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+        if (res.data.length > 0) {
+          this.queryParams.planId = res.data[0].id;
+        }
+        this.getList();
+      })
+    }else{
+      this.getList();
+    }
+  },
+  methods: {
+    openFileDialog(row) {
+      this.tabName = 'a'
+      this.file.issuesFiles = []
+      this.file.files = []
+      this.file.repairFile = []
+      this.file.open = true;
+      if (row.problemFileUrl)
+        this.file.issuesFiles = row.problemFileUrl.split(',');
+      if (row.fileUrl)
+        this.file.files = row.fileUrl.split(',');
+      if (row.repairFile)
+        this.file.repairFile = row.repairFile.split(',');
+    },
+    getPlanList() {
+      let query = {planQuarter: this.month.getMonth() + 1, planYear: this.year.getFullYear(), patrolType: '23'}
+      listAllPlan(query).then(res => {
+        this.planList = res.data;
+      })
+    },
+    /** 查询对讲机列表 */
+    getList() {
+      this.loading = true;
+      if (!this.queryParams.id) {
+        this.queryParams.month = this.month.getMonth() + 1;
+        this.queryParams.year = this.year.getFullYear();
+      }
+      listWalkitTalkie(this.queryParams).then(response => {
+        this.walkitTalkieList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        appearance: null,
+        numberingLabel: null,
+        batteryCondition: null,
+        displayScreen: null,
+        voiceQuality: null,
+        confirmed: null,
+        remarks: null,
+        checkStatus: null,
+        checkDate: null,
+        month: null,
+        year: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        planId: null,
+        problemFileUrl: null,
+        fileUrl: null,
+        issuesStatus: null,
+        issuesFlag: null,
+        repairFile: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.getPlanList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加对讲机";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getWalkitTalkie(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改对讲机";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateWalkitTalkie(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addWalkitTalkie(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除对讲机编号为"' + ids + '"的数据项?').then(function() {
+        return delWalkitTalkie(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('commonuse/walkitTalkie/export', {
+        ...this.queryParams
+      }, `walkitTalkie_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 338 - 0
ui/src/views/patrol/dev/alarm/index.vue

@@ -0,0 +1,338 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:alarm:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:alarm:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:alarm:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:alarm:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:alarm:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="alarmList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="状态" align="center" prop="status" >
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:alarm:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:alarm:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改现场可燃气体检测器/火灾报警系统对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="免检项" prop="ignoreColumn">
+          <el-checkbox-group v-model="ignoreColumn">
+            <el-checkbox
+              v-for="dict in dict.type.ignore_check_alarm"
+              :key="dict.value"
+              :label="dict.value">
+              {{ dict.label }}
+            </el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listAlarm, getAlarm, delAlarm, addAlarm, updateAlarm } from "@/api/patrol/dev/alarm";
+
+export default {
+  name: "Alarm",
+  dicts: ['dev_status', 'ignore_check_alarm'],
+  data() {
+    return {
+      ignoreColumn:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 现场可燃气体检测器/火灾报警系统表格数据
+      alarmList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询现场可燃气体检测器/火灾报警系统列表 */
+    getList() {
+      this.loading = true;
+      listAlarm(this.queryParams).then(response => {
+        this.alarmList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: "1",
+        ignoreColumn: null,
+        patrolType: 8
+      };
+      this.resetForm("form");
+      this.ignoreColumn=[];
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加现场可燃气体检测器/火灾报警系统";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getAlarm(id).then(response => {
+        this.form = response.data;
+        if (this.form.ignoreColumn)
+          this.ignoreColumn = this.form.ignoreColumn.split(",");
+        this.open = true;
+        this.title = "修改现场可燃气体检测器/火灾报警系统";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.ignoreColumn)
+            this.form.ignoreColumn = this.ignoreColumn.join(",");
+          if (this.form.id != null) {
+            updateAlarm(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addAlarm(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除现场可燃气体检测器/火灾报警系统编号为"' + ids + '"的数据项?').then(function() {
+        return delAlarm(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/alarm/export', {
+        ...this.queryParams
+      }, `alarm_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/alarm/exportQRCode', {
+        ...this.queryParams
+      }, `alarmQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 388 - 0
ui/src/views/patrol/dev/annihilator/index.vue

@@ -0,0 +1,388 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:annihilator:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:annihilator:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:annihilator:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:annihilator:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:annihilator:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="annihilatorList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="灭火器型号&类型" align="center" prop="anniType" />
+      <el-table-column label="数量" align="center" prop="anniNum" />
+      <el-table-column label="设备类型" align="center" prop="devType" >
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.annihilator_type" :value="scope.row.devType"/>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="状态" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:annihilator:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:annihilator:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改灭火器材对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="600px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="130px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="数量" prop="anniNum">
+          <el-input-number v-model="form.anniNum" placeholder="请输入数量" />
+        </el-form-item>
+        <el-form-item label="灭火器型号&类型" prop="anniType">
+          <el-input v-model="form.anniType" placeholder="请输入灭火器型号&类型" />
+        </el-form-item>
+        <el-form-item label="设备类型" prop="devType">
+          <el-select v-model="form.devType" placeholder="请选择设备类型">
+            <el-option
+              v-for="dict in dict.type.annihilator_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="免检项" prop="ignoreColumn">
+          <el-checkbox-group v-model="ignoreColumn">
+            <el-checkbox
+              v-for="dict in dict.type.ignore_check_annihilator"
+              :key="dict.value"
+              :label="dict.value">
+              {{ dict.label }}
+            </el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listAnnihilator, getAnnihilator, delAnnihilator, addAnnihilator, updateAnnihilator } from "@/api/patrol/dev/annihilator";
+
+export default {
+  name: "Annihilator",
+  dicts:['annihilator_type','dev_status', 'ignore_check_annihilator'],
+  data() {
+    return {
+      ignoreColumn:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 灭火器材表格数据
+      annihilatorList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        anniType: null,
+        anniNum: null,
+        anniSafe: null,
+        devType: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+        anniNum: [
+          { required: true, message: "数量不能为空", trigger: "blur" }
+        ],
+        anniType: [
+          { required: true, message: "灭火器型号&类型不能为空", trigger: "blur" }
+        ],
+        devType: [
+          { required: true, message: "设备类型不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询灭火器材列表 */
+    getList() {
+      this.loading = true;
+      listAnnihilator(this.queryParams).then(response => {
+        this.annihilatorList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        anniType: null,
+        anniNum: null,
+        anniSafe: null,
+        devType: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: "1",
+        ignoreColumn: null,
+        patrolType: 1
+      };
+      this.resetForm("form");
+      this.ignoreColumn=[];
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加灭火器材";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getAnnihilator(id).then(response => {
+        this.form = response.data;
+        if (this.form.ignoreColumn)
+          this.ignoreColumn = this.form.ignoreColumn.split(",");
+        this.open = true;
+        this.title = "修改灭火器材";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.ignoreColumn)
+            this.form.ignoreColumn = this.ignoreColumn.join(",");
+          if (this.form.id != null) {
+            updateAnnihilator(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addAnnihilator(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除灭火器材编号为"' + ids + '"的数据项?').then(function() {
+        return delAnnihilator(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/annihilator/export', {
+        ...this.queryParams
+      }, `annihilator_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/annihilator/exportQRCode', {
+        ...this.queryParams
+      }, `annihilatorQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 316 - 0
ui/src/views/patrol/dev/bicycle/index.vue

@@ -0,0 +1,316 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="自行车编号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入自行车编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:bicycle:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:bicycle:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:bicycle:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:bicycle:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:bicycle:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="bicycleList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="自行车编号" align="center" prop="devNo" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:bicycle:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:bicycle:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改自行车对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="95px">
+        <el-form-item label="自行车编号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入自行车编号" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listBicycle, getBicycle, delBicycle, addBicycle, updateBicycle } from "@/api/patrol/dev/bicycle";
+
+export default {
+  name: "Bicycle",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 自行车表格数据
+      bicycleList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "自行车编号不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询自行车列表 */
+    getList() {
+      this.loading = true;
+      listBicycle(this.queryParams).then(response => {
+        this.bicycleList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        status: '1',
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: 21
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加自行车";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getBicycle(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改自行车";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateBicycle(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addBicycle(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除自行车编号为"' + ids + '"的数据项?').then(function() {
+        return delBicycle(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/bicycle/export', {
+        ...this.queryParams
+      }, `bicycle_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/bicycle/exportQRCode', {
+        ...this.queryParams
+      }, `bicycleQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 437 - 0
ui/src/views/patrol/dev/cabinet/index.vue

@@ -0,0 +1,437 @@
+<template>
+  <div class="app-container">
+    <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="68px" size="small">
+      <el-form-item label="器材名称" prop="devName">
+        <el-input
+          v-model="queryParams.devName"
+          clearable
+          placeholder="请输入器材名称"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cabinet:add']"
+          icon="el-icon-plus"
+          plain
+          size="mini"
+          type="primary"
+          @click="handleAdd"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cabinet:edit']"
+          :disabled="single"
+          icon="el-icon-edit"
+          plain
+          size="mini"
+          type="success"
+          @click="handleUpdate"
+        >修改
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cabinet:remove']"
+          :disabled="multiple"
+          icon="el-icon-delete"
+          plain
+          size="mini"
+          type="danger"
+          @click="handleDelete"
+        >删除
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cabinet:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExport"
+        >导出
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cabinet:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-tabs v-model="devType" @tab-click="handleQuery">
+      <el-tab-pane label="事故柜1" name="1">
+        <el-table v-loading="loading" :data="cabinetList" :height="clientHeight"
+                  border @selection-change="handleSelectionChange">
+          <el-table-column align="center" type="selection" width="55"/>
+          <el-table-column align="center" label="器材名称" prop="devName"/>
+          <el-table-column align="center" label="器材标配数量" prop="devNum"/>
+          <el-table-column align="center" label="状态" prop="status">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="备注" prop="remarks"/>
+          <el-table-column align="center" class-name="small-padding fixed-width" label="操作">
+            <template slot-scope="scope">
+              <el-button
+                v-hasPermi="['dev:cabinet:edit']"
+                icon="el-icon-edit"
+                size="mini"
+                type="text"
+                @click="handleUpdate(scope.row)"
+              >修改
+              </el-button>
+              <el-button
+                v-hasPermi="['dev:cabinet:remove']"
+                icon="el-icon-delete"
+                size="mini"
+                type="text"
+                @click="handleDelete(scope.row)"
+              >删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+      <el-tab-pane label="事故柜2" name="2">
+        <el-table v-loading="loading" :data="cabinetList" :height="clientHeight"
+                  border @selection-change="handleSelectionChange">
+          <el-table-column align="center" type="selection" width="55"/>
+          <el-table-column align="center" label="器材名称" prop="devName"/>
+          <el-table-column align="center" label="器材标配数量" prop="devNum"/>
+          <el-table-column align="center" label="状态" prop="status">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="备注" prop="remarks"/>
+          <el-table-column align="center" class-name="small-padding fixed-width" label="操作">
+            <template slot-scope="scope">
+              <el-button
+                v-hasPermi="['dev:cabinet:edit']"
+                icon="el-icon-edit"
+                size="mini"
+                type="text"
+                @click="handleUpdate(scope.row)"
+              >修改
+              </el-button>
+              <el-button
+                v-hasPermi="['dev:cabinet:remove']"
+                icon="el-icon-delete"
+                size="mini"
+                type="text"
+                @click="handleDelete(scope.row)"
+              >删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+      <el-tab-pane label="事故柜3" name="3">
+        <el-table v-loading="loading" :data="cabinetList" :height="clientHeight"
+                  border @selection-change="handleSelectionChange">
+          <el-table-column align="center" type="selection" width="55"/>
+          <el-table-column align="center" label="器材名称" prop="devName"/>
+          <el-table-column align="center" label="器材标配数量" prop="devNum"/>
+          <el-table-column align="center" label="状态" prop="status">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="备注" prop="remarks"/>
+          <el-table-column align="center" class-name="small-padding fixed-width" label="操作">
+            <template slot-scope="scope">
+              <el-button
+                v-hasPermi="['dev:cabinet:edit']"
+                icon="el-icon-edit"
+                size="mini"
+                type="text"
+                @click="handleUpdate(scope.row)"
+              >修改
+              </el-button>
+              <el-button
+                v-hasPermi="['dev:cabinet:remove']"
+                icon="el-icon-delete"
+                size="mini"
+                type="text"
+                @click="handleDelete(scope.row)"
+              >删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+    </el-tabs>
+
+    <pagination
+      v-show="total>0"
+      :limit.sync="queryParams.pageSize"
+      :page.sync="queryParams.pageNum"
+      :total="total"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改应急事故柜对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" append-to-body width="600px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="110px">
+        <el-form-item label="器材名称" prop="devName">
+          <el-input v-model="form.devName" placeholder="请输入器材名称"/>
+        </el-form-item>
+        <el-form-item label="器材标配数量" prop="devNum">
+          <el-input-number v-model="form.devNum" placeholder="请输入器材标配数量"/>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="归属" prop="devType">
+          <el-radio-group v-model="form.devType">
+            <el-radio label="1">事故柜1</el-radio>
+            <el-radio label="2">事故柜2</el-radio>
+            <el-radio label="3">事故柜3</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="免检项" prop="ignoreColumn">
+          <el-checkbox-group v-model="ignoreColumn">
+            <el-checkbox
+              v-for="dict in dict.type.ignore_check_cabinet"
+              :key="dict.value"
+              :label="dict.value">
+              {{ dict.label }}
+            </el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {addCabinet, delCabinet, getCabinet, listCabinet, updateCabinet} from "@/api/patrol/dev/cabinet";
+
+export default {
+  name: "Cabinet",
+  dicts: ['dev_status', 'ignore_check_cabinet'],
+  data() {
+    return {
+      ignoreColumn:[],
+      devType: '1',
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 应急事故柜表格数据
+      cabinetList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devName: null,
+        devNum: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null,
+        devType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devName: [
+          {required: true, message: "器材名称不能为空", trigger: "blur"}
+        ],
+        devNum: [
+          {required: true, message: "器材标配数量不能为空", trigger: "blur"}
+        ],
+        delFlag: [
+          {required: true, message: "删除标识0未删除不能为空", trigger: "blur"}
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询应急事故柜列表 */
+    getList() {
+      this.loading = true;
+      this.queryParams.devType=this.devType;
+      listCabinet(this.queryParams).then(response => {
+        this.cabinetList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devName: null,
+        devNum: null,
+        status: '1',
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        ignoreColumn: null,
+        patrolType: 7,
+        devType: this.devType
+      };
+      this.resetForm("form");
+      this.ignoreColumn=[];
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加应急事故柜";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCabinet(id).then(response => {
+        this.form = response.data;
+        if (this.form.ignoreColumn)
+          this.ignoreColumn = this.form.ignoreColumn.split(",");
+        this.open = true;
+        this.title = "修改应急事故柜";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.ignoreColumn)
+            this.form.ignoreColumn = this.ignoreColumn.join(",");
+          if (this.form.id != null) {
+            updateCabinet(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCabinet(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除应急事故柜编号为"' + ids + '"的数据项?').then(function () {
+        return delCabinet(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {
+      });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/cabinet/export', {
+        ...this.queryParams
+      }, `cabinet_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/cabinet/exportQRCode', {
+        ...this.queryParams
+      }, `cabinetQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 331 - 0
ui/src/views/patrol/dev/cannon/index.vue

@@ -0,0 +1,331 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:cannon:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:cannon:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:cannon:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:cannon:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cannon:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="cannonList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:cannon:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:cannon:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改消防水炮检查记录对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listCannon, getCannon, delCannon, addCannon, updateCannon } from "@/api/patrol/dev/cannon";
+
+export default {
+  name: "Cannon",
+  dicts:['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 消防水炮检查记录表格数据
+      cannonList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询消防水炮检查记录列表 */
+    getList() {
+      this.loading = true;
+      listCannon(this.queryParams).then(response => {
+        this.cannonList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        status: "1",
+        patrolType: 2,
+        deptId: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加消防水炮检查记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCannon(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改消防水炮检查记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateCannon(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCannon(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除消防水炮检查记录编号为"' + ids + '"的数据项?').then(function() {
+        return delCannon(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/cannon/exportQRCode', {
+        ...this.queryParams
+      }, `消防水炮QRCode_${new Date().getTime()}.docx`)
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/cannon/export', {
+        ...this.queryParams
+      }, `消防水炮_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

+ 319 - 0
ui/src/views/patrol/dev/cctv/index.vue

@@ -0,0 +1,319 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:cctv:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:cctv:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:cctv:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:cctv:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cctv:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="cctvList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:cctv:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:cctv:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改CCTV系统对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listCctv, getCctv, delCctv, addCctv, updateCctv } from "@/api/patrol/dev/cctv";
+
+export default {
+  name: "Cctv",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // CCTV系统表格数据
+      cctvList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updatedate: null,
+        updaterCode: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询CCTV系统列表 */
+    getList() {
+      this.loading = true;
+      listCctv(this.queryParams).then(response => {
+        this.cctvList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        devNo: null,
+        status: "1",
+        remarks: null,
+        id: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updatedate: null,
+        updaterCode: null,
+        deptId: null,
+        patrolType: 11
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加CCTV系统";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCctv(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改CCTV系统";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateCctv(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCctv(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除CCTV系统编号为"' + ids + '"的数据项?').then(function() {
+        return delCctv(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/cctv/export', {
+        ...this.queryParams
+      }, `cctv_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/cctv/exportQRCode', {
+        ...this.queryParams
+      }, `cctvQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 328 - 0
ui/src/views/patrol/dev/cofferdam/index.vue

@@ -0,0 +1,328 @@
+<template>
+  <div class="app-container">
+    <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="68px" size="small">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          clearable
+          placeholder="请输入位号"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cofferdam:add']"
+          icon="el-icon-plus"
+          plain
+          size="mini"
+          type="primary"
+          @click="handleAdd"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cofferdam:edit']"
+          :disabled="single"
+          icon="el-icon-edit"
+          plain
+          size="mini"
+          type="success"
+          @click="handleUpdate"
+        >修改
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cofferdam:remove']"
+          :disabled="multiple"
+          icon="el-icon-delete"
+          plain
+          size="mini"
+          type="danger"
+          @click="handleDelete"
+        >删除
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cofferdam:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExport"
+        >导出
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cofferdam:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="cofferdamList" :height="clientHeight" border
+              @selection-change="handleSelectionChange">
+      <el-table-column align="center" type="selection" width="55"/>
+      <el-table-column align="center" label="位号" prop="devNo"/>
+      <el-table-column align="center" label="状态" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="备注" prop="remarks"/>
+      <el-table-column align="center" class-name="small-padding fixed-width" label="操作">
+        <template slot-scope="scope">
+          <el-button
+            v-hasPermi="['dev:cofferdam:edit']"
+            icon="el-icon-edit"
+            size="mini"
+            type="text"
+            @click="handleUpdate(scope.row)"
+          >修改
+          </el-button>
+          <el-button
+            v-hasPermi="['dev:cofferdam:remove']"
+            icon="el-icon-delete"
+            size="mini"
+            type="text"
+            @click="handleDelete(scope.row)"
+          >删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :limit.sync="queryParams.pageSize"
+      :page.sync="queryParams.pageNum"
+      :total="total"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改蒸汽裂解装置各区域围堰对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" append-to-body width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号"/>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {addCofferdam, delCofferdam, getCofferdam, listCofferdam, updateCofferdam} from "@/api/patrol/dev/cofferdam";
+
+export default {
+  name: "Cofferdam",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 蒸汽裂解装置各区域围堰表格数据
+      cofferdamList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询蒸汽裂解装置各区域围堰列表 */
+    getList() {
+      this.loading = true;
+      listCofferdam(this.queryParams).then(response => {
+        this.cofferdamList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        status: "1",
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: 17
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加蒸汽裂解装置各区域围堰";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCofferdam(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改蒸汽裂解装置各区域围堰";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateCofferdam(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCofferdam(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除蒸汽裂解装置各区域围堰编号为"' + ids + '"的数据项?').then(function () {
+        return delCofferdam(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {
+      });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/cofferdam/export', {
+        ...this.queryParams
+      }, `cofferdam_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/cofferdam/exportQRCode', {
+        ...this.queryParams
+      }, `cofferdamQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 333 - 0
ui/src/views/patrol/dev/cover/index.vue

@@ -0,0 +1,333 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:cover:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:cover:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:cover:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:cover:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:cover:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="coverList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:cover:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:cover:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改地井盖对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listCover, getCover, delCover, addCover, updateCover } from "@/api/patrol/dev/cover";
+
+export default {
+  name: "Cover",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 地井盖表格数据
+      coverList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询地井盖列表 */
+    getList() {
+      this.loading = true;
+      listCover(this.queryParams).then(response => {
+        this.coverList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        status: '1',
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: 22
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加地井盖";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCover(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改地井盖";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateCover(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCover(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除地井盖编号为"' + ids + '"的数据项?').then(function() {
+        return delCover(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/cover/export', {
+        ...this.queryParams
+      }, `cover_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/cover/exportQRCode', {
+        ...this.queryParams
+      }, `coverQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 319 - 0
ui/src/views/patrol/dev/curtain/index.vue

@@ -0,0 +1,319 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:curtain:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:curtain:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:curtain:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:curtain:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:curtain:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="curtainList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:curtain:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:curtain:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改蒸汽幕对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listCurtain, getCurtain, delCurtain, addCurtain, updateCurtain } from "@/api/patrol/dev/curtain";
+
+export default {
+  name: "Curtain",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 蒸汽幕表格数据
+      curtainList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询蒸汽幕列表 */
+    getList() {
+      this.loading = true;
+      listCurtain(this.queryParams).then(response => {
+        this.curtainList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        status: "1",
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: 16
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加蒸汽幕";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCurtain(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改蒸汽幕";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateCurtain(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCurtain(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除蒸汽幕编号为"' + ids + '"的数据项?').then(function() {
+        return delCurtain(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/curtain/export', {
+        ...this.queryParams
+      }, `curtain_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/curtain/exportQRCode', {
+        ...this.queryParams
+      }, `curtainQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 372 - 0
ui/src/views/patrol/dev/door/index.vue

@@ -0,0 +1,372 @@
+<template>
+  <div class="app-container">
+    <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="68px" size="small">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          clearable
+          placeholder="请输入位号"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:door:add']"
+          icon="el-icon-plus"
+          plain
+          size="mini"
+          type="primary"
+          @click="handleAdd"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:door:edit']"
+          :disabled="single"
+          icon="el-icon-edit"
+          plain
+          size="mini"
+          type="success"
+          @click="handleUpdate"
+        >修改
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:door:remove']"
+          :disabled="multiple"
+          icon="el-icon-delete"
+          plain
+          size="mini"
+          type="danger"
+          @click="handleDelete"
+        >删除
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:door:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExport"
+        >导出
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:door:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-tabs v-model="devType" type="card" @tab-click="handleQuery">
+      <el-tab-pane label="D201常闭式防爆门/防火门" name="D201">
+        <el-table v-loading="loading" :data="doorList" :height="clientHeight" border
+                  @selection-change="handleSelectionChange">
+          <el-table-column align="center" type="selection" width="55"/>
+          <el-table-column align="center" label="位号" prop="devNo"/>
+          <el-table-column align="center" label="状态" prop="status">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="备注" prop="remarks"/>
+          <el-table-column align="center" class-name="small-padding fixed-width" label="操作">
+            <template slot-scope="scope">
+              <el-button
+                v-hasPermi="['dev:door:edit']"
+                icon="el-icon-edit"
+                size="mini"
+                type="text"
+                @click="handleUpdate(scope.row)"
+              >修改
+              </el-button>
+              <el-button
+                v-hasPermi="['dev:door:remove']"
+                icon="el-icon-delete"
+                size="mini"
+                type="text"
+                @click="handleDelete(scope.row)"
+              >删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+      <el-tab-pane label="D301常闭式防爆门/防火门" name="D301">
+        <el-table v-loading="loading" :data="doorList" :height="clientHeight" border
+                  @selection-change="handleSelectionChange">
+          <el-table-column align="center" type="selection" width="55"/>
+          <el-table-column align="center" label="位号" prop="devNo"/>
+          <el-table-column align="center" label="状态" prop="status">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="备注" prop="remarks"/>
+          <el-table-column align="center" class-name="small-padding fixed-width" label="操作">
+            <template slot-scope="scope">
+              <el-button
+                v-hasPermi="['dev:door:edit']"
+                icon="el-icon-edit"
+                size="mini"
+                type="text"
+                @click="handleUpdate(scope.row)"
+              >修改
+              </el-button>
+              <el-button
+                v-hasPermi="['dev:door:remove']"
+                icon="el-icon-delete"
+                size="mini"
+                type="text"
+                @click="handleDelete(scope.row)"
+              >删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+    </el-tabs>
+
+    <pagination
+      v-show="total>0"
+      :limit.sync="queryParams.pageSize"
+      :page.sync="queryParams.pageNum"
+      :total="total"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改常闭式防爆门/防火门对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" append-to-body width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号"/>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="归属" prop="devType">
+          <el-radio-group v-model="form.devType">
+            <el-radio label="D201">D201</el-radio>
+            <el-radio label="D301">D301</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {addDoor, delDoor, getDoor, listDoor, updateDoor} from "@/api/patrol/dev/door";
+
+export default {
+  name: "Door",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      devType: 'D201',
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 常闭式防爆门/防火门表格数据
+      doorList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null,
+        devType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          {required: true, message: "位号不能为空", trigger: "blur"}
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询常闭式防爆门/防火门列表 */
+    getList() {
+      this.loading = true;
+      this.queryParams.devType=this.devType;
+      listDoor(this.queryParams).then(response => {
+        this.doorList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        status: '1',
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: 14,
+        devType: this.devType
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加常闭式防爆门/防火门";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getDoor(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改常闭式防爆门/防火门";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateDoor(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addDoor(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除常闭式防爆门/防火门编号为"' + ids + '"的数据项?').then(function () {
+        return delDoor(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {
+      });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/door/export', {
+        ...this.queryParams
+      }, `door_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/door/exportQRCode', {
+        ...this.queryParams
+      }, `doorQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 319 - 0
ui/src/views/patrol/dev/downspout/index.vue

@@ -0,0 +1,319 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:downspout:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:downspout:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:downspout:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:downspout:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:downspout:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="downspoutList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:downspout:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:downspout:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改落水管对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listDownspout, getDownspout, delDownspout, addDownspout, updateDownspout } from "@/api/patrol/dev/downspout";
+
+export default {
+  name: "Downspout",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 落水管表格数据
+      downspoutList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        position: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+        delFlag: [
+          { required: true, message: "删除标识0未删除不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询落水管列表 */
+    getList() {
+      this.loading = true;
+      listDownspout(this.queryParams).then(response => {
+        this.downspoutList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        position: null,
+        status: '1',
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: 25
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加落水管";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getDownspout(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改落水管";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateDownspout(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addDownspout(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除落水管编号为"' + ids + '"的数据项?').then(function() {
+        return delDownspout(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/downspout/export', {
+        ...this.queryParams
+      }, `downspout_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/downspout/exportQRCode', {
+        ...this.queryParams
+      }, `downspoutQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 333 - 0
ui/src/views/patrol/dev/earplug/index.vue

@@ -0,0 +1,333 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:earplug:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:earplug:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:earplug:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:earplug:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:earplug:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="earplugList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:earplug:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:earplug:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改耳塞分配器对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listEarplug, getEarplug, delEarplug, addEarplug, updateEarplug } from "@/api/patrol/dev/earplug";
+
+export default {
+  name: "Earplug",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 耳塞分配器表格数据
+      earplugList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询耳塞分配器列表 */
+    getList() {
+      this.loading = true;
+      listEarplug(this.queryParams).then(response => {
+        this.earplugList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        status: '1',
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: 19
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加耳塞分配器";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getEarplug(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改耳塞分配器";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateEarplug(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addEarplug(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除耳塞分配器编号为"' + ids + '"的数据项?').then(function() {
+        return delEarplug(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/earplug/export', {
+        ...this.queryParams
+      }, `earplug_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/earplug/exportQRCode', {
+        ...this.queryParams
+      }, `earplugQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 332 - 0
ui/src/views/patrol/dev/eyewash/index.vue

@@ -0,0 +1,332 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:eyewash:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:eyewash:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:eyewash:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:eyewash:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:eyewash:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="eyewashList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="状态" align="center" prop="status" >
+        <template slot-scope="scope">
+            <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:eyewash:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:eyewash:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改洗眼器对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-select v-model="form.dec" placeholder="请选择状态">
+            <el-option
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listEyewash, getEyewash, delEyewash, addEyewash, updateEyewash } from "@/api/patrol/dev/eyewash";
+
+export default {
+  name: "Eyewash",
+  dicts:['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 洗眼器表格数据
+      eyewashList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询洗眼器列表 */
+    getList() {
+      this.loading = true;
+      listEyewash(this.queryParams).then(response => {
+        this.eyewashList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        patrolType: 12
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加洗眼器";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getEyewash(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改洗眼器";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateEyewash(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addEyewash(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除洗眼器编号为"' + ids + '"的数据项?').then(function() {
+        return delEyewash(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/eyewash/export', {
+        ...this.queryParams
+      }, `eyewash_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/eyewash/exportQRCode', {
+        ...this.queryParams
+      }, `eyewashQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 341 - 0
ui/src/views/patrol/dev/hoseBox/index.vue

@@ -0,0 +1,341 @@
+<template>
+  <div class="app-container">
+    <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="68px" size="small">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          clearable
+          placeholder="请输入位号"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          clearable
+          placeholder="请输入位置"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:hoseBox:add']"
+          icon="el-icon-plus"
+          plain
+          size="mini"
+          type="primary"
+          @click="handleAdd"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:hoseBox:edit']"
+          :disabled="single"
+          icon="el-icon-edit"
+          plain
+          size="mini"
+          type="success"
+          @click="handleUpdate"
+        >修改
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:hoseBox:remove']"
+          :disabled="multiple"
+          icon="el-icon-delete"
+          plain
+          size="mini"
+          type="danger"
+          @click="handleDelete"
+        >删除
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:hoseBox:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExport"
+        >导出
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:hoseBox:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="hoseBoxList" :height="clientHeight" border
+              @selection-change="handleSelectionChange">
+      <el-table-column align="center" type="selection" width="55"/>
+      <el-table-column align="center" label="位号" prop="devNo"/>
+      <el-table-column align="center" label="位置" prop="position"/>
+      <el-table-column align="center" label="状态" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column align="center" class-name="small-padding fixed-width" label="操作">
+        <template slot-scope="scope">
+          <el-button
+            v-hasPermi="['dev:hoseBox:edit']"
+            icon="el-icon-edit"
+            size="mini"
+            type="text"
+            @click="handleUpdate(scope.row)"
+          >修改
+          </el-button>
+          <el-button
+            v-hasPermi="['dev:hoseBox:remove']"
+            icon="el-icon-delete"
+            size="mini"
+            type="text"
+            @click="handleDelete(scope.row)"
+          >删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :limit.sync="queryParams.pageSize"
+      :page.sync="queryParams.pageNum"
+      :total="total"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改消防水带箱检查记录对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" append-to-body width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号"/>
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置"/>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {addHoseBox, delHoseBox, getHoseBox, listHoseBox, updateHoseBox} from "@/api/patrol/dev/hoseBox";
+
+export default {
+  name: "HoseBox",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 消防水带箱检查记录表格数据
+      hoseBoxList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询消防水带箱检查记录列表 */
+    getList() {
+      this.loading = true;
+      listHoseBox(this.queryParams).then(response => {
+        this.hoseBoxList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: "1",
+        patrolType: 4
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加消防水带箱检查记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getHoseBox(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改消防水带箱检查记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateHoseBox(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addHoseBox(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除消防水带箱检查记录编号为"' + ids + '"的数据项?').then(function () {
+        return delHoseBox(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {
+      });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/hoseBox/export', {
+        ...this.queryParams
+      }, `hoseBox_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/hoseBox/exportQRCode', {
+        ...this.queryParams
+      }, `消防水带箱QRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 360 - 0
ui/src/views/patrol/dev/movement/index.vue

@@ -0,0 +1,360 @@
+<template>
+  <div class="app-container">
+    <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="68px" size="small">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          clearable
+          placeholder="请输入位号"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          clearable
+          placeholder="请输入位置"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:movement:add']"
+          icon="el-icon-plus"
+          plain
+          size="mini"
+          type="primary"
+          @click="handleAdd"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:movement:edit']"
+          :disabled="single"
+          icon="el-icon-edit"
+          plain
+          size="mini"
+          type="success"
+          @click="handleUpdate"
+        >修改
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:movement:remove']"
+          :disabled="multiple"
+          icon="el-icon-delete"
+          plain
+          size="mini"
+          type="danger"
+          @click="handleDelete"
+        >删除
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:movement:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExport"
+        >导出
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:movement:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="movementList" :height="clientHeight" border
+              @selection-change="handleSelectionChange">
+      <el-table-column align="center" type="selection" width="55"/>
+      <el-table-column align="center" label="位号" prop="devNo"/>
+      <el-table-column align="center" label="位置" prop="position"/>
+      <el-table-column align="center" label="状态" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="备注" prop="remarks"/>
+      <el-table-column align="center" class-name="small-padding fixed-width" label="操作">
+        <template slot-scope="scope">
+          <el-button
+            v-hasPermi="['dev:movement:edit']"
+            icon="el-icon-edit"
+            size="mini"
+            type="text"
+            @click="handleUpdate(scope.row)"
+          >修改
+          </el-button>
+          <el-button
+            v-hasPermi="['dev:movement:remove']"
+            icon="el-icon-delete"
+            size="mini"
+            type="text"
+            @click="handleDelete(scope.row)"
+          >删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :limit.sync="queryParams.pageSize"
+      :page.sync="queryParams.pageNum"
+      :total="total"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改移动平台及移动梯对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" append-to-body width="600px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="110px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号"/>
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置"/>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="免检项" prop="ignoreColumn">
+          <el-checkbox-group v-model="ignoreColumn">
+            <el-checkbox
+              v-for="dict in dict.type.ignore_check_movement"
+              :key="dict.value"
+              :label="dict.value">
+              {{ dict.label }}
+            </el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {addMovement, delMovement, getMovement, listMovement, updateMovement} from "@/api/patrol/dev/movement";
+
+export default {
+  name: "Movement",
+  dicts: ['dev_status', 'ignore_check_movement'],
+  data() {
+    return {
+      ignoreColumn:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 移动平台及移动梯表格数据
+      movementList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        status: null,
+        ignoreColumn: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          {required: true, message: "位号不能为空", trigger: "blur"}
+        ],
+        position: [
+          {required: true, message: "位置不能为空", trigger: "blur"}
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询移动平台及移动梯列表 */
+    getList() {
+      this.loading = true;
+      listMovement(this.queryParams).then(response => {
+        this.movementList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        status: '1',
+        ignoreColumn:null,
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: 20
+      };
+      this.resetForm("form");
+      this.ignoreColumn=[];
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加移动平台及移动梯";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getMovement(id).then(response => {
+        this.form = response.data;
+        if (this.form.ignoreColumn)
+          this.ignoreColumn = this.form.ignoreColumn.split(",");
+        this.open = true;
+        this.title = "修改移动平台及移动梯";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.ignoreColumn)
+            this.form.ignoreColumn = this.ignoreColumn.join(",");
+          if (this.form.id != null) {
+            updateMovement(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addMovement(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除移动平台及移动梯编号为"' + ids + '"的数据项?').then(function () {
+        return delMovement(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {
+      });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/movement/export', {
+        ...this.queryParams
+      }, `movement_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/movement/exportQRCode', {
+        ...this.queryParams
+      }, `movementQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 333 - 0
ui/src/views/patrol/dev/paga/index.vue

@@ -0,0 +1,333 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:paga:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:paga:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:paga:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:paga:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:paga:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="pagaList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:paga:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:paga:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改PAGA对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listPaga, getPaga, delPaga, addPaga, updatePaga } from "@/api/patrol/dev/paga";
+
+export default {
+  name: "Paga",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // PAGA表格数据
+      pagaList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询PAGA列表 */
+    getList() {
+      this.loading = true;
+      listPaga(this.queryParams).then(response => {
+        this.pagaList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        status: null,
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加PAGA";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getPaga(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改PAGA";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updatePaga(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addPaga(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除PAGA编号为"' + ids + '"的数据项?').then(function() {
+        return delPaga(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/paga/export', {
+        ...this.queryParams
+      }, `paga_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/paga/exportQRCode', {
+        ...this.queryParams
+      }, `pagaQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 333 - 0
ui/src/views/patrol/dev/postFire/index.vue

@@ -0,0 +1,333 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:postFire:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:postFire:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:postFire:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:postFire:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:postFire:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="postFireList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="状态" align="center" prop="status"  >
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:postFire:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:postFire:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改地上消火栓检查记录对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listPostFire, getPostFire, delPostFire, addPostFire, updatePostFire } from "@/api/patrol/dev/postFire";
+
+export default {
+  name: "PostFire",
+  dicts:['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 地上消火栓检查记录表格数据
+      postFireList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询地上消火栓检查记录列表 */
+    getList() {
+      this.loading = true;
+      listPostFire(this.queryParams).then(response => {
+        this.postFireList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: "1",
+        patrolType: 3
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加地上消火栓检查记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getPostFire(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改地上消火栓检查记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updatePostFire(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addPostFire(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除地上消火栓检查记录编号为"' + ids + '"的数据项?').then(function() {
+        return delPostFire(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/postFire/export', {
+        ...this.queryParams
+      }, `postFire_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/postFire/exportQRCode', {
+        ...this.queryParams
+      }, `地上消火栓QRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 336 - 0
ui/src/views/patrol/dev/pump/index.vue

@@ -0,0 +1,336 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:pump:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:pump:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:pump:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:pump:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:pump:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="pumpList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:pump:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:pump:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改水泵接合器对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listPump, getPump, delPump, addPump, updatePump } from "@/api/patrol/dev/pump";
+
+export default {
+  name: "Pump",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 水泵接合器表格数据
+      pumpList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+        delFlag: [
+          { required: true, message: "删除标识0未删除不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询水泵接合器列表 */
+    getList() {
+      this.loading = true;
+      listPump(this.queryParams).then(response => {
+        this.pumpList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        status: '1',
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: 26
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加水泵接合器";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getPump(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改水泵接合器";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updatePump(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addPump(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除水泵接合器编号为"' + ids + '"的数据项?').then(function() {
+        return delPump(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/pump/export', {
+        ...this.queryParams
+      }, `pump_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/pump/exportQRCode', {
+        ...this.queryParams
+      }, `pumpQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 345 - 0
ui/src/views/patrol/dev/safetyBelt/index.vue

@@ -0,0 +1,345 @@
+<template>
+  <div class="app-container">
+    <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="68px" size="small">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          clearable
+          placeholder="请输入位号"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          clearable
+          placeholder="请输入位置"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:safetyBelt:add']"
+          icon="el-icon-plus"
+          plain
+          size="mini"
+          type="primary"
+          @click="handleAdd"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:safetyBelt:edit']"
+          :disabled="single"
+          icon="el-icon-edit"
+          plain
+          size="mini"
+          type="success"
+          @click="handleUpdate"
+        >修改
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:safetyBelt:remove']"
+          :disabled="multiple"
+          icon="el-icon-delete"
+          plain
+          size="mini"
+          type="danger"
+          @click="handleDelete"
+        >删除
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:safetyBelt:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExport"
+        >导出
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:safetyBelt:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="safetyBeltList" :height="clientHeight"
+              border @selection-change="handleSelectionChange">
+      <el-table-column align="center" type="selection" width="55"/>
+      <el-table-column align="center" label="位号" prop="devNo"/>
+      <el-table-column align="center" label="位置" prop="position"/>
+      <el-table-column align="center" label="状态" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="备注" prop="remarks"/>
+      <el-table-column align="center" class-name="small-padding fixed-width" label="操作">
+        <template slot-scope="scope">
+          <el-button
+            v-hasPermi="['dev:safetyBelt:edit']"
+            icon="el-icon-edit"
+            size="mini"
+            type="text"
+            @click="handleUpdate(scope.row)"
+          >修改
+          </el-button>
+          <el-button
+            v-hasPermi="['dev:safetyBelt:remove']"
+            icon="el-icon-delete"
+            size="mini"
+            type="text"
+            @click="handleDelete(scope.row)"
+          >删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :limit.sync="queryParams.pageSize"
+      :page.sync="queryParams.pageNum"
+      :total="total"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改安全带对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" append-to-body width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号"/>
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置"/>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{ dict.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {addSafetyBelt, delSafetyBelt, getSafetyBelt, listSafetyBelt, updateSafetyBelt} from "@/api/patrol/dev/safetyBelt";
+
+export default {
+  name: "SafetyBelt",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 安全带表格数据
+      safetyBeltList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          {required: true, message: "位号不能为空", trigger: "blur"}
+        ],
+        position: [
+          {required: true, message: "位置不能为空", trigger: "blur"}
+        ],
+        delFlag: [
+          {required: true, message: "删除标识0未删除不能为空", trigger: "blur"}
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询安全带列表 */
+    getList() {
+      this.loading = true;
+      listSafetyBelt(this.queryParams).then(response => {
+        this.safetyBeltList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        status: '1',
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: 24
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加安全带";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getSafetyBelt(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改安全带";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateSafetyBelt(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addSafetyBelt(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除安全带编号为"' + ids + '"的数据项?').then(function () {
+        return delSafetyBelt(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {
+      });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/safetyBelt/export', {
+        ...this.queryParams
+      }, `safetyBelt_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/safetyBelt/exportQRCode', {
+        ...this.queryParams
+      }, `safetyBeltQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 333 - 0
ui/src/views/patrol/dev/sandbox/index.vue

@@ -0,0 +1,333 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:sandbox:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:sandbox:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:sandbox:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:sandbox:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:sandbox:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="sandboxList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:sandbox:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:sandbox:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改应急沙箱对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listSandbox, getSandbox, delSandbox, addSandbox, updateSandbox } from "@/api/patrol/dev/sandbox";
+
+export default {
+  name: "Sandbox",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 应急沙箱表格数据
+      sandboxList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询应急沙箱列表 */
+    getList() {
+      this.loading = true;
+      listSandbox(this.queryParams).then(response => {
+        this.sandboxList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: null,
+        patrolType: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加应急沙箱";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getSandbox(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改应急沙箱";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateSandbox(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addSandbox(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除应急沙箱编号为"' + ids + '"的数据项?').then(function() {
+        return delSandbox(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/sandbox/export', {
+        ...this.queryParams
+      }, `sandbox_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/sandbox/exportQRCode', {
+        ...this.queryParams
+      }, `应急沙箱QRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 321 - 0
ui/src/views/patrol/dev/shield/index.vue

@@ -0,0 +1,321 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:shield:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:shield:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:shield:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:shield:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:shield:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="shieldList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:shield:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:shield:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改CO2气体保护系统对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listShield, getShield, delShield, addShield, updateShield } from "@/api/patrol/dev/shield";
+
+export default {
+  name: "Shield",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // CO2气体保护系统表格数据
+      shieldList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询CO2气体保护系统列表 */
+    getList() {
+      this.loading = true;
+      listShield(this.queryParams).then(response => {
+        this.shieldList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: null,
+        patrolType: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加CO2气体保护系统";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getShield(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改CO2气体保护系统";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateShield(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addShield(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除CO2气体保护系统编号为"' + ids + '"的数据项?').then(function() {
+        return delShield(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/shield/export', {
+        ...this.queryParams
+      }, `shield_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/shield/exportQRCode', {
+        ...this.queryParams
+      }, `shieldQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 333 - 0
ui/src/views/patrol/dev/sprinkler/index.vue

@@ -0,0 +1,333 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:sprinkler:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:sprinkler:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:sprinkler:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:sprinkler:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:sprinkler:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="sprinklerList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column align="center" label="状态" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:sprinkler:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:sprinkler:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改自动喷淋灭火系统对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listSprinkler, getSprinkler, delSprinkler, addSprinkler, updateSprinkler } from "@/api/patrol/dev/sprinkler";
+
+export default {
+  name: "Sprinkler",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 自动喷淋灭火系统表格数据
+      sprinklerList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询自动喷淋灭火系统列表 */
+    getList() {
+      this.loading = true;
+      listSprinkler(this.queryParams).then(response => {
+        this.sprinklerList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: "1",
+        patrolType: 6
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加自动喷淋灭火系统";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getSprinkler(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改自动喷淋灭火系统";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateSprinkler(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addSprinkler(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除自动喷淋灭火系统编号为"' + ids + '"的数据项?').then(function() {
+        return delSprinkler(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/sprinkler/export', {
+        ...this.queryParams
+      }, `sprinkler_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/sprinkler/exportQRCode', {
+        ...this.queryParams
+      }, `sprinklerQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 333 - 0
ui/src/views/patrol/dev/standpipe/index.vue

@@ -0,0 +1,333 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="位置" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入位置"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:standpipe:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:standpipe:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:standpipe:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:standpipe:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:standpipe:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="standpipeList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="位置" align="center" prop="position" />
+      <el-table-column align="center" label="状态" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:standpipe:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:standpipe:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改消防竖管对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="位置" prop="position">
+          <el-input v-model="form.position" placeholder="请输入位置" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listStandpipe, getStandpipe, delStandpipe, addStandpipe, updateStandpipe } from "@/api/patrol/dev/standpipe";
+
+export default {
+  name: "Standpipe",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 消防竖管表格数据
+      standpipeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        position: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        position: [
+          { required: true, message: "位置不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询消防竖管列表 */
+    getList() {
+      this.loading = true;
+      listStandpipe(this.queryParams).then(response => {
+        this.standpipeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        position: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        remarks: null,
+        deptId: null,
+        status: "1",
+        patrolType: 5
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加消防竖管";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getStandpipe(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改消防竖管";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateStandpipe(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addStandpipe(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除消防竖管编号为"' + ids + '"的数据项?').then(function() {
+        return delStandpipe(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/standpipe/export', {
+        ...this.queryParams
+      }, `standpipe_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/standpipe/exportQRCode', {
+        ...this.queryParams
+      }, `消防竖管QRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 350 - 0
ui/src/views/patrol/dev/tester/index.vue

@@ -0,0 +1,350 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="检测仪类型" prop="testerType" label-width="90px">
+        <el-input
+          v-model="queryParams.testerType"
+          placeholder="请输入检测仪类型"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="型号" prop="testerModel">
+        <el-input
+          v-model="queryParams.testerModel"
+          placeholder="请输入型号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="编号" prop="testerNo">
+        <el-input
+          v-model="queryParams.testerNo"
+          placeholder="请输入编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" clearable placeholder="请选择状态" @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:tester:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:tester:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:tester:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:tester:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:tester:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="testerList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="检测仪类型" align="center" prop="testerType" />
+      <el-table-column label="型号" align="center" prop="testerModel" />
+      <el-table-column label="编号" align="center" prop="testerNo" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:tester:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:tester:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改检测仪对话框 -->
+    <el-dialog :close-on-click-modal="false":title="title" :visible.sync="open" width="550px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="检测仪类型" prop="testerType">
+          <el-input v-model="form.testerType" placeholder="请输入检测仪类型" />
+        </el-form-item>
+        <el-form-item label="型号" prop="testerModel">
+          <el-input v-model="form.testerModel" placeholder="请输入型号" />
+        </el-form-item>
+        <el-form-item label="编号" prop="testerNo">
+          <el-input v-model="form.testerNo" placeholder="请输入编号" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listTester, getTester, delTester, addTester, updateTester } from "@/api/patrol/dev/tester";
+
+export default {
+  name: "Tester",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 检测仪表格数据
+      testerList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        testerType: null,
+        testerModel: null,
+        testerNo: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        testerType: [
+          { required: true, message: "检测仪类型不能为空", trigger: "blur" }
+        ],
+        testerModel: [
+          { required: true, message: "型号不能为空", trigger: "blur" }
+        ],
+        testerNo: [
+          { required: true, message: "编号不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询检测仪列表 */
+    getList() {
+      this.loading = true;
+      listTester(this.queryParams).then(response => {
+        this.testerList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        testerType: null,
+        testerModel: null,
+        testerNo: null,
+        status: "1",
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: 18
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加检测仪";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getTester(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改检测仪";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateTester(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addTester(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除检测仪编号为"' + ids + '"的数据项?').then(function() {
+        return delTester(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/tester/export', {
+        ...this.queryParams
+      }, `tester_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/tester/exportQRCode', {
+        ...this.queryParams
+      }, `检测仪QRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

+ 319 - 0
ui/src/views/patrol/dev/walkieTalkie/index.vue

@@ -0,0 +1,319 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="位号" prop="devNo">
+        <el-input
+          v-model="queryParams.devNo"
+          placeholder="请输入位号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable @change="handleQuery">
+          <el-option
+            v-for="dict in dict.type.dev_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['dev:walkieTalkie:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['dev:walkieTalkie:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['dev:walkieTalkie:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['dev:walkieTalkie:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-hasPermi="['dev:walkieTalkie:export']"
+          icon="el-icon-download"
+          plain
+          size="mini"
+          type="warning"
+          @click="handleExportQRCode"
+        >导出设备二维码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="walkieTalkieList"  :height="clientHeight" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="位号" align="center" prop="devNo" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.dev_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remarks" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['dev:walkieTalkie:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['dev:walkieTalkie:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改对讲机对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="位号" prop="devNo">
+          <el-input v-model="form.devNo" placeholder="请输入位号" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in dict.type.dev_status"
+              :key="dict.value"
+              :label="dict.value"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remarks">
+          <el-input v-model="form.remarks" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listWalkieTalkie, getWalkieTalkie, delWalkieTalkie, addWalkieTalkie, updateWalkieTalkie } from "@/api/patrol/dev/walkieTalkie";
+
+export default {
+  name: "WalkieTalkie",
+  dicts: ['dev_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: false,
+      // 页面高度
+      clientHeight: 300,
+      // 总条数
+      total: 0,
+      // 对讲机表格数据
+      walkieTalkieList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        devNo: null,
+        status: null,
+        remarks: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        devNo: [
+          { required: true, message: "位号不能为空", trigger: "blur" }
+        ],
+        delFlag: [
+          { required: true, message: "删除标识0未删除不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight - 270
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询对讲机列表 */
+    getList() {
+      this.loading = true;
+      listWalkieTalkie(this.queryParams).then(response => {
+        this.walkieTalkieList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        devNo: null,
+        status: '1',
+        remarks: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null,
+        patrolType: 23
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加对讲机";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getWalkieTalkie(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改对讲机";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateWalkieTalkie(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addWalkieTalkie(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除对讲机编号为"' + ids + '"的数据项?').then(function() {
+        return delWalkieTalkie(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('dev/walkieTalkie/export', {
+        ...this.queryParams
+      }, `walkieTalkie_${new Date().getTime()}.xlsx`)
+    },
+    /** 导出按钮操作 */
+    handleExportQRCode() {
+      this.download('dev/walkieTalkie/exportQRCode', {
+        ...this.queryParams
+      }, `walkieTalkieQRCode_${new Date().getTime()}.docx`)
+    }
+  }
+};
+</script>

部分文件因为文件数量过多而无法显示