Compare commits

...

94 Commits

Author SHA1 Message Date
时子升 37bea92a18 工地-搜索内容扩展多类型全部count 1 month ago
杨威 ce1e5cbd75 [feat] 1 month ago
杨威 61988570fe Merge remote-tracking branch 'origin/dev' into dev 1 month ago
杨威 e1a66ecbe0 [feat] 1 month ago
李克 aa3ea1527b 推流接口 1 month ago
吴远 6b060c1d48 自动播放直播流 1 month ago
李克 124d7ac453 推流接口 1 month ago
李克 65ec93eb85 Merge remote-tracking branch 'origin/dev' into dev 1 month ago
李克 74dfbf1bf7 推流接口 1 month ago
时子升 a74ac3ceec 大疆开发-api+错误码对比管理 1 month ago
时子升 a0cf0071ed 工地-ai标签动态获取有效项(启用status) 1 month ago
吴远 04a8c898b3 Merge remote-tracking branch 'origin/dev' into dev 1 month ago
吴远 80d7e72bcb 自动播放直播流 1 month ago
时子升 ba750db3c6 Merge remote-tracking branch 'origin/dev' into dev 1 month ago
时子升 166149bdd7 工地-oss文件独立管理-配合天翼云OSS-要在nacos里system.yml配置osstianyi 1 month ago
袁强 b856267b91 提交 1 month ago
杨威 2b66362bd8 Merge remote-tracking branch 'origin/dev' into dev 1 month ago
杨威 cdbbe257d7 [feat] 1 month ago
吴远 5f12c29eb7 自动播放直播流 1 month ago
吴远 a3742d462f Merge remote-tracking branch 'origin/dev' into dev 1 month ago
吴远 dc642d750a 自动播放直播流 1 month ago
李克 58133f37bb 星罗接口对接和视频流接口 1 month ago
袁强 56d59d7ff7 提交 1 month ago
吴远 70a787720e Merge remote-tracking branch 'origin/dev' into dev 1 month ago
吴远 c69d7a6768 自动播放直播流 1 month ago
李克 f82d9b9f85 Merge remote-tracking branch 'origin/dev' into dev 1 month ago
李克 cc70dd8565 星罗接口对接和视频流接口 1 month ago
吴远 e6c561a6ce 自动播放直播流 1 month ago
吴远 440e437c97 Merge remote-tracking branch 'origin/dev' into dev 1 month ago
吴远 679ff0ed8c 自动播放直播流 1 month ago
袁强 7a4c75655b [bug]修改页面预警列表查询 1 month ago
吴远 a12b6de33d Merge branch 'dev' of http://106.13.50.125:13000/yuanqiang/dk_cloud_drone into dev 1 month ago
吴远 cbd3cf974a 自动播放直播流 1 month ago
李克 aa12725241 星罗接口对接和视频流接口 1 month ago
袁强 e8aad6f968 提交:修改 1 month ago
袁强 788d6c0c06 Merge branch 'dev' of http://106.13.50.125:13000/yuanqiang/dk_cloud_drone into dev 1 month ago
袁强 9337904788 提交:实时与预警 1 month ago
时子升 d9ff5f76ff 赛邮服务配置用户+后台调用短信接口 1 month ago
时子升 1b0767a1e8 Merge remote-tracking branch 'origin/dev' into dev 1 month ago
杨威 b962532431 [feat] 1 month ago
时子升 e2ec21d429 Merge remote-tracking branch 'origin/dev' into dev 1 month ago
袁强 51deca2ed7 提交: AI预警实时推送逻辑修改 1 month ago
袁强 e446b8bca4 提交 1 month ago
杨威 855e915dde [feat] 1 month ago
杨威 2f78be2b4e Merge remote-tracking branch 'origin/dev' into dev 1 month ago
杨威 2651bfdeaa [feat] 1 month ago
袁强 3f7b3eb7ac 提交:feign 1 month ago
杨威 eb3b6364de [feat] 1 month ago
杨威 82903e136a [feat] 1 month ago
杨威 639dd1d056 [feat] 1 month ago
杨威 18a6858dfb [feat] 1 month ago
杨威 7486db2f68 Merge remote-tracking branch 'origin/dev' into dev 1 month ago
杨威 b776c64d65 [feat] 1 month ago
袁强 6d90d193bd 提交:预警热力图 1 month ago
杨威 f5c4041894 [feat] 2 months ago
时子升 08944e5422 Merge remote-tracking branch 'origin/dev' into dev 2 months ago
杨威 8aced047e5 [feat] 2 months ago
时子升 c2f24932bc 天翼云,使用minio访问测试 2 months ago
杨威 06ebc2a4ea [feat] 2 months ago
杨威 37f98c55a5 [feat] 2 months ago
杨威 f29808dfaf [feat] 2 months ago
杨威 993a9d44d7 Merge remote-tracking branch 'origin/dev' into dev 2 months ago
杨威 8a664019af [feat] 2 months ago
袁强 a3e6b0b2fa 提交:排序 2 months ago
杨威 0bab96fa64 [feat] 2 months ago
杨威 98ee5beb61 [feat] 2 months ago
杨威 987006d305 [feat] 2 months ago
杨威 3fca31c79f [feat] 2 months ago
杨威 f2ddd94e5e [feat] 2 months ago
杨威 5ad384d2c0 [feat] 2 months ago
杨威 711c489a87 [feat] 2 months ago
杨威 cfa54467eb [feat] 2 months ago
杨威 3bf3345f7c [feat] 2 months ago
袁强 20c6fc5ca0 提交 2 months ago
杨威 5af411aab1 [feat] 2 months ago
杨威 a54cceef0d [feat] 2 months ago
杨威 5224a43389 [feat] 2 months ago
杨威 c9f0286fd8 [feat] 2 months ago
杨威 010341500b [feat] 2 months ago
杨威 bd1be26370 [feat] 2 months ago
杨威 7dafce3977 [feat] 2 months ago
杨威 9a3ffebe7a [feat] 2 months ago
杨威 0099ad53ad [feat] 2 months ago
杨威 d88ba8b224 [feat] 2 months ago
袁强 6e066e4e90 提交:生成图片预警(多个) 2 months ago
袁强 a5b383a285 提交 2 months ago
杨威 f9eb07ce5e [feat] 2 months ago
袁强 def0122c5f 提交:图片比对问题 2 months ago
袁强 05b13a353c 提交:图片比对 2 months ago
杨威 07dd54ebfb [feat] 2 months ago
杨威 caae858c5a [feat] 2 months ago
杨威 06a836da05 [feat] 2 months ago
杨威 4590e47fd0 Merge remote-tracking branch 'origin/dev' into dev 2 months ago
杨威 e52025e9cf [feat] 2 months ago
  1. 4
      dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java
  2. 10
      dk-api/api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java
  3. 20
      dk-api/api-system/src/main/java/org/dromara/system/api/RemoteSubmailConfigService.java
  4. 74
      dk-api/api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteNoticeBo.java
  5. 6
      dk-api/api-system/src/main/java/org/dromara/system/api/model/LoginUser.java
  6. 2
      dk-auth/src/main/java/org/dromara/auth/DKAuthApplication.java
  7. 24
      dk-auth/src/main/java/org/dromara/auth/feign/FeignDeviceGroup.java
  8. 10
      dk-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java
  9. 7
      dk-common/common-bom/pom.xml
  10. 13
      dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceEnum.java
  11. 39
      dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceTypeVideoEnum.java
  12. 80
      dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceVideoEnum.java
  13. 3
      dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java
  14. 2
      dk-common/common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java
  15. 5
      dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java
  16. 4
      dk-common/common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java
  17. 15
      dk-common/common-excel/pom.xml
  18. 5
      dk-common/common-redis/src/main/java/org/dromara/common/redis/config/RedisConst.java
  19. 45
      dk-common/common-rocketmq/pom.xml
  20. 58
      dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/config/ProducerConfig.java
  21. 25
      dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/model/ProducerMode.java
  22. 189
      dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/producer/MessageProducerUtil.java
  23. 1
      dk-common/common-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  24. 1
      dk-common/pom.xml
  25. 4
      dk-modules/business/pom.xml
  26. 83
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java
  27. 26
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertStatisticsController.java
  28. 1
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java
  29. 13
      dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java
  30. 34
      dk-modules/business/src/main/java/org/dromara/business/domain/BusinessTaskLabel.java
  31. 11
      dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java
  32. 10
      dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessTaskBo.java
  33. 11
      dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java
  34. 35
      dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskLabelVo.java
  35. 5
      dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskVo.java
  36. 5
      dk-modules/business/src/main/java/org/dromara/business/feign/FeignDeviceGroup.java
  37. 21
      dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessAlertMapper.java
  38. 27
      dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessTaskLabelMapper.java
  39. 14
      dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java
  40. 2
      dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertStatisticsService.java
  41. 192
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java
  42. 243
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java
  43. 11
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessTaskServiceImpl.java
  44. 116
      dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml
  45. 11
      dk-modules/business/src/main/resources/mapper/business/BusinessTaskLabelMapper.xml
  46. 7
      dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml
  47. 4
      dk-modules/sample/pom.xml
  48. 68
      dk-modules/sample/src/main/java/org/dromara/sample/common/util/Md5Utils.java
  49. 2
      dk-modules/sample/src/main/java/org/dromara/sample/control/model/param/TakeoffToPointParam.java
  50. 40
      dk-modules/sample/src/main/java/org/dromara/sample/control/service/impl/ControlServiceImpl.java
  51. 15
      dk-modules/sample/src/main/java/org/dromara/sample/feign/BusinessTaskFeign.java
  52. 2
      dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteBusinessTaskFeign.java
  53. 16
      dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteSystemFeign.java
  54. 4
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceController.java
  55. 28
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceFlightRecordsController.java
  56. 82
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceProController.java
  57. 87
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/EngineRecordController.java
  58. 5
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/LiveStreamController.java
  59. 280
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java
  60. 19
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/PlayTextController.java
  61. 7
      dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/DeviceFlightRecordsMapper.java
  62. 15
      dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/IDeviceStreamMapper.java
  63. 16
      dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/IEngineRecordMapper.java
  64. 18
      dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/WarningRecordMapper.java
  65. 30
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/CallBackDTO.java
  66. 12
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/DeviceProDTO.java
  67. 31
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/Engine.java
  68. 31
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/EngineResponse.java
  69. 45
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/EventsDTO.java
  70. 46
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/ExtraType.java
  71. 31
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/ExtraTypeResponse.java
  72. 49
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/ObjectsDTO.java
  73. 37
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/StreamTypeDTO.java
  74. 45
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceFlightRecordsEntity.java
  75. 2
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceProEntity.java
  76. 43
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceStreamEntity.java
  77. 48
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/EngineRecordEntity.java
  78. 55
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/WarningRecordEntity.java
  79. 15
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceFlightRecordsService.java
  80. 13
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceProService.java
  81. 9
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceRedisService.java
  82. 4
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceService.java
  83. 17
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceStreamService.java
  84. 32
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IEngineRecordService.java
  85. 3
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IPlayTextService.java
  86. 15
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IWarningRecordService.java
  87. 58
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceFlightRecordsServiceImpl.java
  88. 171
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceProServiceImpl.java
  89. 4
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceQrtzServiceImpl.java
  90. 23
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceRedisServiceImpl.java
  91. 23
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceServiceImpl.java
  92. 44
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceStreamServiceImpl.java
  93. 246
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/EngineRecordServiceImpl.java
  94. 93
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java
  95. 69
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/PlayTextServiceImpl.java
  96. 48
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java
  97. 20
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/WarningRecordServiceImpl.java
  98. 13
      dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java
  99. 79
      dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java
  100. 11
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/AiCompareController.java

4
dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java

@ -1,5 +1,7 @@
package org.dromara.system.api;
import java.util.List;
/**
* 配置服务
*
@ -21,4 +23,6 @@ public interface RemoteConfigService {
*/
String selectStreamIp();
// List<String> selectStreamType(String deviceSn);
}

10
dk-api/api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java

@ -0,0 +1,10 @@
package org.dromara.system.api;
import org.dromara.system.api.domain.bo.RemoteNoticeBo;
import org.dromara.system.api.domain.vo.RemotePostVo;
import java.util.List;
public interface RemoteNoticeService {
int saveNotice(RemoteNoticeBo bo);
}

20
dk-api/api-system/src/main/java/org/dromara/system/api/RemoteSubmailConfigService.java

@ -0,0 +1,20 @@
package org.dromara.system.api;
import org.dromara.common.core.domain.R;
import org.dromara.system.api.domain.vo.RemoteClientVo;
/**
* 客户端服务
*
* @author Michelle.Chung
*/
public interface RemoteSubmailConfigService {
/**
* 根据客户端id获取客户端详情
*
* @return 客户端对象
*/
R<String> remoteCmdSend(String code, String multiParam );
}

74
dk-api/api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteNoticeBo.java

@ -0,0 +1,74 @@
package org.dromara.system.api.domain.bo;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 操作日志记录表 oper_log
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
public class RemoteNoticeBo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long noticeId;
/**
* 公告标题
*/
private String noticeTitle;
/**
* 公告类型1通知 2公告
*/
private String noticeType;
/**
* 公告内容
*/
private String noticeContent;
/**
* 公告状态0正常 1关闭
*/
private String status;
/**
* 备注
*/
private String remark;
private Integer isRead;
/**
* 创建部门
*/
private Long createDept;
/**
* 创建者
*/
private Long createBy;
private String deviceSn;
/**
* 创建时间
*/
private Date createTime;
private String param;
}

6
dk-api/api-system/src/main/java/org/dromara/system/api/model/LoginUser.java

@ -135,6 +135,12 @@ public class LoginUser implements Serializable {
*/
private List<PostDTO> posts;
/**
* 设备sn权限集合
*/
private List<String> deviceList;
/**
* 获取登录id
*/

2
dk-auth/src/main/java/org/dromara/auth/DKAuthApplication.java

@ -5,6 +5,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* 认证授权中心
@ -12,6 +13,7 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
* @author ruoyi
*/
@EnableDubbo
@EnableFeignClients
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class DKAuthApplication {
public static void main(String[] args) {

24
dk-auth/src/main/java/org/dromara/auth/feign/FeignDeviceGroup.java

@ -0,0 +1,24 @@
package org.dromara.auth.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
@FeignClient(name = "gateway",path = "sample")
public interface FeignDeviceGroup {
@GetMapping("/manage/api/v1/device/group/feign/user")
public List<Integer> listDeviceGroup(@RequestParam("userId") Long userId);
@GetMapping("/manage/api/v1/device/group/feign/device")
public List<String> listDevice(@RequestParam("userId") Long userId);
@GetMapping("/device/flight/count")
public Map<String,Integer> getDevices();
}

10
dk-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java

@ -3,10 +3,12 @@ package org.dromara.auth.service.impl;
import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.ListUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.auth.domain.vo.LoginVo;
import org.dromara.auth.feign.FeignDeviceGroup;
import org.dromara.auth.form.PasswordLoginBody;
import org.dromara.auth.properties.CaptchaProperties;
import org.dromara.auth.service.IAuthStrategy;
@ -26,8 +28,12 @@ import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.api.RemoteUserService;
import org.dromara.system.api.domain.vo.RemoteClientVo;
import org.dromara.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* 密码认证策略
*
@ -45,6 +51,9 @@ public class PasswordAuthStrategy implements IAuthStrategy {
@DubboReference
private RemoteUserService remoteUserService;
@Autowired
FeignDeviceGroup feignDeviceGroup;
@Override
public LoginVo login(String body, RemoteClientVo client) {
PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class);
@ -73,6 +82,7 @@ public class PasswordAuthStrategy implements IAuthStrategy {
model.setTimeout(client.getTimeout());
model.setActiveTimeout(client.getActiveTimeout());
model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
// 生成token
LoginHelper.login(loginUser, model);

7
dk-common/common-bom/pom.xml

@ -257,6 +257,13 @@
<version>${revision}</version>
</dependency>
<!--rocketmq-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>common-rocketmq</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>

13
dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceEnum.java

@ -142,4 +142,17 @@ public enum DeviceEnum {
return Arrays.stream(values()).filter(device -> device.getDevice().equals(finalKey))
.findAny().orElseThrow(() -> new CloudSDKException(DeviceEnum.class, finalKey1));
}
/* @JsonCreator
public static DeviceEnum findKey(String key) {
if(StringUtils.isEmpty(key)){
key = DeviceEnum.M3TD.getDevice();
}
String finalKey = key;
String finalKey1 = key;
return Arrays.stream(values()).filter(device -> device.toString().equals(finalKey))
.findAny().orElseThrow(() -> new CloudSDKException(DeviceEnum.class, finalKey1));
}*/
}

39
dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceTypeVideoEnum.java

@ -0,0 +1,39 @@
package org.dromara.common.sdk.cloudapi.device;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import io.swagger.v3.oas.annotations.media.Schema;
import org.dromara.common.sdk.exception.CloudSDKException;
import java.util.Arrays;
/**
* @author sean
* @version 1.7
* @date 2023/5/26
*/
@Schema(description = "DeviceTypeVideoEnum", enumAsRef = true)
public enum DeviceTypeVideoEnum {
ZERO(0),
SEVEN(7);
;
private final int videoType;
DeviceTypeVideoEnum(int videoType) {
this.videoType = videoType;
}
@JsonValue
public int getVideoType() {
return videoType;
}
@JsonCreator
public static DeviceTypeVideoEnum find(int videoType) {
return Arrays.stream(values()).filter(typeEnum -> typeEnum.videoType == videoType).findAny()
.orElseThrow(() -> new CloudSDKException(DeviceTypeVideoEnum.class, videoType));
}
}

80
dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceVideoEnum.java

@ -0,0 +1,80 @@
package org.dromara.common.sdk.cloudapi.device;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import io.swagger.v3.oas.annotations.media.Schema;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.sdk.exception.CloudSDKException;
import java.util.Arrays;
/**
* @author sean
* @version 1.7
* @date 2023/5/19
*/
@Schema(description = "device model key.", format = "domain-type-subType", enumAsRef = true, example = "0-89-0")
public enum DeviceVideoEnum {
DOCK(DeviceTypeEnum.DOCK_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.SEVEN),
DJIDock2(DeviceTypeEnum.DOCK_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.SEVEN),
DOCK3(DeviceTypeEnum.DOCK_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.SEVEN),
Matrice30(DeviceTypeEnum.M30_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO),
Matrice30T(DeviceTypeEnum.M30T_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO),
M3D(DeviceTypeEnum.M3D_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO),
M3TD(DeviceTypeEnum.M3TD_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO),
M4D(DeviceTypeEnum.M4D_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO),
M4TD(DeviceTypeEnum.M4TD_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO),
;
@Schema(enumAsRef = true)
private final DeviceTypeEnum type;
@Schema(enumAsRef = true)
private final DeviceSubTypeEnum subType;
@Schema(enumAsRef = true)
private final DeviceTypeVideoEnum videoType;
DeviceVideoEnum(DeviceTypeEnum type, DeviceSubTypeEnum subType, DeviceTypeVideoEnum videoType) {
this.type = type;
this.subType = subType;
this.videoType = videoType;
}
public DeviceTypeEnum getType() {
return type;
}
public DeviceSubTypeEnum getSubType() {
return subType;
}
public DeviceTypeVideoEnum getVideoType() {
return videoType;
}
@JsonValue
public String getDevice() {
return String.format("%s-%s-%s", type.getType(), subType.getSubType(),videoType.getVideoType());
}
@JsonCreator
public static DeviceVideoEnum find(String key) {
String finalKey = key.replaceAll(" ","");
return Arrays.stream(values()).filter(device -> device.toString().equals(finalKey))
.findAny().orElseThrow(() -> new CloudSDKException(DeviceEnum.class, finalKey));
}
}

3
dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java

@ -60,4 +60,7 @@ public interface DictService {
* @return dictValue为keydictLabel为值组成的Map
*/
Map<String, String> getAllDictByDictType(String dictType);
//获取字典下所有的字典值与标签 (key: 字典标签, value:字典键值)
Map<String, String> getAllDictMapByDictType(String dictType);
}

2
dk-common/common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java

@ -24,6 +24,8 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
public static final String SLASH = "/";
public static final String DASH = "-";
/**
* 获取参数不为空值
*

5
dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java

@ -86,4 +86,9 @@ public class DictServiceImpl implements DictService {
return StreamUtils.toMap(list, RemoteDictDataVo::getDictValue, RemoteDictDataVo::getDictLabel);
}
@Override
public Map<String, String> getAllDictMapByDictType(String dictType) {
List<RemoteDictDataVo> list = remoteDictService.selectDictDataByType(dictType);
return StreamUtils.toMap(list, RemoteDictDataVo::getDictLabel, RemoteDictDataVo::getDictValue);
}
}

4
dk-common/common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java

@ -175,6 +175,10 @@ public class EncryptUtils {
return keyMap;
}
public static void main(String[] args) {
Map<String, String> map = generateRsaKey();
System.out.println(map);
}
/**
* sm2公钥加密
*

15
dk-common/common-excel/pom.xml

@ -25,6 +25,21 @@
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
<!-- easyexcel版本4.0.3时前台导出报错,配合以下包测试依旧异常-->
<!-- <dependency>-->
<!-- <groupId>commons-io</groupId>-->
<!-- <artifactId>commons-io</artifactId>-->
<!-- <version>2.12.0</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.commons</groupId>-->
<!-- <artifactId>commons-compress</artifactId>-->
<!-- <version>1.21</version>-->
<!-- </dependency>-->
</dependencies>
</project>

5
dk-common/common-redis/src/main/java/org/dromara/common/redis/config/RedisConst.java

@ -19,6 +19,8 @@ public final class RedisConst {
public static final Integer WEBSOCKET_ALIVE_SECOND = 60 * 60 * 24;
public static final Integer DEVICE_VIDEO_STATUE_SECOND = 60 * 50;
public static final String DEVICE_ONLINE_PREFIX = "online" + DELIMITER;
public static final String WEBSOCKET_PREFIX = "webSocket" + DELIMITER;
@ -62,4 +64,7 @@ public final class RedisConst {
public static final String FILE_UPLOADING_PREFIX = "file_uploading" + DELIMITER;
public static final String DRONE_CONTROL_PREFiX = "control_source" + DELIMITER;
public static final String VIDEO_STATUS = "video_status" + DELIMITER;
}

45
dk-common/common-rocketmq/pom.xml

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>dk-common</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>common-rocketmq</artifactId>
<description>
common-rocketmq 配置中心
</description>
<dependencies>
<!--rocketmq消息队列-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version> 4.9.0</version>
</dependency>
<!--RocketMQ-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>common-core</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>common-nacos</artifactId>
</dependency>
</dependencies>
</project>

58
dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/config/ProducerConfig.java

@ -0,0 +1,58 @@
package org.dromara.common.rocketmq.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.dromara.common.rocketmq.model.ProducerMode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
/**
* mq搭建地址连接
* 生产者初者连接信息 具体看nacos配置
*/
@AutoConfiguration
@Slf4j
@EnableConfigurationProperties(ProducerMode.class)
public class ProducerConfig {
/**
* 远程调用连接信息
*/
public static DefaultMQProducer producer;
/**
* 连接客户端信息配置 具体看nacos配置
*/
@Autowired
private ProducerMode producerMode;
@Bean
public DefaultMQProducer getRocketMQProducer() {
producer = new DefaultMQProducer(producerMode.getGroupName());
producer.setNamesrvAddr(producerMode.getNameServer());
//如果需要同一个jvm中不同的producer往不同的mq集群发送消息,需要设置不同的instanceName
if(producerMode.getMaxMessageSize()!=null){
producer.setMaxMessageSize(producerMode.getMaxMessageSize());
}
if(producerMode.getSendMsgTimeout()!=null){
producer.setSendMsgTimeout(producerMode.getSendMsgTimeout());
}
//如果发送消息失败,设置重试次数,默认为2次
if(producerMode.getRetryTimesWhenSendFailed()!=null){
producer.setRetryTimesWhenSendFailed(producerMode.getRetryTimesWhenSendFailed());
}
producer.setVipChannelEnabled(false);
try {
producer.start();
log.info("生产者初始化成功:{}",producer.toString());
} catch (MQClientException e) {
log.error("生产者初始化失败:{}",e.getMessage());
}
return producer;
}
}

25
dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/model/ProducerMode.java

@ -0,0 +1,25 @@
package org.dromara.common.rocketmq.model;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
/**
* 生产者初始化
*/
@Data
@ConfigurationProperties(prefix = "rocketmq.producer")
public class ProducerMode {
private String groupName;
private String nameServer;
private Integer maxMessageSize;
private Integer sendMsgTimeout;
private Integer retryTimesWhenSendFailed;
}

189
dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/producer/MessageProducerUtil.java

@ -0,0 +1,189 @@
package org.dromara.common.rocketmq.producer;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.exception.RemotingException;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import static org.dromara.common.rocketmq.config.ProducerConfig.producer;
/**
* 消息发送
*/
@Slf4j
public class MessageProducerUtil {
/**
* 同步发送消息
* @param topic 主题
* @param tag 标签
* @param key 自定义的key根据业务来定
* @param value 消息的内容
* 通过调用 send() 方法发送消息阻塞等待服务器响应
*/
public static SendResult sendSynchronizeMessage(String topic, String tag, String key, String value){
String body = "topic:【"+topic+"】, tag:【"+tag+"】, key:【"+key+"】, value:【"+value+"】";
try {
Message msg = new Message(topic,tag,key, value.getBytes(RemotingHelper.DEFAULT_CHARSET));
System.out.println("生产者发送消息:"+ JSON.toJSONString(value));
SendResult result = producer.send(msg);
return result;
} catch (Exception e) {
e.printStackTrace();
log.error("消息初始化失败!body:{}",body);
}
return null;
}
/**
* 单向发送消息
* @param topic 主题
* @param tag 标签
* @param key 自定义的key根据业务来定
* @param value 消息的内容
* 单向发送通过调用 sendOneway() 方法发送消息不关心发送结果适用于对可靠性要求不高的场景
*/
public static void sendOnewayMessage(String topic, String tag, String key, String value){
String body = "topic:【"+topic+"】, tag:【"+tag+"】, key:【"+key+"】, value:【"+value+"】";
try {
Message msg = new Message(topic,tag,key, value.getBytes(RemotingHelper.DEFAULT_CHARSET));
System.out.println("生产者发送消息:"+ JSON.toJSONString(value));
producer.sendOneway(msg);
} catch (UnsupportedEncodingException e) {
log.error("消息初始化失败!body:{}",body);
} catch (MQClientException | InterruptedException | RemotingException e) {
log.error("消息发送失败! body:{}",body);
}
}
/**
* 批量发送消息
* @param messages 消息列表
* 批量发送通过调用 send() 方法并传入多条消息实现批量发送消息
*/
// public static SendResult sendBatchMessage(List<Message> messages){
// String body = messages.toString();
// try {
// System.out.println("生产者发送消息:"+ messages);
// // 发送批量消息
// SendResult sendResult = producer.send(messages);
// return sendResult;
// } catch (MQClientException | InterruptedException | RemotingException e) {
// log.error("消息发送失败! body:{}",body);
// } catch (MQBrokerException e) {
// throw new RuntimeException(e);
// }
// return null;
// }
/**
* 发送有序的消息
* @param messagesList Message集合
* @param messageQueueNumber 消息队列数量根据实际情况设定
* 顺序发送 messageQueueNumber 表示消息的业务标识可以根据具体需求进行设置来保证消息按顺序发送
*/
// public static SendResult sendOrderlyMessage(List<Message> messagesList, Integer messageQueueNumber) {
// SendResult result = null;
// for (Message message : messagesList) {
// try {
// result = producer.send(message, (list, msg, arg) -> {
// Integer queueNumber = (Integer) arg;
// //int queueIndex = queueNumber % list.size();
// return list.get(queueNumber);
// }, messageQueueNumber);//根据编号取模,选择消息队列
// } catch (MQClientException | RemotingException | MQBrokerException | InterruptedException e) {
// log.error("发送有序消息失败");
// return result;
// }
// }
// return result;
// }
/**
* 发送延迟消息
* @param topic 主题
* @param tag 标签
* @param key 自定义的key根据业务来定
* @param value 消息的内容
* 延迟发送通过设置延迟级别来实现延迟发送消息
*/
public static SendResult sendDelayMessage(String topic, String tag, String key, String value)
{
SendResult result = null;
try
{
Message msg = new Message(topic,tag,key, value.getBytes(RemotingHelper.DEFAULT_CHARSET));
//设置消息延迟级别,我这里设置5,对应就是延时一分钟
// "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h"
msg.setDelayTimeLevel(4);
// 发送消息到一个Broker
result = producer.send(msg);
// 通过sendResult返回消息是否成功送达
log.info("发送延迟消息结果:======sendResult:{}", result);
DateFormat format =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
log.info("发送时间:{}", format.format(new Date()));
return result;
}
catch (Exception e)
{
e.printStackTrace();
log.error("延迟消息队列推送消息异常:{},推送内容:{}", e.getMessage(), result);
}
return result;
}
/**
* 发送异步的消息
* @param topic 主题
* @param tag 标签
* @param key 自定义的key根据业务来定
* @param value 消息的内容
* 通过调用 send() 方法并传入一个 SendCallback 对象在发送消息的同时可以继续处理其他逻辑消息发送结果通过回调函数通知
*/
public static SendResult sendAsyncProducerMessage(String topic, String tag, String key, String value){
try {
//创建一个消息实例,指定主题、标签和消息体。
Message msg = new Message(topic,tag,key, value.getBytes(RemotingHelper.DEFAULT_CHARSET));
System.out.println("生产者发送消息:"+ JSON.toJSONString(value));
producer.send(msg,new SendCallback() {
// 异步回调的处理
@Override
public void onSuccess(SendResult sendResult) {
System.out.printf("%-10d 异步发送消息成功 %s %n", msg, sendResult.getMsgId());
}
@Override
public void onException(Throwable e) {
System.out.printf("%-10d 异步发送消息失败 %s %n", msg, e);
e.printStackTrace();
}
});
} catch (MQClientException e) {
e.printStackTrace();
} catch (RemotingException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return null;
}
}

1
dk-common/common-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@ -0,0 +1 @@
org.dromara.common.rocketmq.config.ProducerConfig

1
dk-common/pom.xml

@ -46,6 +46,7 @@
<module>common-bus</module>
<module>common-sse</module>
<module>common-cloudsdk</module>
<module>common-rocketmq</module>
</modules>
<artifactId>dk-common</artifactId>

4
dk-modules/business/pom.xml

@ -116,6 +116,10 @@
<groupId>org.dromara</groupId>
<artifactId>api-workflow</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>common-rocketmq</artifactId>
</dependency>
</dependencies>
<build>

83
dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java

@ -1,5 +1,8 @@
package org.dromara.business.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.client.utils.TenantUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
@ -8,15 +11,25 @@ import org.dromara.business.domain.BusinessAlert;
import org.dromara.business.domain.bo.BusinessAlertBo;
import org.dromara.business.domain.vo.BusinessAlertVo;
import org.dromara.business.service.IBusinessAlertService;
import org.dromara.business.utils.MinioUntil;
import org.dromara.business.utils.constants.MinIOConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.core.BaseController;
import org.dromara.system.api.RemoteNoticeService;
import org.dromara.system.api.RemoteSubmailConfigService;
import org.dromara.system.api.domain.bo.RemoteNoticeBo;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
/**
@ -36,7 +49,23 @@ public class BusinessAlertController extends BaseController {
private final IBusinessAlertService businessAlertService;
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
@DubboReference(timeout = 30000)
private RemoteNoticeService remoteNoticeService;
@DubboReference(timeout = 30000)
private RemoteSubmailConfigService remoteSubmailConfigService;
/**
* 测试发送调用submail短信服务
*
* @param code 必须传参smsMultixsend
* @param multiParam 前台传参 JSON.stringfy( {"jobName":"翟山街道华盛","labelCn":"普通垃圾","labelEn":"garbage","deptName":"翟山街道","lat":"34.20994348014929","lng":"117.2054671683176"})
* 后台接收json效果 {"jobName":"翟山街道华盛景园违建巡査面状航线(1)2025-05-11 09:32:30","labelCn":"普通垃圾","labelEn":"garbage","deptName":"翟山街道","lat":"34.20994348014929","lng":"117.2054671683176"}
*/
@GetMapping("/demo")
public void demo(@RequestParam("code") String code, @RequestParam("multiParam") String multiParam) {
remoteSubmailConfigService.remoteCmdSend(code, multiParam);
}
/**
* 查询全部预警/待办/已完成/忽略
*/
@ -52,18 +81,55 @@ public class BusinessAlertController extends BaseController {
return R.ok(businessAlertService.getTodoBusinessAlert(alertId));
}
@Operation(summary ="根据经纬度获取历史预警",description = "根据经纬度获取历史预警")
@GetMapping("/alert/listHandleHistory")
public R<List<BusinessAlert>> listHandleHistory(
@RequestParam(value = "lng",required = false) String lng,
@RequestParam(value ="lat",required = false) String lat,
@RequestParam("createTime") String createTime) {
return R.ok(businessAlertService.listHandleHistory(lng,lat,createTime));
}
@SaCheckPermission("business:alert:delete")
@Log(title = "删除预警", businessType = BusinessType.DELETE)
@Operation(summary ="删除预警",description = "删除预警")
@GetMapping("/alert/{alertId}/delete")
public R<Boolean> deleteFalseAlert(@PathVariable("alertId") Long alertId) {
return R.ok(businessAlertService.deleteFalseAlert(alertId));
}
/**
* 查询全部预警/待办/已完成/忽略
* ai实时流预警保存
*/
@Operation(summary ="ai实时流预警保存",description = "ai实时流预警保存")
@Operation(summary ="ai实时流预警保存-用于演示",description = "ai实时流预警保存-用于演示")
@PostMapping("/saveAlert")
public void saveAlert(BusinessAlertVo vo) {
public R saveAlert(@RequestBody BusinessAlertVo vo) {
vo.setBusinessType(2);
BusinessAlert businessAlert = businessAlertService.addBusinessAlert(vo);
RemoteStartProcess startProcess = new RemoteStartProcess();
startProcess.setBusinessId(String.valueOf(businessAlert.getId()));
startProcess.setFlowCode("alertChz");
remoteWorkflowService.startWorkFlowBatch(List.of(startProcess));
RemoteNoticeBo remoteNoticeBo = new RemoteNoticeBo();
remoteNoticeBo.setNoticeTitle(vo.getDeptName()+"产生预警,预警类型["+vo.getLabelCn()+"],请立即查看");
remoteNoticeBo.setNoticeType("3");
remoteNoticeBo.setNoticeContent(vo.getDeptName()+"产生预警,预警类型["+vo.getLabelCn()+"],请立即查看");
remoteNoticeBo.setStatus("0");
remoteNoticeBo.setIsRead(0);
remoteNoticeBo.setCreateBy(1L);
remoteNoticeBo.setCreateDept(1L);
remoteNoticeBo.setCreateTime(businessAlert.getCreateTime());
if (businessAlert.getBusinessType() == 2){
businessAlert.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, vo.getImages(), 3600).toString());
}
remoteNoticeBo.setDeviceSn(vo.getDeviceSn());
businessAlert.setDeviceSn(vo.getDeviceSn());
remoteNoticeBo.setParam(JSON.toJSONString(businessAlert));
remoteNoticeService.saveNotice(remoteNoticeBo);
remoteSubmailConfigService.remoteCmdSend("smsMultixsend", JSON.toJSONString(vo));
return R.ok();
}
@ -77,4 +143,15 @@ public class BusinessAlertController extends BaseController {
businessAlertService.addBusinessAlertList(alertVoList);
return R.ok();
}
/**
* 移交预警
*/
@Operation(summary ="移交预警",description = "移交预警")
@PostMapping("/alert/transfer")
public R<Boolean> transferAlert(BusinessAlertVo vo) {
return R.ok(businessAlertService.transferAlert(vo));
}
}

26
dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertStatisticsController.java

@ -84,6 +84,11 @@ public class BusinessAlertStatisticsController extends BaseController {
return R.ok(statisticsService.countPostAlert(businessAlertBo));
}
@Operation(summary="各大类全部预警数", description="各大类全部预警数")
@GetMapping(value = "/post/count/all")
public R<List<StatObj>> countPostAll(BusinessAlertBo businessAlertBo) {
return R.ok(statisticsService.countPostAllAlert(businessAlertBo));
}
/**
* 出警效率
@ -142,6 +147,27 @@ public class BusinessAlertStatisticsController extends BaseController {
return R.ok(businessAlertService.cityListAlert(businessAlertBo));
}
/**
* 预警信息-资规/农水-热力图
* @param businessAlertBo
* @return
*/
@Operation(summary="预警信息-资规/农水-标签分组", description="预警信息-资规/农水-标签分组")
@GetMapping(value = "/alert/heatList")
public R<Map<String,Object>> heatList(BusinessAlertBo businessAlertBo) {
return R.ok(businessAlertService.heatList(businessAlertBo));
}
/**
* 预警信息-城管/环保-热力图
* @param businessAlertBo
* @return
*/
@Operation(summary="预警信息-城管/环保/住建-标签分组", description="预警信息-城管/环保/住建-标签分组")
@GetMapping(value = "/city/alert/heatList")
public R<Map<String, Object>> cityHeatList(BusinessAlertBo businessAlertBo) {
return R.ok(businessAlertService.cityHeatList(businessAlertBo));
}
//饼图显示每个月根据部门
@Operation(summary="根据月份显示预警个数", description="根据月份显示预警个数")

1
dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java

@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.business.domain.bo.BusinessTaskBo;
import org.dromara.business.domain.vo.BusinessTaskVo;
import org.dromara.business.service.IBusinessTaskService;
import org.dromara.common.encrypt.annotation.ApiEncrypt;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;

13
dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java

@ -59,12 +59,12 @@ public class BusinessAlert {
/**
* 纬度
*/
private Float lat;
private String lat;
/**
* 精度
*/
private Float lng;
private String lng;
/**
* 标签名-
@ -193,6 +193,12 @@ public class BusinessAlert {
*/
private Integer handleSource;
/**
* 案件号
*/
private String caseNumber;
/**
* 指派人员名称
*/
@ -243,4 +249,7 @@ public class BusinessAlert {
*/
@TableField(exist = false)
private String buttonPermission;
@TableField(exist = false)
private String deviceSn;
}

34
dk-modules/business/src/main/java/org/dromara/business/domain/BusinessTaskLabel.java

@ -0,0 +1,34 @@
package org.dromara.business.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* @auther yq
* @data 2025/2/26
*/
@Data
@TableName("business_task_label")
public class BusinessTaskLabel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private Long taskId;
private String labelCn;
private String labelEn;
}

11
dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java

@ -41,6 +41,9 @@ public class BusinessAlertBo {
*/
private String images;
private String startTime;
private String endTime;
/**
* 预警类型
@ -235,11 +238,13 @@ public class BusinessAlertBo {
*/
private Integer dateType;
private String startTime;
private String endTime;
private String aiName;
private Integer businessType;
/**
* 案件号
*/
private String caseNumber;
}

10
dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessTaskBo.java

@ -1,10 +1,9 @@
package org.dromara.business.domain.bo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import org.dromara.business.domain.BusinessTask;
import org.dromara.business.domain.BusinessTaskLabel;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
@ -13,8 +12,9 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.awt.*;
import java.util.Date;
import java.util.List;
/**
* 工单预约业务对象 business_task
@ -87,4 +87,6 @@ public class BusinessTaskBo extends BaseEntity {
private Date flightTime;
//飞行说明
private String flightExplain;
private List<BusinessTaskLabel> taskLabelList;
}

11
dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java

@ -63,12 +63,12 @@ public class BusinessAlertVo implements Serializable {
/**
* 纬度
*/
private Float lat;
private String lat;
/**
* 精度
*/
private Float lng;
private String lng;
/**
* 标签名-
@ -190,6 +190,7 @@ public class BusinessAlertVo implements Serializable {
* 忽略原因
*/
private String ignoringCause;
private Integer value;
/**
* 来源0平台 1小程序
@ -204,4 +205,10 @@ public class BusinessAlertVo implements Serializable {
private Date createTime;
//1:图片比对预警 2:AI实时预警
private Integer businessType;
private String deviceSn;
/**
* 案件号
*/
private String caseNumber;
}

35
dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskLabelVo.java

@ -0,0 +1,35 @@
package org.dromara.business.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.business.domain.BusinessTask;
import org.dromara.business.domain.BusinessTaskLabel;
import java.io.Serial;
import java.io.Serializable;
/**
* @auther yq
* @data 2025/2/26
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BusinessTaskLabel.class)
public class BusinessTaskLabelVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long id;
private Long taskId;
private String labelCn;
private String labelEn;
}

5
dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskVo.java

@ -5,13 +5,14 @@ import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.business.domain.BusinessTask;
import org.dromara.business.domain.BusinessTaskLabel;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
@ -91,6 +92,6 @@ public class BusinessTaskVo implements Serializable {
private String flightExplain;
private List<BusinessTaskLabel> taskLabelList;
}

5
dk-modules/business/src/main/java/org/dromara/business/feign/FeignDeviceGroup.java

@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
@FeignClient(name = "gateway",path = "sample")
public interface FeignDeviceGroup {
@ -17,4 +18,8 @@ public interface FeignDeviceGroup {
@GetMapping("/manage/api/v1/device/group/feign/device")
public List<String> listDevice(@RequestParam("userId") Long userId);
@GetMapping("/device/flight/count")
public Map<String,Integer> getDevices();
}

21
dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessAlertMapper.java

@ -29,7 +29,7 @@ public interface BusinessAlertMapper extends BaseMapperPlus<BusinessAlert, Busin
@DataPermission(
@DataColumn(key = "deptName", value = "t.dept_id")
)
Page<BusinessAlert> pageAlertFinish(@Param("page") Page<BusinessAlert> page,@Param("ew") QueryWrapper<BusinessAlert> ew);
Page<BusinessAlert> pageBusinessAlertHandle(@Param("page") Page<BusinessAlert> page,@Param("ew") QueryWrapper<BusinessAlert> ew);
/**
* 处理中
@ -47,6 +47,13 @@ public interface BusinessAlertMapper extends BaseMapperPlus<BusinessAlert, Busin
)
Page<BusinessAlert> pageBusinessAlertCancel(@Param("page") Page<BusinessAlert> page,@Param("ew") QueryWrapper<BusinessAlert> ew);
@DataPermission(
@DataColumn(key = "deptName", value = "t.dept_id")
)
Page<BusinessAlert> pageBusinessAlertFinish(@Param("page") Page<BusinessAlert> page, @Param("ew") QueryWrapper<BusinessAlert> wrapper);
@DataPermission(
@DataColumn(key = "deptName", value = "t.dept_id")
)
@ -82,6 +89,7 @@ public interface BusinessAlertMapper extends BaseMapperPlus<BusinessAlert, Busin
List<Map<String, Object>> handlerRate(@Param("param") BusinessAlertBo businessAlertBo,@Param("months") List<String> months);
Map<String, Object> countPastYearAlert(@Param("param") BusinessAlertBo businessAlertBo,@Param("startTime") String startTime,@Param("endTime") String endTime);
Map<String, Object> countTotalAlert(@Param("param") BusinessAlertBo businessAlertBo);
List<Map<String, Object>> countAiLabel(@Param("param") BusinessAlertBo businessAlertBo,@Param("startTime") String startTime,@Param("endTime") String endTime);
@ -89,6 +97,7 @@ public interface BusinessAlertMapper extends BaseMapperPlus<BusinessAlert, Busin
List<BusinessAlert> listAlert(@Param("param") BusinessAlertBo businessAlertBo,@Param("startTime") String startTime,@Param("endTime") String endTime);
List<BusinessAlertVo> heatList(@Param("param") BusinessAlertBo businessAlertBo,@Param("startTime") String startTime,@Param("endTime") String endTime);
List<Map<String,Object>> countStreetRateAlert(@Param("param") BusinessAlertBo businessAlertBo,@Param("startTime") String startTime,@Param("endTime") String endTime,@Param("deptIdList") List<Long> deptIdList);
Map<String, Object> streetRateTopAlert(@Param("param") BusinessAlertBo businessAlertBo,@Param("startTime") String startTime,@Param("endTime") String endTime,@Param("deptIdList") List<Long> deptIdList);
@ -101,4 +110,14 @@ public interface BusinessAlertMapper extends BaseMapperPlus<BusinessAlert, Busin
Map<String, Object> listAppAlertCount(@Param("param") BusinessAlertBo businessAlertBo);
List<BusinessAlert> listHandleHistory(@Param("lng") String lng, @Param("lat") String lat,@Param("createTime") String createTime);
List<Map<String, Object>> listOneDepartAlert(@Param("param") BusinessAlertBo businessAlertBo);
List<Map<String, Object>> listOneDepartAlertStatus(@Param("param") BusinessAlertBo businessAlertBo);
Integer selectCurrentAlertCount(@Param("currentDate") String currentDate);
void batchUpdateCaseNumber(@Param("list") List<BusinessAlertVo> alertVoList);
}

27
dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessTaskLabelMapper.java

@ -0,0 +1,27 @@
package org.dromara.business.mapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.business.domain.BusinessTask;
import org.dromara.business.domain.BusinessTaskLabel;
import org.dromara.business.domain.bo.BusinessTaskBo;
import org.dromara.business.domain.vo.BusinessTaskLabelVo;
import org.dromara.business.domain.vo.BusinessTaskVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.List;
/**
* 工单预约Mapper接口
*
* @author LionLi
* @date 2025-02-26
*/
public interface BusinessTaskLabelMapper extends BaseMapperPlus<BusinessTaskLabel, BusinessTaskLabelVo> {
List<BusinessTaskLabelVo> selectTaskLabelList(@Param("taskId") Long taskId);
}

14
dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java

@ -22,11 +22,13 @@ public interface IBusinessAlertService {
TableDataInfo<BusinessAlert> pageBusinessAlertTodo(BusinessAlertBo bo, PageQuery pageQuery);
TableDataInfo<BusinessAlert> pageBusinessAlertFinish(BusinessAlertBo bo, PageQuery pageQuery);
TableDataInfo<BusinessAlert> pageBusinessAlertHandle(BusinessAlertBo bo, PageQuery pageQuery);
TableDataInfo<BusinessAlert> pageBusinessAlertAll(BusinessAlertBo bo, PageQuery pageQuery);
TableDataInfo<BusinessAlert> pageBusinessAlertCancel(BusinessAlertBo bo, PageQuery pageQuery);
TableDataInfo<BusinessAlert> pageBusinessAlertFinish(BusinessAlertBo bo, PageQuery pageQuery);
/**
* 新增预警任务
*
@ -72,9 +74,11 @@ public interface IBusinessAlertService {
TableDataInfo<BusinessAlert> getInfo(BusinessAlertBo bo, PageQuery pageQuery, String alertCode);
Map<String,Object> listAlert(BusinessAlertBo businessAlertBo);
Map<String,Object> heatList(BusinessAlertBo businessAlertBo);
Map<String, Object> cityListAlert(BusinessAlertBo businessAlertBo);
Map<String, Object> cityHeatList(BusinessAlertBo businessAlertBo);
List<BusinessAlertVo> listVerifyAlert(RemoteBusinessAlertBo businessAlertBo);
Boolean deleteAlert(List<Long> alertIdList);
@ -84,4 +88,10 @@ public interface IBusinessAlertService {
List<BusinessAlert> listTodoAlert(BusinessAlertBo businessAlertBo);
BusinessAlert getTodoBusinessAlert(Long alertId);
Boolean deleteFalseAlert(Long alertId);
List<BusinessAlert> listHandleHistory(String lng, String lat, String createTime);
Boolean transferAlert(BusinessAlertVo vo);
}

2
dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertStatisticsService.java

@ -38,4 +38,6 @@ public interface IBusinessAlertStatisticsService {
Map<String, Object> listAppAlertCount(BusinessAlertBo businessAlertBo);
List<StatObj> countPostAllAlert(BusinessAlertBo businessAlertBo);
}

192
dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java

@ -21,6 +21,7 @@ import org.dromara.business.utils.BatchProcessorUtil;
import org.dromara.business.utils.MinioUntil;
import org.dromara.business.utils.constants.MinIOConstants;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.enums.FormatsType;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.MapstructUtils;
@ -45,6 +46,7 @@ import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
@ -77,6 +79,7 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
public BusinessAlert addBusinessAlert(BusinessAlertVo param) {
BusinessAlert alert = MapstructUtils.convert(param, BusinessAlert.class);
alert.setCreateTime(new Date());
alert.setCaseNumber(param.getCaseNumber());
alert.setJobName(alert.getDeptName()+alert.getLabelCn()+ DateUtils.getTime());
this.baseMapper.insert(alert);
return alert;
@ -85,6 +88,8 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
@Override
public void addBusinessAlertList(List<BusinessAlertVo> alertVoList) {
if(!alertVoList.isEmpty()) {
incrementalCount(alertVoList);
List<RemoteStartProcess> remoteStartProcessList = new ArrayList<>();
for (BusinessAlertVo alertVo : alertVoList) {
alertVo.setBusinessType(2);
@ -119,6 +124,11 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
alert.setHandleType(BusinessStatusEnum.VERIFY.getStatus());
BeanUtils.copyProperties(alert, businessAlert);
//查询历史预警
List<BusinessAlert> businessAlertList = this.listHandleHistory(alert.getLng(), alert.getLat(), DateUtils.parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, alert.getCreateTime()));
businessAlert.setHandleNum(businessAlertList.size());
return businessAlert;
}).toList();
@ -278,11 +288,10 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
return new TableDataInfo<>();
}
wrapper.notIn("t.flowStatus", BusinessStatusEnum.CANCEL.getStatus());
wrapper.eq("t.handle_type",BusinessStatusEnum.FINISH.getStatus());
wrapper.apply(" EXISTS(select * from dk_workflow.flow_his_task ht where ht.approver ='" + LoginHelper.getUserId() + "' and ht.instance_id = t.instanceId)");
Page<BusinessAlert> page = this.baseMapper.pageAlertFinish(pageQuery.build(), wrapper);
Page<BusinessAlert> page = this.baseMapper.pageBusinessAlertFinish(pageQuery.build(), wrapper);
try {
page.getRecords().forEach(businessAlertVo->{
@ -354,6 +363,39 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
return TableDataInfo.build(page);
}
@Override
public TableDataInfo<BusinessAlert> pageBusinessAlertHandle(BusinessAlertBo bo, PageQuery pageQuery) {
QueryWrapper<BusinessAlert> wrapper = buildQueryWrapper(bo);
if (ObjectUtil.isEmpty(wrapper)){
return new TableDataInfo<>();
}
wrapper.notIn("t.flowStatus", BusinessStatusEnum.CANCEL.getStatus());
wrapper.apply(" EXISTS(select * from dk_workflow.flow_his_task ht where ht.approver ='" + LoginHelper.getUserId() + "' and ht.instance_id = t.instanceId)");
Page<BusinessAlert> page = this.baseMapper.pageBusinessAlertHandle(pageQuery.build(), wrapper);
try {
page.getRecords().forEach(businessAlertVo->{
businessAlertVo.setHandleType(null);
if (businessAlertVo.getBusinessType() == 2){
businessAlertVo.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, businessAlertVo.getImages(), 3600).toString());
}else {
businessAlertVo.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlertVo.getImages(), 3600).toString());
businessAlertVo.setMaxImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlertVo.getMaxImages(), 3600).toString());
businessAlertVo.setMaxMateSourceImgUrl(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlertVo.getMaxMateSourceImgUrl(), 3600).toString());
businessAlertVo.setMateSourceImgUrl(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlertVo.getMateSourceImgUrl(), 3600).toString());
}
});
} catch (Exception e) {
log.error(e.getMessage(),e);
}
return TableDataInfo.build(page);
}
/**
* 构建wrapper
@ -380,15 +422,24 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
//排除状态为验证状态预警
wrapper.ne("t.handle_type", BusinessStatusEnum.VERIFY.getStatus());
wrapper.eq("t.del_flag", 0);
if (ObjectUtil.isNotEmpty(bo.getHandleType())){
wrapper.eq("t.handle_type", bo.getHandleType());
}
if (ObjectUtil.isNotEmpty(bo.getDeptId())){
wrapper.eq("t.dept_id", bo.getDeptId());
}
if (ObjectUtil.isNotEmpty(bo.getJobName())){
wrapper.like("t.job_name", bo.getJobName());
}
if (ObjectUtil.isNotEmpty(bo.getLabelEn())){
wrapper.eq("t.label_en", bo.getLabelEn());
}
if (ObjectUtil.isNotEmpty(bo.getStartTime()) && ObjectUtil.isNotEmpty(bo.getEndTime())){
wrapper.ge("DATE_FORMAT(t.create_time, '%Y-%m-%d')", bo.getStartTime());
wrapper.le("DATE_FORMAT(t.create_time, '%Y-%m-%d')", bo.getEndTime());
@ -490,6 +541,38 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
}
@Override
public Map<String, Object> heatList(BusinessAlertBo businessAlertBo) {
Map<String,Object> result = new HashMap<>();
/* //生成近一周开始时间、结束时间
List<String> dayList = getLastSixDays();
String startTime = dayList.get(dayList.size() - 1);
String endTime = dayList.get(0);
result.put("date", startTime + "~" + endTime);*/
//查看的是总览的预警信息
if (ObjectUtil.isEmpty(businessAlertBo.getPostCode())) {
List<BusinessAlertVo> businessAlerts = this.baseMapper.heatList(businessAlertBo, businessAlertBo.getStartTime(), businessAlertBo.getEndTime());
Map<String, List<BusinessAlertVo>> listMap = businessAlerts.stream().collect(Collectors.groupingBy(BusinessAlertVo::getLabelCn));
result.putAll(listMap);
return result;
}
//不是空的话查看是对应各局的
List<RemoteAiLabelPostVo> postVoList = remoteLablePostService.selectLabelByList(businessAlertBo.getPostCode(), null);
if (ObjectUtil.isEmpty(postVoList)){
return result;
}
businessAlertBo.setAiLabelEnList(postVoList.stream().map(RemoteAiLabelPostVo::getLabelEn).distinct().toList());
List<BusinessAlertVo> alertList = this.baseMapper.heatList(businessAlertBo, businessAlertBo.getStartTime(), businessAlertBo.getEndTime());
Map<String, List<BusinessAlertVo>> listMap = alertList.stream().collect(Collectors.groupingBy(BusinessAlertVo::getLabelCn));
result.putAll(listMap);
return result;
}
@Override
public Map<String, Object> cityListAlert(BusinessAlertBo businessAlertBo) {
if (ObjectUtil.hasEmpty(businessAlertBo.getPostCode(),businessAlertBo.getAiName())) {
@ -506,7 +589,7 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
infoMap.put("date", startTime + "~" + endTime);
//不是空的话查看是对应各局的
List<RemoteAiLabelPostVo> postVoList = remoteLablePostService.selectLabelByList(businessAlertBo.getPostCode(), LoginHelper.getDeptId());
List<RemoteAiLabelPostVo> postVoList = remoteLablePostService.selectLabelByList(businessAlertBo.getPostCode(), null);
Map<String, List<RemoteAiLabelPostVo>> aiNameMap = postVoList.stream().collect(Collectors.groupingBy(RemoteAiLabelPostVo::getAiName));
@ -556,6 +639,28 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
return infoMap;
}
@Override
public Map<String, Object> cityHeatList(BusinessAlertBo businessAlertBo) {
if (ObjectUtil.hasEmpty(businessAlertBo.getPostCode(),businessAlertBo.getAiName())) {
throw new ServiceException("参数为空!");
}
Map<String,Object> infoMap = new HashMap<>();
//不是空的话查看是对应各局的
List<RemoteAiLabelPostVo> postVoList = remoteLablePostService.selectLabelByList(businessAlertBo.getPostCode(), null);
Map<String, List<RemoteAiLabelPostVo>> aiNameMap = postVoList.stream().collect(Collectors.groupingBy(RemoteAiLabelPostVo::getAiName));
if (ObjectUtil.isEmpty(postVoList)){
return infoMap;
}
businessAlertBo.setAiLabelEnList(aiNameMap.get(businessAlertBo.getAiName()).stream().map(RemoteAiLabelPostVo::getLabelEn).distinct().toList());
List<BusinessAlertVo> alertList = this.baseMapper.heatList(businessAlertBo, businessAlertBo.getStartTime(), businessAlertBo.getEndTime());
Map<String, List<BusinessAlertVo>> listMap = alertList.stream().collect(Collectors.groupingBy(BusinessAlertVo::getLabelCn));
infoMap.putAll(listMap);
return infoMap;
}
@Override
public List<BusinessAlertVo> listVerifyAlert(RemoteBusinessAlertBo businessAlertBo) {
LambdaQueryWrapper<BusinessAlert> wrapper = new LambdaQueryWrapper<>();
@ -579,7 +684,35 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
@Override
public void batchUpdateDept(List<BusinessAlertVo> alertVoList) {
//更新部门
this.baseMapper.batchUpdateDept(alertVoList);
incrementalCount(alertVoList);
//更新number
this.baseMapper.batchUpdateCaseNumber(alertVoList);
}
/**
* 创建递归caseNumber
* @param alertVoList
*/
public void incrementalCount(List<BusinessAlertVo> alertVoList){
//查询当天时间有多少条预警
Integer currentCount = this.baseMapper.selectCurrentAlertCount(DateUtils.getDate());
//获取当天的时间戳
String currentDate = DateUtils.getDate().replace("-","");
//然后0 + 个数 + 1 当前年月日 例如 202505150 total + 1
AtomicInteger number = new AtomicInteger(1);
alertVoList.forEach(alertVo -> {
int incremental = currentCount + number.get();
alertVo.setCaseNumber(currentDate + "0" + incremental);
number.getAndIncrement();
});
}
@ -647,6 +780,57 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
return businessAlert;
}
@Override
public Boolean deleteFalseAlert(Long alertId) {
LambdaUpdateWrapper<BusinessAlert> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(BusinessAlert::getId, alertId);
wrapper.set(BusinessAlert::getDelFlag,1);
return this.baseMapper.update(wrapper) > 0;
}
@Override
public List<BusinessAlert> listHandleHistory(String lng, String lat, String createTime) {
if (ObjectUtil.hasEmpty(lng, lat)) {
return ListUtil.empty();
}
List<BusinessAlert> businessAlerts = this.baseMapper.listHandleHistory(lng, lat, createTime);
try {
businessAlerts.forEach(businessAlert -> {
if (businessAlert.getBusinessType() == 2){
businessAlert.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, businessAlert.getImages(), 3600).toString());
}else {
businessAlert.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlert.getImages(), 3600).toString());
businessAlert.setMaxImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlert.getMaxImages(), 3600).toString());
}
});
} catch (Exception e) {
log.error(e.getMessage(),e);
}
return businessAlerts;
}
@Override
public Boolean transferAlert(BusinessAlertVo vo) {
if (ObjectUtil.hasEmpty(vo.getId(),vo.getDeptId(),vo.getDeptName())){
throw new RuntimeException("参数为空!");
}
BusinessAlert businessAlert = this.baseMapper.selectById(vo.getId());
LambdaUpdateWrapper<BusinessAlert> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(BusinessAlert::getId, businessAlert.getId());
wrapper.set(BusinessAlert::getDeptId,vo.getDeptId());
wrapper.set(BusinessAlert::getDeptName,vo.getDeptName());
wrapper.set(BusinessAlert::getJobName,vo.getDeptName() + businessAlert.getLabelCn() + businessAlert.getCreateTime());
return this.baseMapper.update(wrapper) > 0;
}
public static void main(String[] args) {
System.out.println(getLastSixDays());

243
dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java

@ -1,8 +1,11 @@
package org.dromara.business.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.business.domain.BusinessAlert;
import org.dromara.business.domain.bo.BusinessAlertBo;
@ -12,6 +15,7 @@ import org.dromara.business.mapper.BusinessAlertMapper;
import org.dromara.business.service.IBusinessAlertService;
import org.dromara.business.service.IBusinessAlertStatisticsService;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.mybatis.enums.DataScopeType;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.RemoteDataScopeService;
@ -44,6 +48,7 @@ import static org.dromara.common.core.constant.Constants.FLY_COUNT;
*
*预警统计Service业务层处理
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatisticsService {
@ -97,8 +102,21 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
businessAlertBo.setDeptId(String.valueOf(LoginHelper.getDeptId()));
businessAlertBo.setAiLabelEnList(getAiLabel(businessAlertBo.getPostCode()).stream().map(RemoteAiLabelPostVo::getLabelEn).collect(Collectors.toList()));
List<Map<String, Object>> mapList = baseMapper.listDepartAlert(businessAlertBo);
//判断是否存在下级
Long deptId = LoginHelper.getDeptId();
List<RemoteDeptVo> remoteDeptVoList = Optional.ofNullable(remoteDeptService.selectListByParentId(String.valueOf(deptId)))
.orElse(Collections.emptyList())
.stream()
.filter(p -> !p.getDeptId().equals(deptId))
.collect(Collectors.toList());
//排除自己如果没有下级则默认使用下边的逻辑查询
if (ObjectUtil.isEmpty(remoteDeptVoList)) {
List<Map<String, Object>> mapList = baseMapper.listOneDepartAlert(businessAlertBo);
return mapList.stream().map(data -> new StatObj(data.get("deptName") + "", Long.parseLong(data.get("total") + ""),"deptId",data.get("deptId"))).collect(Collectors.toList());
}
//如果有则使用这个查询
List<Map<String, Object>> mapList = baseMapper.listDepartAlert(businessAlertBo);
return mapList.stream().map(data -> new StatObj(data.get("deptName") + "", Long.parseLong(data.get("total") + ""),"deptId",data.get("deptId"))).collect(Collectors.toList());
}
@ -131,6 +149,33 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
businessAlertBo.setDeptId(String.valueOf(LoginHelper.getDeptId()));
businessAlertBo.setAiLabelEnList(getAiLabel(businessAlertBo.getPostCode()).stream().map(RemoteAiLabelPostVo::getLabelEn).collect(Collectors.toList()));
//判断是否存在下级
Long deptId = LoginHelper.getDeptId();
List<RemoteDeptVo> remoteDeptVoList = Optional.ofNullable(remoteDeptService.selectListByParentId(String.valueOf(deptId)))
.orElse(Collections.emptyList())
.stream()
.filter(p -> !p.getDeptId().equals(deptId))
.collect(Collectors.toList());
//排除自己如果没有下级则默认使用下边的逻辑查询
if (ObjectUtil.isEmpty(remoteDeptVoList)) {
List<Map<String, Object>> mapList = baseMapper.listOneDepartAlertStatus(businessAlertBo);
return mapList.stream()
.map(map -> new StatObj(
Objects.toString(map.get("deptName")),
List.of(
new StatObj("total", map.get("total")),
new StatObj("todoCount", map.get("todoCount")),
new StatObj("finishCount", map.get("finishCount")),
new StatObj("cancelCount", map.get("cancelCount"))
),"deptId",map.get("deptId")
))
.collect(Collectors.toList());
}
//如果有下级则使用下方方法
List<Map<String, Object>> mapList = baseMapper.listDepartAlertStatus(businessAlertBo);
return mapList.stream()
@ -186,57 +231,63 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//----------------------------------------------获取飞行总架次、总时长----------------------------------------------
//获取飞行总架次、总时长
//获取机场信息根据当前登录人
List<String> deviceSnList = ObjectUtil.isNotEmpty(feignDeviceGroup.listDevice(LoginHelper.getUserId()))?feignDeviceGroup.listDevice(LoginHelper.getUserId()):ListUtil.empty();
// List<String> deviceSnList = ObjectUtil.isNotEmpty(feignDeviceGroup.listDevice(LoginHelper.getUserId()))?feignDeviceGroup.listDevice(LoginHelper.getUserId()):ListUtil.empty();
//过滤redis中用户所拥有的设备
Map<String, Object> countMap = Optional.ofNullable(RedisUtils.getCacheMap(FLY_COUNT))
.map(map -> map.entrySet().stream()
.filter(entry -> deviceSnList.contains(entry.getKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
.orElse(new HashMap<>());
int flyCount;
if (ObjectUtil.isNotEmpty(countMap)){
flyCount = countMap.values().stream()
.filter(Objects::nonNull)
.mapToInt(value -> {
if (value instanceof Number) {
return ((Number) value).intValue();
}
return 0;
})
.sum();
} else {
flyCount = 0;
}
// Map<String, Object> countMap = Optional.ofNullable(RedisUtils.getCacheMap(FLY_COUNT))
// .map(map -> map.entrySet().stream()
// .filter(entry -> deviceSnList.contains(entry.getKey()))
// .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
// .orElse(new HashMap<>());
// int flyCount;
//
// if (ObjectUtil.isNotEmpty(countMap)){
// flyCount = countMap.values().stream()
// .filter(Objects::nonNull)
// .mapToInt(value -> {
// if (value instanceof Number) {
// return ((Number) value).intValue();
// }
// return 0;
// })
// .sum();
// } else {
// flyCount = 0;
// }
//过滤redis中用户所拥有的设备
Map<String, Object> accTimeMap = Optional.ofNullable(RedisUtils.getCacheMap(FLY_ACC_TIME))
.map(map -> map.entrySet().stream()
.filter(entry -> deviceSnList.contains(entry.getKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
.orElse(new HashMap<>());
double flyAccTime;
if (ObjectUtil.isNotEmpty(accTimeMap)) {
flyAccTime = accTimeMap.values().stream()
.filter(Objects::nonNull)
.mapToDouble(value -> {
if (value instanceof Number) {
return ((Number) value).doubleValue();
}
return 0.0;
})
.sum();
} else {
flyAccTime = 0.0;
}
// Map<String, Object> accTimeMap = Optional.ofNullable(RedisUtils.getCacheMap(FLY_ACC_TIME))
// .map(map -> map.entrySet().stream()
// .filter(entry -> deviceSnList.contains(entry.getKey()))
// .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
// .orElse(new HashMap<>());
//
//
// double flyAccTime;
//
// if (ObjectUtil.isNotEmpty(accTimeMap)) {
// flyAccTime = accTimeMap.values().stream()
// .filter(Objects::nonNull)
// .mapToDouble(value -> {
// if (value instanceof Number) {
// return ((Number) value).doubleValue();
// }
// return 0.0;
// })
// .sum();
// } else {
// flyAccTime = 0.0;
// }
//----------------------------------------------获取飞行总架次、总时长----------------------------------------------
Map<String, Integer> devices = new HashMap<>();
try {
devices = feignDeviceGroup.getDevices();
} catch (Exception e) {
log.error(e.getMessage(),e);
}
Map<String, Object> panel = baseMapper.countPanelAlert(businessAlertBo);
@ -245,8 +296,8 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
ObjectUtil.isEmpty(panel.get("total"))?0:panel.get("total"),
ObjectUtil.isEmpty(panel.get("finishCount"))?0:panel.get("finishCount"),
ObjectUtil.isEmpty(panel.get("cancelCount"))?0:panel.get("cancelCount"),
flyCount,
flyAccTime);
ObjectUtil.isEmpty(devices.get("flyCount"))?0:devices.get("flyCount"),
ObjectUtil.isEmpty(devices.get("flyAccTime"))?0:devices.get("flyAccTime"));
}
@Override
@ -372,6 +423,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//查询所有的职能岗位
List<RemotePostVo> postVoList = remotePostService.listPost();
postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则
if (ObjectUtil.isEmpty(postVoList)) {
return ListUtil.empty();
@ -400,6 +452,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//查询所有的职能岗位
List<RemotePostVo> postVoList = remotePostService.listPost();
postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则
List<StatObj> result = new ArrayList<>();
@ -441,6 +494,43 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
return result;
}
@Override
public List<StatObj> countPostAllAlert(BusinessAlertBo businessAlertBo) {
//构建查询数据权限
createPermissions(businessAlertBo);
//查询所有的职能岗位
List<RemotePostVo> postVoList = remotePostService.listPost();
postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则
List<StatObj> result = new ArrayList<>();
if (ObjectUtil.isEmpty(postVoList)) {
return ListUtil.empty();
}
postVoList.forEach(postVo -> {
List<String> labelList = getAiLabel(postVo.getPostCode()).stream().map(RemoteAiLabelPostVo::getLabelEn).collect(Collectors.toList());
Map<String, Object> dateMap = new HashMap<>();
if (ObjectUtil.isEmpty(labelList)) {
dateMap.put("todoCount",0);
dateMap.put("finishCount",0);
}else {
businessAlertBo.setAiLabelEnList(labelList);
dateMap = baseMapper.countTotalAlert(businessAlertBo);
}
result.add(new StatObj(
postVo.getPostName(),
dateMap.get("todoCount"),
dateMap.get("finishCount")
));
});
return result;
}
/**
* 出警效率
* @param businessAlertBo
@ -454,6 +544,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//查询所有的职能岗位
List<RemotePostVo> postVoList = remotePostService.listPost();
postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则
List<String> monthList = getLastSixMonths();
@ -596,14 +687,15 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
switch (dateType) {
case 0:
LocalDate today = LocalDate.now();
LocalDate startDate = today.minusMonths(6)
.with(TemporalAdjusters.firstDayOfMonth());
// 获取当前日期
LocalDate localDate = LocalDate.now();
// 计算当前日期的六个月前的日期
LocalDate sixMonthsAgo = localDate.minusMonths(6);
LocalDate endDate = today.with(TemporalAdjusters.lastDayOfMonth());
result.put("startTime", sixMonthsAgo.format(formatter));
result.put("endTime", localDate.format(formatter));
result.put("startTime",startDate.format(formatter));
result.put("endTime",endDate.format(formatter));
break;
case 1: // 年
LocalDate currentDate = LocalDate.now();
@ -642,7 +734,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//构建查询数据权限
createPermissions(businessAlertBo);
List<RemoteAiLabelPostVo> postVoList = remoteLabelPostService.selectLabelByList(businessAlertBo.getPostCode(), LoginHelper.getDeptId());
List<RemoteAiLabelPostVo> postVoList = remoteLabelPostService.selectLabelByList(businessAlertBo.getPostCode(), null);
Map<String, List<RemoteAiLabelPostVo>> aiNameMap = postVoList.stream().collect(Collectors.groupingBy(RemoteAiLabelPostVo::getAiName));
@ -774,20 +866,37 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
}
private void createPermissions(BusinessAlertBo businessAlertBo) {
Long roleId = Optional.ofNullable(LoginHelper.getLoginUser())
.map(LoginUser::getRoles)
.filter(roles -> !roles.isEmpty())
.map(List::getFirst)
.map(RoleDTO::getRoleId)
.orElse(null);
String roleCustom = remoteDataScopeService.getRoleCustom(roleId);
if (roleCustom.equalsIgnoreCase("-1")){
try {
RoleDTO roleDTO = LoginHelper.getLoginUser().getRoles().getFirst();
//自定义权限
if (roleDTO.getDataScope().equalsIgnoreCase(DataScopeType.CUSTOM.getCode())){
String roleCustom = remoteDataScopeService.getRoleCustom(roleDTO.getRoleId());
if (roleCustom.equalsIgnoreCase("-1")){
businessAlertBo.setDeptIdList(ListUtil.empty());
}else {
businessAlertBo.setDeptIdList(Arrays.stream(roleCustom.split(","))
.map(Long::parseLong)
.collect(Collectors.toList()));
}
} else if (roleDTO.getDataScope().equalsIgnoreCase(DataScopeType.DEPT_AND_CHILD.getCode())) {
//部门及其以下
String deptAndChild = remoteDataScopeService.getDeptAndChild(LoginHelper.getDeptId());
if (deptAndChild.equalsIgnoreCase("-1")){
businessAlertBo.setDeptIdList(ListUtil.empty());
}else {
businessAlertBo.setDeptIdList(Arrays.stream(deptAndChild.split(","))
.map(Long::parseLong)
.collect(Collectors.toList()));
}
} else if (roleDTO.getDataScope().equalsIgnoreCase(DataScopeType.DEPT.getCode())) {
//本部门
businessAlertBo.setDeptIdList(List.of(LoginHelper.getDeptId()));
}
} catch (Exception e) {
businessAlertBo.setDeptIdList(ListUtil.empty());
}else {
businessAlertBo.setDeptIdList(Arrays.stream(roleCustom.split(","))
.map(Long::parseLong)
.collect(Collectors.toList()));
log.error(e.getMessage(),e);
}
}
}

11
dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessTaskServiceImpl.java

@ -2,12 +2,15 @@ package org.dromara.business.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.dromara.business.domain.BusinessTask;
import org.dromara.business.domain.BusinessTaskLabel;
import org.dromara.business.domain.bo.BusinessTaskBo;
import org.dromara.business.domain.vo.BusinessTaskVo;
import org.dromara.business.mapper.BusinessTaskLabelMapper;
import org.dromara.business.mapper.BusinessTaskMapper;
import org.dromara.business.service.IBusinessTaskService;
import org.dromara.common.core.constant.BusinessConstants;
@ -35,6 +38,7 @@ import java.util.Map;
public class BusinessTaskServiceImpl implements IBusinessTaskService {
private final BusinessTaskMapper baseMapper;
private final BusinessTaskLabelMapper taskLabelMapper;
/**
* 查询工单预约
@ -92,6 +96,9 @@ public class BusinessTaskServiceImpl implements IBusinessTaskService {
*/
@Override
public Boolean insertByBo(BusinessTaskBo bo) {
if(bo.getTaskLabelList().isEmpty()){
throw new RuntimeException("未获取到识别类型标签");
}
// 获取当前登录用户信息
LoginUser currentUser = LoginHelper.getLoginUser();
bo.setCreateBy(currentUser.getUserId());
@ -105,6 +112,10 @@ public class BusinessTaskServiceImpl implements IBusinessTaskService {
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
bo.getTaskLabelList().forEach(labelVo -> {
labelVo.setTaskId(bo.getId());
});
taskLabelMapper.insert(bo.getTaskLabelList());
}
return flag;
}

116
dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml

@ -6,6 +6,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<sql id="searchSql">
and ba.handle_type != 'verify'
and ba.del_flag = '0'
<if test="param.aiLabelEnList != null and param.aiLabelEnList.size > 0">
and ba.label_en in
<foreach collection="param.aiLabelEnList" item="item" open="(" close=")" separator=",">
@ -15,6 +16,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="param.createTime != null and param.createTime != ''">
and DATE_FORMAT(ba.create_time,'%Y-%m-%d') = #{param.createTime}
</if>
<if test="param.startTime != null and param.startTime != ''">
and <![CDATA[ DATE_FORMAT(ba.create_time, '%Y-%m-%d') >= #{param.startTime} ]]>
</if>
<if test="param.endTime != null and param.endTime != ''">
and <![CDATA[ DATE_FORMAT(ba.create_time, '%Y-%m-%d') <= #{param.endTime} ]]>
</if>
<if test="param.deptIdList != null and param.deptIdList.size > 0">
and ba.dept_id in
<foreach collection="param.deptIdList" item="item" open="(" close=")" separator=",">
@ -30,6 +37,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
${ew.getCustomSqlSegment}
</select>
<select id="pageBusinessAlertFinish" resultType="org.dromara.business.domain.BusinessAlert">
select t.* from (select
ba.*
from dk_business.business_alert ba) t
${ew.getCustomSqlSegment}
</select>
<select id="pageBusinessAlertCancel" resultType="org.dromara.business.domain.BusinessAlert">
select t.* from (
select
@ -43,7 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
${ew.getCustomSqlSegment}
</select>
<select id="pageAlertFinish" resultType="org.dromara.business.domain.BusinessAlert">
<select id="pageBusinessAlertHandle" resultType="org.dromara.business.domain.BusinessAlert">
select t.* from (
select
ba.*,
@ -435,8 +449,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
COUNT(DISTINCT ba.id) AS total
from business_alert ba
where 1=1
and <![CDATA[ DATE_FORMAT(ba.create_time, '%Y') >= '2024' ]]>
and <![CDATA[ DATE_FORMAT(ba.create_time, '%Y') <= DATE_FORMAT(now(), '%Y') ]]>
and ba.handle_type = 'finish'
<include refid="searchSql"></include>
</select>
@ -502,6 +515,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="searchSql"></include>
</select>
<select id="countTotalAlert" resultType="java.util.Map">
select
IFNULL(SUM( ba.handle_type = 'waiting' ),0) AS todoCount,
IFNULL(SUM( ba.handle_type = 'finish' ),0) AS finishCount
from business_alert ba
where 1=1
<include refid="searchSql"></include>
</select>
<select id="countAiLabel" resultType="java.util.Map">
WITH warning_summary AS (
SELECT al.label_cn, al.label_en
@ -518,6 +540,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
warning_summary ws
LEFT JOIN business_alert ba ON ws.label_en = ba.label_en
and ba.handle_type != 'verify'
and ba.del_flag = '0'
and <![CDATA[ DATE_FORMAT(ba.create_time, '%Y-%m-%d') >= #{startTime} ]]>
and <![CDATA[ DATE_FORMAT(ba.create_time, '%Y-%m-%d') <= #{endTime} ]]>
and ws.label_en in
@ -834,6 +857,93 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
${ew.getCustomSqlSegment}
</select>
<select id="listHandleHistory" resultType="org.dromara.business.domain.BusinessAlert">
SELECT job_name,max_images,images,create_time,id,handle_type,del_flag,ST_Distance_Sphere(point(lng, lat), point(#{lng},#{lat})) AS distance,business_type
FROM business_alert
WHERE <![CDATA[ create_time >= DATE_SUB(#{createTime}, INTERVAL 60 DAY) ]]>
AND <![CDATA[ create_time < #{createTime} ]]>
and del_flag = 0
HAVING <![CDATA[ distance <= 30 ]]>
ORDER BY create_time desc
</select>
<select id="listOneDepartAlert" resultType="java.util.Map">
SELECT
dc.dept_id AS deptId,
dc.dept_name AS deptName,
COALESCE(COUNT(ba.id), 0) AS total
FROM
(select dept_id,dept_name from dk_cloud.sys_dept sd where sd.dept_id = #{param.deptId}) dc
LEFT JOIN business_alert ba ON ba.dept_id = dc.dept_id
<include refid="searchSql"></include>
GROUP BY
dc.dept_id,dc.dept_name
</select>
<select id="listOneDepartAlertStatus" resultType="java.util.Map">
SELECT
dc.dept_id AS deptId,
dc.dept_name AS deptName,
COALESCE(COUNT(ba.id), 0) AS total,
IFNULL(SUM(ba.handle_type = 'waiting'), 0) AS todoCount,
IFNULL(SUM(ba.handle_type = 'finish'), 0) AS finishCount,
IFNULL(SUM(ba.handle_type = 'cancel'), 0) AS cancelCount
FROM
(select dept_id,dept_name from dk_cloud.sys_dept sd where sd.dept_id = #{param.deptId}) dc
LEFT JOIN business_alert ba ON ba.dept_id = dc.dept_id
<include refid="searchSql"></include>
GROUP BY
dc.dept_id,dc.dept_name
</select>
<select id="heatList" resultType="org.dromara.business.domain.vo.BusinessAlertVo">
SELECT
temp.label_en AS labelEn,
temp.label_cn as labelCn,
ba.lat AS lat,
ba.lng AS lng,
COUNT(*) AS value
FROM
(
SELECT
ba.label_en,
ba.label_cn
FROM
dk_business.business_alert ba
GROUP BY
ba.label_en, ba.label_cn
) temp
INNER JOIN
business_alert ba ON temp.label_en = ba.label_en
AND ba.lat IS NOT NULL
<where>
<include refid="searchSql"></include>
</where>
GROUP BY
temp.label_en,temp.label_cn, ba.lat, ba.lng
HAVING
<![CDATA[ ST_Distance_Sphere(POINT(lng, lat), POINT(ba.lng, ba.lat)) <= 30 ]]>
</select>
<select id="selectCurrentAlertCount" resultType="java.lang.Integer">
SELECT
IFNULL( count( 1 ), 0 )
FROM
business_alert ba
WHERE
DATE_FORMAT( ba.create_time, '%Y-%m-%d' ) = #{currentDate} and ba.del_flag = '0'
</select>
<update id="batchUpdateCaseNumber">
UPDATE business_alert
SET
case_number =
<foreach collection="list" item="item" separator=" " open="CASE id" close="END">
WHEN #{item.id} THEN #{item.caseNumber}
</foreach>
WHERE id IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item.id}
</foreach>
</update>
</mapper>

11
dk-modules/business/src/main/resources/mapper/business/BusinessTaskLabelMapper.xml

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.business.mapper.BusinessTaskLabelMapper">
<select id="selectTaskLabelList" resultType="org.dromara.business.domain.vo.BusinessTaskLabelVo">
select * from business_task_label where task_id=#{taskId}
</select>
</mapper>

7
dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml

@ -28,6 +28,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result column="operatTime" property="operatTime" />
<result column="flightTime" property="flightTime" />
<result column="flightExplain" property="flightExplain" />
<collection column="{taskId=id}"
property="taskLabelList" ofType="org.dromara.business.domain.vo.BusinessAlertVo"
javaType="java.util.ArrayList"
select="org.dromara.business.mapper.BusinessTaskLabelMapper.selectTaskLabelList"/>
</resultMap>
<select id="distance" resultType="java.lang.Integer">
SELECT device_id,
@ -91,7 +96,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</when>
</choose>
</where>
order by t.status,t.create_time desc
order by t.create_time desc
</select>
<select id="queryBusinessTask" resultMap="businessTaskMap">
SELECT

4
dk-modules/sample/pom.xml

@ -140,6 +140,10 @@
<groupId>org.dromara</groupId>
<artifactId>api-workflow</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>common-rocketmq</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>

68
dk-modules/sample/src/main/java/org/dromara/sample/common/util/Md5Utils.java

@ -0,0 +1,68 @@
package org.dromara.sample.common.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
/**
* Md5加密方法
*
* @author ruoyi
*/
public class Md5Utils
{
private static final Logger log = LoggerFactory.getLogger(Md5Utils.class);
private static byte[] md5(String s)
{
MessageDigest algorithm;
try
{
algorithm = MessageDigest.getInstance("MD5");
algorithm.reset();
algorithm.update(s.getBytes("UTF-8"));
byte[] messageDigest = algorithm.digest();
return messageDigest;
}
catch (Exception e)
{
log.error("MD5 Error...", e);
}
return null;
}
private static final String toHex(byte hash[])
{
if (hash == null)
{
return null;
}
StringBuffer buf = new StringBuffer(hash.length * 2);
int i;
for (i = 0; i < hash.length; i++)
{
if ((hash[i] & 0xff) < 0x10)
{
buf.append("0");
}
buf.append(Long.toString(hash[i] & 0xff, 16));
}
return buf.toString();
}
public static String hash(String s)
{
try
{
return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
}
catch (Exception e)
{
log.error("not supported charset...{}", e);
return s;
}
}
}

2
dk-modules/sample/src/main/java/org/dromara/sample/control/model/param/TakeoffToPointParam.java

@ -39,7 +39,7 @@ public class TakeoffToPointParam {
@Range(min = 2, max = 1500)
@NotNull
private Double rthAltitude;
private Integer rthAltitude;
@NotNull
private RcLostActionEnum rcLostAction;

40
dk-modules/sample/src/main/java/org/dromara/sample/control/service/impl/ControlServiceImpl.java

@ -1,6 +1,12 @@
package org.dromara.sample.control.service.impl;
import cn.hutool.core.date.DateUtil;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.sdk.cloudapi.wayline.OutOfControlActionEnum;
import org.dromara.common.sdk.cloudapi.wayline.TaskTypeEnum;
import org.dromara.common.sdk.cloudapi.wayline.WaylineJobTypeEnum;
import org.dromara.common.sdk.cloudapi.wayline.WaylineTypeEnum;
import org.dromara.sample.manage.model.dto.DeviceDTO;
import org.dromara.sample.manage.service.IDevicePayloadService;
import org.dromara.sample.manage.service.IDeviceRedisService;
@ -26,10 +32,16 @@ import org.dromara.sample.control.model.enums.DroneAuthorityEnum;
import org.dromara.sample.control.model.enums.RemoteDebugMethodEnum;
import org.dromara.sample.control.model.param.*;
import org.dromara.sample.control.service.IControlService;
import org.dromara.sample.wayline.mapper.IWaylineJobMapper;
import org.dromara.sample.wayline.model.entity.WaylineJobEntity;
import org.dromara.sample.wayline.model.enums.WaylineJobStatusEnum;
import org.dromara.sample.wayline.service.IWaylineJobService;
import org.dromara.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
@ -69,6 +81,10 @@ public class ControlServiceImpl implements IControlService {
@Qualifier("SDKWaylineService")
private AbstractWaylineService abstractWaylineService;
@Autowired
private IWaylineJobMapper waylineJobMapper;
private RemoteDebugHandler checkDebugCondition(String sn, RemoteDebugParam param, RemoteDebugMethodEnum controlMethodEnum) {
RemoteDebugHandler handler = Objects.nonNull(controlMethodEnum.getClazz()) ?
mapper.convertValue(Objects.nonNull(param) ? param : new Object(), controlMethodEnum.getClazz())
@ -163,17 +179,39 @@ public class ControlServiceImpl implements IControlService {
@Override
public HttpResultResponse takeoffToPoint(String sn, TakeoffToPointParam param) {
LoginUser loginUser = LoginHelper.getLoginUser();
checkTakeoffCondition(sn);
Optional<DeviceDTO> dockOpt = deviceRedisService.getDeviceOnline(sn);
param.setFlightId(UUID.randomUUID().toString());
WaylineJobEntity waylineJobEntity = new WaylineJobEntity();
waylineJobEntity.setJobId(param.getFlightId());
waylineJobEntity.setName(dockOpt.get().getNickname()+ DateUtil.date(System.currentTimeMillis()));
waylineJobEntity.setWaylineName(dockOpt.get().getNickname()+ DateUtil.date(System.currentTimeMillis()));
waylineJobEntity.setDockSn(sn);
waylineJobEntity.setWorkspaceId(dockOpt.get().getWorkspaceId());
waylineJobEntity.setTaskType(TaskTypeEnum.IMMEDIATE.getType());
waylineJobEntity.setWaylineType(WaylineTypeEnum.WAYPOINT.getValue());
waylineJobEntity.setUsername(loginUser.getUsername());
waylineJobEntity.setExecuteTime(new Date());
waylineJobEntity.setBeginTime(new Date());
waylineJobEntity.setStatus(WaylineJobStatusEnum.PENDING.getVal());
waylineJobEntity.setOutOfControlAction(OutOfControlActionEnum.RETURN_TO_HOME.getAction());
waylineJobEntity.setRthAltitude(param.getRthAltitude());
waylineJobEntity.setMediaCount(0);
waylineJobEntity.setJobType(WaylineJobTypeEnum.INSTRUCT.getType());
TopicServicesResponse<ServicesReplyData> response = abstractControlService.takeoffToPoint(
SDKManager.getDeviceSDK(sn), mapper.convertValue(param, TakeoffToPointRequest.class));
ServicesReplyData reply = response.getData();
if (reply.getResult().isSuccess()) {
waylineJobEntity.setCreateTime(new Date());
waylineJobMapper.insert(waylineJobEntity);
}
return reply.getResult().isSuccess() ?
HttpResultResponse.success()
: HttpResultResponse.error("无人机未能起飞。" + reply.getResult());
}
@Override
public HttpResultResponse seizeAuthority(String sn, DroneAuthorityEnum authority, DronePayloadParam param) {
TopicServicesResponse<ServicesReplyData> response;

15
dk-modules/sample/src/main/java/org/dromara/sample/feign/BusinessTaskFeign.java

@ -1,15 +0,0 @@
package org.dromara.sample.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name = "gateway",path = "business")
public interface BusinessTaskFeign {
@PostMapping("/update/status")
void updateTaskStatus(@RequestParam String waylineId,
@RequestParam String status,
@RequestParam(required = false) String jobId,
@RequestParam(required = false) String jobName);
}

2
dk-modules/sample/src/main/java/org/dromara/sample/fegin/RemoteBusinessTaskFeign.java → dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteBusinessTaskFeign.java

@ -1,4 +1,4 @@
package org.dromara.sample.fegin;
package org.dromara.sample.feign;
import org.dromara.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;

16
dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteSystemFeign.java

@ -0,0 +1,16 @@
package org.dromara.sample.feign;
import org.dromara.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@FeignClient(name = "gateway",path = "system")
public interface RemoteSystemFeign {
@GetMapping("/config/selectStreamType")
public List<String> selectStreamType(@RequestParam String deviceSn);
}

4
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceController.java

@ -119,7 +119,7 @@ public class DeviceController {
* @param deviceSn
* @return
*/
@PutMapping("/devices/{device_sn}")
@PutMapping("/{workspace_id}/devices/{device_sn}")
@Operation(summary = "更新设备信息。", description = "更新设备信息。")
public HttpResultResponse updateDevice(@RequestBody DeviceDTO device,
@PathVariable("workspace_id") String workspaceId,
@ -136,7 +136,7 @@ public class DeviceController {
* @return
*/
@Operation(summary = "设备离线固件升级任务。", description = "设备离线固件升级任务。")
@PostMapping("/devices/ota")
@PostMapping("/{workspace_id}/devices/ota")
public HttpResultResponse createOtaJob(@PathVariable("workspace_id") String workspaceId,
@RequestBody List<DeviceFirmwareUpgradeDTO> upgradeDTOS) {
return deviceService.createDeviceOtaJob(workspaceId, upgradeDTOS);

28
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceFlightRecordsController.java

@ -0,0 +1,28 @@
package org.dromara.sample.manage.controller;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sample.manage.service.IDeviceFlightRecordsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@Slf4j
@RequestMapping("/device/flight")
public class DeviceFlightRecordsController {
@Autowired
private IDeviceFlightRecordsService deviceFlightRecordsService;
@GetMapping("/count")
public Map<String,Integer> getDevices() {
log.info("----------------------------开始调用feign接口查询项目组----------------------------");
Map<String, Integer> deviceFlightCount = deviceFlightRecordsService.getDeviceFlightCount();
log.info("----------------------------调用feign接口查询项目组结束----------------------------");
return deviceFlightCount;
}
}

82
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceProController.java

@ -49,6 +49,17 @@ public class DeviceProController {
return HttpResultResponse.success(devices);
}
/**
* 查询项目组下拉列表
* @return
*/
@Operation(summary = "查询项目组下拉列表", description = "查询项目组下拉列表")
@GetMapping("/list")
public HttpResultResponse<List<DeviceProEntity>> listDevicePro(){
return HttpResultResponse.success(deviceProService.listDevicePro());
}
//2、添加项目组
/**
* 新增/更新项目
@ -65,8 +76,8 @@ public class DeviceProController {
//3、删除项目组
@Operation(summary = "删除项目组。", description = "删除项目组。")
@DeleteMapping("/delete")
public HttpResultResponse<Boolean> deleteDevicePro(@RequestBody List<Integer> ids) {
return HttpResultResponse.success(deviceProService.deleteIds(ids));
public HttpResultResponse<Boolean> deleteDevicePro(Integer id) {
return HttpResultResponse.success(deviceProService.deleteIds(List.of(id)));
}
/**
@ -80,35 +91,62 @@ public class DeviceProController {
return HttpResultResponse.success(deviceProService.updateDeviceProUser(userEntity,proId));
}
@Operation(summary = "查询项目人员。", description = "查询项目人员")
@GetMapping("/{proId}/user/page")
public HttpResultResponse<PaginationData<DeviceProUserEntity>> pageProUser(@PathVariable Integer proId,
@RequestParam(value = "searchValue",required = false) String searchValue,
@RequestParam(name = "pageNum", defaultValue = "1") Long page,
@RequestParam(name = "pageSize", defaultValue = "10") Long pageSize) {
Page<DeviceProUserEntity> pageQuery = new Page<>(page, pageSize);
return HttpResultResponse.success(deviceProService.pageProUser(searchValue,proId,pageQuery));
}
@Operation(summary = "删除项目人员", description = "删除项目人员")
@DeleteMapping("/{proId}/{proUserId}/user/delete")
public HttpResultResponse<Boolean> deleteProUser(@PathVariable Integer proId,
@PathVariable Long proUserId) {
return HttpResultResponse.success(deviceProService.deleteProUser(proUserId,proId));
}
/**
* 设备绑定项目组
* 开启配置
* @param proId
* @return
*/
@Operation(summary = "设备绑定项目组", description = "设备绑定项目组")
@PostMapping("/bind")
public HttpResultResponse<Boolean> updateDevice(@RequestBody Dict dict) {
return HttpResultResponse.success(deviceProService.updateDevice(dict));
@Operation(summary = "开启配置", description = "开启配置")
@PostMapping("/enable/{proId}")
public HttpResultResponse<Boolean> enablePro(@PathVariable("proId") Integer proId) {
return HttpResultResponse.success(deviceProService.enablePro(proId));
}
/**
* 根据人员获取项目组(feign调用接口)
* 关闭配置
* @param proId
* @return
*/
@GetMapping("/feign/user")
public List<Integer> listDeviceGroup(@RequestParam("userId") Long userId) {
log.info("----------------------------开始调用feign接口查询项目组----------------------------");
List<Integer> result = deviceProService.listDeviceGroup(userId);
log.info("----------------------------调用feign接口查询项目组结束----------------------------");
return result;
@Operation(summary = "关闭配置", description = "关闭配置")
@PostMapping("/disable/{proId}")
public HttpResultResponse<Boolean> disablePro(@PathVariable("proId") Integer proId) {
return HttpResultResponse.success(deviceProService.disablePro(proId));
}
/**
* 根据人员获取当前人员所拥有的机场(feign调用接口)
* 根据人员获取项目组
*/
@GetMapping("/feign/device")
public List<String> listDevice(@RequestParam("userId") Long userId) {
log.info("----------------------------开始调用feign接口查询项目所属机场----------------------------");
List<String> result = deviceProService.listDevice(userId);
log.info("----------------------------调用feign接口查询项目组所属机场----------------------------");
return result;
}
// @GetMapping("/list/pro")
// public HttpResultResponse<List<Integer>> listDeviceGroup(@RequestParam("userId") Long userId) {
// List<Integer> result = deviceProService.listDeviceGroup(userId);
// return HttpResultResponse.success(result);
// }
/**
* 根据人员获取项目组
*/
@GetMapping("/list/user/pro")
public HttpResultResponse<List<DeviceProEntity>> listUserGroup() {
List<DeviceProEntity> result = deviceProService.listUserGroup();
return HttpResultResponse.success(result);
}
}

87
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/EngineRecordController.java

@ -0,0 +1,87 @@
package org.dromara.sample.manage.controller;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.common.sdk.exception.CloudSDKErrorEnum;
import org.dromara.common.sdk.mqtt.property.PropertySetReplyResultEnum;
import org.dromara.sample.manage.model.dto.CallBackDTO;
import org.dromara.sample.manage.model.dto.DeviceDTO;
import org.dromara.sample.manage.model.dto.DeviceFirmwareUpgradeDTO;
import org.dromara.sample.manage.model.dto.EventsDTO;
import org.dromara.sample.manage.model.entity.WarningRecordEntity;
import org.dromara.sample.manage.service.IDeviceService;
import org.dromara.sample.manage.service.IEngineRecordService;
import org.dromara.sample.manage.service.IWarningRecordService;
import org.dromara.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @author sean.zhou
* @version 0.1
* @date 2021/11/15
*/
@RestController
@Slf4j
@RequestMapping("${url.manage.prefix}${url.manage.version}/engineRecord")
@Tag(name = "无人机设备模块")
public class EngineRecordController {
@Autowired
private IEngineRecordService engineRecordService;
@Autowired
private IWarningRecordService warningRecordService;
/**
* 启动星罗引擎
* Get the topology list of all online devices in one workspace.
* @return
*/
@PostMapping("/startEngine")
@Operation(summary = "启动星罗引擎。", description = "启动星罗引擎")
public HttpResultResponse<Map<String,Object>> startEngine(@RequestBody Map<String,Object> objectMap) {
return HttpResultResponse.success(engineRecordService.startEngine(objectMap));
}
@PostMapping("/closeEngine")
@Operation(summary = "关闭星罗引擎。", description = "关闭星罗引擎")
public HttpResultResponse closeEngine(@RequestBody Map<String,Object> objectMap) {
engineRecordService.closeEngine(objectMap);
return HttpResultResponse.success();
}
@PostMapping("/some")
@Operation(summary = "存储推流的预警(对外接口)。", description = "存储推流的预警(对外接口)。")
public void some(@RequestBody CallBackDTO callBackVo){
WarningRecordEntity warningRecord = new WarningRecordEntity();
List<WarningRecordEntity> list = new ArrayList<>();
if (CollectionUtils.isNotEmpty(callBackVo.getEvents())){
for (EventsDTO eventsVo :callBackVo.getEvents()){
warningRecord.setTaskId(callBackVo.getTaskId());
warningRecord.setAlgoId(eventsVo.getAlgoId());
warningRecord.setEventId(eventsVo.getEventId());
warningRecord.setExtraType(eventsVo.getExtraType());
warningRecord.setPicUrl(eventsVo.getPicUrl());
warningRecord.setTimestamp(eventsVo.getTimestamp());
list.add(warningRecord);
}
warningRecordService.saveBatch(list);
System.out.println(callBackVo);
}
}
}

5
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/LiveStreamController.java

@ -7,6 +7,7 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.sample.manage.model.dto.CapacityDeviceDTO;
import org.dromara.sample.manage.model.dto.LiveTypeDTO;
import org.dromara.sample.manage.service.IDeviceRedisService;
import org.dromara.sample.manage.service.ILiveStreamService;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
@ -34,6 +35,9 @@ public class LiveStreamController {
@Autowired
private ObjectMapper mapper;
@Autowired
private IDeviceRedisService deviceRedisService;
/**
* 从数据库中获取当前用户工作区中所有无人机的实时能力数据
* Get live capability data of all drones in the current user's workspace from the database.
@ -59,6 +63,7 @@ public class LiveStreamController {
@PostMapping("/streams/start")
@Operation(summary = "启用直播", description = "启用直播")
public HttpResultResponse liveStart(@RequestBody LiveTypeDTO liveParam) {
return liveStreamService.liveStart(liveParam);
}

280
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java

@ -1,12 +1,27 @@
package org.dromara.sample.manage.controller;
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.seata.common.util.StringUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.implementation.bytecode.Throw;
import org.apache.commons.collections.CollectionUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.dromara.common.redis.utils.RedisOpsUtils;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.mqtt.CommonTopicRequest;
@ -17,12 +32,26 @@ import org.dromara.common.sdk.mqtt.property.PropertySetPublish;
import org.dromara.common.sdk.mqtt.services.ServicesPublish;
import org.dromara.common.sdk.mqtt.services.ServicesReplyReceiver;
import org.dromara.common.sdk.mqtt.services.TopicServicesRequest;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.sample.common.util.Md5Utils;
import org.dromara.sample.feign.RemoteSystemFeign;
import org.dromara.sample.manage.mapper.IDeviceStreamMapper;
import org.dromara.sample.manage.model.dto.*;
import org.dromara.sample.manage.model.entity.DeviceStreamEntity;
import org.dromara.sample.manage.service.IDeviceStreamService;
import org.dromara.sample.media.mapper.IFileMapper;
import org.dromara.system.api.RemoteConfigService;
import org.json.JSONObject;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.*;
import java.util.stream.Collectors;
import static org.apache.commons.compress.utils.ArchiveUtils.sanitize;
import static org.dromara.common.sdk.mqtt.MqttGatewayPublish.DEFAULT_RETRY_COUNT;
import static org.dromara.common.sdk.mqtt.MqttGatewayPublish.DEFAULT_RETRY_TIMEOUT;
@ -50,6 +79,12 @@ public class MegaphoneController {
@DubboReference
private RemoteConfigService remoteConfigService;
@Resource
IDeviceStreamMapper deviceStreamMapper;
@Resource
private RemoteSystemFeign remoteSystemFeign;
/**
* 喊话器-开始播放文档对应遥控器的录音广播模式
* Get the topology list of all online devices in one workspace.
@ -228,6 +263,7 @@ public class MegaphoneController {
*/
@PostMapping("/{workspace_id}/getStreamIp")
@Operation(summary = "获取媒体流ip。", description = "获取媒体流ip。")
@Transactional
public HttpResultResponse getStreamIp(@PathVariable("workspace_id") String workspaceId,
@RequestBody Map<String,Object>objectMap
) {
@ -235,18 +271,91 @@ public class MegaphoneController {
//发送mqtt
String s = remoteConfigService.selectStreamIp();
DisobeyDTO param = Convert.convert(DisobeyDTO.class, objectMap);
if (StringUtils.isNotEmpty(param.getModel())){
String[] split = param.getModel().split(",");
for (String type : split){
List<String> list = new ArrayList<>();
list.add(type);
DisobeyDTO disobeyDTO = new DisobeyDTO();
disobeyDTO.setUrl(s);
disobeyDTO.setOpen(param.getOpen());
disobeyDTO.setType(list);
disobeyDTO.setRtmpUrl(param.getRtmpUrl());
gatewayPublish.publish(top,new CommonTopicRequest<>()
.setData(Objects.requireNonNull(disobeyDTO)),1);
List<DeviceStreamEntity> deviceStreamEntities = deviceStreamMapper.selectList(new QueryWrapper<DeviceStreamEntity>().eq("rtmp_url", param.getRtmpUrl()));
List<String> types = deviceStreamEntities.stream()
.map(DeviceStreamEntity::getStreamType)
.collect(Collectors.toList());
if (param.getOpen() == 1){
// deviceStreamMapper.delete(new QueryWrapper<DeviceStreamEntity>().eq("rtmp_url", param.getRtmpUrl()));
if (StringUtils.isNotEmpty(param.getModel())){
String[] split = param.getModel().split(",");
if (CollectionUtils.isNotEmpty(types) && split.length > types.size()){
//加数据
for (String type : split){
if (!types.contains(type)){
DeviceStreamEntity deviceStreamEntity = new DeviceStreamEntity();
deviceStreamEntity.setStreamType(type);
deviceStreamEntity.setCreateTime(new Date());
deviceStreamEntity.setUpdateTime(new Date());
deviceStreamEntity.setRtmpUrl(param.getRtmpUrl());
deviceStreamMapper.insert(deviceStreamEntity);
List<String> list = new ArrayList<>();
list.add(type);
DisobeyDTO disobeyDTO = new DisobeyDTO();
disobeyDTO.setUrl(s);
disobeyDTO.setOpen(param.getOpen());
disobeyDTO.setType(list);
disobeyDTO.setRtmpUrl(param.getRtmpUrl());
gatewayPublish.publish(top,new CommonTopicRequest<>()
.setData(Objects.requireNonNull(disobeyDTO)),1);
}
}
}else if (CollectionUtils.isNotEmpty(types) && split.length < types.size()){
//删数据
for (String type : types){
List<String> list1 = Arrays.asList(split);
if (!list1.contains(type)){
deviceStreamMapper.delete(new QueryWrapper<DeviceStreamEntity>().eq("rtmp_url", param.getRtmpUrl())
.eq("stream_type", type));
List<String> list = new ArrayList<>();
list.add(type);
DisobeyDTO disobeyDTO = new DisobeyDTO();
disobeyDTO.setUrl(s);
disobeyDTO.setOpen(2);
disobeyDTO.setType(list);
disobeyDTO.setRtmpUrl(param.getRtmpUrl());
gatewayPublish.publish(top,new CommonTopicRequest<>()
.setData(Objects.requireNonNull(disobeyDTO)),1);
}
}
}else {
for (String type : split){
DeviceStreamEntity deviceStreamEntity = new DeviceStreamEntity();
deviceStreamEntity.setStreamType(type);
deviceStreamEntity.setCreateTime(new Date());
deviceStreamEntity.setUpdateTime(new Date());
deviceStreamEntity.setRtmpUrl(param.getRtmpUrl());
deviceStreamMapper.insert(deviceStreamEntity);
List<String> list = new ArrayList<>();
list.add(type);
DisobeyDTO disobeyDTO = new DisobeyDTO();
disobeyDTO.setUrl(s);
disobeyDTO.setOpen(param.getOpen());
disobeyDTO.setType(list);
disobeyDTO.setRtmpUrl(param.getRtmpUrl());
gatewayPublish.publish(top,new CommonTopicRequest<>()
.setData(Objects.requireNonNull(disobeyDTO)),1);
}
}
}
}
if (param.getOpen() == 2){
if (CollectionUtils.isNotEmpty(deviceStreamEntities)){
for (DeviceStreamEntity deviceStreamEntity: deviceStreamEntities){
deviceStreamMapper.delete(new QueryWrapper<DeviceStreamEntity>().eq("rtmp_url", deviceStreamEntity.getRtmpUrl())
.eq("stream_type", deviceStreamEntity.getStreamType()));
List<String> list = new ArrayList<>();
list.add(deviceStreamEntity.getStreamType());
DisobeyDTO disobeyDTO = new DisobeyDTO();
disobeyDTO.setUrl(s);
disobeyDTO.setOpen(param.getOpen());
disobeyDTO.setType(list);
disobeyDTO.setRtmpUrl(param.getRtmpUrl());
gatewayPublish.publish(top,new CommonTopicRequest<>()
.setData(Objects.requireNonNull(disobeyDTO)),1);
}
}
}
return HttpResultResponse.success();
@ -276,4 +385,151 @@ public class MegaphoneController {
MegaphoneDTO megaphoneDTO = (MegaphoneDTO) RedisOpsUtils.get(key);
return HttpResultResponse.success(megaphoneDTO);
}
@GetMapping("/getStreamType")
@Operation(summary = "获取开启的算法类型。", description = "获取开启的算法类型。")
public HttpResultResponse<List<DeviceStreamEntity>> getStreamType(@RequestParam String rtmpUrl
) {
List<DeviceStreamEntity> deviceStreamEntities = deviceStreamMapper.selectList(new LambdaQueryWrapper<DeviceStreamEntity>().eq(DeviceStreamEntity::getRtmpUrl, rtmpUrl));
return HttpResultResponse.success(deviceStreamEntities);
}
/**
* 获取媒体流ip
* Get the topology list of all online devices in one workspace.
* @return
*/
// @PostMapping("/getAlgorithm")
// @Operation(summary = "第三方星罗接口", description = "获取媒体流ip。")
// public HttpResultResponse getAlgorithm(@RequestBody Map<String,Object> objectMap
// ) {
// //获取token
// //设置请求Header和Body(如JSON)
// String md5 = Md5Utils.hash("xuzhou_ai");
// JSONObject jsonObj = new JSONObject();
// jsonObj.put("username", sanitize("xuzhou_ai")); // sanitize函数见下文
// jsonObj.put("password", sanitize(md5));
// String responseBody = PostRequest(jsonObj, "http://60.204.247.65:8100/Third/Login");
// JSONObject jsonObject = new JSONObject(responseBody);
// // 逐层获取 data -> token
// JSONObject data = jsonObject.getJSONObject("data");
// String token = data.getString("token");
// String sceneResponseBody = null;
// String algorithmResponseBody = null;
// //查询用户开通的场景
// if (StringUtils.isNotEmpty(token)){
// try {
// URI uri = new URIBuilder("http://60.204.247.65:8100/V2/AI/WX/User/Scene")
// .build();
// sceneResponseBody = GetRequest(uri, token);
// } catch (URISyntaxException e) {
// throw new RuntimeException(e);
// }
// JSONObject jsonObject1 = new JSONObject(sceneResponseBody);
// // 逐层获取 data -> token
// JSONObject data1 = jsonObject.getJSONObject("data");
// String scene = data1.getString("scene");
//
// //查询场景算法
// List<String> extra_type_list = new ArrayList<>();
// try {
// URI uri = new URIBuilder("http://60.204.247.65:8100/V2/AI/WX/User/ExtraType/Get")
// .addParameter("scene",scene)
// .addParameter("if_open","1")
// .build();
// algorithmResponseBody = GetRequest(uri, token);
// ObjectMapper mapper = new ObjectMapper();
// ExtraTypeResponse response = mapper.readValue(algorithmResponseBody,ExtraTypeResponse.class);
// List<ExtraType> list = response.getData();
// for (ExtraType extraType : list) {
// extra_type_list.add(extraType.getExtra_type());
// break;
// }
// } catch (URISyntaxException | JsonProcessingException e) {
// throw new RuntimeException(e);
// }
//
// JSONObject jsonObj2 = new JSONObject();
// jsonObj2.put("scene", scene); // sanitize函数见下文
// jsonObj2.put("callback_url", objectMap.get("callback_url"));
// jsonObj2.put("input_url", objectMap.get("input_url"));
// jsonObj2.put("push_url", objectMap.get("push_url"));
// jsonObj2.put("play_url", objectMap.get("play_url"));
// String responseBody2 = PostRequest(jsonObj2, "http://60.204.247.65:8100/Third/Engine/Start");
// JSONObject jsonObject2 = new JSONObject(responseBody2);
// }
//
// return HttpResultResponse.success();
// }
//
//
// public String PostRequest( JSONObject jsonObj, String url
// ) {
// try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// // 1. 创建POST请求对象
// HttpPost post = new HttpPost(url);
// StringEntity requestEntity = new StringEntity(jsonObj.toString(), "UTF-8");
// requestEntity.setContentType("application/json");
// post.setEntity(requestEntity);
// post.setHeader("Accept", "application/json");
// // 3. 执行请求并获取响应
// try (CloseableHttpResponse response = httpClient.execute(post)) {
// String responseBody = EntityUtils.toString(response.getEntity());
// if (response.getStatusLine().getStatusCode() == 200) {
// return responseBody;
// } else {
// throw new RuntimeException("第三方接口调用失败!");
// }
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// return null;
//
// }
//
// public String GetRequest(URI uri, String token
// ) {
// try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
//// URI uri = new URIBuilder("https://api.example.com/data")
//// .addParameter("param1", "value1")
//// .addParameter("param2", "value2")
//// .build();
// HttpGet httpGet = new HttpGet(uri);
// httpGet.setHeader("token",token);
// try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
// // 处理响应
// String responseBody = EntityUtils.toString(response.getEntity());
// if (response.getStatusLine().getStatusCode() == 200){
// return responseBody;
// }else {
// throw new RuntimeException("第三方接口调用失败!");
// }
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// return null;
//
// }
@GetMapping("/streams")
@Operation(summary = "获取媒体流ip。", description = "获取媒体流ip。")
@Transactional
public HttpResultResponse<List<String>> streams (@RequestParam String deviceSn
) {
List<String> list = remoteSystemFeign.selectStreamType(deviceSn);
List<String> list1 = new ArrayList<>();
if (CollectionUtils.isNotEmpty(list)){
for (String s : list){
String[] split = s.split(",");
list1.add(split[2]);
}
}
return HttpResultResponse.success(list1);
}
}

19
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/PlayTextController.java

@ -1,24 +1,31 @@
package org.dromara.sample.manage.controller;
import cn.hutool.core.convert.Convert;
import io.seata.common.util.StringUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.common.sdk.mqtt.CommonTopicRequest;
import org.dromara.common.sdk.mqtt.MegaphoneTopicRequest;
import org.dromara.common.sdk.mqtt.MqttGatewayPublish;
import org.dromara.common.sdk.mqtt.TopicConst;
import org.dromara.sample.manage.model.dto.DeviceDTO;
import org.dromara.sample.manage.model.dto.StreamTypeDTO;
import org.dromara.sample.manage.model.dto.TextDTO;
import org.dromara.sample.manage.model.entity.PlayTextEntity;
import org.dromara.sample.manage.service.IDeviceService;
import org.dromara.sample.manage.service.IPlayTextService;
import org.dromara.system.api.RemoteConfigService;
import org.dromara.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
@ -37,6 +44,8 @@ public class PlayTextController {
@Autowired
private IPlayTextService playTextService;
/**
* 获取一个工作区中所有在线设备的列表
* Get the topology list of all online devices in one workspace.
@ -73,5 +82,15 @@ public class PlayTextController {
return HttpResultResponse.success(pageText);
}
@PostMapping("/streamType")
@Operation(summary = "获取媒体流算法类型。", description = "获取媒体流算法类型。")
public HttpResultResponse grtStreamType(@RequestBody Map<String,Object> objectMap
) {
return playTextService.streamType(objectMap);
}
}

7
dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/DeviceFlightRecordsMapper.java

@ -0,0 +1,7 @@
package org.dromara.sample.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.dromara.sample.manage.model.entity.DeviceFlightRecordsEntity;
public interface DeviceFlightRecordsMapper extends BaseMapper<DeviceFlightRecordsEntity> {
}

15
dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/IDeviceStreamMapper.java

@ -0,0 +1,15 @@
package org.dromara.sample.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.dromara.sample.manage.model.entity.DeviceStreamEntity;
import org.dromara.sample.manage.model.entity.PlayTextEntity;
/**
*
* @author sean.zhou
* @date 2021/11/10
* @version 0.1
*/
public interface IDeviceStreamMapper extends BaseMapper<DeviceStreamEntity> {
}

16
dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/IEngineRecordMapper.java

@ -0,0 +1,16 @@
package org.dromara.sample.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.dromara.sample.manage.model.entity.DeviceEntity;
import org.dromara.sample.manage.model.entity.EngineRecordEntity;
/**
*
* @author sean.zhou
* @date 2021/11/10
* @version 0.1
*/
public interface IEngineRecordMapper extends BaseMapper<EngineRecordEntity> {
}

18
dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/WarningRecordMapper.java

@ -0,0 +1,18 @@
package org.dromara.sample.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.dromara.sample.manage.model.entity.WarningRecordEntity;
/**
* 设备对象-用于存储设备Mapper接口
*
* @author wuyuan
* @date 2022-10-25
*/
@Mapper
public interface WarningRecordMapper extends BaseMapper<WarningRecordEntity> {
}

30
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/CallBackDTO.java

@ -0,0 +1,30 @@
package org.dromara.sample.manage.model.dto;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
/**
* 设备对象-用于存储设备对象 iot_device
*
* @author wuyuan
* @date 2022-10-25
*/
@TableName("iot_device")
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class CallBackDTO implements Serializable {
//任务 id
private String taskId;
//检测事件列表
private List<EventsDTO> events;
}

12
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/DeviceProDTO.java

@ -43,5 +43,15 @@ public class DeviceProDTO {
/**
分配人员
*/
private Integer userId;
private Long userId;
/**
* 设备组编码
*/
private String bind_code;
/**
* 设备组名称
*/
private String pro_name;
}

31
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/Engine.java

@ -0,0 +1,31 @@
package org.dromara.sample.manage.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* The entity class of the device
*
* @author sean.zhou
* @version 0.1
* @date 2021/11/10
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Engine implements Serializable {
private String task_id;
private String mission_batch;
}

31
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/EngineResponse.java

@ -0,0 +1,31 @@
package org.dromara.sample.manage.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* The entity class of the device
*
* @author sean.zhou
* @version 0.1
* @date 2021/11/10
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class EngineResponse implements Serializable {
private Long code;
private String message;
private Engine data;
}

45
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/EventsDTO.java

@ -0,0 +1,45 @@
package org.dromara.sample.manage.model.dto;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
/**
* 设备对象-用于存储设备对象 iot_device
*
* @author wuyuan
* @date 2022-10-25
*/
@TableName("iot_device")
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class EventsDTO implements Serializable {
//算法 id")
private Integer algoId;
//算法类型字符串")
private String extraType;
//分配的事件 id")
private String eventId;
//保存后图片的 url")
private String picUrl;
//事件时间戳,单位:毫秒")
private Integer timestamp;
//检测事件列表")
private List<ObjectsDTO> objects;
}

46
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/ExtraType.java

@ -0,0 +1,46 @@
package org.dromara.sample.manage.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* The entity class of the device
*
* @author sean.zhou
* @version 0.1
* @date 2021/11/10
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ExtraType implements Serializable {
private Long id;
private String sence;
private String type;
private String extra_type;
private String model;
private String user;
private int difficult;
private int if_open;
private int sence_id;
private Double conf;
private int aiConfig;
}

31
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/ExtraTypeResponse.java

@ -0,0 +1,31 @@
package org.dromara.sample.manage.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* The entity class of the device
*
* @author sean.zhou
* @version 0.1
* @date 2021/11/10
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ExtraTypeResponse implements Serializable {
private Long code;
private String message;
private List<ExtraType> data;
}

49
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/ObjectsDTO.java

@ -0,0 +1,49 @@
package org.dromara.sample.manage.model.dto;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 设备对象-用于存储设备对象 iot_device
*
* @author wuyuan
* @date 2022-10-25
*/
@TableName("iot_device")
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ObjectsDTO implements Serializable {
//画面运动方向角度,-180度 到 180度")
private String anglePx;
//属性截图,base64编码")
private String attrImage;
//属性名称,车牌,人脸,或其他")
private String attrName;
//属性文字")
private String attrText;
//类别唯一ID")
private String classId;
//画面像素速度,单位(像素/秒)")
private Integer speedPx;
//追踪ID")
private String trackId;
//目标中心X")
private Integer x;
//目标中心Y")
private Integer y;
}

37
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/StreamTypeDTO.java

@ -0,0 +1,37 @@
package org.dromara.sample.manage.model.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.util.List;
/**
* @author sean.zhou
* @version 0.1
* @date 2021/11/23
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class StreamTypeDTO {
private String jobId;
private String jobName;
private String labelCn;
private String labelEn;
private Long deptId;
private String deptName;
private String deviceSn;
private String lat;
private String lng;
private String images;
}

45
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceFlightRecordsEntity.java

@ -0,0 +1,45 @@
package org.dromara.sample.manage.model.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "device_flight_records")
public class DeviceFlightRecordsEntity {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 机场sn
*/
private String deviceSn;
/**
* 飞行总架次
*/
private Integer flyCount;
/**
* 飞行总时长
*/
private Integer flyAccTime;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
}

2
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceProEntity.java

@ -37,7 +37,7 @@ public class DeviceProEntity extends BaseEntity implements Serializable {
private String bindCode;
@TableField(value = "bind_type")
private Integer bindType;
private Boolean bindType;
@TableField(value = "workspace_id")
private String workspaceId;

43
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceStreamEntity.java

@ -0,0 +1,43 @@
package org.dromara.sample.manage.model.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* The entity class of the device
*
* @author sean.zhou
* @version 0.1
* @date 2021/11/10
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "manage_device_stream")
public class DeviceStreamEntity implements Serializable {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField(value = "rtmp_url")
private String rtmpUrl;
@TableField(value = "stream_type")
private String streamType;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}

48
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/EngineRecordEntity.java

@ -0,0 +1,48 @@
package org.dromara.sample.manage.model.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
* The entity class of the EngineRecord
*
* @author sean.zhou
* @version 0.1
* @date 2021/11/10
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "engine_record")
public class EngineRecordEntity implements Serializable {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField(value = "device_sn")
private String deviceSn;
@TableField(value = "extra_type")
private String extraType;
@TableField(value = "task_id")
private String taskId;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(value = "push_url")
private String pushUrl;
}

55
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/WarningRecordEntity.java

@ -0,0 +1,55 @@
package org.dromara.sample.manage.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 设备对象-用于存储设备对象 iot_device
*
* @author wuyuan
* @date 2022-10-25
*/
@TableName("warning_record")
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class WarningRecordEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private String id;
@TableField(value = "task_id")
private String taskId;
@TableField(value = "algo_id")
//算法 id")
private Integer algoId;
@TableField(value = "extra_type")
//算法类型字符串")
private String extraType;
@TableField(value = "event_id")
//分配的事件 id")
private String eventId;
@TableField(value = "pic_url")
//保存后图片的 url")
private String picUrl;
@TableField(value = "timestamp")
//事件时间戳,单位:毫秒")
private Integer timestamp;
}

15
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceFlightRecordsService.java

@ -0,0 +1,15 @@
package org.dromara.sample.manage.service;
import org.dromara.sample.manage.model.entity.DeviceFlightRecordsEntity;
import java.util.List;
import java.util.Map;
public interface IDeviceFlightRecordsService {
void saveDeviceFlight(DeviceFlightRecordsEntity deviceFlightRecords);
Map<String,Integer> getDeviceFlightCount();
}

13
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceProService.java

@ -43,4 +43,17 @@ public interface IDeviceProService {
List<Integer> listDeviceGroup(Long userId);
List<String> listDevice(Long userId);
List<DeviceProEntity> listDevicePro();
Boolean enablePro(Integer proId);
Boolean disablePro(Integer proId);
PaginationData<DeviceProUserEntity> pageProUser(String searchValue, Integer proId,Page<DeviceProUserEntity> pageQuery);
Boolean deleteProUser(Long proUserId, Integer proId);
List<DeviceProEntity> listUserGroup();
}

9
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceRedisService.java

@ -1,6 +1,7 @@
package org.dromara.sample.manage.service;
import org.dromara.common.sdk.cloudapi.device.OsdDockDrone;
import org.dromara.common.sdk.cloudapi.device.VideoId;
import org.dromara.common.sdk.cloudapi.firmware.OtaProgress;
import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.manage.model.dto.DeviceDTO;
@ -126,4 +127,12 @@ public interface IDeviceRedisService {
*/
List<OsdDockDrone> getDevicesOsdInfo(List<String> snList);
Boolean checkDeviceVideo(String sn);
void setDeviceVideo(String sn, Object data);
Optional<VideoId> getDeviceVideo(String sn, Object data);
Boolean delDeviceVideo(String sn);
}

4
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceService.java

@ -11,6 +11,7 @@ import org.dromara.common.websocket.dto.BizCodeEnum;
import org.dromara.sample.manage.model.dto.DeviceDTO;
import org.dromara.sample.manage.model.dto.DeviceFirmwareUpgradeDTO;
import org.dromara.sample.manage.model.dto.TopologyDeviceDTO;
import org.dromara.sample.manage.model.entity.DeviceEntity;
import org.dromara.sample.manage.model.param.DeviceQueryParam;
import com.fasterxml.jackson.databind.JsonNode;
@ -36,6 +37,7 @@ public interface IDeviceService {
*/
void gatewayOffline(String gatewaySn);
/**
* Subscribe to the topic of the gateway when the gateway device goes online, and unsubscribe from the topic of the sub-device.
* @param gateway
@ -144,6 +146,8 @@ public interface IDeviceService {
*/
Optional<DeviceDTO> getDeviceBySn(String sn);
DeviceEntity getDeviceByChildSn(String childSn);
/**
* Create job for device firmware updates.
* @param workspaceId

17
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceStreamService.java

@ -0,0 +1,17 @@
package org.dromara.sample.manage.service;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.sample.manage.model.entity.PlayTextEntity;
import java.util.Map;
/**
* @author sean.zhou
* @date 2021/11/10
* @version 0.1
*/
public interface IDeviceStreamService {
}

32
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IEngineRecordService.java

@ -0,0 +1,32 @@
package org.dromara.sample.manage.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import org.dromara.common.sdk.cloudapi.device.ControlSourceEnum;
import org.dromara.common.sdk.cloudapi.device.DeviceOsdHost;
import org.dromara.common.sdk.cloudapi.device.DockModeCodeEnum;
import org.dromara.common.sdk.cloudapi.device.DroneModeCodeEnum;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.common.sdk.config.version.GatewayManager;
import org.dromara.common.websocket.dto.BizCodeEnum;
import org.dromara.sample.manage.model.dto.DeviceDTO;
import org.dromara.sample.manage.model.dto.DeviceFirmwareUpgradeDTO;
import org.dromara.sample.manage.model.dto.TopologyDeviceDTO;
import org.dromara.sample.manage.model.param.DeviceQueryParam;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @author sean.zhou
* @date 2021/11/10
* @version 0.1
*/
public interface IEngineRecordService {
Map<String,Object> startEngine(Map<String,Object> objectMap);
void closeEngine(Map<String,Object> objectMap);
}

3
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IPlayTextService.java

@ -17,6 +17,7 @@ import org.dromara.sample.manage.model.entity.PlayTextEntity;
import org.dromara.sample.manage.model.param.DeviceQueryParam;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
@ -34,4 +35,6 @@ public interface IPlayTextService {
PaginationData<PlayTextEntity> pageText(Long page, Long pageSize);
HttpResultResponse streamType(Map<String,Object> objectMap);
}

15
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IWarningRecordService.java

@ -0,0 +1,15 @@
package org.dromara.sample.manage.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.sample.manage.model.entity.WarningRecordEntity;
/**
* 设备对象-用于存储设备Service接口
*
* @author wuyuan
* @date 2022-10-25
*/
public interface IWarningRecordService extends IService<WarningRecordEntity>{
}

58
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceFlightRecordsServiceImpl.java

@ -0,0 +1,58 @@
package org.dromara.sample.manage.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.sample.manage.mapper.DeviceFlightRecordsMapper;
import org.dromara.sample.manage.model.entity.DeviceFlightRecordsEntity;
import org.dromara.sample.manage.service.IDeviceFlightRecordsService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class DeviceFlightRecordsServiceImpl extends ServiceImpl<DeviceFlightRecordsMapper,DeviceFlightRecordsEntity> implements IDeviceFlightRecordsService {
@Override
public void saveDeviceFlight(DeviceFlightRecordsEntity deviceFlightRecords) {
//查询之前的数据
DeviceFlightRecordsEntity deviceFlightRecordsEntities = this.baseMapper.selectOne(new LambdaQueryWrapper<DeviceFlightRecordsEntity>().eq(DeviceFlightRecordsEntity::getDeviceSn,deviceFlightRecords.getDeviceSn()));
if (ObjectUtil.isNotEmpty(deviceFlightRecordsEntities)) {
deviceFlightRecordsEntities.setFlyCount(deviceFlightRecordsEntities.getFlyCount() + deviceFlightRecords.getFlyCount());
deviceFlightRecordsEntities.setFlyAccTime(deviceFlightRecordsEntities.getFlyAccTime() + deviceFlightRecords.getFlyAccTime());
this.updateById(deviceFlightRecordsEntities);
}else {
this.save(deviceFlightRecords);
}
}
@Override
public Map<String,Integer> getDeviceFlightCount() {
Map<String,Integer> resultMap = new HashMap<>();
List<DeviceFlightRecordsEntity> deviceFlightRecordsEntities = this.baseMapper.selectList(new LambdaQueryWrapper<>());
int flyCount = deviceFlightRecordsEntities.stream()
.map(DeviceFlightRecordsEntity::getFlyCount)
.reduce(0, Integer::sum);
int flyAccTime = deviceFlightRecordsEntities.stream()
.map(DeviceFlightRecordsEntity::getFlyAccTime)
.reduce(0, Integer::sum);
resultMap.put("flyCount",flyCount);
resultMap.put("flyAccTime",flyAccTime);
return resultMap;
}
}

171
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceProServiceImpl.java

@ -58,7 +58,9 @@ import org.dromara.sample.manage.model.param.DeviceQueryParam;
import org.dromara.sample.manage.model.receiver.BasicDeviceProperty;
import org.dromara.sample.manage.service.*;
import org.dromara.sample.websocket.service.IWebSocketMessageService;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.system.api.model.LoginUser;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -88,7 +90,6 @@ public class DeviceProServiceImpl implements IDeviceProService {
@Autowired
private IDeviceProUserMapper deviceProUserMapper;
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public PaginationData<DeviceProEntity> listDeviceProEntityMap(Page page, DeviceProDTO deviceProDTO) {
@ -100,10 +101,13 @@ public class DeviceProServiceImpl implements IDeviceProService {
@Override
public Boolean updateDevicePro(DeviceProEntity deviceProEntity) {
if(ObjectUtil.isNotEmpty(deviceProEntity.getId())){
DeviceProEntity devicePro = deviceProMapper.selectById(deviceProEntity.getId());
BeanUtils.copyProperties(deviceProEntity, devicePro);
return deviceProMapper.updateById(deviceProEntity) > 0 ;
}else {
deviceProEntity.setDeptName(LoginHelper.getDeptName());
deviceProEntity.setNickName(LoginHelper.getUsername());
deviceProEntity.setNickName(LoginHelper.getLoginUser().getNickname());
return deviceProMapper.insert(deviceProEntity) > 0;
}
}
@ -119,10 +123,6 @@ public class DeviceProServiceImpl implements IDeviceProService {
});
//todo人员是否要删除
List<DeviceProUserEntity> proUserEntityList = deviceProUserMapper.selectList(new LambdaQueryWrapper<DeviceProUserEntity>().in(DeviceProUserEntity::getDeviceProId, ids));
return deviceProMapper.deleteByIds(ids)>0;
}
@ -130,76 +130,16 @@ public class DeviceProServiceImpl implements IDeviceProService {
@Transactional(rollbackFor = Exception.class)
public Boolean updateDeviceProUser(List<DeviceProUserEntity> userEntity,Integer proId) {
try {
//获取项目组信息
DeviceProEntity deviceProEntity = deviceProMapper.selectOne(new LambdaQueryWrapper<DeviceProEntity>().eq(DeviceProEntity::getId, proId));
//查询之前项目所属的人员信息
List<DeviceProUserEntity> proUserEntityList = deviceProUserMapper.selectList(new LambdaQueryWrapper<DeviceProUserEntity>().eq(DeviceProUserEntity::getDeviceProId, proId));
List<DeviceProUserEntity> difference = new ArrayList<>();
// 判断两个集合的差值(基于 userId)
difference = proUserEntityList.stream()
.filter(proUser -> userEntity.stream()
.noneMatch(user -> user.getUserId().equals(proUser.getUserId())))
List<DeviceProUserEntity> different = userEntity.stream()
.filter(user -> proUserEntityList.stream().noneMatch(u -> u.getUserId().equals(user.getUserId())))
.toList();
//--------------------------------------------缓存相关操作----------------------------------------------------------------
//人员如果解绑了项目删除缓存数据
difference.forEach(proUserEntity -> {
//删除人员项目组信息
List<Object> projects = RedisUtils.getCacheList(String.format(Constants.PRO_GROUP, proUserEntity.getUserId()));
List<Map> projectList = projects.stream()
.filter(Map.class::isInstance)
.map(Map.class::cast)
.toList();
//删除人员中所拥有的当前的项目组,然后构建新的存入redis
List<Map> deviceProEntities = projectList.stream().filter(p -> !Integer.valueOf(p.get("id") + "").equals(proId)).toList();
//删除
RedisUtils.deleteObject(String.format(Constants.PRO_GROUP, proUserEntity.getUserId()));
//重新插入
RedisUtils.setCacheList(String.format(Constants.PRO_GROUP, proUserEntity.getUserId()),deviceProEntities);
//删除人员所拥有的设备信息
List<Object> cacheList = RedisUtils.getCacheList(String.format(Constants.PRO_DEVICE, proUserEntity.getUserId()));
List<Map> deviceList = cacheList.stream()
.filter(Map.class::isInstance)
.map(Map.class::cast)
.toList();
//过滤除了这个删除的项目组之外的设备
deviceList = deviceList.stream().filter(p-> !Integer.valueOf(p.get("proId") + "").equals(proId)).toList();
//删除
RedisUtils.deleteObject(String.format(Constants.PRO_DEVICE, proUserEntity.getUserId()));
RedisUtils.setCacheList(String.format(Constants.PRO_DEVICE, proUserEntity.getUserId()),deviceList);
});
//--------------------------------------------缓存相关操作----------------------------------------------------------------
//先清除原来的项目组成员
deviceProUserMapper.delete(new LambdaQueryWrapper<DeviceProUserEntity>().eq(DeviceProUserEntity::getDeviceProId, proId));
if (ObjectUtil.isNotEmpty(userEntity)) {
if (ObjectUtil.isNotEmpty(different)){
//添加新的项目组成员
deviceProUserMapper.insert(userEntity);
//更新缓存记录
userEntity.forEach(proUserEntity -> {
List<Object> projects = RedisUtils.getCacheList(String.format(Constants.PRO_GROUP, proUserEntity.getUserId()));
List<Map> projectList = projects.stream()
.filter(Map.class::isInstance)
.map(Map.class::cast)
.toList();
if (!projectList.stream().anyMatch(p-> Integer.valueOf(p.get("id") + "").equals(proUserEntity.getDeviceProId()))){
Map proMap = objectMapper.convertValue(deviceProEntity, Map.class);
RedisUtils.addCacheList(String.format(Constants.PRO_GROUP, proUserEntity.getUserId()), proMap);
}
});
deviceProUserMapper.insert(different);
}
return true;
@ -229,29 +169,11 @@ public class DeviceProServiceImpl implements IDeviceProService {
wrapper.set(DeviceEntity::getProId, proId);
wrapper.eq(DeviceEntity::getId, deviceId);
if (deviceMapper.update(wrapper) > 0) {
DeviceEntity deviceEntity = deviceMapper.selectOne(new LambdaQueryWrapper<DeviceEntity>().eq(DeviceEntity::getId, deviceId));
//根据proid获取人员用于存储人员的设备权限
List<DeviceProUserEntity> proUserEntityList = deviceProUserMapper.selectList(new LambdaQueryWrapper<DeviceProUserEntity>().eq(DeviceProUserEntity::getDeviceProId, proId));
proUserEntityList.forEach(deviceProUserEntity -> {
List<Object> devices = RedisUtils.getCacheList(String.format(Constants.PRO_DEVICE, deviceProUserEntity.getUserId()));
List<Map> deviceList = devices.stream()
.filter(Map.class::isInstance)
.map(Map.class::cast)
.toList();
if (!deviceList.stream().anyMatch(p-> Integer.valueOf(p.get("id") + "").equals(deviceEntity.getId()))){
Map deviceMap = objectMapper.convertValue(deviceEntity, Map.class);
RedisUtils.addCacheList(String.format(Constants.PRO_DEVICE, deviceProUserEntity.getUserId()), deviceMap);
}
});
}
return deviceMapper.update(wrapper) > 0;
} catch (Exception e) {
return false;
}
return true;
}
/**
@ -268,6 +190,8 @@ public class DeviceProServiceImpl implements IDeviceProService {
List<Integer> proIdList = proUserEntityList.stream().map(DeviceProUserEntity::getDeviceProId).distinct().toList();
LambdaQueryWrapper<DeviceProEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(DeviceProEntity::getId, proIdList);
//查询是否启用的设备组
queryWrapper.eq(DeviceProEntity::getBindType,1);
return deviceProMapper.selectList(queryWrapper).stream().map(DeviceProEntity::getId).distinct().toList();
}
@ -295,6 +219,73 @@ public class DeviceProServiceImpl implements IDeviceProService {
return ListUtil.empty();
}
@Override
public List<DeviceProEntity> listDevicePro() {
return deviceProMapper.selectList(new LambdaQueryWrapper<DeviceProEntity>());
}
@Override
public Boolean enablePro(Integer proId) {
LambdaUpdateWrapper<DeviceProEntity> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(DeviceProEntity::getId, proId);
wrapper.set(DeviceProEntity::getBindType,1);
return this.deviceProMapper.update(wrapper) > 0;
}
@Override
public Boolean disablePro(Integer proId) {
LambdaUpdateWrapper<DeviceProEntity> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(DeviceProEntity::getId, proId);
wrapper.set(DeviceProEntity::getBindType,0);
return this.deviceProMapper.update(wrapper) > 0;
}
@Override
public PaginationData<DeviceProUserEntity> pageProUser(String searchValue, Integer proId,Page<DeviceProUserEntity> pageQuery) {
LambdaQueryWrapper<DeviceProUserEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DeviceProUserEntity::getDeviceProId,proId);
if (ObjectUtil.isNotEmpty(searchValue)){
wrapper.like(DeviceProUserEntity::getNickName,searchValue);
}
Page<DeviceProUserEntity> pagination = deviceProUserMapper.selectPage(pageQuery, wrapper);
return new PaginationData<DeviceProUserEntity>(pagination.getRecords(), new Pagination(pagination.getCurrent(), pagination.getSize(), pagination.getTotal()));
}
@Override
public Boolean deleteProUser(Long proUserId, Integer proId) {
LambdaQueryWrapper<DeviceProUserEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DeviceProUserEntity::getDeviceProId,proId);
wrapper.eq(DeviceProUserEntity::getId,proUserId);
return deviceProUserMapper.delete(wrapper) > 0;
}
@Override
public List<DeviceProEntity> listUserGroup() {
Long userId = LoginHelper.getUserId();
LambdaQueryWrapper<DeviceProUserEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DeviceProUserEntity::getUserId,userId);
List<DeviceProUserEntity> proUserEntityList = deviceProUserMapper.selectList(wrapper);
if (ObjectUtil.isNotEmpty(proUserEntityList)){
List<Integer> proIdList = proUserEntityList.stream().map(DeviceProUserEntity::getDeviceProId).distinct().toList();
LambdaQueryWrapper<DeviceProEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(DeviceProEntity::getId, proIdList);
//查询是否启用的设备组
queryWrapper.eq(DeviceProEntity::getBindType,1);
return deviceProMapper.selectList(queryWrapper);
}
return ListUtil.empty();
}
@Override
public Boolean saveAndUpdate(DeviceProEntity entity) {
boolean flag = true;

4
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceQrtzServiceImpl.java

@ -13,7 +13,7 @@ import org.dromara.common.redis.utils.RedisOpsUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.sdk.cloudapi.wayline.*;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.sample.fegin.RemoteBusinessTaskFeign;
import org.dromara.sample.feign.RemoteBusinessTaskFeign;
import org.dromara.sample.manage.mapper.IDeviceQrtzDateMapper;
import org.dromara.sample.manage.mapper.IDeviceQrtzFileMapper;
import org.dromara.sample.manage.mapper.IDeviceQrtzMapper;
@ -239,6 +239,7 @@ public class DeviceQrtzServiceImpl implements IDeviceQrtzService {
entity.setWaylineId(e.getWaylineId());
entity.setWaylineName(e.getWaylineName());
entity.setSort(e.getSort());
entity.setDeviceSn(e.getDeviceSn());
entity.setStatus(DeviceQrtzConstants.QRTZ_FILE_STATUS_1);
entity.setExecDate(Convert.toDate(endDate));
LoginUser loginUser = LoginHelper.getLoginUser();
@ -327,6 +328,7 @@ public class DeviceQrtzServiceImpl implements IDeviceQrtzService {
HttpResultResponse httpResultResponse = flightTaskService.publishFlightTask(device.getWorkspaceId(), createJobParam, deviceQrtzFileEntity.getNickName());
if(httpResultResponse.getCode() == 0){
deviceQrtzFileEntity.setStatus(DeviceQrtzConstants.QRTZ_FILE_STATUS_2);
deviceQrtzFileEntity.setFlightDate(new Date());
deviceQrtzFileMapper.updateById(deviceQrtzFileEntity);
continue;
}

23
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceRedisServiceImpl.java

@ -2,7 +2,9 @@ package org.dromara.sample.manage.service.impl;
import org.dromara.common.redis.config.RedisConst;
import org.dromara.common.redis.utils.RedisOpsUtils;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.sdk.cloudapi.device.OsdDockDrone;
import org.dromara.common.sdk.cloudapi.device.VideoId;
import org.dromara.common.sdk.cloudapi.firmware.OtaProgress;
import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.manage.model.dto.DeviceDTO;
@ -133,4 +135,25 @@ public class DeviceRedisServiceImpl implements IDeviceRedisService {
return resultList;
}
@Override
public Boolean checkDeviceVideo(String sn) {
return RedisOpsUtils.checkExist(RedisConst.VIDEO_STATUS + sn) && RedisOpsUtils.getExpire(RedisConst.VIDEO_STATUS + sn) > 0;
}
@Override
public void setDeviceVideo(String sn, Object data) {
RedisOpsUtils.setWithExpire(RedisConst.VIDEO_STATUS + sn, data, RedisConst.DEVICE_VIDEO_STATUE_SECOND);
}
@Override
public Optional<VideoId> getDeviceVideo(String sn, Object data) {
return Optional.ofNullable((VideoId) RedisOpsUtils.get(RedisConst.VIDEO_STATUS + sn));
}
@Override
public Boolean delDeviceVideo(String sn) {
return RedisOpsUtils.del(RedisConst.VIDEO_STATUS +sn);
}
}

23
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceServiceImpl.java

@ -1,5 +1,6 @@
package org.dromara.sample.manage.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -404,7 +405,7 @@ public class DeviceServiceImpl implements IDeviceService {
.map(WorkspaceDTO::getWorkspaceName).orElse("") : "")
.firmwareStatus(DeviceFirmwareStatusEnum.NOT_UPGRADE)
.videoId(dockVideoId)
.thingVersion(entity.getVersion()).build();
.thingVersion(entity.getVersion()).proId(ObjectUtil.isNotEmpty(entity.getProId())?String.valueOf(entity.getProId()):"").build();
} catch (CloudSDKException e) {
log.error(e.getLocalizedMessage() + "Entity: {}", entity);
}
@ -550,9 +551,27 @@ public class DeviceServiceImpl implements IDeviceService {
}
DeviceDTO device = devicesList.get(0);
device.setStatus(deviceRedisService.checkDeviceOnline(sn));
if (StringUtils.hasText(device.getChildDeviceSn())) {
Optional<DeviceDTO> childOpt = this.getDeviceBySn(device.getChildDeviceSn());
childOpt.ifPresent(child -> {
child.setStatus(deviceRedisService.checkDeviceOnline(child.getDeviceSn()));
child.setWorkspaceName(device.getWorkspaceName());
device.setChildren(child);
});
}
if(device.getProId() != null){
DeviceProEntity deviceProEntitie = deviceProMapper.selectOne(new LambdaQueryWrapper<DeviceProEntity>().eq(DeviceProEntity::getId, device.getProId()));
device.setDeviceProEntity(deviceProEntitie);
}
return Optional.of(device);
}
@Override
public DeviceEntity getDeviceByChildSn(String childSn) {
DeviceEntity deviceEntity = mapper.selectOne(new LambdaQueryWrapper<DeviceEntity>().eq(DeviceEntity::getChildSn, childSn));
return deviceEntity;
}
@Override
public HttpResultResponse createDeviceOtaJob(String workspaceId, List<DeviceFirmwareUpgradeDTO> upgradeDTOS) {
List<OtaCreateDevice> deviceOtaFirmwares = deviceFirmwareService.getDeviceOtaFirmware(workspaceId, upgradeDTOS);
@ -709,7 +728,7 @@ public class DeviceServiceImpl implements IDeviceService {
.firmwareVersion(dto.getFirmwareVersion())
.compatibleStatus(dto.getFirmwareStatus() == null ? null :
DeviceFirmwareStatusEnum.CONSISTENT_UPGRADE != dto.getFirmwareStatus())
.deviceDesc(dto.getDeviceDesc())
.deviceDesc(dto.getDeviceDesc()).proId(ObjectUtil.isNotEmpty(dto.getProId())?Integer.valueOf(dto.getProId()):null)
.build();
}
}

44
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceStreamServiceImpl.java

@ -0,0 +1,44 @@
package org.dromara.sample.manage.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.Pagination;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.common.sdk.mqtt.CommonTopicRequest;
import org.dromara.common.sdk.mqtt.MqttGatewayPublish;
import org.dromara.sample.feign.RemoteSystemFeign;
import org.dromara.sample.manage.mapper.IPlayTextMapper;
import org.dromara.sample.manage.model.dto.StreamTypeDTO;
import org.dromara.sample.manage.model.entity.PlayTextEntity;
import org.dromara.sample.manage.service.IDeviceStreamService;
import org.dromara.sample.manage.service.IPlayTextService;
import org.dromara.system.api.RemoteConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
/**
*
* @author sean.zhou
* @version 0.1
* @date 2021/11/10
*/
@Service
@Slf4j
@Transactional
public class DeviceStreamServiceImpl implements IDeviceStreamService {
}

246
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/EngineRecordServiceImpl.java

@ -0,0 +1,246 @@
package org.dromara.sample.manage.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.seata.common.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.dromara.common.sdk.cloudapi.device.*;
import org.dromara.common.sdk.cloudapi.firmware.*;
import org.dromara.common.sdk.cloudapi.firmware.api.AbstractFirmwareService;
import org.dromara.common.sdk.cloudapi.property.api.AbstractPropertyService;
import org.dromara.common.sdk.cloudapi.tsa.DeviceIconUrl;
import org.dromara.common.sdk.cloudapi.tsa.TopologyDeviceModel;
import org.dromara.common.sdk.common.*;
import org.dromara.common.sdk.config.version.GatewayManager;
import org.dromara.common.sdk.exception.CloudSDKException;
import org.dromara.common.sdk.mqtt.IMqttTopicService;
import org.dromara.common.sdk.mqtt.MqttGatewayPublish;
import org.dromara.common.sdk.mqtt.events.EventsSubscribe;
import org.dromara.common.sdk.mqtt.osd.OsdSubscribe;
import org.dromara.common.sdk.mqtt.property.PropertySetReplyResultEnum;
import org.dromara.common.sdk.mqtt.property.PropertySetSubscribe;
import org.dromara.common.sdk.mqtt.requests.RequestsSubscribe;
import org.dromara.common.sdk.mqtt.services.ServicesReplyData;
import org.dromara.common.sdk.mqtt.services.ServicesSubscribe;
import org.dromara.common.sdk.mqtt.services.TopicServicesResponse;
import org.dromara.common.sdk.mqtt.state.StateSubscribe;
import org.dromara.common.sdk.mqtt.status.StatusSubscribe;
import org.dromara.common.websocket.dto.BizCodeEnum;
import org.dromara.sample.common.error.CommonErrorEnum;
import org.dromara.sample.common.util.Md5Utils;
import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.control.model.enums.DroneAuthorityEnum;
import org.dromara.sample.manage.mapper.IDeviceMapper;
import org.dromara.sample.manage.mapper.IDeviceProMapper;
import org.dromara.sample.manage.mapper.IEngineRecordMapper;
import org.dromara.sample.manage.model.dto.*;
import org.dromara.sample.manage.model.entity.DeviceEntity;
import org.dromara.sample.manage.model.entity.DeviceProEntity;
import org.dromara.sample.manage.model.entity.EngineRecordEntity;
import org.dromara.sample.manage.model.enums.DeviceFirmwareStatusEnum;
import org.dromara.sample.manage.model.enums.PropertySetFieldEnum;
import org.dromara.sample.manage.model.enums.UserTypeEnum;
import org.dromara.sample.manage.model.param.DeviceQueryParam;
import org.dromara.sample.manage.model.receiver.BasicDeviceProperty;
import org.dromara.sample.manage.service.*;
import org.dromara.sample.websocket.service.IWebSocketMessageService;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.net.URI;
import java.net.URISyntaxException;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import static org.apache.commons.compress.utils.ArchiveUtils.sanitize;
/**
*
* @author sean.zhou
* @version 0.1
* @date 2021/11/10
*/
@Service
@Slf4j
@Transactional
public class EngineRecordServiceImpl implements IEngineRecordService {
@Resource
IEngineRecordMapper mapper;
@Override
public Map<String, Object> startEngine(Map<String, Object> objectMap){
EngineRecordEntity record = new EngineRecordEntity();
//获取token
//设置请求Header和Body(如JSON)
String md5 = Md5Utils.hash("xuzhou_ai");
JSONObject jsonObj = new JSONObject();
jsonObj.put("username", sanitize("xuzhou_ai")); // sanitize函数见下文
jsonObj.put("password", sanitize(md5));
String responseBody = PostRequest(jsonObj, "http://60.204.247.65:8100/Third/Login");
JSONObject jsonObject = new JSONObject(responseBody);
// 逐层获取 data -> token
JSONObject data = jsonObject.getJSONObject("data");
String token = data.getString("token");
String sceneResponseBody = null;
String algorithmResponseBody = null;
//查询用户开通的场景
if (StringUtils.isNotEmpty(token)){
try {
URI uri = new URIBuilder("http://60.204.247.65:8100/V2/AI/WX/User/Scene")
.build();
sceneResponseBody = GetRequest(uri, token);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
JSONObject jsonObject1 = new JSONObject(sceneResponseBody);
// 逐层获取 data -> token
JSONObject data1 = jsonObject.getJSONObject("data");
String scene = data1.getString("scene");
//查询场景算法
List<String> extra_type_list = new ArrayList<>();
try {
URI uri = new URIBuilder("http://60.204.247.65:8100/V2/AI/WX/User/ExtraType/Get")
.addParameter("scene",scene)
.addParameter("if_open","1")
.build();
algorithmResponseBody = GetRequest(uri, token);
ObjectMapper mapper = new ObjectMapper();
ExtraTypeResponse response = mapper.readValue(algorithmResponseBody,ExtraTypeResponse.class);
List<ExtraType> list = response.getData();
for (ExtraType extraType : list) {
extra_type_list.add(extraType.getExtra_type());
break;
}
} catch (URISyntaxException | JsonProcessingException e) {
throw new RuntimeException(e);
}
JSONObject jsonObj2 = new JSONObject();
jsonObj2.put("scene", scene); // sanitize函数见下文
jsonObj2.put("callback_url", objectMap.get("callback_url"));
jsonObj2.put("input_url", objectMap.get("input_url"));
jsonObj2.put("push_url", objectMap.get("push_url"));
jsonObj2.put("play_url", objectMap.get("play_url"));
String responseBody2 = PostRequest(jsonObj2, "http://60.204.247.65:8100/Third/Engine/Start");
ObjectMapper mapper1 = new ObjectMapper();
EngineResponse response = null;
try {
response = mapper1.readValue(responseBody2, EngineResponse.class);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
objectMap.put("task_id",response.getData().getTask_id());
record.setPushUrl(objectMap.get("push_url").toString());
record.setDeviceSn(objectMap.get("device_sn").toString());
record.setTaskId(response.getData().getTask_id());
record.setExtraType(String.join(",", extra_type_list));
}
Map<String, Object> map = new HashMap();
map.put("callback_url", objectMap.get("callback_url"));
map.put("input_url", objectMap.get("input_url"));
map.put("push_url", objectMap.get("push_url"));
map.put("play_url", objectMap.get("play_url"));
map.put("task_id", objectMap.get("task_id"));
//添加启动引擎记录
mapper.insert(record);
return map;
}
@Override
public void closeEngine(Map<String, Object> objectMap) {
JSONObject jsonObj2 = new JSONObject();
EngineRecordEntity record = mapper.selectOne(new LambdaQueryWrapper<EngineRecordEntity>().eq(EngineRecordEntity::getDeviceSn, objectMap.get("device_sn")));
if (record == null){
throw new RuntimeException("关闭引擎失败!");
}
jsonObj2.put("task_id", record.getTaskId()); // sanitize函数见下文
String responseBody2 = PostRequest(jsonObj2, "http://60.204.247.65:8100/Third/Engine/Stop");
JSONObject json = new JSONObject(responseBody2);
// 方式2:安全获取(先判空再转换)
Object dataObj = json.get("data");
if(dataObj != null && dataObj instanceof Integer) {
int data = (Integer) dataObj;
if (data ==1){
mapper.delete(new LambdaQueryWrapper<EngineRecordEntity>().eq(EngineRecordEntity::getDeviceSn, objectMap.get("device_sn")));
}else {
throw new RuntimeException("关闭引擎失败!");
}
} else {
throw new RuntimeException("关闭引擎失败!");
}
}
public String PostRequest( JSONObject jsonObj, String url
) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 1. 创建POST请求对象
HttpPost post = new HttpPost(url);
StringEntity requestEntity = new StringEntity(jsonObj.toString(), "UTF-8");
requestEntity.setContentType("application/json");
post.setEntity(requestEntity);
post.setHeader("Accept", "application/json");
// 3. 执行请求并获取响应
try (CloseableHttpResponse response = httpClient.execute(post)) {
String responseBody = EntityUtils.toString(response.getEntity());
if (response.getStatusLine().getStatusCode() == 200) {
return responseBody;
} else {
throw new RuntimeException("第三方接口调用失败!");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String GetRequest(URI uri, String token
) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// URI uri = new URIBuilder("https://api.example.com/data")
// .addParameter("param1", "value1")
// .addParameter("param2", "value2")
// .build();
HttpGet httpGet = new HttpGet(uri);
httpGet.setHeader("token",token);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
// 处理响应
String responseBody = EntityUtils.toString(response.getEntity());
if (response.getStatusLine().getStatusCode() == 200){
return responseBody;
}else {
throw new RuntimeException("第三方接口调用失败!");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

93
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java

@ -1,23 +1,34 @@
package org.dromara.sample.manage.service.impl;
import cn.hutool.core.convert.Convert;
import jakarta.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.dromara.common.rocketmq.producer.MessageProducerUtil;
import org.dromara.common.sdk.cloudapi.device.DeviceDomainEnum;
import org.dromara.common.sdk.cloudapi.device.VideoId;
import org.dromara.common.sdk.cloudapi.livestream.*;
import org.dromara.common.sdk.cloudapi.livestream.api.AbstractLivestreamService;
import org.dromara.common.sdk.cloudapi.wayline.FlighttaskProgress;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.SDKManager;
import org.dromara.common.sdk.mqtt.CommonTopicRequest;
import org.dromara.common.sdk.mqtt.MqttGatewayPublish;
import org.dromara.common.sdk.mqtt.services.ServicesReplyData;
import org.dromara.common.sdk.mqtt.services.TopicServicesResponse;
import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.feign.RemoteSystemFeign;
import org.dromara.sample.manage.model.dto.*;
import org.dromara.sample.manage.model.entity.DeviceEntity;
import org.dromara.sample.manage.model.param.DeviceQueryParam;
import org.dromara.sample.manage.service.*;
import org.dromara.sample.wayline.model.dto.WaylineJobDTO;
import org.dromara.sample.wayline.service.IWaylineJobService;
import org.dromara.sample.wayline.service.IWaylineRedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -44,6 +55,21 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
@Autowired
private AbstractLivestreamService abstractLivestreamService;
@Resource
private MqttGatewayPublish gatewayPublish;
@Autowired
private IPlayTextService playTextService;
@Autowired
private IWaylineRedisService waylineRedisService;
@Autowired
private IWaylineJobService waylineJobService;
@Resource
private RemoteSystemFeign remoteSystemFeign;
@Override
public List<CapacityDeviceDTO> getLiveCapacity(String workspaceId) {
@ -72,7 +98,6 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
if (HttpResultResponse.CODE_SUCCESS != responseResult.getCode()) {
return responseResult;
}
ILivestreamUrl url = LiveStreamProperty.get(liveParam.getUrlType());
url = setExt(liveParam.getUrlType(), url, liveParam.getVideoId());
@ -85,9 +110,10 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
.setVideoQuality(liveParam.getVideoQuality()));
if (!response.getData().getResult().isSuccess()) {
return HttpResultResponse.error(response.getData().getResult());
if(response.getData().getResult().getCode() != 513003){
return HttpResultResponse.error(response.getData().getResult());
}
}
LiveDTO live = new LiveDTO();
switch (liveParam.getUrlType()) {
@ -107,16 +133,48 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
.append(gb28181.getChannel())
.toString());
break;
case RTSP:
live.setUrl(response.getData().getOutput());
break;
case WHIP:
live.setUrl(url.toString().replace("whip", "whep"));
break;
default:
return HttpResultResponse.error(LiveErrorCodeEnum.URL_TYPE_NOT_SUPPORTED);
}
DeviceEntity deviceBySn = deviceService.getDeviceByChildSn(liveParam.getVideoId().getDroneSn());
if(deviceBySn != null){
Optional<EventsReceiver<FlighttaskProgress>> runningWaylineJob = waylineRedisService.getRunningWaylineJob(deviceBySn.getDeviceSn());
Map<String,Object> reqMap = new HashMap<>();
if(runningWaylineJob.isPresent()) {
//开启ai推流
List<String> deviceSn = remoteSystemFeign.selectStreamType(deviceBySn.getDeviceSn());
if (CollectionUtils.isNotEmpty(deviceSn)){
ILivestreamUrl iLivestreamUrl = LiveStreamProperty.get(UrlTypeEnum.RTMP);
String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId();
Optional<WaylineJobDTO> waylineJobDTO = waylineJobService.getJobByJobInternalId(jobId);
reqMap.put("jobId",waylineJobDTO.get().getJobId());
reqMap.put("jobName",waylineJobDTO.get().getJobName());
reqMap.put("deviceSn",deviceBySn.getDeviceSn());
reqMap.put("videoId",liveParam.getVideoId().getDroneSn().toString()+"-"+liveParam.getVideoId().getPayloadIndex().toString());
reqMap.put("url",iLivestreamUrl.toString());
playTextService.streamType(reqMap);
for (String s : deviceSn){
String[] split = s.split(",");
List<String> list = new ArrayList<>();
list.add(split[2]);
DisobeyDTO disobeyDTO = new DisobeyDTO();
disobeyDTO.setUrl("http://114.235.183.163");
disobeyDTO.setOpen(1);
disobeyDTO.setType(list);
disobeyDTO.setRtmpUrl(liveParam.getVideoId().getDroneSn().toString()+"-"+liveParam.getVideoId().getPayloadIndex().toString());
gatewayPublish.publish("task/image/disobey/smoke",new CommonTopicRequest<>()
.setData(Objects.requireNonNull(disobeyDTO)),1);
}
}
}
}
// MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStart",liveParam.getVideoId().getDroneSn(),liveParam.getVideoId().toString());
return HttpResultResponse.success(live);
}
@ -126,10 +184,25 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
if (HttpResultResponse.CODE_SUCCESS != responseResult.getCode()) {
return responseResult;
}
TopicServicesResponse<ServicesReplyData> response = abstractLivestreamService.liveStopPush(
SDKManager.getDeviceSDK(responseResult.getData().getDeviceSn()), new LiveStopPushRequest()
.setVideoId(videoId));
// //关闭ai推流
// List<String> deviceSn = remoteSystemFeign.selectStreamType(responseResult.getData().getDeviceSn());
// if (CollectionUtils.isNotEmpty(deviceSn)){
// for (String s : deviceSn){
// List<String> list = new ArrayList<>();
// list.add(s);
// DisobeyDTO disobeyDTO = new DisobeyDTO();
// disobeyDTO.setUrl(s);
// disobeyDTO.setOpen(2);
// disobeyDTO.setType(list);
// disobeyDTO.setRtmpUrl(videoId.toString());
// gatewayPublish.publish("task/image/disobey/smoke",new CommonTopicRequest<>()
// .setData(Objects.requireNonNull(disobeyDTO)),1);
// }
// }
if (!response.getData().getResult().isSuccess()) {
return HttpResultResponse.error(response.getData().getResult());
}

69
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/PlayTextServiceImpl.java

@ -1,58 +1,47 @@
package org.dromara.sample.manage.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.seata.common.util.StringUtils;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.domain.R;
import org.dromara.common.sdk.cloudapi.device.*;
import org.dromara.common.sdk.cloudapi.firmware.*;
import org.dromara.common.sdk.cloudapi.firmware.api.AbstractFirmwareService;
import org.dromara.common.sdk.cloudapi.property.api.AbstractPropertyService;
import org.dromara.common.sdk.cloudapi.tsa.DeviceIconUrl;
import org.dromara.common.sdk.cloudapi.tsa.TopologyDeviceModel;
import org.dromara.common.sdk.common.*;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.Pagination;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.common.sdk.config.version.GatewayManager;
import org.dromara.common.sdk.exception.CloudSDKException;
import org.dromara.common.sdk.mqtt.CommonTopicRequest;
import org.dromara.common.sdk.mqtt.IMqttTopicService;
import org.dromara.common.sdk.mqtt.MqttGatewayPublish;
import org.dromara.common.sdk.mqtt.events.EventsSubscribe;
import org.dromara.common.sdk.mqtt.osd.OsdSubscribe;
import org.dromara.common.sdk.mqtt.property.PropertySetReplyResultEnum;
import org.dromara.common.sdk.mqtt.property.PropertySetSubscribe;
import org.dromara.common.sdk.mqtt.requests.RequestsSubscribe;
import org.dromara.common.sdk.mqtt.services.ServicesReplyData;
import org.dromara.common.sdk.mqtt.services.ServicesSubscribe;
import org.dromara.common.sdk.mqtt.services.TopicServicesResponse;
import org.dromara.common.sdk.mqtt.state.StateSubscribe;
import org.dromara.common.sdk.mqtt.status.StatusSubscribe;
import org.dromara.common.websocket.dto.BizCodeEnum;
import org.dromara.sample.common.error.CommonErrorEnum;
import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.control.model.enums.DroneAuthorityEnum;
import org.dromara.sample.manage.mapper.IDeviceMapper;
import org.dromara.sample.feign.RemoteSystemFeign;
import org.dromara.sample.manage.mapper.IPlayTextMapper;
import org.dromara.sample.manage.model.dto.*;
import org.dromara.sample.manage.model.entity.DeviceEntity;
import org.dromara.sample.manage.model.entity.PlayTextEntity;
import org.dromara.sample.manage.model.enums.DeviceFirmwareStatusEnum;
import org.dromara.sample.manage.model.enums.PropertySetFieldEnum;
import org.dromara.sample.manage.model.enums.UserTypeEnum;
import org.dromara.sample.manage.model.param.DeviceQueryParam;
import org.dromara.sample.manage.model.receiver.BasicDeviceProperty;
import org.dromara.sample.manage.service.*;
import org.dromara.system.api.RemoteConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -68,6 +57,14 @@ public class PlayTextServiceImpl implements IPlayTextService {
@Autowired
private IPlayTextMapper playTextMapper;
@Resource
private MqttGatewayPublish gatewayPublish;
@DubboReference
private RemoteConfigService remoteConfigService;
@Resource
private RemoteSystemFeign remoteSystemFeign;
@Override
public HttpResultResponse insertPlayText(PlayTextEntity param) {
@ -107,4 +104,24 @@ public class PlayTextServiceImpl implements IPlayTextService {
.orderByDesc(true,PlayTextEntity::getId));
return new PaginationData<PlayTextEntity>(pagination.getRecords(), new Pagination(pagination.getCurrent(), pagination.getSize(), pagination.getTotal()));
}
@Override
public HttpResultResponse streamType(Map<String, Object> objectMap) {
String top = "task/image/disobey/streamType";
//发送mqtt
List<String> deviceSn = remoteSystemFeign.selectStreamType(objectMap.get("deviceSn").toString());
if (CollectionUtils.isNotEmpty(deviceSn)){
for (String s : deviceSn){
String[] split = s.split(",");
objectMap.put("deptId",split[0]);
objectMap.put("deptName",split[1]);
objectMap.put("labelEn",split[2]);
objectMap.put("labelCn",split[3]);
StreamTypeDTO param = Convert.convert(StreamTypeDTO.class, objectMap);
gatewayPublish.publish(top,new CommonTopicRequest<>()
.setData(Objects.requireNonNull(param)),1);
}
}
return HttpResultResponse.success("请求成功");
}
}

48
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java

@ -2,8 +2,10 @@ package org.dromara.sample.manage.service.impl;
import cn.hutool.core.util.ObjectUtil;
import org.dromara.common.redis.utils.RedisOpsUtils;
import org.dromara.common.rocketmq.producer.MessageProducerUtil;
import org.dromara.common.sdk.cloudapi.device.*;
import org.dromara.common.sdk.cloudapi.device.api.AbstractDeviceService;
import org.dromara.common.sdk.cloudapi.livestream.VideoTypeEnum;
import org.dromara.common.sdk.cloudapi.psdk.PsdkUiResource;
import org.dromara.common.sdk.cloudapi.psdk.PsdkWidgetValues;
import org.dromara.common.sdk.cloudapi.tsa.DeviceIconUrl;
@ -36,6 +38,9 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import static org.dromara.common.core.utils.StringUtils.DASH;
import static org.dromara.common.core.utils.StringUtils.SLASH;
/**
* @author sean
* @version 1.7
@ -154,7 +159,9 @@ public class SDKDeviceService extends AbstractDeviceService {
if(request.getData().getMediaFileDetail() != null){
RedisOpsUtils.hashSet("updateMediaFileDetail",from,request.getData().getMediaFileDetail().getRemainUpload());
}
if( deviceRedisService.getDeviceOsd(deviceOpt.get().getChildDeviceSn(),OsdDockDrone.class).isEmpty() && deviceRedisService.checkDeviceVideo(deviceOpt.get().getChildDeviceSn())){
deviceRedisService.delDeviceVideo(deviceOpt.get().getChildDeviceSn());
}
DeviceDTO device = deviceOpt.get();
if (StringUtils.hasText(device.getChildDeviceSn())) {
deviceService.getDeviceBySn(device.getChildDeviceSn()).ifPresent(device::setChildren);
@ -172,6 +179,38 @@ public class SDKDeviceService extends AbstractDeviceService {
deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DOCK_OSD, from, request.getData());
}
@Override
public void dockLiveStatusUpdate(TopicStateRequest<DockLiveStatus> request, MessageHeaders headers){
/*Optional<DeviceDTO> dockOnline = deviceRedisService.getDeviceOnline(request.getGateway());
Optional<DeviceDTO> deviceOnline = deviceRedisService.getDeviceOnline(dockOnline.get().getChildDeviceSn());
Optional<OsdDock> deviceOsd = deviceRedisService.getDeviceOsd(dockOnline.get().getDeviceSn(), OsdDock.class);
if(deviceOsd.get().getModeCode().getCode() != 4){
return;
}
if(!RedisOpsUtils.checkExist("video"+deviceOnline.get().getDeviceSn())){
return;
}
RedisOpsUtils.set("video"+deviceOnline.get().getDeviceSn(),60);
if(deviceOnline.isEmpty()){
return;
}
if(request.getData().getLiveStatus().size() == 0 ){
String deviceVideoEnum = DeviceVideoEnum.find(deviceOnline.get().getDeviceName()).getDevice();
deviceRedisService.delDeviceVideo(deviceOnline.get().getDeviceSn());
VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType());
MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStopStart",deviceOnline.get().getDeviceSn(),videoId.toString());
}
List<DockLiveStatusData> dockLiveStatusDataList = request.getData().getLiveStatus().stream().filter(item ->
item.getVideoId().getDroneSn().equals(dockOnline.get().getChildDeviceSn()) && item.getStatus() == true).collect(Collectors.toList());
if(dockLiveStatusDataList.size() == 0){
String deviceVideoEnum = DeviceVideoEnum.find(deviceOnline.get().getDeviceName()).getDevice();
VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType());
deviceRedisService.delDeviceVideo(deviceOnline.get().getDeviceSn());
MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStopStart",deviceOnline.get().getDeviceSn(),videoId.toString());
}*/
}
@Override
public void osdDockDrone(TopicOsdRequest<OsdDockDrone> request, MessageHeaders headers) {
String from = request.getFrom();
@ -190,12 +229,17 @@ public class SDKDeviceService extends AbstractDeviceService {
}
DeviceDTO device = deviceOpt.get();
/*String deviceVideoEnum = DeviceVideoEnum.find(device.getDeviceName()).getDevice();
if(!deviceRedisService.checkDeviceVideo(device.getDeviceSn())){
VideoId videoId = new VideoId(device.getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType());
MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStart",device.getDeviceSn(),videoId.toString());
}*/
deviceRedisService.setDeviceOnline(device);
deviceRedisService.setDeviceOsd(from, request.getData());
deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, request.getData());
}
@Override
public void osdRemoteControl(TopicOsdRequest<OsdRemoteControl> request, MessageHeaders headers) {
String from = request.getFrom();

20
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/WarningRecordServiceImpl.java

@ -0,0 +1,20 @@
package org.dromara.sample.manage.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sample.manage.mapper.WarningRecordMapper;
import org.dromara.sample.manage.model.entity.WarningRecordEntity;
import org.dromara.sample.manage.service.IWarningRecordService;
import org.springframework.stereotype.Service;
/**
* 设备对象-用于存储设备Service业务层处理
*
* @author wuyuan
* @date 2022-10-25
*/
@Service
@Slf4j
public class WarningRecordServiceImpl extends ServiceImpl<WarningRecordMapper, WarningRecordEntity> implements IWarningRecordService {
}

13
dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java

@ -3,6 +3,7 @@ package org.dromara.sample.media.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.dromara.common.core.constant.DeviceQrtzConstants;
import org.dromara.common.sdk.cloudapi.device.OsdDock;
import org.dromara.common.sdk.cloudapi.media.*;
import org.dromara.common.sdk.cloudapi.media.api.AbstractMediaService;
import org.dromara.common.sdk.mqtt.MqttReply;
@ -113,16 +114,24 @@ public class MediaServiceImpl extends AbstractMediaService implements IMediaServ
String jobId = callback.getFile().getExt().getFlightId();
Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(request.getGateway());
if(deviceRedisService.getDeviceOsd(request.getGateway(), OsdDock.class).get().getModeCode().getCode() == 4){
DeviceDTO device = deviceOpt.get();
boolean isSave = parseMediaFile(callback, device);
if (!isSave) {
log.error("将文件保存到数据库失败,请手动检查数据。");
return null;
}
return new TopicEventsResponse<MqttReply>().setData(MqttReply.success());
}
MediaFileCountDTO mediaFileCount = mediaRedisService.getMediaCount(request.getGateway(), jobId);
List<DeviceQrtzFileEntity> deviceQrtzFileEntities = deviceQrtzFileMapper.selectList(new LambdaQueryWrapper<DeviceQrtzFileEntity>().eq(DeviceQrtzFileEntity::getDeviceSn, request.getGateway()).eq(DeviceQrtzFileEntity::getStatus, DeviceQrtzConstants.QRTZ_FILE_STATUS_2).eq(DeviceQrtzFileEntity::getWaylineId, mediaFileCount.getFileId()));
// duplicate data
if (deviceOpt.isEmpty()
|| (Objects.nonNull(mediaFileCount) && request.getBid().equals(mediaFileCount.getBid())
&& request.getTid().equals(mediaFileCount.getTid()))) {
if(CollectionUtils.isEmpty(deviceQrtzFileEntities)){
deviceQrtzFileEntities.stream().forEach(item->{
item.setStatus(DeviceQrtzConstants.QRTZ_FILE_STATUS_2);
item.setStatus(DeviceQrtzConstants.QRTZ_FILE_STATUS_3);
});
deviceQrtzFileMapper.updateById(deviceQrtzFileEntities,100);
}

79
dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java

@ -0,0 +1,79 @@
package org.dromara.sample.rocketmq;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.dromara.common.sdk.cloudapi.device.VideoId;
import org.dromara.common.sdk.cloudapi.livestream.LensChangeVideoTypeEnum;
import org.dromara.common.sdk.cloudapi.livestream.UrlTypeEnum;
import org.dromara.common.sdk.cloudapi.livestream.VideoQualityEnum;
import org.dromara.common.sdk.cloudapi.wayline.FlighttaskProgress;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.manage.model.dto.DeviceDTO;
import org.dromara.sample.manage.model.dto.LiveDTO;
import org.dromara.sample.manage.model.dto.LiveTypeDTO;
import org.dromara.sample.manage.model.entity.DeviceEntity;
import org.dromara.sample.manage.service.IDeviceRedisService;
import org.dromara.sample.manage.service.IDeviceService;
import org.dromara.sample.manage.service.ILiveStreamService;
import org.dromara.sample.manage.service.IPlayTextService;
import org.dromara.sample.wayline.model.dto.WaylineJobDTO;
import org.dromara.sample.wayline.service.IWaylineJobService;
import org.dromara.sample.wayline.service.IWaylineRedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
/**
* @auther wuyuan
* @data 2025/5/12
*/
@RocketMQMessageListener(consumerGroup = "videoStart",topic = "videoStartConsum")
@Component
public class RocketMqConsum implements RocketMQListener<MessageExt> {
@Autowired
private ILiveStreamService liveStreamService;
@Autowired
private IPlayTextService playTextService;
@Autowired
private IWaylineRedisService waylineRedisService;
@Autowired
private IDeviceService deviceService;
@Autowired
private IWaylineJobService waylineJobService;
@Autowired
private IDeviceRedisService deviceRedisService;
@Override
public void onMessage(MessageExt message) {
String videoIds = new String(message.getBody());
VideoId videoId = new VideoId(videoIds);
LiveTypeDTO liveTypeDTO = new LiveTypeDTO();
liveTypeDTO.setUrlType(UrlTypeEnum.WHIP);
liveTypeDTO.setVideoType(LensChangeVideoTypeEnum.WIDE);
liveTypeDTO.setVideoQuality(VideoQualityEnum.ULTRA_HD);
liveTypeDTO.setVideoId(videoId);
DeviceEntity deviceBySn = deviceService.getDeviceByChildSn(videoId.getDroneSn());
Optional<EventsReceiver<FlighttaskProgress>> runningWaylineJob = waylineRedisService.getRunningWaylineJob(deviceBySn.getDeviceSn());
Map<String,Object> reqMap = new HashMap<>();
if(runningWaylineJob.isPresent()) {
String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId();
Optional<WaylineJobDTO> waylineJobDTO = waylineJobService.getJobByJobInternalId(jobId);
reqMap.put("jobId",waylineJobDTO.get().getJobId());
reqMap.put("jobName",waylineJobDTO.get().getJobName());
reqMap.put("deviceSn",videoId.getDroneSn());
playTextService.streamType(reqMap);
}
}
}

11
dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/AiCompareController.java

@ -136,7 +136,16 @@ public class AiCompareController extends BaseController {
public R<Void> edit(@Validated(EditGroup.class) @RequestBody Map<String,Object> bo) {
return toAjax(aiCompareService.update(bo));
}
/**
* 状态更改
*/
@SaCheckPermission("sample:compare:add")
@Log(title = "状态更改", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@GetMapping("/updateStatus")
public R<Void> updateStatus(Long id) {
return toAjax(aiCompareService.updateStatus(id));
}
/**
* 画框

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save