diff --git a/pom.xml b/pom.xml
index 4e06b239..39d4ae71 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,7 +33,7 @@
6.7.2
5.8.20
-
+
@@ -206,6 +206,7 @@
ruoyi-generator
ruoyi-common
ruoyi-flowable
+ yanzhu-deviceApi
yanzhu-bigscreen
yanzhu-jh
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index 53b3e8b2..6b19a48f 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -41,6 +41,14 @@ wechat:
wxAppId: wx9997d071b4996f23
wxAppSecret: 5bcc9ca17b31133d93a025871fc5021d
+# 日志配置
+logging:
+ level:
+ com.ruoyi: error
+ com.yanzhu.jh: error
+ org.springframework: error
+ org.flowable: error
+
# 数据源配置
spring:
datasource:
diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml
index 3b47e33b..0344d825 100644
--- a/ruoyi-admin/src/main/resources/logback.xml
+++ b/ruoyi-admin/src/main/resources/logback.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java
index 106912c0..4300a612 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java
@@ -47,6 +47,11 @@ public class CacheConstants
*/
public static final String YANZHU_SYSTEM_CONFIG = "yanzhu_system_config:";
+ /**
+ * yanzhu设备塔吊检测 redis key
+ */
+ public static final String YANZHU_DEVICE_TOWER = "device.tower_cfg:";
+
/**
* 微信公众号模板消息 redis key
*/
diff --git a/ruoyi-ui/src/api/device/towerDataCollide.js b/ruoyi-ui/src/api/device/towerDataCollide.js
new file mode 100644
index 00000000..1a5eed52
--- /dev/null
+++ b/ruoyi-ui/src/api/device/towerDataCollide.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询塔机碰撞信息列表
+export function listTowerDataCollide(query) {
+ return request({
+ url: '/device/towerDataCollide/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询塔机碰撞信息详细
+export function getTowerDataCollide(id) {
+ return request({
+ url: '/device/towerDataCollide/' + id,
+ method: 'get'
+ })
+}
+
+// 新增塔机碰撞信息
+export function addTowerDataCollide(data) {
+ return request({
+ url: '/device/towerDataCollide',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改塔机碰撞信息
+export function updateTowerDataCollide(data) {
+ return request({
+ url: '/device/towerDataCollide',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除塔机碰撞信息
+export function delTowerDataCollide(id) {
+ return request({
+ url: '/device/towerDataCollide/' + id,
+ method: 'delete'
+ })
+}
diff --git a/ruoyi-ui/src/api/device/towerDataLimit.js b/ruoyi-ui/src/api/device/towerDataLimit.js
new file mode 100644
index 00000000..b62f5755
--- /dev/null
+++ b/ruoyi-ui/src/api/device/towerDataLimit.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询塔机限位信息列表
+export function listTowerDataLimit(query) {
+ return request({
+ url: '/device/towerDataLimit/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询塔机限位信息详细
+export function getTowerDataLimit(id) {
+ return request({
+ url: '/device/towerDataLimit/' + id,
+ method: 'get'
+ })
+}
+
+// 新增塔机限位信息
+export function addTowerDataLimit(data) {
+ return request({
+ url: '/device/towerDataLimit',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改塔机限位信息
+export function updateTowerDataLimit(data) {
+ return request({
+ url: '/device/towerDataLimit',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除塔机限位信息
+export function delTowerDataLimit(id) {
+ return request({
+ url: '/device/towerDataLimit/' + id,
+ method: 'delete'
+ })
+}
diff --git a/ruoyi-ui/src/api/device/towerDataLocal.js b/ruoyi-ui/src/api/device/towerDataLocal.js
new file mode 100644
index 00000000..e2c67a6a
--- /dev/null
+++ b/ruoyi-ui/src/api/device/towerDataLocal.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询塔机定位信息列表
+export function listTowerDataLocal(query) {
+ return request({
+ url: '/device/towerDataLocal/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询塔机定位信息详细
+export function getTowerDataLocal(id) {
+ return request({
+ url: '/device/towerDataLocal/' + id,
+ method: 'get'
+ })
+}
+
+// 新增塔机定位信息
+export function addTowerDataLocal(data) {
+ return request({
+ url: '/device/towerDataLocal',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改塔机定位信息
+export function updateTowerDataLocal(data) {
+ return request({
+ url: '/device/towerDataLocal',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除塔机定位信息
+export function delTowerDataLocal(id) {
+ return request({
+ url: '/device/towerDataLocal/' + id,
+ method: 'delete'
+ })
+}
diff --git a/ruoyi-ui/src/api/device/towerDataRound.js b/ruoyi-ui/src/api/device/towerDataRound.js
new file mode 100644
index 00000000..50c7e12f
--- /dev/null
+++ b/ruoyi-ui/src/api/device/towerDataRound.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询塔机工作循环列表
+export function listTowerDataRound(query) {
+ return request({
+ url: '/device/towerDataRound/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询塔机工作循环详细
+export function getTowerDataRound(id) {
+ return request({
+ url: '/device/towerDataRound/' + id,
+ method: 'get'
+ })
+}
+
+// 新增塔机工作循环
+export function addTowerDataRound(data) {
+ return request({
+ url: '/device/towerDataRound',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改塔机工作循环
+export function updateTowerDataRound(data) {
+ return request({
+ url: '/device/towerDataRound',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除塔机工作循环
+export function delTowerDataRound(id) {
+ return request({
+ url: '/device/towerDataRound/' + id,
+ method: 'delete'
+ })
+}
diff --git a/ruoyi-ui/src/api/device/towerDataRun.js b/ruoyi-ui/src/api/device/towerDataRun.js
new file mode 100644
index 00000000..7b3e5122
--- /dev/null
+++ b/ruoyi-ui/src/api/device/towerDataRun.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询塔机实时数据列表
+export function listTowerDataRun(query) {
+ return request({
+ url: '/device/towerDataRun/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询塔机实时数据详细
+export function getTowerDataRun(id) {
+ return request({
+ url: '/device/towerDataRun/' + id,
+ method: 'get'
+ })
+}
+
+// 新增塔机实时数据
+export function addTowerDataRun(data) {
+ return request({
+ url: '/device/towerDataRun',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改塔机实时数据
+export function updateTowerDataRun(data) {
+ return request({
+ url: '/device/towerDataRun',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除塔机实时数据
+export function delTowerDataRun(id) {
+ return request({
+ url: '/device/towerDataRun/' + id,
+ method: 'delete'
+ })
+}
diff --git a/ruoyi-ui/src/api/device/towerDataWarning.js b/ruoyi-ui/src/api/device/towerDataWarning.js
new file mode 100644
index 00000000..69979639
--- /dev/null
+++ b/ruoyi-ui/src/api/device/towerDataWarning.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询塔机预警管理列表
+export function listTowerDataWarning(query) {
+ return request({
+ url: '/device/towerDataWarning/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询塔机预警管理详细
+export function getTowerDataWarning(id) {
+ return request({
+ url: '/device/towerDataWarning/' + id,
+ method: 'get'
+ })
+}
+
+// 新增塔机预警管理
+export function addTowerDataWarning(data) {
+ return request({
+ url: '/device/towerDataWarning',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改塔机预警管理
+export function updateTowerDataWarning(data) {
+ return request({
+ url: '/device/towerDataWarning',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除塔机预警管理
+export function delTowerDataWarning(id) {
+ return request({
+ url: '/device/towerDataWarning/' + id,
+ method: 'delete'
+ })
+}
diff --git a/ruoyi-ui/src/api/device/towerProjectConfig.js b/ruoyi-ui/src/api/device/towerProjectConfig.js
new file mode 100644
index 00000000..8eb49d9e
--- /dev/null
+++ b/ruoyi-ui/src/api/device/towerProjectConfig.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询塔基检测配置列表
+export function listTowerProjectConfig(query) {
+ return request({
+ url: '/device/towerProjectConfig/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询塔基检测配置详细
+export function getTowerProjectConfig(id) {
+ return request({
+ url: '/device/towerProjectConfig/' + id,
+ method: 'get'
+ })
+}
+
+// 新增塔基检测配置
+export function addTowerProjectConfig(data) {
+ return request({
+ url: '/device/towerProjectConfig',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改塔基检测配置
+export function updateTowerProjectConfig(data) {
+ return request({
+ url: '/device/towerProjectConfig',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除塔基检测配置
+export function delTowerProjectConfig(id) {
+ return request({
+ url: '/device/towerProjectConfig/' + id,
+ method: 'delete'
+ })
+}
diff --git a/ruoyi-ui/src/views/device/towerDataCollide/index.vue b/ruoyi-ui/src/views/device/towerDataCollide/index.vue
new file mode 100644
index 00000000..aa0719d8
--- /dev/null
+++ b/ruoyi-ui/src/views/device/towerDataCollide/index.vue
@@ -0,0 +1,512 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 碰撞详情信息
+
+
+ 添加
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-ui/src/views/device/towerDataLimit/index.vue b/ruoyi-ui/src/views/device/towerDataLimit/index.vue
new file mode 100644
index 00000000..a3f65260
--- /dev/null
+++ b/ruoyi-ui/src/views/device/towerDataLimit/index.vue
@@ -0,0 +1,498 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-ui/src/views/device/towerDataLocal/index.vue b/ruoyi-ui/src/views/device/towerDataLocal/index.vue
new file mode 100644
index 00000000..7359e4ff
--- /dev/null
+++ b/ruoyi-ui/src/views/device/towerDataLocal/index.vue
@@ -0,0 +1,418 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-ui/src/views/device/towerDataRound/index.vue b/ruoyi-ui/src/views/device/towerDataRound/index.vue
new file mode 100644
index 00000000..8eadaf00
--- /dev/null
+++ b/ruoyi-ui/src/views/device/towerDataRound/index.vue
@@ -0,0 +1,453 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-ui/src/views/device/towerDataRun/index.vue b/ruoyi-ui/src/views/device/towerDataRun/index.vue
new file mode 100644
index 00000000..8e74ffef
--- /dev/null
+++ b/ruoyi-ui/src/views/device/towerDataRun/index.vue
@@ -0,0 +1,424 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-ui/src/views/device/towerDataWarning/index.vue b/ruoyi-ui/src/views/device/towerDataWarning/index.vue
new file mode 100644
index 00000000..85675ad7
--- /dev/null
+++ b/ruoyi-ui/src/views/device/towerDataWarning/index.vue
@@ -0,0 +1,351 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-ui/src/views/device/towerProjectConfig/index.vue b/ruoyi-ui/src/views/device/towerProjectConfig/index.vue
new file mode 100644
index 00000000..1377e47e
--- /dev/null
+++ b/ruoyi-ui/src/views/device/towerProjectConfig/index.vue
@@ -0,0 +1,336 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-wechat/src/main/resources/application-prod.yml b/ruoyi-wechat/src/main/resources/application-prod.yml
index bf14568c..c840592e 100644
--- a/ruoyi-wechat/src/main/resources/application-prod.yml
+++ b/ruoyi-wechat/src/main/resources/application-prod.yml
@@ -43,6 +43,13 @@ wechat:
wxAppId: wx9997d071b4996f23
wxAppSecret: 5bcc9ca17b31133d93a025871fc5021d
+# 日志配置
+logging:
+ level:
+ com.ruoyi: error
+ com.yanzhu.jh: error
+ org.springframework: error
+
# 数据源配置
spring:
datasource:
diff --git a/ruoyi-wechat/src/main/resources/logback.xml b/ruoyi-wechat/src/main/resources/logback.xml
index 3b47e33b..2f83cff6 100644
--- a/ruoyi-wechat/src/main/resources/logback.xml
+++ b/ruoyi-wechat/src/main/resources/logback.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/yanzhu-deviceApi/pom.xml b/yanzhu-deviceApi/pom.xml
new file mode 100644
index 00000000..aea9f55a
--- /dev/null
+++ b/yanzhu-deviceApi/pom.xml
@@ -0,0 +1,79 @@
+
+
+
+ ruoyi
+ com.ruoyi
+ 3.8.6
+
+
+ 4.0.0
+ jar
+ yanzhu-deviceApi
+
+
+ 设备检测服务入口
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+
+
+
+
+ com.ruoyi
+ ruoyi-framework
+
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ com.yanzhu.jh
+ yanzhu-jh
+ 1.0.0
+ compile
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ 2.1.1.RELEASE
+
+ true
+
+
+
+
+ repackage
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ 3.1.0
+
+ false
+ ${project.artifactId}
+
+
+
+ ${project.artifactId}
+
+
+
\ No newline at end of file
diff --git a/yanzhu-deviceApi/src/main/java/com/ruoyi/DeviceApiApplication.java b/yanzhu-deviceApi/src/main/java/com/ruoyi/DeviceApiApplication.java
new file mode 100644
index 00000000..bbb86282
--- /dev/null
+++ b/yanzhu-deviceApi/src/main/java/com/ruoyi/DeviceApiApplication.java
@@ -0,0 +1,31 @@
+package com.ruoyi;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+
+/**
+ * 启动程序
+ *
+ * @author ruoyi
+ */
+@SpringBootApplication(scanBasePackages = "com.ruoyi,com.yanzhu.jh",exclude = { DataSourceAutoConfiguration.class })
+@MapperScan(value = {"com.ruoyi.*.mapper","com.yanzhu.jh.*.mapper"})
+public class DeviceApiApplication
+{
+ public static void main(String[] args)
+ {
+ SpringApplication.run(DeviceApiApplication.class, args);
+ System.out.println("(♥◠‿◠)ノ゙ 设备Api启动成功 ლ(´ڡ`ლ)゙ \n" +
+ " .-------. ____ __ \n" +
+ " | _ _ \\ \\ \\ / / \n" +
+ " | ( ' ) | \\ _. / ' \n" +
+ " |(_ o _) / _( )_ .' \n" +
+ " | (_,_).' __ ___(_ o _)' \n" +
+ " | |\\ \\ | || |(_,_)' \n" +
+ " | | \\ `' /| `-' / \n" +
+ " | | \\ / \\ / \n" +
+ " ''-' `'-' `-..-' ");
+ }
+}
diff --git a/yanzhu-deviceApi/src/main/java/com/ruoyi/DeviceApiServletInitializer.java b/yanzhu-deviceApi/src/main/java/com/ruoyi/DeviceApiServletInitializer.java
new file mode 100644
index 00000000..b86ea79c
--- /dev/null
+++ b/yanzhu-deviceApi/src/main/java/com/ruoyi/DeviceApiServletInitializer.java
@@ -0,0 +1,18 @@
+package com.ruoyi;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * web容器中进行部署
+ *
+ * @author ruoyi
+ */
+public class DeviceApiServletInitializer extends SpringBootServletInitializer
+{
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
+ {
+ return application.sources(DeviceApiApplication.class);
+ }
+}
diff --git a/yanzhu-deviceApi/src/main/java/com/ruoyi/api/TowerCraneApiController.java b/yanzhu-deviceApi/src/main/java/com/ruoyi/api/TowerCraneApiController.java
new file mode 100644
index 00000000..5d317f4d
--- /dev/null
+++ b/yanzhu-deviceApi/src/main/java/com/ruoyi/api/TowerCraneApiController.java
@@ -0,0 +1,326 @@
+package com.ruoyi.api;
+
+import com.alibaba.fastjson2.JSON;
+import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.annotation.RateLimiter;
+import com.ruoyi.common.constant.CacheConstants;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.core.text.Convert;
+import com.ruoyi.common.enums.HttpStatusEnum;
+import com.ruoyi.common.enums.LimitType;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.domain.TowerReqVo;
+import com.ruoyi.emuns.TowerTypeEnums;
+import com.yanzhu.jh.device.domain.*;
+import com.yanzhu.jh.device.service.*;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 塔吊监测APIController
+ *
+ * @author JiangYuQi
+ * @date 2024-01-13
+ */
+@Slf4j
+@RestController
+@RequestMapping("/desApi/towerCrane")
+public class TowerCraneApiController {
+
+ @Autowired
+ private RedisCache redisCache;
+
+ @Autowired
+ private IDevTowerDataRunService devTowerDataRunService;
+
+ @Autowired
+ private IDevTowerDataRoundService devTowerDataRoundService;
+
+ @Autowired
+ private IDevTowerDataLimitService devTowerDataLimitService;
+
+ @Autowired
+ private IDevTowerDataLocalService devTowerDataLocalService;
+
+ @Autowired
+ private IDevTowerDataCollideService devTowerDataCollideService;
+
+ @Autowired
+ private IDevTowerDataWarningService devTowerDataWarningService;
+
+ @Autowired
+ private IDevTowerProjectConfigService devTowerProjectConfigService;
+
+ /**
+ * 塔吊监测++
+ * 限流规则[60秒内最多请求10次,限流策略IP]
+ * @param req 请求信息
+ * @author JiangYuQi
+ * @date 2024-01-13
+ */
+ @Anonymous
+ @ApiOperation(value = "塔吊监测")
+ @RateLimiter(count = 10, limitType = LimitType.IP)
+ @PostMapping("/v1/push")
+ public AjaxResult pushData(@Validated @RequestBody TowerReqVo req) {
+ log.info("towerCrane==>{}", JSON.toJSONString(req));
+ DevTowerProjectConfig config = redisCache.getCacheObject(CacheConstants.YANZHU_DEVICE_TOWER+req.getContent().getDeviceKey());
+ if(config==null){
+ throw new ServiceException(HttpStatusEnum.DARA_EXCEPTION.getInfo(),HttpStatusEnum.DARA_EXCEPTION.getCode());
+ }
+ if(req.getType() == TowerTypeEnums.BASE.getCode()){
+ this.pushConfigData(config,req);
+ }else if(req.getType() == TowerTypeEnums.RUN.getCode()){
+ this.pushRunData(config,req);
+ }else if(req.getType() == TowerTypeEnums.ROUND.getCode()){
+ this.pushRoundData(config,req);
+ }else if(req.getType() == TowerTypeEnums.COLLIDE.getCode()){
+ this.pushCollideData(config,req);
+ }else if(req.getType() == TowerTypeEnums.LIMIT.getCode()){
+ this.pushLimitData(config,req);
+ }else if(req.getType() == TowerTypeEnums.LOCAL.getCode()){
+ this.pushLocalData(config,req);
+ }
+ return AjaxResult.success();
+ }
+
+ /**
+ * 塔机上报基本信息
+ * @param req
+ */
+ private void pushConfigData(DevTowerProjectConfig config,TowerReqVo req){
+ DevTowerProjectConfig devTowerProjectConfig = devTowerProjectConfigService.selectDevTowerProjectConfigById(config.getId());
+ Map dataContent = req.getContent().getDataContent();
+ devTowerProjectConfig.setTowerId(Convert.toStr(dataContent.get("towerId")));
+ devTowerProjectConfig.setTowerType(Convert.toStr(dataContent.get("towerType")));
+ devTowerProjectConfig.setCoordinateX(Convert.toStr(dataContent.get("coordinateX")));
+ devTowerProjectConfig.setCoordinateY(Convert.toStr(dataContent.get("coordinateY")));
+ devTowerProjectConfig.setFrontBrachium(Convert.toStr(dataContent.get("frontBrachium")));
+ devTowerProjectConfig.setAfterBrachium(Convert.toStr(dataContent.get("afterBrachium")));
+ devTowerProjectConfig.setTowerBodyHeight(Convert.toStr(dataContent.get("towerBodyHeight")));
+ devTowerProjectConfig.setTowerCapHeight(Convert.toStr(dataContent.get("towerCapHeight")));
+ devTowerProjectConfig.setTowerSectionHeight(Convert.toStr(dataContent.get("towerSectionHeight")));
+ devTowerProjectConfigService.updateDevTowerProjectConfigNoCache(devTowerProjectConfig);
+ }
+
+ /**
+ * 塔机上报实时数据
+ * @param req
+ */
+ private void pushRunData(DevTowerProjectConfig config,TowerReqVo req){
+ DevTowerDataRun devTowerDataRun = new DevTowerDataRun();
+ Map dataContent = req.getContent().getDataContent();
+ devTowerDataRun.setCfgId(config.getId());
+ devTowerDataRun.setProjectId(config.getProjectId());
+ devTowerDataRun.setDeptId(config.getDeptId());
+ devTowerDataRun.setDeviceKey(config.getDeviceSn());
+ devTowerDataRun.setHeight(Convert.toStr(dataContent.get("height")));
+ devTowerDataRun.setRange(Convert.toStr(dataContent.get("range")));
+ devTowerDataRun.setRotation(Convert.toStr(dataContent.get("rotation")));
+ devTowerDataRun.setLoad(Convert.toStr(dataContent.get("load")));
+ devTowerDataRun.setWindSpeed(Convert.toStr(dataContent.get("windSpeed")));
+ devTowerDataRun.setLeanAngleX(Convert.toStr(dataContent.get("leanAngleX")));
+ devTowerDataRun.setLeanAngleY(Convert.toStr(dataContent.get("leanAngleY")));
+ devTowerDataRun.setLoadPercent(Convert.toStr(dataContent.get("loadPercent")));
+ devTowerDataRun.setMomentPercent(Convert.toStr(dataContent.get("momentPercent")));
+ devTowerDataRun.setWindSpeedPercent(Convert.toStr(dataContent.get("windSpeedPercent")));
+ devTowerDataRun.setLeanAnglePercent(Convert.toStr(dataContent.get("leanAnglePercent")));
+ devTowerDataRun.setRate(Convert.toStr(dataContent.get("rate")));
+ devTowerDataRun.setRotationSensorState(Convert.toStr(dataContent.get("rotationSensorState")));
+ devTowerDataRun.setLoadSensorState(Convert.toStr(dataContent.get("loadSensorState")));
+ devTowerDataRun.setWindSpeedSensorState(Convert.toStr(dataContent.get("windSpeedSensorState")));
+ devTowerDataRun.setLeanAngleSensorState(Convert.toStr(dataContent.get("leanAngleSensorState")));
+ devTowerDataRun.setRangeSensorState(Convert.toStr(dataContent.get("rangeSensorState")));
+ devTowerDataRun.setHeightSensorState(Convert.toStr(dataContent.get("heightSensorState")));
+ devTowerDataRun.setBrakingStatus(Convert.toStr(dataContent.get("brakingStatus")));
+ if(dataContent.get("warnings")!=null){
+ List warnings = (List)dataContent.get("warnings");
+ devTowerDataRun.setWarnings(String.join(",", warnings));
+ }
+ devTowerDataRunService.insertDevTowerDataRun(devTowerDataRun);
+ }
+
+ /**
+ * 塔机上报循环数据
+ * @param req
+ */
+ private void pushRoundData(DevTowerProjectConfig config,TowerReqVo req){
+ DevTowerDataRound devTowerDataRound = new DevTowerDataRound();
+ Map dataContent = req.getContent().getDataContent();
+ devTowerDataRound.setCfgId(config.getId());
+ devTowerDataRound.setProjectId(config.getProjectId());
+ devTowerDataRound.setDeptId(config.getDeptId());
+ devTowerDataRound.setDeviceKey(config.getDeviceSn());
+ devTowerDataRound.setTowerId(Convert.toStr(dataContent.get("towerId")));
+ devTowerDataRound.setWorkStartTime(Convert.toStr(dataContent.get("workStartTime")));
+ devTowerDataRound.setWorkEndTime(Convert.toStr(dataContent.get("workEndTime")));
+ devTowerDataRound.setMinHeight(Convert.toStr(dataContent.get("minHeight")));
+ devTowerDataRound.setMaxHeight(Convert.toStr(dataContent.get("maxHeight")));
+ devTowerDataRound.setMinRange(Convert.toStr(dataContent.get("minRange")));
+ devTowerDataRound.setMaxRange(Convert.toStr(dataContent.get("maxRange")));
+ devTowerDataRound.setStartHeight(Convert.toStr(dataContent.get("startHeight")));
+ devTowerDataRound.setEndHeight(Convert.toStr(dataContent.get("endHeight")));
+ devTowerDataRound.setStartRange(Convert.toStr(dataContent.get("startRange")));
+ devTowerDataRound.setEndRange(Convert.toStr(dataContent.get("endRange")));
+ devTowerDataRound.setStartRotation(Convert.toStr(dataContent.get("startRotation")));
+ devTowerDataRound.setEndRotation(Convert.toStr(dataContent.get("endRotation")));
+ devTowerDataRound.setMaxLoad(Convert.toStr(dataContent.get("maxLoad")));
+ devTowerDataRound.setMaxLoadPercent(Convert.toStr(dataContent.get("maxLoadPercent")));
+ devTowerDataRound.setMaxMoment(Convert.toStr(dataContent.get("maxMoment")));
+ devTowerDataRound.setMaxMomentPercent(Convert.toStr(dataContent.get("maxMomentPercent")));
+ devTowerDataRound.setStartWindSpeed(Convert.toStr(dataContent.get("startWindSpeed")));
+ devTowerDataRound.setEndWindSpeed(Convert.toStr(dataContent.get("endWindSpeed")));
+ devTowerDataRound.setStartWindSpeedPercent(Convert.toStr(dataContent.get("startWindSpeedPercent")));
+ devTowerDataRound.setEndWindSpeedPercent(Convert.toStr(dataContent.get("endWindSpeedPercent")));
+ devTowerDataRound.setStartLeanAngleX(Convert.toStr(dataContent.get("startleanAngleX")));
+ devTowerDataRound.setEndLeanAngleX(Convert.toStr(dataContent.get("endLeanAngleX")));
+ devTowerDataRound.setStartLeanAngleY(Convert.toStr(dataContent.get("startleanAngleY")));
+ devTowerDataRound.setEndLeanAngleY(Convert.toStr(dataContent.get("endLeanAngleY")));
+ if(dataContent.get("warning")!=null){
+ List warnings = (List)dataContent.get("warning");
+ devTowerDataRound.setWarnings(String.join(",", warnings));
+ }
+ devTowerDataRoundService.insertDevTowerDataRound(devTowerDataRound);
+ }
+
+ /**
+ * 塔机上报碰撞信息
+ * @param req
+ */
+ private void pushCollideData(DevTowerProjectConfig config,TowerReqVo req){
+ DevTowerDataCollide devTowerDataCollide = new DevTowerDataCollide();
+ Map dataContent = req.getContent().getLocalDeviceInfo();
+ devTowerDataCollide.setCfgId(config.getId());
+ devTowerDataCollide.setProjectId(config.getProjectId());
+ devTowerDataCollide.setDeptId(config.getDeptId());
+ devTowerDataCollide.setDeviceKey(config.getDeviceSn());
+ devTowerDataCollide.setTowerId(Convert.toStr(dataContent.get("towerId")));
+ devTowerDataCollide.setCoordinateX(Convert.toStr(dataContent.get("coordinateX")));
+ devTowerDataCollide.setCoordinateY(Convert.toStr(dataContent.get("coordinateY")));
+ devTowerDataCollide.setFrontBrachium(Convert.toStr(dataContent.get("frontBrachium")));
+ devTowerDataCollide.setAfterBrachium(Convert.toStr(dataContent.get("afterBrachium")));
+ devTowerDataCollide.setTowerBodyHeight(Convert.toStr(dataContent.get("towerBodyHeight")));
+ devTowerDataCollide.setHeight(Convert.toStr(dataContent.get("height")));
+ devTowerDataCollide.setAngle(Convert.toStr(dataContent.get("angle")));
+ devTowerDataCollide.setRange(Convert.toStr(dataContent.get("range")));
+ devTowerDataCollide.setEarlyWarningDistance(Convert.toStr(dataContent.get("earlyWarningDistance")));
+ devTowerDataCollide.setAlarmWarningDistance(Convert.toStr(dataContent.get("alarmWarningDistance")));
+ devTowerDataCollide.setContourValue(Convert.toStr(dataContent.get("contourValue")));
+ List devTowerDataCollideDetailList = new ArrayList<>();
+ if(StringUtils.isNotEmpty(req.getContent().getCollideTowers())){
+ for (Map collideTowers:req.getContent().getCollideTowers()){
+ DevTowerDataCollideDetail devTowerDataCollideDetail = new DevTowerDataCollideDetail();
+ devTowerDataCollideDetail.setTowerId(Convert.toStr(collideTowers.get("towerId")));
+ devTowerDataCollideDetail.setCoordinateX(Convert.toStr(collideTowers.get("coordinateX")));
+ devTowerDataCollideDetail.setCoordinateY(Convert.toStr(collideTowers.get("coordinateY")));
+ devTowerDataCollideDetail.setFrontBrachium(Convert.toStr(collideTowers.get("frontBrachium")));
+ devTowerDataCollideDetail.setAfterBrachium(Convert.toStr(collideTowers.get("afterBrachium")));
+ devTowerDataCollideDetail.setTowerBodyHeight(Convert.toStr(collideTowers.get("towerBodyHeight")));
+ devTowerDataCollideDetail.setHeight(Convert.toStr(collideTowers.get("height")));
+ devTowerDataCollideDetail.setAngle(Convert.toStr(collideTowers.get("angle")));
+ devTowerDataCollideDetail.setRange(Convert.toStr(collideTowers.get("range")));
+ devTowerDataCollideDetail.setCollideHorizontalDistance(Convert.toStr(collideTowers.get("collideHorizontalDistance")));
+ devTowerDataCollideDetail.setCollideVerticalDistance(Convert.toStr(collideTowers.get("collideVerticalDistance")));
+ devTowerDataCollideDetail.setCollideState(Convert.toStr(collideTowers.get("collideState")));
+ devTowerDataCollideDetailList.add(devTowerDataCollideDetail);
+ }
+ devTowerDataCollide.setDevTowerDataCollideDetailList(devTowerDataCollideDetailList);
+ }
+ devTowerDataCollideService.insertDevTowerDataCollide(devTowerDataCollide);
+ }
+
+ /**
+ * 塔机上报限位信息
+ * @param req
+ */
+ private void pushLimitData(DevTowerProjectConfig config,TowerReqVo req){
+ DevTowerDataLimit devTowerDataLimit = new DevTowerDataLimit();
+ Map dataContent = req.getContent().getDataContent();
+ devTowerDataLimit.setCfgId(config.getId());
+ devTowerDataLimit.setProjectId(config.getProjectId());
+ devTowerDataLimit.setDeptId(config.getDeptId());
+ devTowerDataLimit.setDeviceKey(config.getDeviceSn());
+ devTowerDataLimit.setTowerId(Convert.toStr(dataContent.get("towerId")));
+ devTowerDataLimit.setWindSpeedWarning(Convert.toStr(dataContent.get("windSpeedWarning")));
+ devTowerDataLimit.setWindSpeedAlarm(Convert.toStr(dataContent.get("windSpeedAlarm")));
+ devTowerDataLimit.setLoadWarning(Convert.toStr(dataContent.get("loadWarning")));
+ devTowerDataLimit.setLoadAlarm(Convert.toStr(dataContent.get("loadAlarm")));
+ devTowerDataLimit.setMomentWarning(Convert.toStr(dataContent.get("momentWarning")));
+ devTowerDataLimit.setMomentAlarm(Convert.toStr(dataContent.get("momentAlarm")));
+ devTowerDataLimit.setHighLimitWarning(Convert.toStr(dataContent.get("highLimitWarning")));
+ devTowerDataLimit.setHighLimitAlarm(Convert.toStr(dataContent.get("highLimitAlarm")));
+ devTowerDataLimit.setLowLimitWarning(Convert.toStr(dataContent.get("lowLimitWarning")));
+ devTowerDataLimit.setLowLimitAlarm(Convert.toStr(dataContent.get("lowLimitAlarm")));
+ devTowerDataLimit.setLeftLimitWarning(Convert.toStr(dataContent.get("leftLimitWarning")));
+ devTowerDataLimit.setLeftLimitAlarm(Convert.toStr(dataContent.get("leftLimitAlarm")));
+ devTowerDataLimit.setRightLimitWarning(Convert.toStr(dataContent.get("rightLimitWarning")));
+ devTowerDataLimit.setRightLimitAlarm(Convert.toStr(dataContent.get("rightLimitAlarm")));
+ devTowerDataLimit.setFrontLimitWarning(Convert.toStr(dataContent.get("frontLimitWarning")));
+ devTowerDataLimit.setFrontLimitAlarm(Convert.toStr(dataContent.get("frontLimitAlarm")));
+ devTowerDataLimit.setBackLimitWarning(Convert.toStr(dataContent.get("backLimitWarning")));
+ devTowerDataLimit.setBackLimitAlarm(Convert.toStr(dataContent.get("backLimitAlarm")));
+ devTowerDataLimit.setCollisionAngleWarning(Convert.toStr(dataContent.get("collisionAngleWarning")));
+ devTowerDataLimit.setCollisionAngleAlarm(Convert.toStr(dataContent.get("collisionAngleAlarm")));
+ devTowerDataLimit.setCollisionDistanceWarning(Convert.toStr(dataContent.get("collisionDistanceWarning")));
+ devTowerDataLimit.setCollisionDistanceAlarm(Convert.toStr(dataContent.get("collisionDistanceAlarm")));
+ devTowerDataLimit.sethDistanceWarning(Convert.toStr(dataContent.get("hDistanceWarning")));
+ devTowerDataLimit.sethDistanceAlarm(Convert.toStr(dataContent.get("hDistanceAlarm")));
+ devTowerDataLimit.setvDistanceWarning(Convert.toStr(dataContent.get("vDistanceWarning")));
+ devTowerDataLimit.setvDistanceAlarm(Convert.toStr(dataContent.get("vDistanceAlarm")));
+ devTowerDataLimit.setLeanWarning(Convert.toStr(dataContent.get("leanWarning")));
+ devTowerDataLimit.setLeanAlarm(Convert.toStr(dataContent.get("leanAlarm")));
+ devTowerDataLimit.setRangeLimitStart(Convert.toStr(dataContent.get("rangeLimitStart")));
+ devTowerDataLimit.setRangeLimitEnd(Convert.toStr(dataContent.get("rangeLimitEnd")));
+ devTowerDataLimit.setHeightLimitStart(Convert.toStr(dataContent.get("heightLimitStart")));
+ devTowerDataLimit.setHeightLimitEnd(Convert.toStr(dataContent.get("heightLimitEnd")));
+ devTowerDataLimit.setRotationLimitStart(Convert.toStr(dataContent.get("rotationLimitStart")));
+ devTowerDataLimit.setRotationLimitEnd(Convert.toStr(dataContent.get("rotationLimitEnd")));
+ devTowerDataLimitService.insertDevTowerDataLimit(devTowerDataLimit);
+ }
+
+ /**
+ * 塔机上报标定位信息
+ * @param req
+ */
+ private void pushLocalData(DevTowerProjectConfig config,TowerReqVo req){
+ DevTowerDataLocal devTowerDataLocal = new DevTowerDataLocal();
+ Map dataContent = req.getContent().getDataContent();
+ devTowerDataLocal.setCfgId(config.getId());
+ devTowerDataLocal.setProjectId(config.getProjectId());
+ devTowerDataLocal.setDeptId(config.getDeptId());
+ devTowerDataLocal.setDeviceKey(config.getDeviceSn());
+ devTowerDataLocal.setTowerId(Convert.toStr(dataContent.get("towerId")));
+ devTowerDataLocal.setRangeNearEndAdValue(Convert.toStr(dataContent.get("rangeNearEndADValue")));
+ devTowerDataLocal.setRangeNearEndRealityValue(Convert.toStr(dataContent.get("rangeNearEndRealityValue")));
+ devTowerDataLocal.setRangeFarEndAdValue(Convert.toStr(dataContent.get("rangeFarEndADValue")));
+ devTowerDataLocal.setRangeFarEndRealityValue(Convert.toStr(dataContent.get("rangeFarEndRealityValue")));
+ devTowerDataLocal.setHighNearEndAdValue(Convert.toStr(dataContent.get("highNearEndADValue")));
+ devTowerDataLocal.setHighNearEndRealityValue(Convert.toStr(dataContent.get("highNearEndRealityValue")));
+ devTowerDataLocal.setHighFarEndAdValue(Convert.toStr(dataContent.get("highFarEndADValue")));
+ devTowerDataLocal.setHighFarEndRealityValue(Convert.toStr(dataContent.get("highFarEndRealityValue")));
+ devTowerDataLocal.setEmptyWeightAdValue(Convert.toStr(dataContent.get("emptyWeightADValue")));
+ devTowerDataLocal.setEmptyWeightRealityValue(Convert.toStr(dataContent.get("emptyWeightRealityValue")));
+ devTowerDataLocal.setLoadWeightAdValue(Convert.toStr(dataContent.get("loadWeightADValue")));
+ devTowerDataLocal.setLoadWeightRealityValue(Convert.toStr(dataContent.get("loadWeightRealityValue")));
+ devTowerDataLocal.setRotationStartAdValue(Convert.toStr(dataContent.get("rotationStartADValue")));
+ devTowerDataLocal.setRotationStartRealityValue(Convert.toStr(dataContent.get("rotationStartRealityValue")));
+ devTowerDataLocal.setRotationEndAdValue(Convert.toStr(dataContent.get("rotationEndADValue")));
+ devTowerDataLocal.setRotationEndRealityValue(Convert.toStr(dataContent.get("rotationEndRealityValue")));
+ devTowerDataLocal.setWindSpeedFactor(Convert.toStr(dataContent.get("windSpeedFactor")));
+ devTowerDataLocal.setTiltFactor(Convert.toStr(dataContent.get("tiltFactor")));
+ devTowerDataLocalService.insertDevTowerDataLocal(devTowerDataLocal);
+ }
+
+}
diff --git a/yanzhu-deviceApi/src/main/java/com/ruoyi/domain/TowerContentReqVo.java b/yanzhu-deviceApi/src/main/java/com/ruoyi/domain/TowerContentReqVo.java
new file mode 100644
index 00000000..e7ebde4a
--- /dev/null
+++ b/yanzhu-deviceApi/src/main/java/com/ruoyi/domain/TowerContentReqVo.java
@@ -0,0 +1,47 @@
+package com.ruoyi.domain;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 塔吊检测推送信息 请求内容
+ *
+ * @author: JiangYuQi
+ * @date: 2024/01/13 12:21
+ */
+@Data
+public class TowerContentReqVo {
+
+ /**
+ * 数据产生的时间戳
+ */
+ private Long time;
+
+ /**
+ * 数据类型
+ */
+ private String dataType;
+
+ /**
+ * 设备序列号,唯一标识 84E0*****
+ */
+ private String deviceKey;
+
+ /**
+ * 上报内容
+ */
+ private Map dataContent;
+
+ /**
+ * 碰撞信息
+ */
+ private Map localDeviceInfo;
+
+ /**
+ * 碰撞塔吊设备信息
+ */
+ private List