dev #5

Merged
yuanqiang merged 69 commits from dev into test 1 month 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. 8
      dk-api/api-system/src/main/java/org/dromara/system/api/RemoteSubscribeService.java
  5. 74
      dk-api/api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteNoticeBo.java
  6. 49
      dk-api/api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSubscribeApiVo.java
  7. 5
      dk-auth/pom.xml
  8. 76
      dk-auth/src/main/java/org/dromara/auth/controller/TokenController.java
  9. 22
      dk-auth/src/main/java/org/dromara/auth/form/CasLoginBody.java
  10. 56
      dk-auth/src/main/java/org/dromara/auth/service/impl/CasAuthStrategy.java
  11. 12
      dk-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java
  12. 108
      dk-auth/src/main/java/org/dromara/auth/util/HttpClientUtil.java
  13. 7
      dk-common/common-bom/pom.xml
  14. 13
      dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceEnum.java
  15. 39
      dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceTypeVideoEnum.java
  16. 80
      dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceVideoEnum.java
  17. 3
      dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java
  18. 2
      dk-common/common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java
  19. 5
      dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java
  20. 4
      dk-common/common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java
  21. 15
      dk-common/common-excel/pom.xml
  22. 5
      dk-common/common-redis/src/main/java/org/dromara/common/redis/config/RedisConst.java
  23. 45
      dk-common/common-rocketmq/pom.xml
  24. 58
      dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/config/ProducerConfig.java
  25. 25
      dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/model/ProducerMode.java
  26. 189
      dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/producer/MessageProducerUtil.java
  27. 1
      dk-common/common-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  28. 1
      dk-common/pom.xml
  29. 4
      dk-modules/business/pom.xml
  30. 61
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java
  31. 21
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertStatisticsController.java
  32. 1
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java
  33. 9
      dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java
  34. 34
      dk-modules/business/src/main/java/org/dromara/business/domain/BusinessTaskLabel.java
  35. 11
      dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessAlertBo.java
  36. 10
      dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessTaskBo.java
  37. 7
      dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java
  38. 35
      dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskLabelVo.java
  39. 5
      dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskVo.java
  40. 4
      dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessAlertMapper.java
  41. 27
      dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessTaskLabelMapper.java
  42. 5
      dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java
  43. 111
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java
  44. 27
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java
  45. 11
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessTaskServiceImpl.java
  46. 58
      dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml
  47. 11
      dk-modules/business/src/main/resources/mapper/business/BusinessTaskLabelMapper.xml
  48. 7
      dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml
  49. 4
      dk-modules/sample/pom.xml
  50. 68
      dk-modules/sample/src/main/java/org/dromara/sample/common/util/Md5Utils.java
  51. 2
      dk-modules/sample/src/main/java/org/dromara/sample/control/model/param/TakeoffToPointParam.java
  52. 40
      dk-modules/sample/src/main/java/org/dromara/sample/control/service/impl/ControlServiceImpl.java
  53. 15
      dk-modules/sample/src/main/java/org/dromara/sample/feign/BusinessTaskFeign.java
  54. 2
      dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteBusinessTaskFeign.java
  55. 16
      dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteSystemFeign.java
  56. 4
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceController.java
  57. 82
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceProController.java
  58. 87
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/EngineRecordController.java
  59. 5
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/LiveStreamController.java
  60. 280
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java
  61. 19
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/PlayTextController.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. 2
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceProEntity.java
  75. 43
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceStreamEntity.java
  76. 48
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/EngineRecordEntity.java
  77. 55
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/WarningRecordEntity.java
  78. 13
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceProService.java
  79. 9
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceRedisService.java
  80. 4
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceService.java
  81. 17
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceStreamService.java
  82. 32
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IEngineRecordService.java
  83. 3
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IPlayTextService.java
  84. 15
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IWarningRecordService.java
  85. 179
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceProServiceImpl.java
  86. 4
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceQrtzServiceImpl.java
  87. 23
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceRedisServiceImpl.java
  88. 23
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceServiceImpl.java
  89. 44
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceStreamServiceImpl.java
  90. 246
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/EngineRecordServiceImpl.java
  91. 93
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java
  92. 69
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/PlayTextServiceImpl.java
  93. 48
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java
  94. 20
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/WarningRecordServiceImpl.java
  95. 11
      dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java
  96. 79
      dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java
  97. 39
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java
  98. 2
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/entity/WaylineJobEntity.java
  99. 2
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IFlightTaskService.java
  100. 2
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IWaylineJobService.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 );
}

8
dk-api/api-system/src/main/java/org/dromara/system/api/RemoteSubscribeService.java

@ -0,0 +1,8 @@
package org.dromara.system.api;
import org.dromara.system.api.domain.vo.RemoteSubscribeApiVo;
public interface RemoteSubscribeService {
RemoteSubscribeApiVo getPrivateKey(String subscribeApiCode);
}

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;
}

49
dk-api/api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSubscribeApiVo.java

@ -0,0 +1,49 @@
package org.dromara.system.api.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@Data
public class RemoteSubscribeApiVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long id;
/**
* 订阅名称
*/
private String subscribeName;
/**
* 订阅编码
*/
private String subscribeCode;
/**
* 订阅人
*/
private List<String> subscribeUser;
/**
* 公钥
*/
private String publicKey;
/**
*私钥
*/
private String privateKey;
/**
*是否开启
*/
private Boolean isEnable;
}

5
dk-auth/pom.xml

@ -86,6 +86,11 @@
<artifactId>api-resource</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>api-system</artifactId>
</dependency>
<!-- 自定义负载均衡(多团队开发使用) -->
<!-- <dependency>-->
<!-- <groupId>org.dromara</groupId>-->

76
dk-auth/src/main/java/org/dromara/auth/controller/TokenController.java

@ -4,6 +4,8 @@ import cn.dev33.satoken.exception.NotLoginException;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
@ -21,11 +23,13 @@ import org.dromara.auth.form.RegisterBody;
import org.dromara.auth.form.SocialLoginBody;
import org.dromara.auth.service.IAuthStrategy;
import org.dromara.auth.service.SysLoginService;
import org.dromara.auth.util.HttpClientUtil;
import org.dromara.common.core.constant.UserConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginBody;
import org.dromara.common.core.utils.*;
import org.dromara.common.encrypt.annotation.ApiEncrypt;
import org.dromara.common.encrypt.utils.EncryptUtils;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.social.config.properties.SocialLoginConfigProperties;
@ -33,14 +37,13 @@ import org.dromara.common.social.config.properties.SocialProperties;
import org.dromara.common.social.utils.SocialUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.resource.api.RemoteMessageService;
import org.dromara.system.api.RemoteClientService;
import org.dromara.system.api.RemoteConfigService;
import org.dromara.system.api.RemoteSocialService;
import org.dromara.system.api.RemoteTenantService;
import org.dromara.system.api.*;
import org.dromara.system.api.domain.vo.RemoteClientVo;
import org.dromara.system.api.domain.vo.RemoteSubscribeApiVo;
import org.dromara.system.api.domain.vo.RemoteTenantVo;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
@ -74,6 +77,8 @@ public class TokenController {
private final RemoteSocialService remoteSocialService;
@DubboReference(stub = "true")
private final RemoteMessageService remoteMessageService;
@DubboReference
private final RemoteSubscribeService remoteSubscribeService;
/**
* 登录方法
@ -238,4 +243,67 @@ public class TokenController {
return R.ok(result);
}
/**
* 负责根据调用方传入的url和参数还有用户名进行免登录执行redirect_url
*/
@PostMapping("/thirdParty/{subscribeApiCode}")
public R<String> getAuthThirdParty(@RequestBody String param, @PathVariable("subscribeApiCode") String subscribeApiCode) {
//根据订阅组和用户获取私钥
RemoteSubscribeApiVo remoteSubscribeApiVo = remoteSubscribeService.getPrivateKey(subscribeApiCode);
//解密
String decrypt = null;
try {
decrypt = EncryptUtils.decryptByRsa(param, remoteSubscribeApiVo.getPrivateKey());
} catch (Exception e) {
throw new RuntimeException(e);
}
if (ObjectUtil.isEmpty(decrypt)){
throw new RuntimeException("解析内容失败,请检查公钥是否正确!");
}
//解析传过来的参数
JSONObject body = JSON.parseObject(decrypt);
if (!remoteSubscribeApiVo.getSubscribeUser().contains(body.getString("username"))){
throw new RuntimeException("当前用户没有权限!");
}
//获取接口请求方式
String method = body.getString("method");
//获取客户端id
String clientId = body.getString("clientId");
// 授权类型和客户端id
RemoteClientVo clientVo = remoteClientService.queryByClientId(clientId);
//获取token
JSONObject result = new JSONObject();
result.put("username", body.getString("username"));
LoginVo loginVo = IAuthStrategy.login(result.toJSONString(), clientVo, "cas");
//构建请求header添加token、header
Map<String,String> header = new HashMap<>();
header.put("Authorization", "Bearer " + loginVo.getAccessToken());
header.put("clientId", clientId);
//发送
try {
switch (method.toLowerCase()){
case "post":
HttpClientUtil.sendPost(body.getString("redirectUrl"),body.toJSONString(),header);
break;
case "get":
HttpClientUtil.sendGet(body.getString("redirectUrl"),header);
break;
}
} catch (IOException e) {
log.error(e.getMessage(),e);
}
return R.ok();
}
}

22
dk-auth/src/main/java/org/dromara/auth/form/CasLoginBody.java

@ -0,0 +1,22 @@
package org.dromara.auth.form;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.domain.model.LoginBody;
/**
* 免密登录对象
*
* @author Lion Li
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CasLoginBody extends LoginBody {
/**
* 用户名
*/
private String username;
}

56
dk-auth/src/main/java/org/dromara/auth/service/impl/CasAuthStrategy.java

@ -0,0 +1,56 @@
package org.dromara.auth.service.impl;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
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.form.CasLoginBody;
import org.dromara.auth.service.IAuthStrategy;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.satoken.utils.LoginHelper;
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.stereotype.Service;
@Slf4j
@Service("cas" + IAuthStrategy.BASE_NAME)
@RequiredArgsConstructor
public class CasAuthStrategy implements IAuthStrategy{
@DubboReference
private RemoteUserService remoteUserService;
@Override
public LoginVo login(String body, RemoteClientVo client) {
CasLoginBody loginBody = JsonUtils.parseObject(body, CasLoginBody.class);
String tenantId = loginBody.getTenantId();
String username = loginBody.getUsername();
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
return remoteUserService.getUserInfo(username, tenantId);
});
loginUser.setClientKey(client.getClientKey());
loginUser.setDeviceType(client.getDeviceType());
SaLoginModel model = new SaLoginModel();
model.setDevice(client.getDeviceType());
// 例如: 后台用户30分钟过期 app用户1天过期
model.setTimeout(client.getTimeout());
model.setActiveTimeout(client.getActiveTimeout());
model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
// 生成token
LoginHelper.login(loginUser, model);
LoginVo loginVo = new LoginVo();
loginVo.setAccessToken(StpUtil.getTokenValue());
loginVo.setExpireIn(StpUtil.getTokenTimeout());
loginVo.setClientId(client.getClientId());
return loginVo;
}
}

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

@ -83,18 +83,6 @@ public class PasswordAuthStrategy implements IAuthStrategy {
model.setActiveTimeout(client.getActiveTimeout());
model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
//获取设备权限
List<String> deviceList = new ArrayList<>();
try {
deviceList = feignDeviceGroup.listDevice(loginUser.getUserId());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
loginUser.setDeviceList(deviceList);
// 生成token
LoginHelper.login(loginUser, model);

108
dk-auth/src/main/java/org/dromara/auth/util/HttpClientUtil.java

@ -0,0 +1,108 @@
package org.dromara.auth.util;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.*;
import org.apache.http.entity.ContentType;
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 java.io.IOException;
import java.util.Map;
public class HttpClientUtil {
// 默认超时时间
private static final int TIMEOUT = 5000;
// 创建默认的 HttpClient
private static CloseableHttpClient createHttpClient() {
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(TIMEOUT)
.setConnectionRequestTimeout(TIMEOUT)
.setSocketTimeout(TIMEOUT)
.build();
return HttpClients.custom()
.setDefaultRequestConfig(config)
.build();
}
// 发送 GET 请求
public static String sendGet(String url, Map<String, String> headers) throws IOException {
HttpGet httpGet = new HttpGet(url);
if (headers != null) {
headers.forEach(httpGet::addHeader);
}
try (CloseableHttpClient httpClient = createHttpClient();
CloseableHttpResponse response = httpClient.execute(httpGet)) {
return handleResponse(response);
}
}
// 发送 POST 请求
public static String sendPost(String url, String body, Map<String, String> headers) throws IOException {
HttpPost httpPost = new HttpPost(url);
if (headers != null) {
headers.forEach(httpPost::addHeader);
}
if (body != null) {
HttpEntity entity = new StringEntity(body, ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
}
try (CloseableHttpClient httpClient = createHttpClient();
CloseableHttpResponse response = httpClient.execute(httpPost)) {
return handleResponse(response);
}
}
// 发送 PUT 请求
public static String sendPut(String url, String body, Map<String, String> headers) throws IOException {
HttpPut httpPut = new HttpPut(url);
if (headers != null) {
headers.forEach(httpPut::addHeader);
}
if (body != null) {
HttpEntity entity = new StringEntity(body, ContentType.APPLICATION_JSON);
httpPut.setEntity(entity);
}
try (CloseableHttpClient httpClient = createHttpClient();
CloseableHttpResponse response = httpClient.execute(httpPut)) {
return handleResponse(response);
}
}
// 发送 DELETE 请求
public static String sendDelete(String url, Map<String, String> headers) throws IOException {
HttpDelete httpDelete = new HttpDelete(url);
if (headers != null) {
headers.forEach(httpDelete::addHeader);
}
try (CloseableHttpClient httpClient = createHttpClient();
CloseableHttpResponse response = httpClient.execute(httpDelete)) {
return handleResponse(response);
}
}
// 处理响应
private static String handleResponse(HttpResponse response) throws IOException {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode >= 200 && statusCode < 300) {
HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
} else {
throw new ClientProtocolException("Unexpected response status: " + statusCode);
}
}
}

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>

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

@ -1,6 +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;
@ -9,17 +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;
/**
@ -39,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);
}
/**
* 查询全部预警/待办/已完成/忽略
*/
@ -75,17 +101,35 @@ public class BusinessAlertController extends BaseController {
}
/**
* 查询全部预警/待办/已完成/忽略
* 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();
}
@ -99,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));
}
}

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

@ -142,6 +142,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;

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

@ -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;
}

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

@ -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;
}

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

@ -96,6 +96,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);
@ -115,4 +116,7 @@ public interface BusinessAlertMapper extends BaseMapperPlus<BusinessAlert, Busin
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);
}

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

@ -74,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);
@ -91,4 +93,5 @@ public interface IBusinessAlertService {
List<BusinessAlert> listHandleHistory(String lng, String lat, String createTime);
Boolean transferAlert(BusinessAlertVo vo);
}

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

@ -46,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;
/**
@ -78,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;
@ -86,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);
@ -432,6 +436,10 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
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());
@ -533,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())) {
@ -549,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));
@ -599,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<>();
@ -622,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();
});
}
@ -722,6 +812,25 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
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());

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

@ -1,7 +1,9 @@
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;
@ -280,7 +282,12 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
// }
//----------------------------------------------获取飞行总架次、总时长----------------------------------------------
Map<String, Integer> devices = feignDeviceGroup.getDevices();
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);
@ -416,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();
@ -444,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<>();
@ -498,6 +507,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();
@ -640,14 +650,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();
@ -686,7 +697,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));

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;
}

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

@ -16,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=",">
@ -443,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>
@ -526,6 +531,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
@ -880,7 +886,55 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
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);

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);
}
}

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;
}

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;
}

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>{
}

179
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())))
// .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)) {
List<DeviceProUserEntity> proUserEntityList = deviceProUserMapper.selectList(new LambdaQueryWrapper<DeviceProUserEntity>().eq(DeviceProUserEntity::getDeviceProId, proId));
List<DeviceProUserEntity> different = userEntity.stream()
.filter(user -> proUserEntityList.stream().noneMatch(u -> u.getUserId().equals(user.getUserId())))
.toList();
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,28 +169,8 @@ public class DeviceProServiceImpl implements IDeviceProService {
wrapper.set(DeviceEntity::getProId, proId);
wrapper.eq(DeviceEntity::getId, deviceId);
return deviceMapper.update(wrapper) > 0;
// 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);
// }
// });
// }
} catch (Exception e) {
return false;
}
@ -270,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();
}
@ -297,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;
@ -292,7 +292,7 @@ public class DeviceQrtzServiceImpl implements IDeviceQrtzService {
DateTimeFormatter formatterS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 格式化当前日期
String formattedDate = currentDate.format(formatter);
List<DeviceQrtzFileEntity> qrtzFileEntityList = deviceQrtzFileMapper.selectList(new QueryWrapper<DeviceQrtzFileEntity>().eq("device_sn", device.getDeviceSn()).eq("exec_date", formattedDate).eq("status", DeviceQrtzConstants.QRTZ_FILE_STATUS_1).orderByAsc("sort"));
List<DeviceQrtzFileEntity> qrtzFileEntityList = deviceQrtzFileMapper.selectList(new QueryWrapper<DeviceQrtzFileEntity>().eq("device_sn", qrtzEntityList.get(0).getDeviceSn()).eq("exec_date", formattedDate).eq("qrtz_id",qrtzEntityList.get(0).getId()).eq("status", DeviceQrtzConstants.QRTZ_FILE_STATUS_1).orderByAsc("sort"));
if (!qrtzFileEntityList.isEmpty()) {
DeviceQrtzFileEntity deviceQrtzFileEntity = qrtzFileEntityList.get(0);
List<DeviceQrtzDateEntity> qrtzDateEntityList = deviceQrtzDateMapper.listDeviceQrtzDateByQrtzAndDate(deviceQrtzFileEntity.getQrtzId());

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 {
}

11
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,9 +114,17 @@ 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())

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);
}
}
}

39
dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java

@ -3,25 +3,34 @@ package org.dromara.sample.wayline.controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.dromara.business.api.domain.vo.RemoteBusinessAlertVo;
import org.dromara.common.core.domain.R;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.sdk.cloudapi.wayline.FlighttaskProgress;
import org.dromara.common.sdk.cloudapi.wayline.WaylineJobTypeEnum;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.PaginationData;
import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.media.model.MediaFileDTO;
import org.dromara.sample.wayline.model.dto.WaylineJobDTO;
import org.dromara.sample.wayline.model.enums.WaylineTaskStatusEnum;
import org.dromara.sample.wayline.model.param.CreateJobParam;
import org.dromara.sample.wayline.model.param.UpdateJobParam;
import org.dromara.sample.wayline.service.IFlightTaskService;
import org.dromara.sample.wayline.service.IWaylineFileService;
import org.dromara.sample.wayline.service.IWaylineJobService;
import org.dromara.sample.wayline.service.IWaylineRedisService;
import org.dromara.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URL;
import java.sql.SQLException;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@ -41,6 +50,11 @@ public class WaylineJobController {
@Autowired
private IFlightTaskService flighttaskService;
@Autowired
private IWaylineRedisService waylineRedisService;
@Autowired
private IWaylineFileService waylineFileService;
/**
* Create a wayline task for the Dock.
* @param request
@ -107,7 +121,32 @@ public class WaylineJobController {
return HttpResultResponse.success();
}
public static void main(String[] args) {
WaylineTaskStatusEnum pause = WaylineTaskStatusEnum.RESUME;
System.out.println(pause.getVal());
}
@GetMapping("/{workspace_id}/getJobFileUrlByDeviceSn")
@Operation(summary = "根据设备查询飞行任务。", description = "根据设备查询飞行任务。")
public void getJobFileUrlByDeviceSn(@PathVariable(name = "workspace_id") String workspaceId,
@RequestParam(name = "device_sn") String deviceSn, HttpServletRequest req, HttpServletResponse rsp) {
try {
Optional<EventsReceiver<FlighttaskProgress>> runningWaylineJob = waylineRedisService.getRunningWaylineJob(deviceSn);
if(runningWaylineJob.isEmpty()) {
return;
}
String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId();
Optional<WaylineJobDTO> waylineJobDTO = waylineJobService.getJobByJobId(workspaceId, jobId);
if(waylineJobDTO.isEmpty()) {
return;
}
URL url = waylineFileService.getObjectUrl(workspaceId, waylineJobDTO.get().getFileId());
rsp.sendRedirect(url.toString());
} catch (IOException | SQLException e) {
e.printStackTrace();
}
}
}

2
dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/entity/WaylineJobEntity.java

@ -90,7 +90,7 @@ public class WaylineJobEntity implements Serializable {
private String parentId;
@TableField("job_type")
private WaylineJobTypeEnum waylineJobTypeEnum;
private Integer jobType;
@TableField(exist = false)
private ProgressExtBreakPoint breakPoint;

2
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IFlightTaskService.java

@ -74,5 +74,7 @@ public interface IFlightTaskService {
*/
void updateJobStatus(String workspaceId, String jobId, UpdateJobParam param);
void updateJobDeviceSnStatus(String workspaceId, String deviceSn, UpdateJobParam param);
void retryPrepareJob(ConditionalWaylineJobKey jobKey, WaylineJobDTO waylineJob);
}

2
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IWaylineJobService.java

@ -55,6 +55,8 @@ public interface IWaylineJobService {
*/
Optional<WaylineJobDTO> getJobByJobId(String workspaceId, String jobId);
Optional<WaylineJobDTO> getJobByJobInternalId(String jobId);
/**
* Update job data.
* @param dto

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

Loading…
Cancel
Save