From 46ac312ddf63f6f143a8b1684f37073521ac8c45 Mon Sep 17 00:00:00 2001
From: lcj <2331845269@qq.com>
Date: Wed, 10 Dec 2025 15:53:31 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=96=B0=E9=A1=B9=E7=9B=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
xinnengyuan/pom.xml | 9 +
.../src/main/resources/application-menu.yml | 356 ++++++++++++++++++
.../impl/DroProjectDroneServiceImpl.java | 18 +-
.../service/impl/FacRedLineServiceImpl.java | 1 +
.../manager/dronemanager/DroneManager.java | 9 +-
.../dronemanager/DroneRequestUtils.java | 28 +-
6 files changed, 403 insertions(+), 18 deletions(-)
create mode 100644 xinnengyuan/ruoyi-admin/src/main/resources/application-menu.yml
diff --git a/xinnengyuan/pom.xml b/xinnengyuan/pom.xml
index 7022d665..70e17df4 100644
--- a/xinnengyuan/pom.xml
+++ b/xinnengyuan/pom.xml
@@ -86,6 +86,15 @@
true
+
+ menu
+
+ menu
+ info
+ ruoyi
+ 123456
+
+
prod
diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/application-menu.yml b/xinnengyuan/ruoyi-admin/src/main/resources/application-menu.yml
new file mode 100644
index 00000000..68773c98
--- /dev/null
+++ b/xinnengyuan/ruoyi-admin/src/main/resources/application-menu.yml
@@ -0,0 +1,356 @@
+# 开发环境配置
+server:
+ # 服务器的HTTP端口,默认为8080
+ port: 9528
+--- # 临时文件存储位置 避免临时文件被系统清理报错
+spring.servlet.multipart.location: /ruoyi/server/temp
+
+--- # 监控中心配置
+spring.boot.admin.client:
+ # 增加客户端开关
+ enabled: false
+ url: http://localhost:9090/admin
+ instance:
+ service-host-type: IP
+ metadata:
+ username: ${spring.boot.admin.client.username}
+ userpassword: ${spring.boot.admin.client.password}
+ username: @monitor.username@
+ password: @monitor.password@
+
+--- # snail-job 配置
+snail-job:
+ enabled: false
+ # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
+ group: "ruoyi_group"
+ # SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config`表
+ token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
+ server:
+ host: 127.0.0.1
+ port: 17888
+ # 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段
+ namespace: ${spring.profiles.active}
+ # 随主应用端口漂移
+ port: 2${server.port}
+ # 客户端ip指定
+ host:
+ # RPC类型: netty, grpc
+ rpc-type: grpc
+
+--- # 数据源配置
+spring:
+ ai:
+ dashscope:
+ api-key: sk-8d8df92fcbac4bd2922edba30b0bb8fa
+ chat:
+ options:
+ model: qwen3-max
+ datasource:
+ type: com.zaxxer.hikari.HikariDataSource
+ # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
+ dynamic:
+ # 性能分析插件(有性能损耗 不建议生产环境使用)
+ p6spy: false
+ # 设置默认的数据源或者数据源组,默认值即为 master
+ primary: master
+ # 严格模式 匹配不到数据源则报错
+ strict: true
+ datasource:
+ # 主库数据源
+ master:
+ type: ${spring.datasource.type}
+ driverClassName: com.mysql.cj.jdbc.Driver
+ # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
+ # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
+ url: jdbc:mysql://192.168.110.2:13386/xinnengyuanmenu?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+ username: xinnengyuanmenu
+ password: 2RkXFG8ZE6r5LL7B
+ # # 从库数据源
+ # slave:
+ # lazy: true
+ # type: ${spring.datasource.type}
+ # driverClassName: com.mysql.cj.jdbc.Driver
+ # url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+ # username:
+ # password:
+ # oracle:
+ # type: ${spring.datasource.type}
+ # driverClassName: oracle.jdbc.OracleDriver
+ # url: jdbc:oracle:thin:@//localhost:1521/XE
+ # username: ROOT
+ # password: root
+ # postgres:
+ # type: ${spring.datasource.type}
+ # driverClassName: org.postgresql.Driver
+ # url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
+ # username: root
+ # password: root
+ # sqlserver:
+ # type: ${spring.datasource.type}
+ # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
+ # url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
+ # username: SA
+ # password: root
+ hikari:
+ # 最大连接池数量
+ maxPoolSize: 20
+ # 最小空闲线程数量
+ minIdle: 10
+ # 配置获取连接等待超时的时间
+ connectionTimeout: 30000
+ # 校验超时时间
+ validationTimeout: 5000
+ # 空闲连接存活最大时间,默认10分钟
+ idleTimeout: 600000
+ # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
+ maxLifetime: 1800000
+ # 多久检查一次连接的活性
+ keepaliveTime: 30000
+
+--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
+spring.data:
+ redis:
+ # 地址
+ host: 192.168.110.2
+ # 端口,默认为6379
+ port: 9287
+ # 数据库索引
+ database: 21
+ # redis 密码必须配置
+ password: syar23rdsaagdrsa
+ # 连接超时时间
+ timeout: 10s
+ # 是否开启ssl
+ ssl.enabled: false
+
+# redisson 配置
+redisson:
+ # redis key前缀
+ keyPrefix:
+ # 线程池数量
+ threads: 16
+ # Netty线程池数量
+ nettyThreads: 32
+ # 单节点配置
+ singleServerConfig:
+ # 客户端名称
+ clientName: ${ruoyi.name}
+ # 最小空闲连接数
+ connectionMinimumIdleSize: 32
+ # 连接池大小
+ connectionPoolSize: 64
+ # 连接空闲超时,单位:毫秒
+ idleConnectionTimeout: 10000
+ # 命令等待超时,单位:毫秒
+ timeout: 3000
+ # 发布和订阅连接池大小
+ subscriptionConnectionPoolSize: 50
+
+--- # mail 邮件发送
+mail:
+ enabled: false
+ host: smtp.163.com
+ port: 465
+ # 是否需要用户名密码验证
+ auth: true
+ # 发送方,遵循RFC-822标准
+ from: xxx@163.com
+ # 用户名(注意:如果使用foxmail邮箱,此处user为qq号)
+ user: xxx@163.com
+ # 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助)
+ pass: xxxxxxxxxx
+ # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。
+ starttlsEnable: true
+ # 使用SSL安全连接
+ sslEnable: true
+ # SMTP超时时长,单位毫秒,缺省值不超时
+ timeout: 0
+ # Socket连接超时值,单位毫秒,缺省值不超时
+ connectionTimeout: 0
+
+--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商
+# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用
+sms:
+ # 配置源类型用于标定配置来源(interface,yaml)
+ config-type: yaml
+ # 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制
+ restricted: false
+ # 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
+ minute-max: 1
+ # 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
+ account-max: 30
+ # 以下配置来自于 org.dromara.sms4j.provider.config.BaseConfig类中
+ blends:
+ # 唯一ID 用于发送短信寻找具体配置 随便定义别用中文即可
+ # 可以同时存在两个相同厂商 例如: ali1 ali2 两个不同的阿里短信账号 也可用于区分租户
+ config1:
+ # 框架定义的厂商名称标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
+ supplier: alibaba
+ # 有些称为accessKey有些称之为apiKey,也有称为sdkKey或者appId。
+ access-key-id: 您的accessKey
+ # 称为accessSecret有些称之为apiSecret
+ access-key-secret: 您的accessKeySecret
+ signature: 您的短信签名
+ sdk-app-id: 您的sdkAppId
+ config2:
+ # 登录
+ supplier: tencent
+ access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
+ access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
+ signature: 重庆远界大数据研究院
+ sdk-app-id: 1401018866
+ template-id: 2491779
+ config3:
+ # 注册
+ supplier: tencent
+ access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
+ access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
+ signature: 重庆远界大数据研究院
+ sdk-app-id: 1401018866
+ template-id: 2491776
+ config4:
+ # 质量工单逾期
+ supplier: tencent
+ access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
+ access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
+ signature: 重庆远界大数据研究院
+ sdk-app-id: 1401018866
+ template-id: 2534747
+ config5:
+ # 设计图纸
+ supplier: tencent
+ access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
+ access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
+ signature: 重庆远界大数据研究院
+ sdk-app-id: 1401018866
+ template-id: 2534750
+ config6:
+ # 安全工单
+ supplier: tencent
+ access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
+ access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
+ signature: 重庆远界大数据研究院
+ sdk-app-id: 1401018866
+ template-id: 2534848
+
+--- # 三方授权
+justauth:
+ # 前端外网访问地址
+ address: http://localhost:80
+ type:
+ maxkey:
+ # maxkey 服务器地址
+ # 注意 如下均配置均不需要修改 maxkey 已经内置好了数据
+ server-url: http://sso.maxkey.top
+ client-id: 876892492581044224
+ client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8
+ redirect-uri: ${justauth.address}/social-callback?source=maxkey
+ topiam:
+ # topiam 服务器地址
+ server-url: http://127.0.0.1:1989/api/v1/authorize/y0q************spq***********8ol
+ client-id: 449c4*********937************759
+ client-secret: ac7***********1e0************28d
+ redirect-uri: ${justauth.address}/social-callback?source=topiam
+ scopes: [ openid, email, phone, profile ]
+ qq:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: ${justauth.address}/social-callback?source=qq
+ union-id: false
+ weibo:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: ${justauth.address}/social-callback?source=weibo
+ gitee:
+ client-id: 91436b7940090d09c72c7daf85b959cfd5f215d67eea73acbf61b6b590751a98
+ client-secret: 02c6fcfd70342980cd8dd2f2c06c1a350645d76c754d7a264c4e125f9ba915ac
+ redirect-uri: ${justauth.address}/social-callback?source=gitee
+ dingtalk:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: ${justauth.address}/social-callback?source=dingtalk
+ baidu:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: ${justauth.address}/social-callback?source=baidu
+ csdn:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: ${justauth.address}/social-callback?source=csdn
+ coding:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: ${justauth.address}/social-callback?source=coding
+ coding-group-name: xx
+ oschina:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: ${justauth.address}/social-callback?source=oschina
+ alipay_wallet:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet
+ alipay-public-key: MIIB**************DAQAB
+ wechat_open:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: ${justauth.address}/social-callback?source=wechat_open
+ wechat_mp:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: ${justauth.address}/social-callback?source=wechat_mp
+ wechat_enterprise:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise
+ agent-id: 1000002
+ gitlab:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: ${justauth.address}/social-callback?source=gitlab
+# 和风天气 https://dev.qweather.com/
+weather:
+ key-id: T65EAABUXC
+ project-id: 2JTHPUQ5YY
+ private-key: MC4CAQAwBQYDK2VwBCIEIMAglX7IsxYiTeM+FXXnvCUsIggajeP4s8gAllewm6BN
+ api-host: n35rk53njv.re.qweatherapi.com
+# dxf转 geojson 执行文件名
+dxf2GeoJson:
+ file-name: main
+ys7:
+ app-key: xxx
+ app-secret: xxx
+ job:
+ capture-enabled: false # 控制是否启用萤石抓拍任务
+ device-sync-enabled: false # 控制是否同步萤石设备
+# 斯巴达算法
+sparta:
+ url: http://119.3.204.120:8040
+ client-id: test
+ client-secret: 115fcb08fa6742a1b086d9bb80a6ad59
+# 身份证加密密钥(32 位)
+id-card:
+ encrypt-key: 7ae260d150a14027d2238a1cf80a48ef
+recognizer:
+ url: http://192.168.110.5:50071
+
+qrCode:
+ url: http://xny.yj-3d.com:7788
+# 无人机大图
+drone:
+ url: http://192.168.110.2:9512
+# 聊天服务
+chat:
+ server:
+ port: 18088
+# rabbitmq 配置
+rabbitmq:
+ exchange-name: local-normal-exchange
+ queue-name: local-normal-queue
+ routing-key: local.normal.routing.key
+ delay-exchange-name: local-delay-queue
+ delay-queue-name: local-delay-exchange
+ delay-routing-key: local.delay.routing.key
+ dead-letter-exchange: local-dlx-exchange
+ dead-letter-queue: local-dlx-queue
+ dead-letter-routing-key: local.dlx.routing.key
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/drone/service/impl/DroProjectDroneServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/drone/service/impl/DroProjectDroneServiceImpl.java
index 37322aab..c8b4cd46 100644
--- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/drone/service/impl/DroProjectDroneServiceImpl.java
+++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/drone/service/impl/DroProjectDroneServiceImpl.java
@@ -17,6 +17,8 @@ import org.dromara.drone.domain.bo.DroProjectDroneBo;
import org.dromara.drone.domain.vo.DroProjectDroneVo;
import org.dromara.drone.mapper.DroProjectDroneMapper;
import org.dromara.drone.service.IDroProjectDroneService;
+import org.dromara.facility.domain.FacRedLine;
+import org.dromara.facility.service.IFacRedLineService;
import org.dromara.manager.dronemanager.DroneManager;
import org.springframework.stereotype.Service;
@@ -37,6 +39,9 @@ public class DroProjectDroneServiceImpl extends ServiceImpl gatewayList = list.stream().map(DroProjectDrone::getDroneSn).toList();
+ // 获取项目红线信息
+ FacRedLine redLine = facRedLineService.lambdaQuery()
+ .eq(FacRedLine::getProjectId, projectId)
+ .last("limit 1")
+ .one();
+ String positionStr = null;
+ if (redLine != null) {
+ positionStr = redLine.getPositions();
+ }
+ // 添加机场信息
+ droneManager.addAirportInfoByProject(gatewayList, positionStr, projectId);
}
return true;
}
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacRedLineServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacRedLineServiceImpl.java
index 8c92ec42..6bb12489 100644
--- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacRedLineServiceImpl.java
+++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/facility/service/impl/FacRedLineServiceImpl.java
@@ -168,6 +168,7 @@ public class FacRedLineServiceImpl extends ServiceImpl gateways, Long projectId) {
- DroneRequestUtils.addAirportInfoByProject(droneProperties.getUrl(), gateways, projectId);
+ public void addAirportInfoByProject(List gateways, String redLineStr, Long projectId) {
+ DroneRequestUtils.addAirportInfoByProject(droneProperties.getUrl(), gateways, redLineStr, projectId);
}
/**
diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/dronemanager/DroneRequestUtils.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/dronemanager/DroneRequestUtils.java
index fe17682b..605b2815 100644
--- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/dronemanager/DroneRequestUtils.java
+++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/dronemanager/DroneRequestUtils.java
@@ -1,6 +1,7 @@
package org.dromara.manager.dronemanager;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONArray;
@@ -25,28 +26,29 @@ public class DroneRequestUtils {
/**
* 添加项目机场信息
*
- * @param gateways 飞机编号
- * @param projectId 项目id
+ * @param gateways 飞机编号
+ * @param redLineStr 红线位置
+ * @param projectId 项目 id
*/
- public static void addAirportInfoByProject(String url, List gateways, Long projectId) {
+ public static void addAirportInfoByProject(String url, List gateways, String redLineStr, Long projectId) {
if (CollUtil.isEmpty(gateways)) {
throw new ServiceException("请选择飞机", HttpStatus.BAD_REQUEST);
}
if (projectId == null) {
throw new ServiceException("请选择项目", HttpStatus.BAD_REQUEST);
}
- // 拼接 query 参数
- StringBuilder queryBuilder = new StringBuilder();
- queryBuilder.append("projectId=").append(projectId);
- for (String gateway : gateways) {
- queryBuilder.append("&gateways=").append(gateway);
- }
-
- // 完整 URL
- String fullUrl = url + DroneConstant.ADD_DRONE_INFO_BY_PROJECT + "?" + queryBuilder;
+ String gatewayStr = String.join(",", gateways);
+ // 构造请求体 JSON
+ JSONObject reqBody = new JSONObject();
+ reqBody.set("projectId", projectId);
+ reqBody.set("gateways", gatewayStr);
+ reqBody.set("range", redLineStr);
+ String fullUrl = url + DroneConstant.ADD_DRONE_INFO_BY_PROJECT;
+ log.info("添加项目机场信息请求 URL:{}", fullUrl);
String errorMsg = "添加项目机场信息请求失败";
try (HttpResponse response = HttpRequest.post(fullUrl)
- .body("{}")
+ .header(Header.CONTENT_TYPE, "application/json")
+ .body(reqBody.toString())
.execute()) {
if (!response.isOk()) {
log.error("{}:{}", errorMsg, response.getStatus());