Browse Source

Merge branch 'dev' of http://106.13.50.125:13000/yuanqiang/dk_cloud_drone into dev

# Conflicts:
#	dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java
#	dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java
#	dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/WaylineJobServiceImpl.java
pull/6/head
吴远 1 month ago
parent
commit
08343e9e51
  1. 4
      dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java
  2. 10
      dk-api/api-system/src/main/java/org/dromara/system/api/RemoteNoticeService.java
  3. 20
      dk-api/api-system/src/main/java/org/dromara/system/api/RemoteSubmailConfigService.java
  4. 74
      dk-api/api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteNoticeBo.java
  5. 7
      dk-common/common-bom/pom.xml
  6. 13
      dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceEnum.java
  7. 39
      dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceTypeVideoEnum.java
  8. 80
      dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceVideoEnum.java
  9. 3
      dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java
  10. 2
      dk-common/common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java
  11. 5
      dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java
  12. 15
      dk-common/common-excel/pom.xml
  13. 5
      dk-common/common-redis/src/main/java/org/dromara/common/redis/config/RedisConst.java
  14. 45
      dk-common/common-rocketmq/pom.xml
  15. 58
      dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/config/ProducerConfig.java
  16. 25
      dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/model/ProducerMode.java
  17. 189
      dk-common/common-rocketmq/src/main/java/org/dromara/common/rocketmq/producer/MessageProducerUtil.java
  18. 1
      dk-common/common-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  19. 1
      dk-common/pom.xml
  20. 4
      dk-modules/business/pom.xml
  21. 50
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java
  22. 1
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessTaskController.java
  23. 3
      dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlert.java
  24. 34
      dk-modules/business/src/main/java/org/dromara/business/domain/BusinessTaskLabel.java
  25. 10
      dk-modules/business/src/main/java/org/dromara/business/domain/bo/BusinessTaskBo.java
  26. 1
      dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessAlertVo.java
  27. 35
      dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskLabelVo.java
  28. 5
      dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessTaskVo.java
  29. 27
      dk-modules/business/src/main/java/org/dromara/business/mapper/BusinessTaskLabelMapper.java
  30. 14
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java
  31. 7
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java
  32. 11
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessTaskServiceImpl.java
  33. 15
      dk-modules/business/src/main/resources/mapper/business/BusinessAlertMapper.xml
  34. 11
      dk-modules/business/src/main/resources/mapper/business/BusinessTaskLabelMapper.xml
  35. 5
      dk-modules/business/src/main/resources/mapper/business/BusinessTaskMapper.xml
  36. 4
      dk-modules/sample/pom.xml
  37. 68
      dk-modules/sample/src/main/java/org/dromara/sample/common/util/Md5Utils.java
  38. 2
      dk-modules/sample/src/main/java/org/dromara/sample/control/model/param/TakeoffToPointParam.java
  39. 40
      dk-modules/sample/src/main/java/org/dromara/sample/control/service/impl/ControlServiceImpl.java
  40. 16
      dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteSystemFeign.java
  41. 87
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/EngineRecordController.java
  42. 5
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/LiveStreamController.java
  43. 280
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java
  44. 19
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/PlayTextController.java
  45. 15
      dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/IDeviceStreamMapper.java
  46. 16
      dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/IEngineRecordMapper.java
  47. 18
      dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/WarningRecordMapper.java
  48. 30
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/CallBackDTO.java
  49. 31
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/Engine.java
  50. 31
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/EngineResponse.java
  51. 45
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/EventsDTO.java
  52. 46
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/ExtraType.java
  53. 31
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/ExtraTypeResponse.java
  54. 49
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/ObjectsDTO.java
  55. 37
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/StreamTypeDTO.java
  56. 43
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceStreamEntity.java
  57. 48
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/EngineRecordEntity.java
  58. 55
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/WarningRecordEntity.java
  59. 9
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceRedisService.java
  60. 4
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceService.java
  61. 17
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceStreamService.java
  62. 32
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IEngineRecordService.java
  63. 3
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IPlayTextService.java
  64. 15
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IWarningRecordService.java
  65. 23
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceRedisServiceImpl.java
  66. 18
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceServiceImpl.java
  67. 44
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceStreamServiceImpl.java
  68. 246
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/EngineRecordServiceImpl.java
  69. 93
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java
  70. 69
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/PlayTextServiceImpl.java
  71. 46
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java
  72. 20
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/WarningRecordServiceImpl.java
  73. 11
      dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java
  74. 79
      dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java
  75. 25
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java
  76. 2
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/entity/WaylineJobEntity.java
  77. 2
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IFlightTaskService.java
  78. 2
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IWaylineJobService.java
  79. 28
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/FlightTaskServiceImpl.java
  80. 9
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/WaylineJobServiceImpl.java
  81. 5
      dk-modules/system/pom.xml
  82. 79
      dk-modules/system/src/main/java/org/dromara/system/config/OssTianyiConfig.java
  83. 113
      dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiController.java
  84. 131
      dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiErrorController.java
  85. 106
      dk-modules/system/src/main/java/org/dromara/system/controller/SysSubmailConfigUserController.java
  86. 58
      dk-modules/system/src/main/java/org/dromara/system/controller/ossTianyi/OssTianyiController.java
  87. 125
      dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteController.java
  88. 239
      dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekController.java
  89. 227
      dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekOssController.java
  90. 8
      dk-modules/system/src/main/java/org/dromara/system/controller/system/AiLabelController.java
  91. 8
      dk-modules/system/src/main/java/org/dromara/system/controller/system/SysConfigController.java
  92. 240
      dk-modules/system/src/main/java/org/dromara/system/controller/system/SysSubmailConfigController.java
  93. 106
      dk-modules/system/src/main/java/org/dromara/system/controller/system/SysSubmailLogController.java
  94. 6
      dk-modules/system/src/main/java/org/dromara/system/controller/system/SysUserController.java
  95. 63
      dk-modules/system/src/main/java/org/dromara/system/domain/DjiApi.java
  96. 76
      dk-modules/system/src/main/java/org/dromara/system/domain/DjiApiError.java
  97. 67
      dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeek.java
  98. 71
      dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeekOss.java
  99. 1
      dk-modules/system/src/main/java/org/dromara/system/domain/SysNotice.java
  100. 92
      dk-modules/system/src/main/java/org/dromara/system/domain/SysSubmailConfig.java

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

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

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

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

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

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

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

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

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

@ -257,6 +257,13 @@
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<!--rocketmq-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>common-rocketmq</artifactId>
<version>${revision}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
</project> </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)) return Arrays.stream(values()).filter(device -> device.getDevice().equals(finalKey))
.findAny().orElseThrow(() -> new CloudSDKException(DeviceEnum.class, finalKey1)); .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 * @return dictValue为keydictLabel为值组成的Map
*/ */
Map<String, String> getAllDictByDictType(String dictType); 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 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); 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);
}
} }

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

@ -25,6 +25,21 @@
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId> <artifactId>easyexcel</artifactId>
</dependency> </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> </dependencies>
</project> </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 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 DEVICE_ONLINE_PREFIX = "online" + DELIMITER;
public static final String WEBSOCKET_PREFIX = "webSocket" + 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 FILE_UPLOADING_PREFIX = "file_uploading" + DELIMITER;
public static final String DRONE_CONTROL_PREFiX = "control_source" + 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-bus</module>
<module>common-sse</module> <module>common-sse</module>
<module>common-cloudsdk</module> <module>common-cloudsdk</module>
<module>common-rocketmq</module>
</modules> </modules>
<artifactId>dk-common</artifactId> <artifactId>dk-common</artifactId>

4
dk-modules/business/pom.xml

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

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

@ -1,6 +1,8 @@
package org.dromara.business.controller; package org.dromara.business.controller;
import cn.dev33.satoken.annotation.SaCheckPermission; 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.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; 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.bo.BusinessAlertBo;
import org.dromara.business.domain.vo.BusinessAlertVo; import org.dromara.business.domain.vo.BusinessAlertVo;
import org.dromara.business.service.IBusinessAlertService; 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.core.domain.R;
import org.dromara.common.log.annotation.Log; import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType; import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; 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.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.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess; import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@ -39,7 +49,23 @@ public class BusinessAlertController extends BaseController {
private final IBusinessAlertService businessAlertService; private final IBusinessAlertService businessAlertService;
@DubboReference(timeout = 30000) @DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService; 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") @PostMapping("/saveAlert")
public void saveAlert(BusinessAlertVo vo) { public R saveAlert(@RequestBody BusinessAlertVo vo) {
vo.setBusinessType(2); vo.setBusinessType(2);
BusinessAlert businessAlert = businessAlertService.addBusinessAlert(vo); BusinessAlert businessAlert = businessAlertService.addBusinessAlert(vo);
RemoteStartProcess startProcess = new RemoteStartProcess(); RemoteStartProcess startProcess = new RemoteStartProcess();
startProcess.setBusinessId(String.valueOf(businessAlert.getId())); startProcess.setBusinessId(String.valueOf(businessAlert.getId()));
startProcess.setFlowCode("alertChz"); startProcess.setFlowCode("alertChz");
remoteWorkflowService.startWorkFlowBatch(List.of(startProcess)); 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();
} }

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

@ -46,7 +46,6 @@ public class BusinessTaskController extends BaseController {
/** /**
* 查询工单预约列表 * 查询工单预约列表
*/ */
@ApiEncrypt(response=true)
@SaCheckPermission("business:task:list") @SaCheckPermission("business:task:list")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo<BusinessTaskVo> list(BusinessTaskBo bo, PageQuery pageQuery) { public TableDataInfo<BusinessTaskVo> list(BusinessTaskBo bo, PageQuery pageQuery) {

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

@ -243,4 +243,7 @@ public class BusinessAlert {
*/ */
@TableField(exist = false) @TableField(exist = false)
private String buttonPermission; 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;
}

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

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

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

@ -205,4 +205,5 @@ public class BusinessAlertVo implements Serializable {
private Date createTime; private Date createTime;
//1:图片比对预警 2:AI实时预警 //1:图片比对预警 2:AI实时预警
private Integer businessType; private Integer businessType;
private String deviceSn;
} }

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

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

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

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

@ -555,8 +555,14 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
return result; return result;
} }
//不是空的话查看是对应各局的 //不是空的话查看是对应各局的
businessAlertBo.setAiLabelEnList(List.of(businessAlertBo.getLabelEn())); List<RemoteAiLabelPostVo> postVoList = remoteLablePostService.selectLabelByList(businessAlertBo.getPostCode(), null);
List<BusinessAlertVo> alertList = this.baseMapper.heatList(businessAlertBo,businessAlertBo.getStartTime(), businessAlertBo.getEndTime());
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)); Map<String, List<BusinessAlertVo>> listMap = alertList.stream().collect(Collectors.groupingBy(BusinessAlertVo::getLabelCn));
result.putAll(listMap); result.putAll(listMap);
return result; return result;
@ -578,7 +584,7 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
infoMap.put("date", startTime + "~" + endTime); 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)); Map<String, List<RemoteAiLabelPostVo>> aiNameMap = postVoList.stream().collect(Collectors.groupingBy(RemoteAiLabelPostVo::getAiName));
@ -636,7 +642,7 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
Map<String,Object> infoMap = new HashMap<>(); Map<String,Object> infoMap = new HashMap<>();
//不是空的话查看是对应各局的 //不是空的话查看是对应各局的
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)); Map<String, List<RemoteAiLabelPostVo>> aiNameMap = postVoList.stream().collect(Collectors.groupingBy(RemoteAiLabelPostVo::getAiName));

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

@ -1,7 +1,9 @@
package org.dromara.business.service.impl; package org.dromara.business.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
@ -416,6 +418,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//查询所有的职能岗位 //查询所有的职能岗位
List<RemotePostVo> postVoList = remotePostService.listPost(); List<RemotePostVo> postVoList = remotePostService.listPost();
postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则
if (ObjectUtil.isEmpty(postVoList)) { if (ObjectUtil.isEmpty(postVoList)) {
return ListUtil.empty(); return ListUtil.empty();
@ -444,6 +447,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//查询所有的职能岗位 //查询所有的职能岗位
List<RemotePostVo> postVoList = remotePostService.listPost(); List<RemotePostVo> postVoList = remotePostService.listPost();
postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则
List<StatObj> result = new ArrayList<>(); List<StatObj> result = new ArrayList<>();
@ -498,6 +502,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//查询所有的职能岗位 //查询所有的职能岗位
List<RemotePostVo> postVoList = remotePostService.listPost(); List<RemotePostVo> postVoList = remotePostService.listPost();
postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则
List<String> monthList = getLastSixMonths(); List<String> monthList = getLastSixMonths();
@ -687,7 +692,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist
//构建查询数据权限 //构建查询数据权限
createPermissions(businessAlertBo); 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)); 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 cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.business.domain.BusinessTask; import org.dromara.business.domain.BusinessTask;
import org.dromara.business.domain.BusinessTaskLabel;
import org.dromara.business.domain.bo.BusinessTaskBo; import org.dromara.business.domain.bo.BusinessTaskBo;
import org.dromara.business.domain.vo.BusinessTaskVo; import org.dromara.business.domain.vo.BusinessTaskVo;
import org.dromara.business.mapper.BusinessTaskLabelMapper;
import org.dromara.business.mapper.BusinessTaskMapper; import org.dromara.business.mapper.BusinessTaskMapper;
import org.dromara.business.service.IBusinessTaskService; import org.dromara.business.service.IBusinessTaskService;
import org.dromara.common.core.constant.BusinessConstants; import org.dromara.common.core.constant.BusinessConstants;
@ -35,6 +38,7 @@ import java.util.Map;
public class BusinessTaskServiceImpl implements IBusinessTaskService { public class BusinessTaskServiceImpl implements IBusinessTaskService {
private final BusinessTaskMapper baseMapper; private final BusinessTaskMapper baseMapper;
private final BusinessTaskLabelMapper taskLabelMapper;
/** /**
* 查询工单预约 * 查询工单预约
@ -92,6 +96,9 @@ public class BusinessTaskServiceImpl implements IBusinessTaskService {
*/ */
@Override @Override
public Boolean insertByBo(BusinessTaskBo bo) { public Boolean insertByBo(BusinessTaskBo bo) {
if(bo.getTaskLabelList().isEmpty()){
throw new RuntimeException("未获取到识别类型标签");
}
// 获取当前登录用户信息 // 获取当前登录用户信息
LoginUser currentUser = LoginHelper.getLoginUser(); LoginUser currentUser = LoginHelper.getLoginUser();
bo.setCreateBy(currentUser.getUserId()); bo.setCreateBy(currentUser.getUserId());
@ -105,6 +112,10 @@ public class BusinessTaskServiceImpl implements IBusinessTaskService {
boolean flag = baseMapper.insert(add) > 0; boolean flag = baseMapper.insert(add) > 0;
if (flag) { if (flag) {
bo.setId(add.getId()); bo.setId(add.getId());
bo.getTaskLabelList().forEach(labelVo -> {
labelVo.setTaskId(bo.getId());
});
taskLabelMapper.insert(bo.getTaskLabelList());
} }
return flag; return flag;
} }

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

@ -449,8 +449,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
COUNT(DISTINCT ba.id) AS total COUNT(DISTINCT ba.id) AS total
from business_alert ba from business_alert ba
where 1=1 where 1=1
and <![CDATA[ DATE_FORMAT(ba.create_time, '%Y') >= '2024' ]]> and ba.handle_type = 'finish'
and <![CDATA[ DATE_FORMAT(ba.create_time, '%Y') <= DATE_FORMAT(now(), '%Y') ]]>
<include refid="searchSql"></include> <include refid="searchSql"></include>
</select> </select>
@ -891,8 +890,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
SELECT SELECT
temp.label_en AS labelEn, temp.label_en AS labelEn,
temp.label_cn as labelCn, temp.label_cn as labelCn,
bl.lat AS lat, ba.lat AS lat,
bl.lng AS lng, ba.lng AS lng,
COUNT(*) AS value COUNT(*) AS value
FROM FROM
( (
@ -905,15 +904,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
ba.label_en, ba.label_cn ba.label_en, ba.label_cn
) temp ) temp
INNER JOIN INNER JOIN
business_alert bl ON temp.label_en = bl.label_en business_alert ba ON temp.label_en = ba.label_en
AND bl.lat IS NOT NULL AND ba.lat IS NOT NULL
<where> <where>
<include refid="searchSql"></include> <include refid="searchSql"></include>
</where> </where>
GROUP BY GROUP BY
temp.label_en,temp.label_cn, bl.lat, bl.lng temp.label_en,temp.label_cn, ba.lat, ba.lng
HAVING HAVING
<![CDATA[ ST_Distance_Sphere(POINT(lng, lat), POINT(bl.lng, bl.lat)) <= 30 ]]> <![CDATA[ ST_Distance_Sphere(POINT(lng, lat), POINT(ba.lng, ba.lat)) <= 30 ]]>
</select> </select>

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>

5
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="operatTime" property="operatTime" />
<result column="flightTime" property="flightTime" /> <result column="flightTime" property="flightTime" />
<result column="flightExplain" property="flightExplain" /> <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> </resultMap>
<select id="distance" resultType="java.lang.Integer"> <select id="distance" resultType="java.lang.Integer">
SELECT device_id, SELECT device_id,

4
dk-modules/sample/pom.xml

@ -140,6 +140,10 @@
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>api-workflow</artifactId> <artifactId>api-workflow</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>common-rocketmq</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId> <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) @Range(min = 2, max = 1500)
@NotNull @NotNull
private Double rthAltitude; private Integer rthAltitude;
@NotNull @NotNull
private RcLostActionEnum rcLostAction; 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; 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.model.dto.DeviceDTO;
import org.dromara.sample.manage.service.IDevicePayloadService; import org.dromara.sample.manage.service.IDevicePayloadService;
import org.dromara.sample.manage.service.IDeviceRedisService; 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.enums.RemoteDebugMethodEnum;
import org.dromara.sample.control.model.param.*; import org.dromara.sample.control.model.param.*;
import org.dromara.sample.control.service.IControlService; 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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@ -69,6 +81,10 @@ public class ControlServiceImpl implements IControlService {
@Qualifier("SDKWaylineService") @Qualifier("SDKWaylineService")
private AbstractWaylineService abstractWaylineService; private AbstractWaylineService abstractWaylineService;
@Autowired
private IWaylineJobMapper waylineJobMapper;
private RemoteDebugHandler checkDebugCondition(String sn, RemoteDebugParam param, RemoteDebugMethodEnum controlMethodEnum) { private RemoteDebugHandler checkDebugCondition(String sn, RemoteDebugParam param, RemoteDebugMethodEnum controlMethodEnum) {
RemoteDebugHandler handler = Objects.nonNull(controlMethodEnum.getClazz()) ? RemoteDebugHandler handler = Objects.nonNull(controlMethodEnum.getClazz()) ?
mapper.convertValue(Objects.nonNull(param) ? param : new Object(), controlMethodEnum.getClazz()) mapper.convertValue(Objects.nonNull(param) ? param : new Object(), controlMethodEnum.getClazz())
@ -163,17 +179,39 @@ public class ControlServiceImpl implements IControlService {
@Override @Override
public HttpResultResponse takeoffToPoint(String sn, TakeoffToPointParam param) { public HttpResultResponse takeoffToPoint(String sn, TakeoffToPointParam param) {
LoginUser loginUser = LoginHelper.getLoginUser();
checkTakeoffCondition(sn); checkTakeoffCondition(sn);
Optional<DeviceDTO> dockOpt = deviceRedisService.getDeviceOnline(sn);
param.setFlightId(UUID.randomUUID().toString()); 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( TopicServicesResponse<ServicesReplyData> response = abstractControlService.takeoffToPoint(
SDKManager.getDeviceSDK(sn), mapper.convertValue(param, TakeoffToPointRequest.class)); SDKManager.getDeviceSDK(sn), mapper.convertValue(param, TakeoffToPointRequest.class));
ServicesReplyData reply = response.getData(); ServicesReplyData reply = response.getData();
if (reply.getResult().isSuccess()) {
waylineJobEntity.setCreateTime(new Date());
waylineJobMapper.insert(waylineJobEntity);
}
return reply.getResult().isSuccess() ? return reply.getResult().isSuccess() ?
HttpResultResponse.success() HttpResultResponse.success()
: HttpResultResponse.error("无人机未能起飞。" + reply.getResult()); : HttpResultResponse.error("无人机未能起飞。" + reply.getResult());
} }
@Override @Override
public HttpResultResponse seizeAuthority(String sn, DroneAuthorityEnum authority, DronePayloadParam param) { public HttpResultResponse seizeAuthority(String sn, DroneAuthorityEnum authority, DronePayloadParam param) {
TopicServicesResponse<ServicesReplyData> response; TopicServicesResponse<ServicesReplyData> response;

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

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.common.sdk.common.HttpResultResponse;
import org.dromara.sample.manage.model.dto.CapacityDeviceDTO; import org.dromara.sample.manage.model.dto.CapacityDeviceDTO;
import org.dromara.sample.manage.model.dto.LiveTypeDTO; import org.dromara.sample.manage.model.dto.LiveTypeDTO;
import org.dromara.sample.manage.service.IDeviceRedisService;
import org.dromara.sample.manage.service.ILiveStreamService; import org.dromara.sample.manage.service.ILiveStreamService;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -34,6 +35,9 @@ public class LiveStreamController {
@Autowired @Autowired
private ObjectMapper mapper; private ObjectMapper mapper;
@Autowired
private IDeviceRedisService deviceRedisService;
/** /**
* 从数据库中获取当前用户工作区中所有无人机的实时能力数据 * 从数据库中获取当前用户工作区中所有无人机的实时能力数据
* Get live capability data of all drones in the current user's workspace from the database. * 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") @PostMapping("/streams/start")
@Operation(summary = "启用直播", description = "启用直播") @Operation(summary = "启用直播", description = "启用直播")
public HttpResultResponse liveStart(@RequestBody LiveTypeDTO liveParam) { public HttpResultResponse liveStart(@RequestBody LiveTypeDTO liveParam) {
return liveStreamService.liveStart(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; package org.dromara.sample.manage.controller;
import cn.hutool.core.convert.Convert; 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.seata.common.util.StringUtils;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; 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.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.redis.utils.RedisOpsUtils;
import org.dromara.common.sdk.common.HttpResultResponse; import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.mqtt.CommonTopicRequest; 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.ServicesPublish;
import org.dromara.common.sdk.mqtt.services.ServicesReplyReceiver; import org.dromara.common.sdk.mqtt.services.ServicesReplyReceiver;
import org.dromara.common.sdk.mqtt.services.TopicServicesRequest; 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.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.dromara.system.api.RemoteConfigService;
import org.json.JSONObject;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.*; 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_COUNT;
import static org.dromara.common.sdk.mqtt.MqttGatewayPublish.DEFAULT_RETRY_TIMEOUT; import static org.dromara.common.sdk.mqtt.MqttGatewayPublish.DEFAULT_RETRY_TIMEOUT;
@ -50,6 +79,12 @@ public class MegaphoneController {
@DubboReference @DubboReference
private RemoteConfigService remoteConfigService; private RemoteConfigService remoteConfigService;
@Resource
IDeviceStreamMapper deviceStreamMapper;
@Resource
private RemoteSystemFeign remoteSystemFeign;
/** /**
* 喊话器-开始播放文档对应遥控器的录音广播模式 * 喊话器-开始播放文档对应遥控器的录音广播模式
* Get the topology list of all online devices in one workspace. * Get the topology list of all online devices in one workspace.
@ -228,6 +263,7 @@ public class MegaphoneController {
*/ */
@PostMapping("/{workspace_id}/getStreamIp") @PostMapping("/{workspace_id}/getStreamIp")
@Operation(summary = "获取媒体流ip。", description = "获取媒体流ip。") @Operation(summary = "获取媒体流ip。", description = "获取媒体流ip。")
@Transactional
public HttpResultResponse getStreamIp(@PathVariable("workspace_id") String workspaceId, public HttpResultResponse getStreamIp(@PathVariable("workspace_id") String workspaceId,
@RequestBody Map<String,Object>objectMap @RequestBody Map<String,Object>objectMap
) { ) {
@ -235,18 +271,91 @@ public class MegaphoneController {
//发送mqtt //发送mqtt
String s = remoteConfigService.selectStreamIp(); String s = remoteConfigService.selectStreamIp();
DisobeyDTO param = Convert.convert(DisobeyDTO.class, objectMap); DisobeyDTO param = Convert.convert(DisobeyDTO.class, objectMap);
if (StringUtils.isNotEmpty(param.getModel())){ List<DeviceStreamEntity> deviceStreamEntities = deviceStreamMapper.selectList(new QueryWrapper<DeviceStreamEntity>().eq("rtmp_url", param.getRtmpUrl()));
String[] split = param.getModel().split(","); List<String> types = deviceStreamEntities.stream()
for (String type : split){ .map(DeviceStreamEntity::getStreamType)
List<String> list = new ArrayList<>(); .collect(Collectors.toList());
list.add(type); if (param.getOpen() == 1){
DisobeyDTO disobeyDTO = new DisobeyDTO(); // deviceStreamMapper.delete(new QueryWrapper<DeviceStreamEntity>().eq("rtmp_url", param.getRtmpUrl()));
disobeyDTO.setUrl(s); if (StringUtils.isNotEmpty(param.getModel())){
disobeyDTO.setOpen(param.getOpen()); String[] split = param.getModel().split(",");
disobeyDTO.setType(list); if (CollectionUtils.isNotEmpty(types) && split.length > types.size()){
disobeyDTO.setRtmpUrl(param.getRtmpUrl()); //加数据
gatewayPublish.publish(top,new CommonTopicRequest<>() for (String type : split){
.setData(Objects.requireNonNull(disobeyDTO)),1); 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(); return HttpResultResponse.success();
@ -276,4 +385,151 @@ public class MegaphoneController {
MegaphoneDTO megaphoneDTO = (MegaphoneDTO) RedisOpsUtils.get(key); MegaphoneDTO megaphoneDTO = (MegaphoneDTO) RedisOpsUtils.get(key);
return HttpResultResponse.success(megaphoneDTO); 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; 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.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.sdk.common.HttpResultResponse; import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.sdk.common.PaginationData; 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.MegaphoneTopicRequest;
import org.dromara.common.sdk.mqtt.MqttGatewayPublish; import org.dromara.common.sdk.mqtt.MqttGatewayPublish;
import org.dromara.common.sdk.mqtt.TopicConst; import org.dromara.common.sdk.mqtt.TopicConst;
import org.dromara.sample.manage.model.dto.DeviceDTO; 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.dto.TextDTO;
import org.dromara.sample.manage.model.entity.PlayTextEntity; import org.dromara.sample.manage.model.entity.PlayTextEntity;
import org.dromara.sample.manage.service.IDeviceService; import org.dromara.sample.manage.service.IDeviceService;
import org.dromara.sample.manage.service.IPlayTextService; import org.dromara.sample.manage.service.IPlayTextService;
import org.dromara.system.api.RemoteConfigService;
import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.UUID; import java.util.UUID;
@ -37,6 +44,8 @@ public class PlayTextController {
@Autowired @Autowired
private IPlayTextService playTextService; private IPlayTextService playTextService;
/** /**
* 获取一个工作区中所有在线设备的列表 * 获取一个工作区中所有在线设备的列表
* Get the topology list of all online devices in one workspace. * Get the topology list of all online devices in one workspace.
@ -73,5 +82,15 @@ public class PlayTextController {
return HttpResultResponse.success(pageText); 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;
}

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

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

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

@ -1,6 +1,7 @@
package org.dromara.sample.manage.service; package org.dromara.sample.manage.service;
import org.dromara.common.sdk.cloudapi.device.OsdDockDrone; 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.common.sdk.cloudapi.firmware.OtaProgress;
import org.dromara.sample.component.mqtt.model.EventsReceiver; import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.manage.model.dto.DeviceDTO; import org.dromara.sample.manage.model.dto.DeviceDTO;
@ -126,4 +127,12 @@ public interface IDeviceRedisService {
*/ */
List<OsdDockDrone> getDevicesOsdInfo(List<String> snList); 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.DeviceDTO;
import org.dromara.sample.manage.model.dto.DeviceFirmwareUpgradeDTO; import org.dromara.sample.manage.model.dto.DeviceFirmwareUpgradeDTO;
import org.dromara.sample.manage.model.dto.TopologyDeviceDTO; 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 org.dromara.sample.manage.model.param.DeviceQueryParam;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
@ -36,6 +37,7 @@ public interface IDeviceService {
*/ */
void gatewayOffline(String gatewaySn); 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. * Subscribe to the topic of the gateway when the gateway device goes online, and unsubscribe from the topic of the sub-device.
* @param gateway * @param gateway
@ -144,6 +146,8 @@ public interface IDeviceService {
*/ */
Optional<DeviceDTO> getDeviceBySn(String sn); Optional<DeviceDTO> getDeviceBySn(String sn);
DeviceEntity getDeviceByChildSn(String childSn);
/** /**
* Create job for device firmware updates. * Create job for device firmware updates.
* @param workspaceId * @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 org.dromara.sample.manage.model.param.DeviceQueryParam;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
/** /**
@ -34,4 +35,6 @@ public interface IPlayTextService {
PaginationData<PlayTextEntity> pageText(Long page, Long pageSize); 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>{
}

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.config.RedisConst;
import org.dromara.common.redis.utils.RedisOpsUtils; 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.OsdDockDrone;
import org.dromara.common.sdk.cloudapi.device.VideoId;
import org.dromara.common.sdk.cloudapi.firmware.OtaProgress; import org.dromara.common.sdk.cloudapi.firmware.OtaProgress;
import org.dromara.sample.component.mqtt.model.EventsReceiver; import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.manage.model.dto.DeviceDTO; import org.dromara.sample.manage.model.dto.DeviceDTO;
@ -133,4 +135,25 @@ public class DeviceRedisServiceImpl implements IDeviceRedisService {
return resultList; 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);
}
} }

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

@ -555,9 +555,27 @@ public class DeviceServiceImpl implements IDeviceService {
} }
DeviceDTO device = devicesList.get(0); DeviceDTO device = devicesList.get(0);
device.setStatus(deviceRedisService.checkDeviceOnline(sn)); 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); return Optional.of(device);
} }
@Override
public DeviceEntity getDeviceByChildSn(String childSn) {
DeviceEntity deviceEntity = mapper.selectOne(new LambdaQueryWrapper<DeviceEntity>().eq(DeviceEntity::getChildSn, childSn));
return deviceEntity;
}
@Override @Override
public HttpResultResponse createDeviceOtaJob(String workspaceId, List<DeviceFirmwareUpgradeDTO> upgradeDTOS) { public HttpResultResponse createDeviceOtaJob(String workspaceId, List<DeviceFirmwareUpgradeDTO> upgradeDTOS) {
List<OtaCreateDevice> deviceOtaFirmwares = deviceFirmwareService.getDeviceOtaFirmware(workspaceId, upgradeDTOS); List<OtaCreateDevice> deviceOtaFirmwares = deviceFirmwareService.getDeviceOtaFirmware(workspaceId, upgradeDTOS);

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; 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.DeviceDomainEnum;
import org.dromara.common.sdk.cloudapi.device.VideoId; import org.dromara.common.sdk.cloudapi.device.VideoId;
import org.dromara.common.sdk.cloudapi.livestream.*; import org.dromara.common.sdk.cloudapi.livestream.*;
import org.dromara.common.sdk.cloudapi.livestream.api.AbstractLivestreamService; 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.HttpResultResponse;
import org.dromara.common.sdk.common.SDKManager; 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.ServicesReplyData;
import org.dromara.common.sdk.mqtt.services.TopicServicesResponse; 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.dto.*;
import org.dromara.sample.manage.model.entity.DeviceEntity;
import org.dromara.sample.manage.model.param.DeviceQueryParam; import org.dromara.sample.manage.model.param.DeviceQueryParam;
import org.dromara.sample.manage.service.*; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.*;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -44,6 +55,21 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
@Autowired @Autowired
private AbstractLivestreamService abstractLivestreamService; private AbstractLivestreamService abstractLivestreamService;
@Resource
private MqttGatewayPublish gatewayPublish;
@Autowired
private IPlayTextService playTextService;
@Autowired
private IWaylineRedisService waylineRedisService;
@Autowired
private IWaylineJobService waylineJobService;
@Resource
private RemoteSystemFeign remoteSystemFeign;
@Override @Override
public List<CapacityDeviceDTO> getLiveCapacity(String workspaceId) { public List<CapacityDeviceDTO> getLiveCapacity(String workspaceId) {
@ -72,7 +98,6 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
if (HttpResultResponse.CODE_SUCCESS != responseResult.getCode()) { if (HttpResultResponse.CODE_SUCCESS != responseResult.getCode()) {
return responseResult; return responseResult;
} }
ILivestreamUrl url = LiveStreamProperty.get(liveParam.getUrlType()); ILivestreamUrl url = LiveStreamProperty.get(liveParam.getUrlType());
url = setExt(liveParam.getUrlType(), url, liveParam.getVideoId()); url = setExt(liveParam.getUrlType(), url, liveParam.getVideoId());
@ -85,9 +110,10 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
.setVideoQuality(liveParam.getVideoQuality())); .setVideoQuality(liveParam.getVideoQuality()));
if (!response.getData().getResult().isSuccess()) { 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(); LiveDTO live = new LiveDTO();
switch (liveParam.getUrlType()) { switch (liveParam.getUrlType()) {
@ -107,16 +133,48 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
.append(gb28181.getChannel()) .append(gb28181.getChannel())
.toString()); .toString());
break; break;
case RTSP:
live.setUrl(response.getData().getOutput());
break;
case WHIP: case WHIP:
live.setUrl(url.toString().replace("whip", "whep")); live.setUrl(url.toString().replace("whip", "whep"));
break; break;
default: default:
return HttpResultResponse.error(LiveErrorCodeEnum.URL_TYPE_NOT_SUPPORTED); 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); return HttpResultResponse.success(live);
} }
@ -126,10 +184,25 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
if (HttpResultResponse.CODE_SUCCESS != responseResult.getCode()) { if (HttpResultResponse.CODE_SUCCESS != responseResult.getCode()) {
return responseResult; return responseResult;
} }
TopicServicesResponse<ServicesReplyData> response = abstractLivestreamService.liveStopPush( TopicServicesResponse<ServicesReplyData> response = abstractLivestreamService.liveStopPush(
SDKManager.getDeviceSDK(responseResult.getData().getDeviceSn()), new LiveStopPushRequest() SDKManager.getDeviceSDK(responseResult.getData().getDeviceSn()), new LiveStopPushRequest()
.setVideoId(videoId)); .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()) { if (!response.getData().getResult().isSuccess()) {
return HttpResultResponse.error(response.getData().getResult()); 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; package org.dromara.sample.manage.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import io.seata.common.util.StringUtils;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; 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.device.*;
import org.dromara.common.sdk.cloudapi.firmware.*; import org.dromara.common.sdk.cloudapi.firmware.*;
import org.dromara.common.sdk.cloudapi.firmware.api.AbstractFirmwareService; import org.dromara.common.sdk.cloudapi.firmware.api.AbstractFirmwareService;
import org.dromara.common.sdk.cloudapi.property.api.AbstractPropertyService; import org.dromara.common.sdk.cloudapi.property.api.AbstractPropertyService;
import org.dromara.common.sdk.cloudapi.tsa.DeviceIconUrl; import org.dromara.common.sdk.cloudapi.tsa.DeviceIconUrl;
import org.dromara.common.sdk.cloudapi.tsa.TopologyDeviceModel; 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.config.version.GatewayManager;
import org.dromara.common.sdk.exception.CloudSDKException; 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.IMqttTopicService;
import org.dromara.common.sdk.mqtt.MqttGatewayPublish; 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.sample.feign.RemoteSystemFeign;
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.manage.mapper.IPlayTextMapper; import org.dromara.sample.manage.mapper.IPlayTextMapper;
import org.dromara.sample.manage.model.dto.*; import org.dromara.sample.manage.model.dto.*;
import org.dromara.sample.manage.model.entity.DeviceEntity; import org.dromara.sample.manage.model.entity.DeviceEntity;
import org.dromara.sample.manage.model.entity.PlayTextEntity; 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.sample.manage.service.*;
import org.dromara.system.api.RemoteConfigService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.*;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -68,6 +57,14 @@ public class PlayTextServiceImpl implements IPlayTextService {
@Autowired @Autowired
private IPlayTextMapper playTextMapper; private IPlayTextMapper playTextMapper;
@Resource
private MqttGatewayPublish gatewayPublish;
@DubboReference
private RemoteConfigService remoteConfigService;
@Resource
private RemoteSystemFeign remoteSystemFeign;
@Override @Override
public HttpResultResponse insertPlayText(PlayTextEntity param) { public HttpResultResponse insertPlayText(PlayTextEntity param) {
@ -107,4 +104,24 @@ public class PlayTextServiceImpl implements IPlayTextService {
.orderByDesc(true,PlayTextEntity::getId)); .orderByDesc(true,PlayTextEntity::getId));
return new PaginationData<PlayTextEntity>(pagination.getRecords(), new Pagination(pagination.getCurrent(), pagination.getSize(), pagination.getTotal())); 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("请求成功");
}
} }

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

@ -2,9 +2,11 @@ package org.dromara.sample.manage.service.impl;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import org.dromara.common.redis.utils.RedisOpsUtils; import org.dromara.common.redis.utils.RedisOpsUtils;
import org.dromara.common.rocketmq.producer.MessageProducerUtil;
import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.sdk.cloudapi.device.*; import org.dromara.common.sdk.cloudapi.device.*;
import org.dromara.common.sdk.cloudapi.device.api.AbstractDeviceService; 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.PsdkUiResource;
import org.dromara.common.sdk.cloudapi.psdk.PsdkWidgetValues; import org.dromara.common.sdk.cloudapi.psdk.PsdkWidgetValues;
import org.dromara.common.sdk.cloudapi.tsa.DeviceIconUrl; import org.dromara.common.sdk.cloudapi.tsa.DeviceIconUrl;
@ -31,13 +33,15 @@ import org.springframework.util.StringUtils;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.dromara.common.core.utils.StringUtils.DASH;
import static org.dromara.common.core.utils.StringUtils.SLASH;
import static org.dromara.common.core.constant.Constants.FLY_COUNT; import static org.dromara.common.core.constant.Constants.FLY_COUNT;
/** /**
@ -158,7 +162,6 @@ public class SDKDeviceService extends AbstractDeviceService {
if(request.getData().getMediaFileDetail() != null){ if(request.getData().getMediaFileDetail() != null){
RedisOpsUtils.hashSet("updateMediaFileDetail",from,request.getData().getMediaFileDetail().getRemainUpload()); RedisOpsUtils.hashSet("updateMediaFileDetail",from,request.getData().getMediaFileDetail().getRemainUpload());
} }
DeviceDTO device = deviceOpt.get(); DeviceDTO device = deviceOpt.get();
if(request.getData().getLatitude() != null && request.getData().getLongitude() != null if(request.getData().getLatitude() != null && request.getData().getLongitude() != null
&& ((deviceOpt.get().getLatitude() == null && deviceOpt.get().getLongitude() == null)) || (request.getData().getLatitude() != deviceOpt.get().getLatitude() && request.getData().getLongitude() != deviceOpt.get().getLongitude())){ && ((deviceOpt.get().getLatitude() == null && deviceOpt.get().getLongitude() == null)) || (request.getData().getLatitude() != deviceOpt.get().getLatitude() && request.getData().getLongitude() != deviceOpt.get().getLongitude())){
@ -176,12 +179,44 @@ public class SDKDeviceService extends AbstractDeviceService {
&& request.getData().getDroneChargeState().getCapacityPercent() >= 80 && (remainUpload != null && remainUpload == 0)){ && request.getData().getDroneChargeState().getCapacityPercent() >= 80 && (remainUpload != null && remainUpload == 0)){
deviceQrtzService.getDeviceQrtzFileEntity(device); deviceQrtzService.getDeviceQrtzFileEntity(device);
} }
deviceRedisService.setDeviceOnline(device); deviceRedisService.setDeviceOnline(device);
fillDockOsd(from, request.getData()); fillDockOsd(from, request.getData());
deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DOCK_OSD, from, request.getData()); 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 @Override
public void osdDockDrone(TopicOsdRequest<OsdDockDrone> request, MessageHeaders headers) { public void osdDockDrone(TopicOsdRequest<OsdDockDrone> request, MessageHeaders headers) {
@ -201,12 +236,17 @@ public class SDKDeviceService extends AbstractDeviceService {
} }
DeviceDTO device = deviceOpt.get(); 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.setDeviceOnline(device);
deviceRedisService.setDeviceOsd(from, request.getData()); deviceRedisService.setDeviceOsd(from, request.getData());
deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, request.getData()); deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, request.getData());
} }
@Override @Override
public void osdRemoteControl(TopicOsdRequest<OsdRemoteControl> request, MessageHeaders headers) { public void osdRemoteControl(TopicOsdRequest<OsdRemoteControl> request, MessageHeaders headers) {
String from = request.getFrom(); 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.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.dromara.common.core.constant.DeviceQrtzConstants; 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.*;
import org.dromara.common.sdk.cloudapi.media.api.AbstractMediaService; import org.dromara.common.sdk.cloudapi.media.api.AbstractMediaService;
import org.dromara.common.sdk.mqtt.MqttReply; import org.dromara.common.sdk.mqtt.MqttReply;
@ -113,9 +114,17 @@ public class MediaServiceImpl extends AbstractMediaService implements IMediaServ
String jobId = callback.getFile().getExt().getFlightId(); String jobId = callback.getFile().getExt().getFlightId();
Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(request.getGateway()); 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); 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())); 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 // duplicate data
if (deviceOpt.isEmpty() if (deviceOpt.isEmpty()
|| (Objects.nonNull(mediaFileCount) && request.getBid().equals(mediaFileCount.getBid()) || (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);
}
}
}

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

@ -15,6 +15,7 @@ import org.dromara.common.sdk.common.PaginationData;
import org.dromara.sample.component.mqtt.model.EventsReceiver; import org.dromara.sample.component.mqtt.model.EventsReceiver;
import org.dromara.sample.media.model.MediaFileDTO; import org.dromara.sample.media.model.MediaFileDTO;
import org.dromara.sample.wayline.model.dto.WaylineJobDTO; import org.dromara.sample.wayline.model.dto.WaylineJobDTO;
import org.dromara.sample.wayline.model.enums.WaylineTaskStatusEnum;
import org.dromara.sample.wayline.model.entity.WaylineFileEntity; import org.dromara.sample.wayline.model.entity.WaylineFileEntity;
import org.dromara.sample.wayline.model.param.CreateJobParam; import org.dromara.sample.wayline.model.param.CreateJobParam;
import org.dromara.sample.wayline.model.param.UpdateJobParam; import org.dromara.sample.wayline.model.param.UpdateJobParam;
@ -22,6 +23,7 @@ import org.dromara.sample.wayline.service.IFlightTaskService;
import org.dromara.sample.wayline.service.IWaylineFileService; import org.dromara.sample.wayline.service.IWaylineFileService;
import org.dromara.sample.wayline.service.IWaylineJobService; import org.dromara.sample.wayline.service.IWaylineJobService;
import org.dromara.sample.wayline.service.IWaylineRedisService; import org.dromara.sample.wayline.service.IWaylineRedisService;
import org.dromara.sample.wayline.service.IWaylineRedisService;
import org.dromara.sample.wayline.service.impl.WaylineFileServiceImpl; import org.dromara.sample.wayline.service.impl.WaylineFileServiceImpl;
import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -55,9 +57,9 @@ public class WaylineJobController {
@Autowired @Autowired
private IWaylineRedisService waylineRedisService; private IWaylineRedisService waylineRedisService;
@Autowired @Autowired
private IWaylineFileService waylineFileService; private IWaylineFileService waylineFileService;
/** /**
* Create a wayline task for the Dock. * Create a wayline task for the Dock.
* @param request * @param request
@ -145,4 +147,25 @@ public class WaylineJobController {
@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; private String parentId;
@TableField("job_type") @TableField("job_type")
private WaylineJobTypeEnum waylineJobTypeEnum; private Integer jobType;
@TableField(exist = false) @TableField(exist = false)
private ProgressExtBreakPoint breakPoint; 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 updateJobStatus(String workspaceId, String jobId, UpdateJobParam param);
void updateJobDeviceSnStatus(String workspaceId, String deviceSn, UpdateJobParam param);
void retryPrepareJob(ConditionalWaylineJobKey jobKey, WaylineJobDTO waylineJob); 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> getJobByJobId(String workspaceId, String jobId);
Optional<WaylineJobDTO> getJobByJobInternalId(String jobId);
/** /**
* Update job data. * Update job data.
* @param dto * @param dto

28
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/FlightTaskServiceImpl.java

@ -517,6 +517,34 @@ public class FlightTaskServiceImpl extends AbstractWaylineService implements IFl
} }
@Override
public void updateJobDeviceSnStatus(String workspaceId, String deviceSn, UpdateJobParam param) {
Optional<EventsReceiver<FlighttaskProgress>> runningWaylineJob = waylineRedisService.getRunningWaylineJob(deviceSn);
if(runningWaylineJob.isEmpty()) {
return;
}
String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId();
Optional<WaylineJobDTO> waylineJobOpt = waylineJobService.getJobByJobId(workspaceId, jobId);
if (waylineJobOpt.isEmpty()) {
throw new RuntimeException("作业不存在。");
}
WaylineJobDTO waylineJob = waylineJobOpt.get();
WaylineJobStatusEnum statusEnum = waylineJobService.getWaylineState(waylineJob.getDockSn());
if (statusEnum.getEnd() || WaylineJobStatusEnum.PENDING == statusEnum) {
throw new RuntimeException("路线作业状态不匹配,因此无法执行该操作。");
}
switch (param.getStatus()) {
case PAUSE:
pauseJob(workspaceId, waylineJob.getDockSn(), jobId, statusEnum);
break;
case RESUME:
resumeJob(workspaceId, waylineJob.getDockSn(), jobId, statusEnum);
break;
}
}
private void pauseJob(String workspaceId, String dockSn, String jobId, WaylineJobStatusEnum statusEnum) { private void pauseJob(String workspaceId, String dockSn, String jobId, WaylineJobStatusEnum statusEnum) {
if (WaylineJobStatusEnum.PAUSED == statusEnum && jobId.equals(waylineRedisService.getPausedWaylineJobId(dockSn))) { if (WaylineJobStatusEnum.PAUSED == statusEnum && jobId.equals(waylineRedisService.getPausedWaylineJobId(dockSn))) {
waylineRedisService.setPausedWaylineJob(dockSn, jobId); waylineRedisService.setPausedWaylineJob(dockSn, jobId);

9
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/WaylineJobServiceImpl.java

@ -106,6 +106,7 @@ public class WaylineJobServiceImpl implements IWaylineJobService {
.rthAltitude(param.getRthAltitude()) .rthAltitude(param.getRthAltitude())
.mediaCount(0) .mediaCount(0)
.breakPoint(param.getBreakPoint()) .breakPoint(param.getBreakPoint())
.jobType(param.getJobType().getType())
.proId(proId) .proId(proId)
.build(); .build();
@ -150,6 +151,14 @@ public class WaylineJobServiceImpl implements IWaylineJobService {
return Optional.ofNullable(entity2Dto(jobEntity)); return Optional.ofNullable(entity2Dto(jobEntity));
} }
@Override
public Optional<WaylineJobDTO> getJobByJobInternalId(String jobId) {
WaylineJobEntity jobEntity = mapper.selectOne(
new LambdaQueryWrapper<WaylineJobEntity>()
.eq(WaylineJobEntity::getJobId, jobId));
return Optional.ofNullable(entity2Dto(jobEntity));
}
@Override @Override
public Boolean updateJob(WaylineJobDTO dto) { public Boolean updateJob(WaylineJobDTO dto) {
return mapper.update(this.dto2Entity(dto), return mapper.update(this.dto2Entity(dto),

5
dk-modules/system/pom.xml

@ -93,6 +93,11 @@
<artifactId>common-encrypt</artifactId> <artifactId>common-encrypt</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>common-oss</artifactId>
</dependency>
<!-- RuoYi Api System --> <!-- RuoYi Api System -->
<dependency> <dependency>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>

79
dk-modules/system/src/main/java/org/dromara/system/config/OssTianyiConfig.java

@ -0,0 +1,79 @@
package org.dromara.system.config;
import io.minio.MinioClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Minio 配置信息
*
* @author ruoyi
*/
@Configuration
@ConfigurationProperties(prefix = "osstianyi")
public class OssTianyiConfig
{
private String endPoint;
private String accessKey;
private String secretKey;
private String bucketName;
public String getEndPoint() {
return endPoint;
}
public void setEndPoint(String endPoint) {
this.endPoint = endPoint;
}
public String getAccessKey()
{
return accessKey;
}
public void setAccessKey(String accessKey)
{
this.accessKey = accessKey;
}
public String getSecretKey()
{
return secretKey;
}
public void setSecretKey(String secretKey)
{
this.secretKey = secretKey;
}
public String getBucketName()
{
return bucketName;
}
public void setBucketName(String bucketName)
{
this.bucketName = bucketName;
}
@Override
public String toString() {
return "OssTianyiConfig{" +
"endPoint='" + endPoint + '\'' +
", accessKey='" + accessKey + '\'' +
", secretKey='" + secretKey + '\'' +
", bucketName='" + bucketName + '\'' +
'}';
}
@Bean
public MinioClient getMinioClient()
{
// System.out.println("OssTianyiConfig");
// System.out.println("OssTianyiConfig" + endPoint);
System.out.println(toString());
return MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build();
}
}

113
dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiController.java

@ -0,0 +1,113 @@
package org.dromara.system.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.system.domain.vo.DjiApiVo;
import org.dromara.system.domain.bo.DjiApiBo;
import org.dromara.system.service.IDjiApiService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 大疆开发
* 前端访问路由地址为:/djidev/djiApi
*
* @author szs
* @date 2025-05-14
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/djiApi")
public class DjiApiController extends BaseController {
private final IDjiApiService djiApiService;
/**
* 查询大疆开发列表
*/
@SaCheckPermission("djidev:djiApi:list")
@GetMapping("/list")
public TableDataInfo<DjiApiVo> list(DjiApiBo bo, PageQuery pageQuery) {
return djiApiService.queryPageList(bo, pageQuery);
}
/**
* 导出大疆开发列表
*/
@SaCheckPermission("djidev:djiApi:export")
@Log(title = "大疆开发", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(DjiApiBo bo, HttpServletResponse response) {
List<DjiApiVo> list = djiApiService.queryList(bo);
ExcelUtil.exportExcel(list, "大疆开发", DjiApiVo.class, response);
}
/**
* 获取大疆开发详细信息
*
* @param id 主键
*/
@SaCheckPermission("djidev:djiApi:query")
@GetMapping("/{id}")
public R<DjiApiVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(djiApiService.queryById(id));
}
/**
* 新增大疆开发
*/
@SaCheckPermission("djidev:djiApi:add")
@Log(title = "大疆开发", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody DjiApiBo bo) {
//跟新版本次数
if(null == bo.getVersionCount()){
DjiApiBo bo1 = new DjiApiBo();
bo1.setDjiApiType(bo.getDjiApiType());
List<DjiApiVo> djiApiVos = djiApiService.queryList(bo1);
bo.setVersionCount(djiApiVos.size() +1);
}
return toAjax(djiApiService.insertByBo(bo));
}
/**
* 修改大疆开发
*/
@SaCheckPermission("djidev:djiApi:edit")
@Log(title = "大疆开发", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody DjiApiBo bo) {
return toAjax(djiApiService.updateByBo(bo));
}
/**
* 删除大疆开发
*
* @param ids 主键串
*/
@SaCheckPermission("djidev:djiApi:remove")
@Log(title = "大疆开发", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(djiApiService.deleteWithValidByIds(List.of(ids), true));
}
}

131
dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiErrorController.java

@ -0,0 +1,131 @@
package org.dromara.system.controller;
import java.util.ArrayList;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.excel.core.ExcelResult;
import org.dromara.system.domain.vo.SysUserImportVo;
import org.dromara.system.listener.DjiApiErrorImportListener;
import org.dromara.system.listener.SysUserImportListener;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.system.domain.vo.DjiApiErrorVo;
import org.dromara.system.domain.bo.DjiApiErrorBo;
import org.dromara.system.service.IDjiApiErrorService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* 大疆开发-错误码
* 前端访问路由地址为:/djidev/djiApiError
*
* @author szs
* @date 2025-05-14
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/djiApiError")
public class DjiApiErrorController extends BaseController {
private final IDjiApiErrorService djiApiErrorService;
/**
* 查询大疆开发-错误码列表
*/
@SaCheckPermission("djidev:djiApiError:list")
@GetMapping("/list")
public TableDataInfo<DjiApiErrorVo> list(DjiApiErrorBo bo, PageQuery pageQuery) {
return djiApiErrorService.queryPageList(bo, pageQuery);
}
/**
* 导出大疆开发-错误码列表
*/
@SaCheckPermission("djidev:djiApiError:export")
@Log(title = "大疆开发-错误码", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(DjiApiErrorBo bo, HttpServletResponse response) {
List<DjiApiErrorVo> list = djiApiErrorService.queryList(bo);
ExcelUtil.exportExcel(list, "大疆开发-错误码", DjiApiErrorVo.class, response);
}
@Log(title = "大疆开发-错误码管理", businessType = BusinessType.IMPORT)
@SaCheckPermission("djidev:djiApiError:import")
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
ExcelResult<DjiApiErrorVo> result = ExcelUtil.importExcel(file.getInputStream(), DjiApiErrorVo.class, new DjiApiErrorImportListener(updateSupport));
return R.ok(result.getAnalysis());
}
/**
* 获取导入模板
*/
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
ExcelUtil.exportExcel(new ArrayList<>(), "大疆开发-错误码数据", DjiApiErrorVo.class, response);
}
/**
* 获取大疆开发-错误码详细信息
*
* @param id 主键
*/
@SaCheckPermission("djidev:djiApiError:query")
@GetMapping("/{id}")
public R<DjiApiErrorVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(djiApiErrorService.queryById(id));
}
/**
* 新增大疆开发-错误码
*/
@SaCheckPermission("djidev:djiApiError:add")
@Log(title = "大疆开发-错误码", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody DjiApiErrorBo bo) {
return toAjax(djiApiErrorService.insertByBo(bo));
}
/**
* 修改大疆开发-错误码
*/
@SaCheckPermission("djidev:djiApiError:edit")
@Log(title = "大疆开发-错误码", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody DjiApiErrorBo bo) {
return toAjax(djiApiErrorService.updateByBo(bo));
}
/**
* 删除大疆开发-错误码
*
* @param ids 主键串
*/
@SaCheckPermission("djidev:djiApiError:remove")
@Log(title = "大疆开发-错误码", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(djiApiErrorService.deleteWithValidByIds(List.of(ids), true));
}
}

106
dk-modules/system/src/main/java/org/dromara/system/controller/SysSubmailConfigUserController.java

@ -0,0 +1,106 @@
package org.dromara.system.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.system.domain.vo.SysSubmailConfigUserVo;
import org.dromara.system.domain.bo.SysSubmailConfigUserBo;
import org.dromara.system.service.ISysSubmailConfigUserService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 赛邮服务配置用户
* 前端访问路由地址为:/system/sysSubmailConfigUser
*
* @author szs
* @date 2025-05-11
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/sysSubmailConfigUser")
public class SysSubmailConfigUserController extends BaseController {
private final ISysSubmailConfigUserService sysSubmailConfigUserService;
/**
* 查询赛邮服务配置用户列表
*/
@SaCheckPermission("system:sysSubmailConfigUser:list")
@GetMapping("/list")
public TableDataInfo<SysSubmailConfigUserVo> list(SysSubmailConfigUserBo bo, PageQuery pageQuery) {
return sysSubmailConfigUserService.queryPageList(bo, pageQuery);
}
/**
* 导出赛邮服务配置用户列表
*/
@SaCheckPermission("system:sysSubmailConfigUser:export")
@Log(title = "赛邮服务配置用户", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(SysSubmailConfigUserBo bo, HttpServletResponse response) {
List<SysSubmailConfigUserVo> list = sysSubmailConfigUserService.queryList(bo);
ExcelUtil.exportExcel(list, "赛邮服务配置用户", SysSubmailConfigUserVo.class, response);
}
/**
* 获取赛邮服务配置用户详细信息
*
* @param id 主键
*/
@SaCheckPermission("system:sysSubmailConfigUser:query")
@GetMapping("/{id}")
public R<SysSubmailConfigUserVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(sysSubmailConfigUserService.queryById(id));
}
/**
* 新增赛邮服务配置用户
*/
@SaCheckPermission("system:sysSubmailConfigUser:add")
@Log(title = "赛邮服务配置用户", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysSubmailConfigUserBo bo) {
return toAjax(sysSubmailConfigUserService.insertByBo(bo));
}
/**
* 修改赛邮服务配置用户
*/
@SaCheckPermission("system:sysSubmailConfigUser:edit")
@Log(title = "赛邮服务配置用户", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysSubmailConfigUserBo bo) {
return toAjax(sysSubmailConfigUserService.updateByBo(bo));
}
/**
* 删除赛邮服务配置用户
*
* @param ids 主键串
*/
@SaCheckPermission("system:sysSubmailConfigUser:remove")
@Log(title = "赛邮服务配置用户", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(sysSubmailConfigUserService.deleteWithValidByIds(List.of(ids), true));
}
}

58
dk-modules/system/src/main/java/org/dromara/system/controller/ossTianyi/OssTianyiController.java

@ -0,0 +1,58 @@
package org.dromara.system.controller.ossTianyi;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.core.domain.R;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.system.domain.SysUploadFile;
import org.dromara.system.utils.OssTianyiClientUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
/**
* 系统上传文件Controller
*
* @author tom
* @date 2024-12-21
*/
@RestController
@RequestMapping("/ossTianyi")
public class OssTianyiController extends BaseController
{
@Autowired
private OssTianyiClientUtils ossTianyiClientUtils;
/**
* 查询系统上传文件列表 实际是上传接口
*/
@SaCheckPermission("file:sysUploadFile:list")
@GetMapping("/list")
public TableDataInfo list(SysUploadFile sysUploadFile)
{
String localFilePath = "D:\\123pan\\page.html";
try{
ossTianyiClientUtils.uploadFileTest("page.html","dev/temp",localFilePath);
}catch (Exception e){
e.printStackTrace();
}
return null;
}
@GetMapping("/upload")
public R<HashMap<String, Object>> upload(@RequestPart("file") MultipartFile file) {
try {
ossTianyiClientUtils.uploadFile( "dev/temp/"+file.getName(), file);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

125
dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteController.java

@ -0,0 +1,125 @@
package org.dromara.system.controller.site;
import cn.dev33.satoken.annotation.SaCheckPermission;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.service.DictService;
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.web.core.BaseController;
import org.dromara.resource.api.RemoteMessageService;
import org.dromara.system.domain.bo.SysNoticeBo;
import org.dromara.system.domain.vo.SysNoticeVo;
import org.dromara.system.service.ISysNoticeService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 公告 信息操作处理
*
* @author Lion Li
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/site")
public class SiteController extends BaseController {
private final ISysNoticeService noticeService;
private final DictService dictService;
@DubboReference
private final RemoteMessageService remoteMessageService;
//每周提供一次二维场地全貌图及工地视频。 以周为单位处理数据
//site/img/2005/xxxxxxx.png
//site/video/2025/
//todo 二维瓦片上传
//todo 二维瓦片批量上传 (按照周)
//todo 二维瓦片批量下载 (按照周)
//todo 二维瓦片访问 #按照 http://localhost:3308/tile/{z}/{x}/{y}.png 模式访问
//todo 工地视频上传
//todo 工地视频下载
/**
* 获取通知公告列表
*/
// @SaCheckPermission("system:notice:list")
@GetMapping("/list")
public TableDataInfo<SysNoticeVo> list(SysNoticeBo notice, PageQuery pageQuery) {
return noticeService.selectPageNoticeList(notice, pageQuery);
}
/**
* 根据通知公告编号获取详细信息
*
* @param noticeId 公告ID
*/
// @SaCheckPermission("system:notice:query")
@GetMapping(value = "/{noticeId}")
public R<SysNoticeVo> getInfo(@PathVariable Long noticeId) {
return R.ok(noticeService.selectNoticeById(noticeId));
}
/**
* 新增通知公告
*/
// @SaCheckPermission("system:notice:add")
@Log(title = "通知公告", businessType = BusinessType.INSERT)
@PostMapping
public R<Void> add(@Validated @RequestBody SysNoticeBo notice) {
int rows = noticeService.insertNotice(notice);
if (rows <= 0) {
return R.fail();
}
String type = dictService.getDictLabel("sys_notice_type", notice.getNoticeType());
remoteMessageService.publishAll("[" + type + "] " + notice.getNoticeTitle());
return R.ok();
}
/**
* 修改通知公告
*/
// @SaCheckPermission("system:notice:edit")
@Log(title = "通知公告", businessType = BusinessType.UPDATE)
@PutMapping
public R<Void> edit(@Validated @RequestBody SysNoticeBo notice) {
return toAjax(noticeService.updateNotice(notice));
}
/**
* 删除通知公告
*
* @param noticeIds 公告ID串
*/
// @SaCheckPermission("system:notice:remove")
@Log(title = "通知公告", businessType = BusinessType.DELETE)
@DeleteMapping("/{noticeIds}")
public R<Void> remove(@PathVariable Long[] noticeIds) {
return toAjax(noticeService.deleteNoticeByIds(noticeIds));
}
}

239
dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekController.java

@ -0,0 +1,239 @@
package org.dromara.system.controller.site;
import java.util.Date;
import java.util.List;
import java.util.Map;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.core.service.DictService;
import org.dromara.common.dict.utils.DictUtils;
import org.dromara.system.api.RemoteDictService;
import org.dromara.system.api.domain.vo.RemoteDictDataVo;
import org.dromara.system.domain.SiteWeek;
import org.dromara.system.domain.bo.SiteWeekOssBo;
import org.dromara.system.domain.vo.SiteWeekOssVo;
import org.dromara.system.domain.vo.SysDictDataVo;
import org.dromara.system.service.ISiteWeekOssService;
import org.dromara.system.service.ISysDictDataService;
import org.dromara.system.utils.OssTianyiClientUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.system.domain.vo.SiteWeekVo;
import org.dromara.system.domain.bo.SiteWeekBo;
import org.dromara.system.service.ISiteWeekService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.utils.WeekNoUtil;
/**
* 工地日期周
* 前端访问路由地址为:/system/siteWeek
*
* @author szs
* @date 2025-05-10
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/siteWeek")
public class SiteWeekController extends BaseController {
private final ISiteWeekService siteWeekService;
// @Autowired
// private ISysDictDataService sysDictDataService;
// RemoteDictService
private final DictService dictService;
@Autowired
private ISiteWeekOssService siteWeekOssService;
@Autowired
private OssTianyiClientUtils ossTianyiClientUtils;
/**
* 查询工地日期周列表
*/
@SaCheckPermission("system:siteWeek:list")
@GetMapping("/list")
public TableDataInfo<SiteWeekVo> list(SiteWeekBo bo, PageQuery pageQuery) {
return siteWeekService.queryPageList(bo, pageQuery);
}
/**
* 导出工地日期周列表
*/
@SaCheckPermission("system:siteWeek:export")
@Log(title = "工地日期周", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(SiteWeekBo bo, HttpServletResponse response) {
List<SiteWeekVo> list = siteWeekService.queryList(bo);
ExcelUtil.exportExcel(list, "工地日期周", SiteWeekVo.class, response);
}
/**
* 获取工地日期周详细信息
*
* @param id 主键
*/
@SaCheckPermission("system:siteWeek:query")
@GetMapping("/{id}")
public R<SiteWeekVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(siteWeekService.queryById(id));
}
/**
* 新增工地日期周
*/
@SaCheckPermission("system:siteWeek:add")
@Log(title = "工地日期周", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SiteWeekBo bo) {
return toAjax(siteWeekService.insertByBo(bo));
}
@SaCheckPermission("system:siteWeek:add")
@Log(title = "工地日期周", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/autoAdd")
public R<SiteWeekVo> autoAdd(@Validated(AddGroup.class) @RequestBody SiteWeekBo bo) {
R<SiteWeekVo> siteWeekVo = autoAddSiteWeek();
return siteWeekVo;
}
private R<SiteWeekVo> autoAddSiteWeek() {
//新增时基于最新日期处理weekNo
//先查找当前周是否已存在数据库, 有》返回已有数据, 无》新建数据再返回
Date currentDate = new Date();
int weekNoByDate = WeekNoUtil.getWeekNoByDate(currentDate);
SiteWeekBo siteWeekBo = new SiteWeekBo();
siteWeekBo.setWeekNo((long) weekNoByDate);
List<SiteWeekVo> siteWeekVoList = siteWeekService.queryList(siteWeekBo);
SiteWeekVo siteWeekVo = null;
if (siteWeekVoList.size() > 0) {
return R.fail("当前周已存在,无法新增");
}else{
String dateStr = WeekNoUtil.generateDateStr(currentDate);
String dateFormatStr = DateUtil.format(currentDate, "yyyy-MM-dd");
siteWeekBo.setName(dateStr);
siteWeekBo.setNameTime(dateFormatStr);
//扩展默认字典配置 默认(tile/tileZip/img/video)
// List<SysDictDataVo> siteOssDirList = DictUtils.getDictCache("site_oss_dir");
/**
* 这里用dictService直接查是因为 RemoteDictDataVo SysDictDataVo 报错折中做法简单说就是 RemoteDictDataVo vo = siteOssDirList.get(0)就报错
* 报错如下
* class org.dromara.system.domain.vo.SysDictDataVo cannot be cast to class org.dromara.system.api.domain.vo.RemoteDictDataVo
* (org.dromara.system.domain.vo.SysDictDataVo and org.dromara.system.api.domain.vo.RemoteDictDataVo are in unnamed module of
* loader 'app')
*/
Map<String, String> siteOssDirMap = dictService.getAllDictMapByDictType("site_oss_dir");
siteWeekBo.setDirTile(siteOssDirMap.getOrDefault("二维地图","tile"));
siteWeekBo.setDirTileZip(siteOssDirMap.getOrDefault("二维地图压缩包","tileZip"));
siteWeekBo.setDirImg(siteOssDirMap.getOrDefault("图片","img"));
siteWeekBo.setDirVideo(siteOssDirMap.getOrDefault("视频","video"));
/*
for (int i = 0; i < siteOssDirList.size(); i++) {
switch (siteOssDirList.get(i).getDictLabel()){
case "二维地图":
siteWeekBo.setDirTile(siteOssDirList.get(i).getDictValue());
break;
case "二维地图压缩包":
siteWeekBo.setDirTileZip(siteOssDirList.get(i).getDictValue());
break;
case "图片":
siteWeekBo.setDirImg(siteOssDirList.get(i).getDictValue());
break;
case "视频":
siteWeekBo.setDirVideo(siteOssDirList.get(i).getDictValue());
break;
}
}*/
siteWeekService.insertByBo(siteWeekBo);
siteWeekVo = BeanUtil.copyProperties(siteWeekBo, SiteWeekVo.class);
}
return R.ok(siteWeekVo);
}
/**
* 修改工地日期周
*/
@SaCheckPermission("system:siteWeek:edit")
@Log(title = "工地日期周", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SiteWeekBo bo) {
return toAjax(siteWeekService.updateByBo(bo));
}
@SaCheckPermission("system:siteWeek:edit")
@Log(title = "更新工地日期周", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("changeKeepFlag")
public R<Void> changeKeepFlag(@Validated(EditGroup.class) @RequestBody SiteWeekBo bo) {
return toAjax(siteWeekService.updateByBo(bo));
}
/**
* 删除工地日期周
*
* @param ids 主键串
*/
@SaCheckPermission("system:siteWeek:remove")
@Log(title = "工地日期周", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
// Boolean result = siteWeekService.deleteWithValidByIds(List.of(ids), true);
Boolean result = true;
for (Long id : ids) {
SiteWeekOssBo siteWeekOssBo = new SiteWeekOssBo();
siteWeekOssBo.setSiteWeekId(id);
List<SiteWeekOssVo> siteWeekOssVoList = siteWeekOssService.queryList(siteWeekOssBo);
for (SiteWeekOssVo siteWeekOssVo : siteWeekOssVoList) {
try{
ossTianyiClientUtils.deleteFile(siteWeekOssVo.getUrl()); //minio删除文件
siteWeekOssService.deleteWithValidByIds(List.of(siteWeekOssVo.getId()),true); //工地周数据删除
}catch (Exception e){
result = false;
System.err.println("天翼oss文件删除失败"+ siteWeekOssVo.getUrl());
}
}
siteWeekService.deleteWithValidByIds(List.of(id),true);
}
return toAjax(result);
}
}

227
dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekOssController.java

@ -0,0 +1,227 @@
package org.dromara.system.controller.site;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.servlet.ServletOutputStream;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.apache.poi.util.IOUtils;
import org.dromara.system.config.OssTianyiConfig;
import org.dromara.system.domain.bo.SiteWeekBo;
import org.dromara.system.domain.vo.SiteWeekVo;
import org.dromara.system.service.ISiteWeekService;
import org.dromara.system.utils.OssTianyiClientUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.system.domain.vo.SiteWeekOssVo;
import org.dromara.system.domain.bo.SiteWeekOssBo;
import org.dromara.system.service.ISiteWeekOssService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* 工地周OSS对象存储
* 前端访问路由地址为:/system/siteWeekOss
*
* @author szs
* @date 2025-05-10
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/siteWeekOss")
public class SiteWeekOssController extends BaseController {
private final ISiteWeekOssService siteWeekOssService;
@Autowired
private ISiteWeekService siteWeekService;
@Autowired
private OssTianyiClientUtils ossTianyiClientUtils;
/**
* 查询工地周OSS对象存储列表
*/
@SaCheckPermission("system:siteWeekOss:list")
@GetMapping("/list")
public TableDataInfo<SiteWeekOssVo> list(SiteWeekOssBo bo, PageQuery pageQuery) {
return siteWeekOssService.queryPageList(bo, pageQuery);
}
/**
* 导出工地周OSS对象存储列表
*/
@SaCheckPermission("system:siteWeekOss:export")
@Log(title = "工地周OSS对象存储", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(SiteWeekOssBo bo, HttpServletResponse response) {
List<SiteWeekOssVo> list = siteWeekOssService.queryList(bo);
ExcelUtil.exportExcel(list, "工地周OSS对象存储", SiteWeekOssVo.class, response);
}
/**
* 获取工地周OSS对象存储详细信息
*
* @param id 主键
*/
@SaCheckPermission("system:siteWeekOss:query")
@GetMapping("/{id}")
public R<SiteWeekOssVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(siteWeekOssService.queryById(id));
}
/**
* 新增工地周OSS对象存储
*/
@SaCheckPermission("system:siteWeekOss:add")
@Log(title = "工地周OSS对象存储", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SiteWeekOssBo bo) {
return toAjax(siteWeekOssService.insertByBo(bo));
}
/**
* 修改工地周OSS对象存储
*/
@SaCheckPermission("system:siteWeekOss:edit")
@Log(title = "工地周OSS对象存储", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SiteWeekOssBo bo) {
return toAjax(siteWeekOssService.updateByBo(bo));
}
// @Log(title = "OSS对象存储", businessType = BusinessType.INSERT)
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "上传OSS对象存储",description = "上传OSS对象存储")
public R<SiteWeekOssBo> upload(@RequestPart("file") MultipartFile file, @RequestParam("siteWeekId") Long siteWeekId) {
if (ObjectUtil.isNull(file)) {
return R.fail("上传文件不能为空");
}
SiteWeekVo siteWeekVo = siteWeekService.queryById(siteWeekId);
//工地日期周默认上传路径
String baseUrl = siteWeekVo.getNameTime() + "/" + siteWeekVo.getDirTile() + "/";
//上传到minio
String fileUrl = baseUrl + file.getOriginalFilename();
ossTianyiClientUtils.uploadFile(fileUrl, file);
//记录到本地
SiteWeekOssBo siteWeekOssBo = new SiteWeekOssBo();
siteWeekOssBo.setSiteWeekId(siteWeekVo.getId());
siteWeekOssBo.setWeekNo(siteWeekVo.getWeekNo());
siteWeekOssBo.setFileName(file.getOriginalFilename());
siteWeekOssBo.setOriginalName(file.getOriginalFilename());
siteWeekOssBo.setFileSuffix(FileUtil.extName(file.getOriginalFilename()));
siteWeekOssBo.setUrl(fileUrl);
siteWeekOssBo.setService("tianyiOss");
Boolean uploadBo = siteWeekOssService.insertByBo(siteWeekOssBo);
// SysOssVo oss = iSysOssService.upload(file);
// SiteWeekOssBo uploadVo = new SiteWeekOssBo();
// uploadVo.setUrl(oss.getUrl());
// uploadVo.setFileName(oss.getOriginalName());
// uploadVo.setOssId(oss.getOssId().toString());
// return R.ok(uploadVo);
return R.ok(siteWeekOssBo);
}
/**
* 下载OSS对象存储
*
* @param id OSS对象ID
*/
@GetMapping("/download/{id}")
@Operation(summary = "下载OSS对象存储",description = "下载OSS对象存储")
public void download(@PathVariable Long id, HttpServletResponse response) throws IOException {
SiteWeekOssVo siteWeekOssVo = siteWeekOssService.queryById(id);
// InputStream inputStream = ossTianyiClientUtils.downloadFile(siteWeekOssVo.getUrl());
// String encodedFileName = URLEncoder.encode(siteWeekOssVo.getFileName(), "UTF-8").replaceAll("\\+", "%20");
// response.setContentType("application/octet-stream");
// response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
// response.setHeader("download-filename", encodedFileName);
// // 文件流复制
// try (ServletOutputStream outputStream = response.getOutputStream()) {
// IOUtils.copy(inputStream, outputStream);
// outputStream.flush();
// } finally {
// inputStream.close(); // 关闭流
// }
try (InputStream inputStream = ossTianyiClientUtils.downloadFile(siteWeekOssVo.getUrl())) {
// 文件名进行编码
String encodedFileName = URLEncoder.encode(siteWeekOssVo.getFileName(), "UTF-8").replaceAll("\\+", "%20");
response.setContentType("application/octet-stream");// 设置响应内容类型
response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
// 获取响应输出流
ServletOutputStream outputStream = response.getOutputStream();
// 文件内容写入响应输出流
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
} catch (Exception e) {
throw new RuntimeException("下载有误");
}
}
/**
* 删除工地周OSS对象存储
*
* @param ids 主键串
*/
@SaCheckPermission("system:siteWeekOss:remove")
@Log(title = "工地周OSS对象存储", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
// Boolean result = siteWeekOssService.deleteWithValidByIds(List.of(ids), true);
Boolean result = true;
for (Long id : ids) {
SiteWeekOssVo siteWeekOssVo = siteWeekOssService.queryById(id);
try{
ossTianyiClientUtils.deleteFile(siteWeekOssVo.getUrl()); //minio删除文件
siteWeekOssService.deleteWithValidByIds(List.of(id),true); //工地周数据删除
}catch (Exception e){
result = false;
System.err.println("天翼oss文件删除失败"+ siteWeekOssVo.getUrl());
}
}
return toAjax(result);
}
}

8
dk-modules/system/src/main/java/org/dromara/system/controller/system/AiLabelController.java

@ -57,6 +57,14 @@ public class AiLabelController extends BaseController {
return aiLabelService.allList(); return aiLabelService.allList();
} }
/**
* 下拉框集合-绑定过的标签
*/
@GetMapping("/bing/list")
public List<AiLabelVo> listPostLabel() {
return aiLabelService.selectLabelList();
}
/** /**
* 下拉框集合 * 下拉框集合
*/ */

8
dk-modules/system/src/main/java/org/dromara/system/controller/system/SysConfigController.java

@ -1,6 +1,7 @@
package org.dromara.system.controller.system; package org.dromara.system.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.web.core.BaseController; import org.dromara.common.web.core.BaseController;
@ -134,4 +135,11 @@ public class SysConfigController extends BaseController {
configService.resetConfigCache(); configService.resetConfigCache();
return R.ok(); return R.ok();
} }
@GetMapping("/selectStreamType")
public List<String> selectStreamType(@RequestParam String deviceSn) {
return configService.selectStreamType(deviceSn);
}
} }

240
dk-modules/system/src/main/java/org/dromara/system/controller/system/SysSubmailConfigController.java

@ -0,0 +1,240 @@
package org.dromara.system.controller.system;
import java.nio.file.CopyOption;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.excel.core.ExcelResult;
import org.dromara.system.domain.SysSubmailConfigUser;
import org.dromara.system.domain.SysSubmailLog;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysSubmailConfigUserBo;
import org.dromara.system.domain.bo.SysSubmailLogBo;
import org.dromara.system.domain.vo.SysSubmailConfigUserVo;
import org.dromara.system.domain.vo.SysUserImportVo;
import org.dromara.system.listener.SysUserImportListener;
import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysSubmailConfigUserService;
import org.dromara.system.service.ISysSubmailLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.system.domain.vo.SysSubmailConfigVo;
import org.dromara.system.domain.bo.SysSubmailConfigBo;
import org.dromara.system.service.ISysSubmailConfigService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* 赛邮服务配置
* 前端访问路由地址为:/system/sysSubmailConfig
*
* @author szs
* @date 2025-05-11
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/submailConfig")
public class SysSubmailConfigController extends BaseController {
private final ISysSubmailConfigService sysSubmailConfigService;
@Autowired
private ISysSubmailConfigUserService sysSubmailConfigUserService;
/**
* 查询赛邮服务配置列表
*/
@SaCheckPermission("system:sysSubmailConfig:list")
@GetMapping("/list")
public TableDataInfo<SysSubmailConfigVo> list(SysSubmailConfigBo bo, PageQuery pageQuery) {
TableDataInfo<SysSubmailConfigVo> sysSubmailConfigVoTableDataInfo = sysSubmailConfigService.queryPageList(bo, pageQuery);
List<SysSubmailConfigVo> rows = sysSubmailConfigVoTableDataInfo.getRows();
List<Long> configIds = rows.stream().map(SysSubmailConfigVo::getId).toList();
List<SysSubmailConfigUserVo> sysSubmailConfigUserVoList = sysSubmailConfigUserService.selectConfigUserByConfigIds(configIds);
for (SysSubmailConfigVo configVo : rows) {
List<SysSubmailConfigUserVo> collect = sysSubmailConfigUserVoList.stream().filter(item -> item.getSubmailConfigId().equals(configVo.getId())).collect(Collectors.toList());
configVo.setConfigUserList(collect);
}
return sysSubmailConfigVoTableDataInfo;
}
@SaCheckPermission("system:sysSubmailConfig:list")
@GetMapping("/listAll")
public List<SysSubmailConfigVo> listAll(SysSubmailConfigBo bo) {
return sysSubmailConfigService.queryList(bo);
}
@SaCheckPermission("system:sysSubmailConfig:export")
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
// ExcelResult<SysSubmailConfigVo> result = ExcelUtil.importExcel(file.getInputStream(), SysSubmailConfigVo.class, new SysUserImportListener(updateSupport));
System.out.println(file.getName());
return R.ok(null);
}
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
ExcelUtil.exportExcel(new ArrayList<>(), "配置数据", SysSubmailConfigVo.class, response);
}
/**
* 导出赛邮服务配置列表
*/
@SaCheckPermission("system:sysSubmailConfig:export")
@Log(title = "赛邮服务配置", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(SysSubmailConfigBo bo, HttpServletResponse response) {
List<SysSubmailConfigVo> list = sysSubmailConfigService.queryList(bo);
// ExcelUtil.exportExcel(list, "赛邮服务配置", SysSubmailConfigVo.class, response);
List<SysSubmailConfigVo> listVo = MapstructUtils.convert(list, SysSubmailConfigVo.class);
// 导出方法
ExcelUtil.exportExcel(listVo, "赛邮服务数据", SysSubmailConfigVo.class, response);
}
/**
* 获取赛邮服务配置详细信息
*
* @param id 主键
*/
@SaCheckPermission("system:sysSubmailConfig:query")
@GetMapping("/{id}")
public R<SysSubmailConfigVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(sysSubmailConfigService.queryById(id));
}
/**
* 新增赛邮服务配置
*/
@SaCheckPermission("system:sysSubmailConfig:add")
@Log(title = "赛邮服务配置", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysSubmailConfigBo bo) {
return toAjax(sysSubmailConfigService.insertByBo(bo));
}
/**
* 修改赛邮服务配置
*/
@SaCheckPermission("system:sysSubmailConfig:edit")
@Log(title = "赛邮服务配置", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysSubmailConfigBo bo) {
return toAjax(sysSubmailConfigService.updateByBo(bo));
}
//配置
@SaCheckPermission("system:sysSubmailConfig:edit")
@Log(title = "配置赛邮服务配置用户", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("/configUser")
public R<Void> configUser(@Validated(EditGroup.class) @RequestBody SysSubmailConfigBo bo) {
//删除旧配置
SysSubmailConfigUserBo userBo = new SysSubmailConfigUserBo();
userBo.setSubmailConfigId(bo.getId());
List<SysSubmailConfigUserVo> sysSubmailConfigUserVoList = sysSubmailConfigUserService.queryList(userBo);
List<Long> configUserIds = sysSubmailConfigUserVoList.stream().map(SysSubmailConfigUserVo::getId).toList();
sysSubmailConfigUserService.deleteWithValidByIds(configUserIds,true);
//保留新配置
for (SysUser sysUser : bo.getConfigUserList()) {
SysSubmailConfigUserBo sysSubmailConfigUser = new SysSubmailConfigUserBo();
sysSubmailConfigUser.setSubmailConfigId(bo.getId());
sysSubmailConfigUser.setUserId(sysUser.getUserId());
sysSubmailConfigUser.setName(sysUser.getNickName());
sysSubmailConfigUser.setPhonenumber(sysUser.getPhonenumber());
sysSubmailConfigUserService.insertByBo(sysSubmailConfigUser);
}
return toAjax(1);
}
/**
* 删除赛邮服务配置
*
* @param ids 主键串
*/
@SaCheckPermission("system:sysSubmailConfig:remove")
@Log(title = "赛邮服务配置", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(sysSubmailConfigService.deleteWithValidByIds(List.of(ids), true));
}
//发送测试
@Autowired
private ISysSubmailLogService sysSubmailLogService;
/**
*
* @param code 必须传参smsMultixsend
* @param multiParam 前台传参 JSON.stringfy( {"jobName":"翟山街道华盛","labelCn":"普通垃圾","labelEn":"garbage","deptName":"翟山街道","lat":"34.20994348014929","lng":"117.2054671683176"})
* @return
*/
@RepeatSubmit()
@PostMapping("/cmdSend")
public R<String> cmdSend(@RequestParam("code") String code, @RequestParam("multiParam") String multiParam) {
if(StrUtil.isBlank(code)){
return R.fail("发送类型为空");
}
return sysSubmailConfigService.cmdSend(code, multiParam);
}
//发送测试
@RepeatSubmit()
@PostMapping("/autoSend")
public R<String> autoSend(@Validated(AddGroup.class) @RequestBody SysSubmailConfigBo bo) {
//判断是否配置用户
SysSubmailConfigUserBo mailUserQuery = new SysSubmailConfigUserBo();
mailUserQuery.setSubmailConfigId(bo.getId());
List<SysSubmailConfigUserVo> sysSubmailConfigUserVoList = sysSubmailConfigUserService.queryList(mailUserQuery);
List<SysSubmailConfigUserVo> configUserVoList = sysSubmailConfigUserVoList.stream().filter(item -> StrUtil.isNotBlank(item.getPhonenumber())).collect(Collectors.toList());
if(configUserVoList.size() <= 0) {
return R.fail("暂无配置有效用户");
}
String result = sysSubmailConfigService.submailSendUtil(bo, configUserVoList);
return R.ok(result);
}
}

106
dk-modules/system/src/main/java/org/dromara/system/controller/system/SysSubmailLogController.java

@ -0,0 +1,106 @@
package org.dromara.system.controller.system;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.system.domain.vo.SysSubmailLogVo;
import org.dromara.system.domain.bo.SysSubmailLogBo;
import org.dromara.system.service.ISysSubmailLogService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 赛邮服务发送log
* 前端访问路由地址为:/system/sysSubmailLog
*
* @author szs
* @date 2025-05-11
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/submailLog")
public class SysSubmailLogController extends BaseController {
private final ISysSubmailLogService sysSubmailLogService;
/**
* 查询赛邮服务发送log列表
*/
@SaCheckPermission("system:sysSubmailLog:list")
@GetMapping("/list")
public TableDataInfo<SysSubmailLogVo> list(SysSubmailLogBo bo, PageQuery pageQuery) {
return sysSubmailLogService.queryPageList(bo, pageQuery);
}
/**
* 导出赛邮服务发送log列表
*/
@SaCheckPermission("system:sysSubmailLog:export")
@Log(title = "赛邮服务发送log", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(SysSubmailLogBo bo, HttpServletResponse response) {
List<SysSubmailLogVo> list = sysSubmailLogService.queryList(bo);
ExcelUtil.exportExcel(list, "赛邮服务发送log", SysSubmailLogVo.class, response);
}
/**
* 获取赛邮服务发送log详细信息
*
* @param id 主键
*/
@SaCheckPermission("system:sysSubmailLog:query")
@GetMapping("/{id}")
public R<SysSubmailLogVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(sysSubmailLogService.queryById(id));
}
/**
* 新增赛邮服务发送log
*/
@SaCheckPermission("system:sysSubmailLog:add")
@Log(title = "赛邮服务发送log", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysSubmailLogBo bo) {
return toAjax(sysSubmailLogService.insertByBo(bo));
}
/**
* 修改赛邮服务发送log
*/
@SaCheckPermission("system:sysSubmailLog:edit")
@Log(title = "赛邮服务发送log", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysSubmailLogBo bo) {
return toAjax(sysSubmailLogService.updateByBo(bo));
}
/**
* 删除赛邮服务发送log
*
* @param ids 主键串
*/
@SaCheckPermission("system:sysSubmailLog:remove")
@Log(title = "赛邮服务发送log", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(sysSubmailLogService.deleteWithValidByIds(List.of(ids), true));
}
}

6
dk-modules/system/src/main/java/org/dromara/system/controller/system/SysUserController.java

@ -74,6 +74,12 @@ public class SysUserController extends BaseController {
return R.ok(userService.allList(user)); return R.ok(userService.allList(user));
} }
@SaCheckPermission("system:user:list")
@GetMapping("/listAll")
public List<SysUserVo> listAll(SysUserBo user) {
return userService.selectUserwithPhonenumberList(user);
}
/** /**
* 导出用户列表 * 导出用户列表
*/ */

63
dk-modules/system/src/main/java/org/dromara/system/domain/DjiApi.java

@ -0,0 +1,63 @@
package org.dromara.system.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* 大疆开发对象 dji_api
*
* @author szs
* @date 2025-05-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("dji_api")
public class DjiApi extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "id")
private Long id;
/**
* 大疆api类型
*/
private String djiApiType;
/**
* 版本名称
*/
private String name;
/**
* 版本号
*/
private String nameVersionNo;
/**
* 版本次数
*/
private Integer versionCount;
/**
* 发步日期
*/
private Date timeRelease;
/**
* 备注
*/
private String remark;
}

76
dk-modules/system/src/main/java/org/dromara/system/domain/DjiApiError.java

@ -0,0 +1,76 @@
package org.dromara.system.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 大疆开发-错误码对象 dji_api_error
*
* @author szs
* @date 2025-05-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("dji_api_error")
public class DjiApiError extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "id")
private Long id;
/**
* 大疆APIId
*/
private Long djiApiId;
/**
* 大疆API版本
*/
private String djiApiName;
/**
* 错误码
*/
private String name;
/**
* 中文描述
*/
private String nameCn;
/**
* 英文描述
*/
private String nameEn;
/**
* 是否变更
*/
private String isChangeFlag;
/**
* 历史变更次数
*/
private Integer changeHistroyCount;
/**
* 历史变更Ids(,分隔)
*/
private String changeHistoryIds;
/**
* 大疆开发-错误码
*/
private String remark;
}

67
dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeek.java

@ -0,0 +1,67 @@
package org.dromara.system.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 工地日期周对象 site_week
*
* @author szs
* @date 2025-05-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("site_week")
public class SiteWeek extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "id")
private Long id;
/**
* 名称
*/
private String name;
/**
* 年月日名称
*/
private String nameTime;
/**
* 周编号
*/
private Long weekNo;
/**
* 周描述
*/
private String weekNoDescr;
/**
* 分组编号备用
*/
private Long groupNo;
private String dirTile;
private String dirTileZip;
private String dirImg;
private String dirVideo;
private String isKeepFlag; //是否保存(0正常 1停用)
/**
* 备注
*/
private String remark;
}

71
dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeekOss.java

@ -0,0 +1,71 @@
package org.dromara.system.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 工地周OSS对象存储对象 site_week_oss
*
* @author szs
* @date 2025-05-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("site_week_oss")
public class SiteWeekOss extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "id")
private Long id;
/**
* 工地周id
*/
private Long siteWeekId;
/**
* 周编号
*/
private Long weekNo;
/**
* 文件名
*/
private String fileName;
/**
* 原名
*/
private String originalName;
/**
* 文件后缀名
*/
private String fileSuffix;
/**
* URL地址
*/
private String url;
/**
* 备注
*/
private String remark;
/**
* 服务商
*/
private String service;
}

1
dk-modules/system/src/main/java/org/dromara/system/domain/SysNotice.java

@ -48,4 +48,5 @@ public class SysNotice extends TenantEntity {
*/ */
private String remark; private String remark;
private Integer isRead;
} }

92
dk-modules/system/src/main/java/org/dromara/system/domain/SysSubmailConfig.java

@ -0,0 +1,92 @@
package org.dromara.system.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 赛邮服务配置对象 sys_submail_config
*
* @author szs
* @date 2025-05-11
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_submail_config")
public class SysSubmailConfig extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 字典编码
*/
@TableId(value = "id")
private Long id;
/**
* 接口名称
*/
private String name;
/**
* 接口编码
*/
private String code;
/**
* 赛邮类型(Mail, Message,Voice,Internationalsms,Mobiledata)
*/
private String type;
/**
* 接口Url
*/
private String url;
/**
* AppId
*/
private String appid;
/**
* signature
*/
private String signature;
private String project; //模板编码
/**
* tag参数
*/
private String tag;
/**
* UNIX 时间戳
*/
private String timestamp;
/**
* API 授权模式(normal)
*/
private String signType;
/**
* signature加密计算方式
*/
private String signVersion;
/**
* 最新反馈状态1是 0否
*/
private String latestResStatus;
/**
* 备注
*/
private String remark;
}

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

Loading…
Cancel
Save