Commit c4c451320d21c7a2d0a1b1a31d981b24487b6b1f
Merge branch 'feature/iot' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into master-jdk17
Showing
441 changed files
with
18589 additions
and
11832 deletions
Too many changes.
To preserve performance only 100 of 441 files are displayed.
pom.xml
| ... | ... | @@ -24,7 +24,7 @@ |
| 24 | 24 | <!-- <module>yudao-module-crm</module>--> |
| 25 | 25 | <!-- <module>yudao-module-erp</module>--> |
| 26 | 26 | <!-- <module>yudao-module-ai</module>--> |
| 27 | -<!-- <module>yudao-module-iot</module>--> | |
| 27 | + <module>yudao-module-iot</module> | |
| 28 | 28 | </modules> |
| 29 | 29 | |
| 30 | 30 | <name>${project.artifactId}</name> | ... | ... |
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/DateIntervalEnum.java
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java
| ... | ... | @@ -8,6 +8,7 @@ import cn.hutool.core.lang.Assert; |
| 8 | 8 | import cn.hutool.core.util.StrUtil; |
| 9 | 9 | import cn.iocoder.yudao.framework.common.enums.DateIntervalEnum; |
| 10 | 10 | |
| 11 | +import java.sql.Timestamp; | |
| 11 | 12 | import java.time.*; |
| 12 | 13 | import java.time.format.DateTimeFormatter; |
| 13 | 14 | import java.time.format.DateTimeParseException; |
| ... | ... | @@ -16,8 +17,7 @@ import java.time.temporal.TemporalAdjusters; |
| 16 | 17 | import java.util.ArrayList; |
| 17 | 18 | import java.util.List; |
| 18 | 19 | |
| 19 | -import static cn.hutool.core.date.DatePattern.UTC_MS_WITH_XXX_OFFSET_PATTERN; | |
| 20 | -import static cn.hutool.core.date.DatePattern.createFormatter; | |
| 20 | +import static cn.hutool.core.date.DatePattern.*; | |
| 21 | 21 | |
| 22 | 22 | /** |
| 23 | 23 | * 时间工具类,用于 {@link LocalDateTime} |
| ... | ... | @@ -90,6 +90,21 @@ public class LocalDateTimeUtils { |
| 90 | 90 | * @param time 指定时间 |
| 91 | 91 | * @return 是否 |
| 92 | 92 | */ |
| 93 | + public static boolean isBetween(LocalDateTime startTime, LocalDateTime endTime, Timestamp time) { | |
| 94 | + if (startTime == null || endTime == null || time == null) { | |
| 95 | + return false; | |
| 96 | + } | |
| 97 | + return LocalDateTimeUtil.isIn(LocalDateTimeUtil.of(time), startTime, endTime); | |
| 98 | + } | |
| 99 | + | |
| 100 | + /** | |
| 101 | + * 判指定断时间,是否在该时间范围内 | |
| 102 | + * | |
| 103 | + * @param startTime 开始时间 | |
| 104 | + * @param endTime 结束时间 | |
| 105 | + * @param time 指定时间 | |
| 106 | + * @return 是否 | |
| 107 | + */ | |
| 93 | 108 | public static boolean isBetween(LocalDateTime startTime, LocalDateTime endTime, String time) { |
| 94 | 109 | if (startTime == null || endTime == null || time == null) { |
| 95 | 110 | return false; |
| ... | ... | @@ -234,6 +249,11 @@ public class LocalDateTimeUtils { |
| 234 | 249 | // 2. 循环,生成时间范围 |
| 235 | 250 | List<LocalDateTime[]> timeRanges = new ArrayList<>(); |
| 236 | 251 | switch (intervalEnum) { |
| 252 | + case HOUR: | |
| 253 | + while (startTime.isBefore(endTime)) { | |
| 254 | + timeRanges.add(new LocalDateTime[]{startTime, startTime.plusHours(1).minusNanos(1)}); | |
| 255 | + startTime = startTime.plusHours(1); | |
| 256 | + } | |
| 237 | 257 | case DAY: |
| 238 | 258 | while (startTime.isBefore(endTime)) { |
| 239 | 259 | timeRanges.add(new LocalDateTime[]{startTime, startTime.plusDays(1).minusNanos(1)}); |
| ... | ... | @@ -297,6 +317,8 @@ public class LocalDateTimeUtils { |
| 297 | 317 | |
| 298 | 318 | // 2. 循环,生成时间范围 |
| 299 | 319 | switch (intervalEnum) { |
| 320 | + case HOUR: | |
| 321 | + return LocalDateTimeUtil.format(startTime, DatePattern.NORM_DATETIME_MINUTE_PATTERN); | |
| 300 | 322 | case DAY: |
| 301 | 323 | return LocalDateTimeUtil.format(startTime, DatePattern.NORM_DATE_PATTERN); |
| 302 | 324 | case WEEK: | ... | ... |
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/JsonUtils.java
| ... | ... | @@ -3,18 +3,22 @@ package cn.iocoder.yudao.framework.common.util.json; |
| 3 | 3 | import cn.hutool.core.util.ArrayUtil; |
| 4 | 4 | import cn.hutool.core.util.StrUtil; |
| 5 | 5 | import cn.hutool.json.JSONUtil; |
| 6 | +import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeDeserializer; | |
| 7 | +import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeSerializer; | |
| 6 | 8 | import com.fasterxml.jackson.annotation.JsonInclude; |
| 7 | 9 | import com.fasterxml.jackson.core.type.TypeReference; |
| 8 | 10 | import com.fasterxml.jackson.databind.DeserializationFeature; |
| 9 | 11 | import com.fasterxml.jackson.databind.JsonNode; |
| 10 | 12 | import com.fasterxml.jackson.databind.ObjectMapper; |
| 11 | 13 | import com.fasterxml.jackson.databind.SerializationFeature; |
| 14 | +import com.fasterxml.jackson.databind.module.SimpleModule; | |
| 12 | 15 | import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; |
| 13 | 16 | import lombok.SneakyThrows; |
| 14 | 17 | import lombok.extern.slf4j.Slf4j; |
| 15 | 18 | |
| 16 | 19 | import java.io.IOException; |
| 17 | 20 | import java.lang.reflect.Type; |
| 21 | +import java.time.LocalDateTime; | |
| 18 | 22 | import java.util.ArrayList; |
| 19 | 23 | import java.util.List; |
| 20 | 24 | |
| ... | ... | @@ -32,7 +36,11 @@ public class JsonUtils { |
| 32 | 36 | objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); |
| 33 | 37 | objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); |
| 34 | 38 | objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略 null 值 |
| 35 | - objectMapper.registerModules(new JavaTimeModule()); // 解决 LocalDateTime 的序列化 | |
| 39 | + // 解决 LocalDateTime 的序列化 | |
| 40 | + SimpleModule simpleModule = new JavaTimeModule() | |
| 41 | + .addSerializer(LocalDateTime.class, TimestampLocalDateTimeSerializer.INSTANCE) | |
| 42 | + .addDeserializer(LocalDateTime.class, TimestampLocalDateTimeDeserializer.INSTANCE); | |
| 43 | + objectMapper.registerModules(simpleModule); | |
| 36 | 44 | } |
| 37 | 45 | |
| 38 | 46 | /** |
| ... | ... | @@ -99,6 +107,18 @@ public class JsonUtils { |
| 99 | 107 | } |
| 100 | 108 | } |
| 101 | 109 | |
| 110 | + public static <T> T parseObject(byte[] text, Type type) { | |
| 111 | + if (ArrayUtil.isEmpty(text)) { | |
| 112 | + return null; | |
| 113 | + } | |
| 114 | + try { | |
| 115 | + return objectMapper.readValue(text, objectMapper.getTypeFactory().constructType(type)); | |
| 116 | + } catch (IOException e) { | |
| 117 | + log.error("json parse err,json:{}", text, e); | |
| 118 | + throw new RuntimeException(e); | |
| 119 | + } | |
| 120 | + } | |
| 121 | + | |
| 102 | 122 | /** |
| 103 | 123 | * 将字符串解析成指定类型的对象 |
| 104 | 124 | * 使用 {@link #parseObject(String, Class)} 时,在@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 的场景下, | ... | ... |
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/object/ObjectUtils.java
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/redis/config/YudaoRedisMQConsumerAutoConfiguration.java
| ... | ... | @@ -69,9 +69,8 @@ public class YudaoRedisMQConsumerAutoConfiguration { |
| 69 | 69 | @ConditionalOnBean(AbstractRedisStreamMessageListener.class) // 只有 AbstractStreamMessageListener 存在的时候,才需要注册 Redis pubsub 监听 |
| 70 | 70 | public RedisPendingMessageResendJob redisPendingMessageResendJob(List<AbstractRedisStreamMessageListener<?>> listeners, |
| 71 | 71 | RedisMQTemplate redisTemplate, |
| 72 | - @Value("${spring.application.name}") String groupName, | |
| 73 | 72 | RedissonClient redissonClient) { |
| 74 | - return new RedisPendingMessageResendJob(listeners, redisTemplate, groupName, redissonClient); | |
| 73 | + return new RedisPendingMessageResendJob(listeners, redisTemplate, redissonClient); | |
| 75 | 74 | } |
| 76 | 75 | |
| 77 | 76 | /** |
| ... | ... | @@ -141,14 +140,14 @@ public class YudaoRedisMQConsumerAutoConfiguration { |
| 141 | 140 | * |
| 142 | 141 | * @return 消费者名字 |
| 143 | 142 | */ |
| 144 | - private static String buildConsumerName() { | |
| 143 | + public static String buildConsumerName() { | |
| 145 | 144 | return String.format("%s@%d", SystemUtil.getHostInfo().getAddress(), SystemUtil.getCurrentPID()); |
| 146 | 145 | } |
| 147 | 146 | |
| 148 | 147 | /** |
| 149 | 148 | * 校验 Redis 版本号,是否满足最低的版本号要求! |
| 150 | 149 | */ |
| 151 | - private static void checkRedisVersion(RedisTemplate<String, ?> redisTemplate) { | |
| 150 | + public static void checkRedisVersion(RedisTemplate<String, ?> redisTemplate) { | |
| 152 | 151 | // 获得 Redis 版本 |
| 153 | 152 | Properties info = redisTemplate.execute((RedisCallback<Properties>) RedisServerCommands::info); |
| 154 | 153 | String version = MapUtil.getStr(info, "redis_version"); | ... | ... |
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/redis/core/job/RedisPendingMessageResendJob.java
| ... | ... | @@ -35,7 +35,6 @@ public class RedisPendingMessageResendJob { |
| 35 | 35 | |
| 36 | 36 | private final List<AbstractRedisStreamMessageListener<?>> listeners; |
| 37 | 37 | private final RedisMQTemplate redisTemplate; |
| 38 | - private final String groupName; | |
| 39 | 38 | private final RedissonClient redissonClient; |
| 40 | 39 | |
| 41 | 40 | /** |
| ... | ... | @@ -64,13 +63,13 @@ public class RedisPendingMessageResendJob { |
| 64 | 63 | private void execute() { |
| 65 | 64 | StreamOperations<String, Object, Object> ops = redisTemplate.getRedisTemplate().opsForStream(); |
| 66 | 65 | listeners.forEach(listener -> { |
| 67 | - PendingMessagesSummary pendingMessagesSummary = Objects.requireNonNull(ops.pending(listener.getStreamKey(), groupName)); | |
| 66 | + PendingMessagesSummary pendingMessagesSummary = Objects.requireNonNull(ops.pending(listener.getStreamKey(), listener.getGroup())); | |
| 68 | 67 | // 每个消费者的 pending 队列消息数量 |
| 69 | 68 | Map<String, Long> pendingMessagesPerConsumer = pendingMessagesSummary.getPendingMessagesPerConsumer(); |
| 70 | 69 | pendingMessagesPerConsumer.forEach((consumerName, pendingMessageCount) -> { |
| 71 | 70 | log.info("[processPendingMessage][消费者({}) 消息数量({})]", consumerName, pendingMessageCount); |
| 72 | 71 | // 每个消费者的 pending消息的详情信息 |
| 73 | - PendingMessages pendingMessages = ops.pending(listener.getStreamKey(), Consumer.from(groupName, consumerName), Range.unbounded(), pendingMessageCount); | |
| 72 | + PendingMessages pendingMessages = ops.pending(listener.getStreamKey(), Consumer.from(listener.getGroup(), consumerName), Range.unbounded(), pendingMessageCount); | |
| 74 | 73 | if (pendingMessages.isEmpty()) { |
| 75 | 74 | return; |
| 76 | 75 | } |
| ... | ... | @@ -91,7 +90,7 @@ public class RedisPendingMessageResendJob { |
| 91 | 90 | .ofObject(records.get(0).getValue()) // 设置内容 |
| 92 | 91 | .withStreamKey(listener.getStreamKey())); |
| 93 | 92 | // ack 消息消费完成 |
| 94 | - redisTemplate.getRedisTemplate().opsForStream().acknowledge(groupName, records.get(0)); | |
| 93 | + redisTemplate.getRedisTemplate().opsForStream().acknowledge(listener.getGroup(), records.get(0)); | |
| 95 | 94 | log.info("[processPendingMessage][消息({})重新投递成功]", records.get(0).getId()); |
| 96 | 95 | }); |
| 97 | 96 | }); | ... | ... |
yudao-framework/yudao-spring-boot-starter-mq/src/main/java/cn/iocoder/yudao/framework/mq/redis/core/stream/AbstractRedisStreamMessageListener.java
| ... | ... | @@ -53,6 +53,12 @@ public abstract class AbstractRedisStreamMessageListener<T extends AbstractRedis |
| 53 | 53 | this.streamKey = messageType.getDeclaredConstructor().newInstance().getStreamKey(); |
| 54 | 54 | } |
| 55 | 55 | |
| 56 | + protected AbstractRedisStreamMessageListener(String streamKey, String group) { | |
| 57 | + this.messageType = null; | |
| 58 | + this.streamKey = streamKey; | |
| 59 | + this.group = group; | |
| 60 | + } | |
| 61 | + | |
| 56 | 62 | @Override |
| 57 | 63 | public void onMessage(ObjectRecord<String, String> message) { |
| 58 | 64 | // 消费消息 | ... | ... |
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java
| 1 | 1 | package cn.iocoder.yudao.framework.mybatis.config; |
| 2 | 2 | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 3 | 4 | import cn.hutool.core.util.StrUtil; |
| 4 | 5 | import cn.iocoder.yudao.framework.mybatis.core.handler.DefaultDBFieldHandler; |
| 5 | 6 | import com.baomidou.mybatisplus.annotation.DbType; |
| 6 | 7 | import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; |
| 7 | 8 | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; |
| 8 | 9 | import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; |
| 10 | +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | |
| 9 | 11 | import com.baomidou.mybatisplus.extension.incrementer.*; |
| 10 | 12 | import com.baomidou.mybatisplus.extension.parser.JsqlParserGlobal; |
| 11 | 13 | import com.baomidou.mybatisplus.extension.parser.cache.JdkSerialCaffeineJsqlParseCache; |
| 12 | 14 | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; |
| 13 | 15 | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; |
| 16 | +import com.fasterxml.jackson.databind.ObjectMapper; | |
| 14 | 17 | import org.apache.ibatis.annotations.Mapper; |
| 15 | 18 | import org.mybatis.spring.annotation.MapperScan; |
| 16 | 19 | import org.springframework.boot.autoconfigure.AutoConfiguration; |
| ... | ... | @@ -18,6 +21,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| 18 | 21 | import org.springframework.context.annotation.Bean; |
| 19 | 22 | import org.springframework.core.env.ConfigurableEnvironment; |
| 20 | 23 | |
| 24 | +import java.util.List; | |
| 21 | 25 | import java.util.concurrent.TimeUnit; |
| 22 | 26 | |
| 23 | 27 | /** |
| ... | ... | @@ -75,4 +79,11 @@ public class YudaoMybatisAutoConfiguration { |
| 75 | 79 | throw new IllegalArgumentException(StrUtil.format("DbType{} 找不到合适的 IKeyGenerator 实现类", dbType)); |
| 76 | 80 | } |
| 77 | 81 | |
| 82 | + @Bean | |
| 83 | + public JacksonTypeHandler jacksonTypeHandler(List<ObjectMapper> objectMappers) { | |
| 84 | + // 特殊:设置 JacksonTypeHandler 的 ObjectMapper! | |
| 85 | + JacksonTypeHandler.setObjectMapper(CollUtil.getFirst(objectMappers)); | |
| 86 | + return new JacksonTypeHandler(Object.class); | |
| 87 | + } | |
| 88 | + | |
| 78 | 89 | } | ... | ... |
yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/ratelimiter/core/aop/RateLimiterAspect.java
| ... | ... | @@ -39,7 +39,7 @@ public class RateLimiterAspect { |
| 39 | 39 | |
| 40 | 40 | @Before("@annotation(rateLimiter)") |
| 41 | 41 | public void beforePointCut(JoinPoint joinPoint, RateLimiter rateLimiter) { |
| 42 | - // 获得 IdempotentKeyResolver 对象 | |
| 42 | + // 获得 RateLimiterKeyResolver 对象 | |
| 43 | 43 | RateLimiterKeyResolver keyResolver = keyResolvers.get(rateLimiter.keyResolver()); |
| 44 | 44 | Assert.notNull(keyResolver, "找不到对应的 RateLimiterKeyResolver"); |
| 45 | 45 | // 解析 Key | ... | ... |
yudao-module-iot/pom.xml
| 1 | 1 | <?xml version="1.0" encoding="UTF-8"?> |
| 2 | 2 | <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| 3 | - xmlns="http://maven.apache.org/POM/4.0.0" | |
| 4 | - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |
| 3 | + xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |
| 5 | 4 | <parent> |
| 6 | 5 | <artifactId>yudao</artifactId> |
| 7 | 6 | <groupId>cn.iocoder.boot</groupId> |
| 8 | 7 | <version>${revision}</version> |
| 9 | 8 | </parent> |
| 10 | 9 | <modules> |
| 11 | - <module>yudao-module-iot-api</module> | |
| 12 | 10 | <module>yudao-module-iot-biz</module> |
| 13 | - <module>yudao-module-iot-plugins</module> | |
| 11 | + <module>yudao-module-iot-core</module> | |
| 12 | + <module>yudao-module-iot-gateway</module> | |
| 14 | 13 | </modules> |
| 15 | 14 | <modelVersion>4.0.0</modelVersion> |
| 16 | 15 | |
| ... | ... | @@ -20,7 +19,7 @@ |
| 20 | 19 | <name>${project.artifactId}</name> |
| 21 | 20 | <description> |
| 22 | 21 | 物联网模块 |
| 23 | - <!-- TODO 芋艿:需要补充下说明! --> | |
| 22 | + <!-- TODO 芋艿:需要补充下说明! --> | |
| 24 | 23 | </description> |
| 25 | 24 | |
| 26 | 25 | </project> |
| 27 | 26 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/IotDeviceUpstreamApi.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.*; | |
| 5 | -import cn.iocoder.yudao.module.iot.enums.ApiConstants; | |
| 6 | -import jakarta.validation.Valid; | |
| 7 | -import org.springframework.web.bind.annotation.PostMapping; | |
| 8 | -import org.springframework.web.bind.annotation.RequestBody; | |
| 9 | - | |
| 10 | -/** | |
| 11 | - * 设备数据 Upstream 上行 API | |
| 12 | - * | |
| 13 | - * 目的:设备 -> 插件 -> 服务端 | |
| 14 | - * | |
| 15 | - * @author haohao | |
| 16 | - */ | |
| 17 | -public interface IotDeviceUpstreamApi { | |
| 18 | - | |
| 19 | - String PREFIX = ApiConstants.PREFIX + "/device/upstream"; | |
| 20 | - | |
| 21 | - // ========== 设备相关 ========== | |
| 22 | - | |
| 23 | - /** | |
| 24 | - * 更新设备状态 | |
| 25 | - * | |
| 26 | - * @param updateReqDTO 更新设备状态 DTO | |
| 27 | - */ | |
| 28 | - @PostMapping(PREFIX + "/update-state") | |
| 29 | - CommonResult<Boolean> updateDeviceState(@Valid @RequestBody IotDeviceStateUpdateReqDTO updateReqDTO); | |
| 30 | - | |
| 31 | - /** | |
| 32 | - * 上报设备属性数据 | |
| 33 | - * | |
| 34 | - * @param reportReqDTO 上报设备属性数据 DTO | |
| 35 | - */ | |
| 36 | - @PostMapping(PREFIX + "/report-property") | |
| 37 | - CommonResult<Boolean> reportDeviceProperty(@Valid @RequestBody IotDevicePropertyReportReqDTO reportReqDTO); | |
| 38 | - | |
| 39 | - /** | |
| 40 | - * 上报设备事件数据 | |
| 41 | - * | |
| 42 | - * @param reportReqDTO 设备事件 | |
| 43 | - */ | |
| 44 | - @PostMapping(PREFIX + "/report-event") | |
| 45 | - CommonResult<Boolean> reportDeviceEvent(@Valid @RequestBody IotDeviceEventReportReqDTO reportReqDTO); | |
| 46 | - | |
| 47 | - // TODO @芋艿:这个需要 plugins 接入下 | |
| 48 | - /** | |
| 49 | - * 注册设备 | |
| 50 | - * | |
| 51 | - * @param registerReqDTO 注册设备 DTO | |
| 52 | - */ | |
| 53 | - @PostMapping(PREFIX + "/register") | |
| 54 | - CommonResult<Boolean> registerDevice(@Valid @RequestBody IotDeviceRegisterReqDTO registerReqDTO); | |
| 55 | - | |
| 56 | - // TODO @芋艿:这个需要 plugins 接入下 | |
| 57 | - /** | |
| 58 | - * 注册子设备 | |
| 59 | - * | |
| 60 | - * @param registerReqDTO 注册子设备 DTO | |
| 61 | - */ | |
| 62 | - @PostMapping(PREFIX + "/register-sub") | |
| 63 | - CommonResult<Boolean> registerSubDevice(@Valid @RequestBody IotDeviceRegisterSubReqDTO registerReqDTO); | |
| 64 | - | |
| 65 | - // TODO @芋艿:这个需要 plugins 接入下 | |
| 66 | - /** | |
| 67 | - * 注册设备拓扑 | |
| 68 | - * | |
| 69 | - * @param addReqDTO 注册设备拓扑 DTO | |
| 70 | - */ | |
| 71 | - @PostMapping(PREFIX + "/add-topology") | |
| 72 | - CommonResult<Boolean> addDeviceTopology(@Valid @RequestBody IotDeviceTopologyAddReqDTO addReqDTO); | |
| 73 | - | |
| 74 | - // TODO @芋艿:考虑 http 认证 | |
| 75 | - /** | |
| 76 | - * 认证 Emqx 连接 | |
| 77 | - * | |
| 78 | - * @param authReqDTO 认证 Emqx 连接 DTO | |
| 79 | - */ | |
| 80 | - @PostMapping(PREFIX + "/authenticate-emqx-connection") | |
| 81 | - CommonResult<Boolean> authenticateEmqxConnection(@Valid @RequestBody IotDeviceEmqxAuthReqDTO authReqDTO); | |
| 82 | - | |
| 83 | - // ========== 插件相关 ========== | |
| 84 | - | |
| 85 | - /** | |
| 86 | - * 心跳插件实例 | |
| 87 | - * | |
| 88 | - * @param heartbeatReqDTO 心跳插件实例 DTO | |
| 89 | - */ | |
| 90 | - @PostMapping(PREFIX + "/heartbeat-plugin-instance") | |
| 91 | - CommonResult<Boolean> heartbeatPluginInstance(@Valid @RequestBody IotPluginInstanceHeartbeatReqDTO heartbeatReqDTO); | |
| 92 | - | |
| 93 | -} | |
| 94 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDeviceConfigSetReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream; | |
| 2 | - | |
| 3 | -import jakarta.validation.constraints.NotNull; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.util.Map; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * IoT 设备【配置】设置 Request DTO | |
| 10 | - * | |
| 11 | - * @author 芋道源码 | |
| 12 | - */ | |
| 13 | -@Data | |
| 14 | -public class IotDeviceConfigSetReqDTO extends IotDeviceDownstreamAbstractReqDTO { | |
| 15 | - | |
| 16 | - /** | |
| 17 | - * 配置 | |
| 18 | - */ | |
| 19 | - @NotNull(message = "配置不能为空") | |
| 20 | - private Map<String, Object> config; | |
| 21 | - | |
| 22 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDeviceOtaUpgradeReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream; | |
| 2 | - | |
| 3 | -import cn.hutool.core.map.MapUtil; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.util.Map; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * IoT 设备【OTA】升级下发 Request DTO(更新固件消息) | |
| 10 | - * | |
| 11 | - * @author 芋道源码 | |
| 12 | - */ | |
| 13 | -@Data | |
| 14 | -public class IotDeviceOtaUpgradeReqDTO extends IotDeviceDownstreamAbstractReqDTO { | |
| 15 | - | |
| 16 | - /** | |
| 17 | - * 固件编号 | |
| 18 | - */ | |
| 19 | - private Long firmwareId; | |
| 20 | - /** | |
| 21 | - * 固件版本 | |
| 22 | - */ | |
| 23 | - private String version; | |
| 24 | - | |
| 25 | - /** | |
| 26 | - * 签名方式 | |
| 27 | - * | |
| 28 | - * 例如说:MD5、SHA256 | |
| 29 | - */ | |
| 30 | - private String signMethod; | |
| 31 | - /** | |
| 32 | - * 固件文件签名 | |
| 33 | - */ | |
| 34 | - private String fileSign; | |
| 35 | - /** | |
| 36 | - * 固件文件大小 | |
| 37 | - */ | |
| 38 | - private Long fileSize; | |
| 39 | - /** | |
| 40 | - * 固件文件 URL | |
| 41 | - */ | |
| 42 | - private String fileUrl; | |
| 43 | - | |
| 44 | - /** | |
| 45 | - * 自定义信息,建议使用 JSON 格式 | |
| 46 | - */ | |
| 47 | - private String information; | |
| 48 | - | |
| 49 | - public static IotDeviceOtaUpgradeReqDTO build(Map<?, ?> map) { | |
| 50 | - return new IotDeviceOtaUpgradeReqDTO() | |
| 51 | - .setFirmwareId(MapUtil.getLong(map, "firmwareId")).setVersion((String) map.get("version")) | |
| 52 | - .setSignMethod((String) map.get("signMethod")).setFileSign((String) map.get("fileSign")) | |
| 53 | - .setFileSize(MapUtil.getLong(map, "fileSize")).setFileUrl((String) map.get("fileUrl")) | |
| 54 | - .setInformation((String) map.get("information")); | |
| 55 | - } | |
| 56 | - | |
| 57 | - public static Map<?, ?> build(IotDeviceOtaUpgradeReqDTO dto) { | |
| 58 | - return MapUtil.builder() | |
| 59 | - .put("firmwareId", dto.getFirmwareId()).put("version", dto.getVersion()) | |
| 60 | - .put("signMethod", dto.getSignMethod()).put("fileSign", dto.getFileSign()) | |
| 61 | - .put("fileSize", dto.getFileSize()).put("fileUrl", dto.getFileUrl()) | |
| 62 | - .put("information", dto.getInformation()) | |
| 63 | - .build(); | |
| 64 | - } | |
| 65 | - | |
| 66 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDevicePropertyGetReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream; | |
| 2 | - | |
| 3 | -import jakarta.validation.constraints.NotEmpty; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.util.List; | |
| 7 | - | |
| 8 | -// TODO @芋艿:从 server => plugin => device 是否有必要?从阿里云 iot 来看,没有这个功能?! | |
| 9 | -// TODO @芋艿:是不是改成 read 更好?在看看阿里云的 topic 设计 | |
| 10 | -/** | |
| 11 | - * IoT 设备【属性】获取 Request DTO | |
| 12 | - * | |
| 13 | - * @author 芋道源码 | |
| 14 | - */ | |
| 15 | -@Data | |
| 16 | -public class IotDevicePropertyGetReqDTO extends IotDeviceDownstreamAbstractReqDTO { | |
| 17 | - | |
| 18 | - /** | |
| 19 | - * 属性标识数组 | |
| 20 | - */ | |
| 21 | - @NotEmpty(message = "属性标识数组不能为空") | |
| 22 | - private List<String> identifiers; | |
| 23 | - | |
| 24 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDevicePropertySetReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream; | |
| 2 | - | |
| 3 | -import jakarta.validation.constraints.NotEmpty; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.util.Map; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * IoT 设备【属性】设置 Request DTO | |
| 10 | - * | |
| 11 | - * @author 芋道源码 | |
| 12 | - */ | |
| 13 | -@Data | |
| 14 | -public class IotDevicePropertySetReqDTO extends IotDeviceDownstreamAbstractReqDTO { | |
| 15 | - | |
| 16 | - /** | |
| 17 | - * 属性参数 | |
| 18 | - */ | |
| 19 | - @NotEmpty(message = "属性参数不能为空") | |
| 20 | - private Map<String, Object> properties; | |
| 21 | - | |
| 22 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDeviceServiceInvokeReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream; | |
| 2 | - | |
| 3 | -import jakarta.validation.constraints.NotEmpty; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.util.Map; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * IoT 设备【服务】调用 Request DTO | |
| 10 | - * | |
| 11 | - * @author 芋道源码 | |
| 12 | - */ | |
| 13 | -@Data | |
| 14 | -public class IotDeviceServiceInvokeReqDTO extends IotDeviceDownstreamAbstractReqDTO { | |
| 15 | - | |
| 16 | - /** | |
| 17 | - * 服务标识 | |
| 18 | - */ | |
| 19 | - @NotEmpty(message = "服务标识不能为空") | |
| 20 | - private String identifier; | |
| 21 | - /** | |
| 22 | - * 调用参数 | |
| 23 | - */ | |
| 24 | - private Map<String, Object> params; | |
| 25 | - | |
| 26 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceEventReportReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream; | |
| 2 | - | |
| 3 | -import jakarta.validation.constraints.NotEmpty; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.util.Map; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * IoT 设备【事件】上报 Request DTO | |
| 10 | - * | |
| 11 | - * @author 芋道源码 | |
| 12 | - */ | |
| 13 | -@Data | |
| 14 | -public class IotDeviceEventReportReqDTO extends IotDeviceUpstreamAbstractReqDTO { | |
| 15 | - | |
| 16 | - /** | |
| 17 | - * 事件标识 | |
| 18 | - */ | |
| 19 | - @NotEmpty(message = "事件标识不能为空") | |
| 20 | - private String identifier; | |
| 21 | - /** | |
| 22 | - * 事件参数 | |
| 23 | - */ | |
| 24 | - private Map<String, Object> params; | |
| 25 | - | |
| 26 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceOtaProgressReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream; | |
| 2 | - | |
| 3 | -import lombok.Data; | |
| 4 | - | |
| 5 | -// TODO @芋艿:待实现:/ota/${productKey}/${deviceName}/progress | |
| 6 | -/** | |
| 7 | - * IoT 设备【OTA】升级进度 Request DTO(上报更新固件进度) | |
| 8 | - * | |
| 9 | - * @author 芋道源码 | |
| 10 | - */ | |
| 11 | -@Data | |
| 12 | -public class IotDeviceOtaProgressReqDTO extends IotDeviceUpstreamAbstractReqDTO { | |
| 13 | - | |
| 14 | - /** | |
| 15 | - * 固件编号 | |
| 16 | - */ | |
| 17 | - private Long firmwareId; | |
| 18 | - | |
| 19 | - /** | |
| 20 | - * 升级状态 | |
| 21 | - * | |
| 22 | - * 枚举 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeRecordStatusEnum} | |
| 23 | - */ | |
| 24 | - private Integer status; | |
| 25 | - /** | |
| 26 | - * 升级进度,百分比 | |
| 27 | - */ | |
| 28 | - private Integer progress; | |
| 29 | - | |
| 30 | - /** | |
| 31 | - * 升级进度描述 | |
| 32 | - */ | |
| 33 | - private String description; | |
| 34 | - | |
| 35 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceOtaPullReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream; | |
| 2 | - | |
| 3 | -// TODO @芋艿:待实现:/ota/${productKey}/${deviceName}/pull | |
| 4 | -/** | |
| 5 | - * IoT 设备【OTA】升级下拉 Request DTO(拉取固件更新) | |
| 6 | - * | |
| 7 | - * @author 芋道源码 | |
| 8 | - */ | |
| 9 | -public class IotDeviceOtaPullReqDTO { | |
| 10 | - | |
| 11 | - /** | |
| 12 | - * 固件编号 | |
| 13 | - */ | |
| 14 | - private Long firmwareId; | |
| 15 | - | |
| 16 | - /** | |
| 17 | - * 固件版本 | |
| 18 | - */ | |
| 19 | - private String version; | |
| 20 | - | |
| 21 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceOtaReportReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream; | |
| 2 | - | |
| 3 | -// TODO @芋艿:待实现:/ota/${productKey}/${deviceName}/report | |
| 4 | -/** | |
| 5 | - * IoT 设备【OTA】上报 Request DTO(上报固件版本) | |
| 6 | - * | |
| 7 | - * @author 芋道源码 | |
| 8 | - */ | |
| 9 | -public class IotDeviceOtaReportReqDTO { | |
| 10 | - | |
| 11 | - /** | |
| 12 | - * 固件编号 | |
| 13 | - */ | |
| 14 | - private Long firmwareId; | |
| 15 | - | |
| 16 | - /** | |
| 17 | - * 固件版本 | |
| 18 | - */ | |
| 19 | - private String version; | |
| 20 | - | |
| 21 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDevicePropertyReportReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream; | |
| 2 | - | |
| 3 | -import jakarta.validation.constraints.NotEmpty; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.util.Map; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * IoT 设备【属性】上报 Request DTO | |
| 10 | - * | |
| 11 | - * @author 芋道源码 | |
| 12 | - */ | |
| 13 | -@Data | |
| 14 | -public class IotDevicePropertyReportReqDTO extends IotDeviceUpstreamAbstractReqDTO { | |
| 15 | - | |
| 16 | - /** | |
| 17 | - * 属性参数 | |
| 18 | - */ | |
| 19 | - @NotEmpty(message = "属性参数不能为空") | |
| 20 | - private Map<String, Object> properties; | |
| 21 | - | |
| 22 | -} | |
| 23 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceRegisterReqDTO.java deleted
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceRegisterSubReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream; | |
| 2 | - | |
| 3 | -import jakarta.validation.constraints.NotEmpty; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.util.List; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * IoT 设备【注册】子设备 Request DTO | |
| 10 | - * | |
| 11 | - * @author 芋道源码 | |
| 12 | - */ | |
| 13 | -@Data | |
| 14 | -public class IotDeviceRegisterSubReqDTO extends IotDeviceUpstreamAbstractReqDTO { | |
| 15 | - | |
| 16 | - // TODO @芋艿:看看要不要优化命名 | |
| 17 | - /** | |
| 18 | - * 子设备数组 | |
| 19 | - */ | |
| 20 | - @NotEmpty(message = "子设备不能为空") | |
| 21 | - private List<Device> params; | |
| 22 | - | |
| 23 | - /** | |
| 24 | - * 设备信息 | |
| 25 | - */ | |
| 26 | - @Data | |
| 27 | - public static class Device { | |
| 28 | - | |
| 29 | - /** | |
| 30 | - * 产品标识 | |
| 31 | - */ | |
| 32 | - @NotEmpty(message = "产品标识不能为空") | |
| 33 | - private String productKey; | |
| 34 | - | |
| 35 | - /** | |
| 36 | - * 设备名称 | |
| 37 | - */ | |
| 38 | - @NotEmpty(message = "设备名称不能为空") | |
| 39 | - private String deviceName; | |
| 40 | - | |
| 41 | - } | |
| 42 | - | |
| 43 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceStateUpdateReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 4 | -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; | |
| 5 | -import jakarta.validation.constraints.NotNull; | |
| 6 | -import lombok.Data; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * IoT 设备【状态】更新 Request DTO | |
| 10 | - * | |
| 11 | - * @author 芋道源码 | |
| 12 | - */ | |
| 13 | -@Data | |
| 14 | -public class IotDeviceStateUpdateReqDTO extends IotDeviceUpstreamAbstractReqDTO { | |
| 15 | - | |
| 16 | - /** | |
| 17 | - * 设备状态 | |
| 18 | - */ | |
| 19 | - @NotNull(message = "设备状态不能为空") | |
| 20 | - @InEnum(IotDeviceStateEnum.class) // 只使用:在线、离线 | |
| 21 | - private Integer state; | |
| 22 | - | |
| 23 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceTopologyAddReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream; | |
| 2 | - | |
| 3 | -import jakarta.validation.constraints.NotEmpty; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.util.List; | |
| 7 | - | |
| 8 | -// TODO @芋艿:要写清楚,是来自设备网关,还是设备。 | |
| 9 | -/** | |
| 10 | - * IoT 设备【拓扑】添加 Request DTO | |
| 11 | - */ | |
| 12 | -@Data | |
| 13 | -public class IotDeviceTopologyAddReqDTO extends IotDeviceUpstreamAbstractReqDTO { | |
| 14 | - | |
| 15 | - // TODO @芋艿:看看要不要优化命名 | |
| 16 | - /** | |
| 17 | - * 子设备数组 | |
| 18 | - */ | |
| 19 | - @NotEmpty(message = "子设备不能为空") | |
| 20 | - private List<IotDeviceRegisterSubReqDTO.Device> params; | |
| 21 | - | |
| 22 | - /** | |
| 23 | - * 设备信息 | |
| 24 | - */ | |
| 25 | - @Data | |
| 26 | - public static class Device { | |
| 27 | - | |
| 28 | - /** | |
| 29 | - * 产品标识 | |
| 30 | - */ | |
| 31 | - @NotEmpty(message = "产品标识不能为空") | |
| 32 | - private String productKey; | |
| 33 | - | |
| 34 | - /** | |
| 35 | - * 设备名称 | |
| 36 | - */ | |
| 37 | - @NotEmpty(message = "设备名称不能为空") | |
| 38 | - private String deviceName; | |
| 39 | - | |
| 40 | - // TODO @芋艿:阿里云还有 sign 签名 | |
| 41 | - | |
| 42 | - } | |
| 43 | - | |
| 44 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotPluginInstanceHeartbeatReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream; | |
| 2 | - | |
| 3 | -import jakarta.validation.constraints.NotEmpty; | |
| 4 | -import jakarta.validation.constraints.NotNull; | |
| 5 | -import lombok.Data; | |
| 6 | - | |
| 7 | -/** | |
| 8 | - * IoT 插件实例心跳 Request DTO | |
| 9 | - * | |
| 10 | - * @author 芋道源码 | |
| 11 | - */ | |
| 12 | -@Data | |
| 13 | -public class IotPluginInstanceHeartbeatReqDTO { | |
| 14 | - | |
| 15 | - /** | |
| 16 | - * 请求编号 | |
| 17 | - */ | |
| 18 | - @NotEmpty(message = "请求编号不能为空") | |
| 19 | - private String processId; | |
| 20 | - | |
| 21 | - /** | |
| 22 | - * 插件包标识符 | |
| 23 | - */ | |
| 24 | - @NotEmpty(message = "插件包标识符不能为空") | |
| 25 | - private String pluginKey; | |
| 26 | - | |
| 27 | - /** | |
| 28 | - * 插件实例所在 IP | |
| 29 | - */ | |
| 30 | - @NotEmpty(message = "插件实例所在 IP 不能为空") | |
| 31 | - private String hostIp; | |
| 32 | - /** | |
| 33 | - * 插件实例的进程编号 | |
| 34 | - */ | |
| 35 | - @NotNull(message = "插件实例的进程编号不能为空") | |
| 36 | - private Integer downstreamPort; | |
| 37 | - | |
| 38 | - /** | |
| 39 | - * 是否在线 | |
| 40 | - */ | |
| 41 | - @NotNull(message = "是否在线不能为空") | |
| 42 | - private Boolean online; | |
| 43 | - | |
| 44 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/package-info.java deleted
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ApiConstants.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.enums; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.enums.RpcConstants; | |
| 4 | - | |
| 5 | -/** | |
| 6 | - * API 相关的枚举 | |
| 7 | - * | |
| 8 | - * @author 芋道源码 | |
| 9 | - */ | |
| 10 | -public class ApiConstants { | |
| 11 | - | |
| 12 | - public static final String PREFIX = RpcConstants.RPC_API_PREFIX + "/iot"; | |
| 13 | - | |
| 14 | - public static final String VERSION = "1.0.0"; | |
| 15 | - | |
| 16 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginDeployTypeEnum.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.enums.plugin; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.core.ArrayValuable; | |
| 4 | -import lombok.Getter; | |
| 5 | -import lombok.RequiredArgsConstructor; | |
| 6 | - | |
| 7 | -import java.util.Arrays; | |
| 8 | - | |
| 9 | -/** | |
| 10 | - * IoT 部署方式枚举 | |
| 11 | - * | |
| 12 | - * @author haohao | |
| 13 | - */ | |
| 14 | -@RequiredArgsConstructor | |
| 15 | -@Getter | |
| 16 | -public enum IotPluginDeployTypeEnum implements ArrayValuable<Integer> { | |
| 17 | - | |
| 18 | - JAR(0, "JAR 部署"), | |
| 19 | - STANDALONE(1, "独立部署"); | |
| 20 | - | |
| 21 | - public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotPluginDeployTypeEnum::getDeployType).toArray(Integer[]::new); | |
| 22 | - | |
| 23 | - /** | |
| 24 | - * 部署方式 | |
| 25 | - */ | |
| 26 | - private final Integer deployType; | |
| 27 | - /** | |
| 28 | - * 部署方式名 | |
| 29 | - */ | |
| 30 | - private final String name; | |
| 31 | - | |
| 32 | - @Override | |
| 33 | - public Integer[] array() { | |
| 34 | - return ARRAYS; | |
| 35 | - } | |
| 36 | - | |
| 37 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginStatusEnum.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.enums.plugin; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.core.ArrayValuable; | |
| 4 | -import lombok.Getter; | |
| 5 | -import lombok.RequiredArgsConstructor; | |
| 6 | - | |
| 7 | -import java.util.Arrays; | |
| 8 | - | |
| 9 | -/** | |
| 10 | - * IoT 插件状态枚举 | |
| 11 | - * | |
| 12 | - * @author haohao | |
| 13 | - */ | |
| 14 | -@RequiredArgsConstructor | |
| 15 | -@Getter | |
| 16 | -public enum IotPluginStatusEnum implements ArrayValuable<Integer> { | |
| 17 | - | |
| 18 | - STOPPED(0, "停止"), | |
| 19 | - RUNNING(1, "运行"); | |
| 20 | - | |
| 21 | - public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotPluginStatusEnum::getStatus).toArray(Integer[]::new); | |
| 22 | - | |
| 23 | - /** | |
| 24 | - * 状态 | |
| 25 | - */ | |
| 26 | - private final Integer status; | |
| 27 | - /** | |
| 28 | - * 状态名 | |
| 29 | - */ | |
| 30 | - private final String name; | |
| 31 | - | |
| 32 | - @Override | |
| 33 | - public Integer[] array() { | |
| 34 | - return ARRAYS; | |
| 35 | - } | |
| 36 | - | |
| 37 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/plugin/IotPluginTypeEnum.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.enums.plugin; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.core.ArrayValuable; | |
| 4 | -import lombok.AllArgsConstructor; | |
| 5 | -import lombok.Getter; | |
| 6 | - | |
| 7 | -import java.util.Arrays; | |
| 8 | - | |
| 9 | -/** | |
| 10 | - * IoT 插件类型枚举 | |
| 11 | - * | |
| 12 | - * @author haohao | |
| 13 | - */ | |
| 14 | -@AllArgsConstructor | |
| 15 | -@Getter | |
| 16 | -public enum IotPluginTypeEnum implements ArrayValuable<Integer> { | |
| 17 | - | |
| 18 | - NORMAL(0, "普通插件"), | |
| 19 | - DEVICE(1, "设备插件"); | |
| 20 | - | |
| 21 | - public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotPluginTypeEnum::getType).toArray(Integer[]::new); | |
| 22 | - | |
| 23 | - /** | |
| 24 | - * 类型 | |
| 25 | - */ | |
| 26 | - private final Integer type; | |
| 27 | - /** | |
| 28 | - * 类型名 | |
| 29 | - */ | |
| 30 | - private final String name; | |
| 31 | - | |
| 32 | - @Override | |
| 33 | - public Integer[] array() { | |
| 34 | - return ARRAYS; | |
| 35 | - } | |
| 36 | - | |
| 37 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotDataFormatEnum.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.enums.product; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.core.ArrayValuable; | |
| 4 | -import lombok.AllArgsConstructor; | |
| 5 | -import lombok.Getter; | |
| 6 | - | |
| 7 | -import java.util.Arrays; | |
| 8 | - | |
| 9 | -/** | |
| 10 | - * 产品数据格式枚举类 | |
| 11 | - * | |
| 12 | - * @author ahh | |
| 13 | - * @see <a href="https://help.aliyun.com/zh/iot/user-guide/message-parsing">阿里云 - 什么是消息解析</a> | |
| 14 | - */ | |
| 15 | -@AllArgsConstructor | |
| 16 | -@Getter | |
| 17 | -public enum IotDataFormatEnum implements ArrayValuable<Integer> { | |
| 18 | - | |
| 19 | - JSON(0, "标准数据格式(JSON)"), | |
| 20 | - CUSTOMIZE(1, "透传/自定义"); | |
| 21 | - | |
| 22 | - public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotDataFormatEnum::getType).toArray(Integer[]::new); | |
| 23 | - | |
| 24 | - /** | |
| 25 | - * 类型 | |
| 26 | - */ | |
| 27 | - private final Integer type; | |
| 28 | - /** | |
| 29 | - * 描述 | |
| 30 | - */ | |
| 31 | - private final String description; | |
| 32 | - | |
| 33 | - @Override | |
| 34 | - public Integer[] array() { | |
| 35 | - return ARRAYS; | |
| 36 | - } | |
| 37 | - | |
| 38 | -} |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/product/IotProtocolTypeEnum.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.enums.product; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.core.ArrayValuable; | |
| 4 | -import lombok.AllArgsConstructor; | |
| 5 | -import lombok.Getter; | |
| 6 | - | |
| 7 | -import java.util.Arrays; | |
| 8 | - | |
| 9 | -/** | |
| 10 | - * IoT 接入网关协议枚举类 | |
| 11 | - * | |
| 12 | - * @author ahh | |
| 13 | - */ | |
| 14 | -@AllArgsConstructor | |
| 15 | -@Getter | |
| 16 | -public enum IotProtocolTypeEnum implements ArrayValuable<Integer> { | |
| 17 | - | |
| 18 | - CUSTOM(0, "自定义"), | |
| 19 | - MODBUS(1, "Modbus"), | |
| 20 | - OPC_UA(2, "OPC UA"), | |
| 21 | - ZIGBEE(3, "ZigBee"), | |
| 22 | - BLE(4, "BLE"); | |
| 23 | - | |
| 24 | - public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotProtocolTypeEnum::getType).toArray(Integer[]::new); | |
| 25 | - | |
| 26 | - /** | |
| 27 | - * 类型 | |
| 28 | - */ | |
| 29 | - private final Integer type; | |
| 30 | - /** | |
| 31 | - * 描述 | |
| 32 | - */ | |
| 33 | - private final String description; | |
| 34 | - | |
| 35 | - @Override | |
| 36 | - public Integer[] array() { | |
| 37 | - return ARRAYS; | |
| 38 | - } | |
| 39 | - | |
| 40 | -} |
yudao-module-iot/yudao-module-iot-biz/pom.xml
| 1 | 1 | <?xml version="1.0" encoding="UTF-8"?> |
| 2 | 2 | <project xmlns="http://maven.apache.org/POM/4.0.0" |
| 3 | - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
| 4 | - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |
| 3 | + 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"> | |
| 5 | 4 | <parent> |
| 6 | 5 | <artifactId>yudao-module-iot</artifactId> |
| 7 | 6 | <groupId>cn.iocoder.boot</groupId> |
| ... | ... | @@ -15,7 +14,7 @@ |
| 15 | 14 | <name>${project.artifactId}</name> |
| 16 | 15 | <description> |
| 17 | 16 | 物联网 模块,主要实现 产品管理、设备管理、协议管理等功能。 |
| 18 | - <!-- TODO 芋艿:后续补充下 --> | |
| 17 | + <!-- TODO 芋艿:后续补充下 --> | |
| 19 | 18 | </description> |
| 20 | 19 | |
| 21 | 20 | <dependencies> |
| ... | ... | @@ -26,7 +25,7 @@ |
| 26 | 25 | </dependency> |
| 27 | 26 | <dependency> |
| 28 | 27 | <groupId>cn.iocoder.boot</groupId> |
| 29 | - <artifactId>yudao-module-iot-api</artifactId> | |
| 28 | + <artifactId>yudao-module-iot-core</artifactId> | |
| 30 | 29 | <version>${revision}</version> |
| 31 | 30 | </dependency> |
| 32 | 31 | |
| ... | ... | @@ -75,10 +74,11 @@ |
| 75 | 74 | </dependency> |
| 76 | 75 | |
| 77 | 76 | <!-- 消息队列相关 --> |
| 77 | + <!-- TODO @芋艿:临时打开 --> | |
| 78 | 78 | <dependency> |
| 79 | 79 | <groupId>org.apache.rocketmq</groupId> |
| 80 | 80 | <artifactId>rocketmq-spring-boot-starter</artifactId> |
| 81 | - <optional>true</optional> | |
| 81 | +<!-- <optional>true</optional>--> | |
| 82 | 82 | </dependency> |
| 83 | 83 | <dependency> |
| 84 | 84 | <groupId>org.springframework.kafka</groupId> |
| ... | ... | @@ -91,47 +91,17 @@ |
| 91 | 91 | <optional>true</optional> |
| 92 | 92 | </dependency> |
| 93 | 93 | |
| 94 | - <dependency> | |
| 95 | - <groupId>org.pf4j</groupId> <!-- PF4J:内置插件机制 --> | |
| 96 | - <artifactId>pf4j-spring</artifactId> | |
| 97 | - </dependency> | |
| 98 | - | |
| 99 | - <!-- TODO @芋艿:bom 管理 --> | |
| 100 | - <dependency> | |
| 101 | - <groupId>org.apache.groovy</groupId> | |
| 102 | - <artifactId>groovy-all</artifactId> | |
| 103 | - <version>4.0.25</version> | |
| 104 | - <type>pom</type> | |
| 105 | - </dependency> | |
| 106 | - | |
| 107 | - <!-- TODO @芋艿:bom 管理 --> | |
| 108 | - <dependency> | |
| 109 | - <groupId>org.graalvm.js</groupId> | |
| 110 | - <artifactId>js</artifactId> | |
| 111 | - <version>24.1.2</version> | |
| 112 | - <type>pom</type> | |
| 113 | - </dependency> | |
| 114 | - <dependency> | |
| 115 | - <groupId>org.graalvm.js</groupId> | |
| 116 | - <artifactId>js-scriptengine</artifactId> | |
| 117 | - <version>24.1.2</version> | |
| 118 | - </dependency> | |
| 119 | - | |
| 120 | - <!-- TODO @芋艿:合理注释 --> | |
| 121 | - <!-- IoT 数据桥梁的执行器所需消息队列。如果您只需要使用 rocketmq 那么则注释掉其它消息队列即可 --> | |
| 94 | + <!-- IoT 网络组件:接收来自设备的上行数据 --> | |
| 122 | 95 | <!-- <dependency>--> |
| 123 | - <!-- <groupId>org.apache.rocketmq</groupId>--> | |
| 124 | - <!-- <artifactId>rocketmq-spring-boot-starter</artifactId>--> | |
| 96 | + <!-- <groupId>cn.iocoder.boot</groupId>--> | |
| 97 | + <!-- <artifactId>yudao-module-iot-net-component-http</artifactId>--> | |
| 98 | + <!-- <version>${revision}</version>--> | |
| 125 | 99 | <!-- </dependency>--> |
| 126 | 100 | <!-- <dependency>--> |
| 127 | - <!-- <groupId>org.springframework.kafka</groupId>--> | |
| 128 | - <!-- <artifactId>spring-kafka</artifactId>--> | |
| 101 | + <!-- <groupId>cn.iocoder.boot</groupId>--> | |
| 102 | + <!-- <artifactId>yudao-module-iot-net-component-emqx</artifactId>--> | |
| 103 | + <!-- <version>${revision}</version>--> | |
| 129 | 104 | <!-- </dependency>--> |
| 130 | - <!-- <dependency>--> | |
| 131 | - <!-- <groupId>org.springframework.boot</groupId>--> | |
| 132 | - <!-- <artifactId>spring-boot-starter-amqp</artifactId>--> | |
| 133 | - <!-- </dependency>--> | |
| 134 | - | |
| 135 | 105 | </dependencies> |
| 136 | 106 | |
| 137 | 107 | </project> | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/ScriptTest.java deleted
| 1 | -package cn.iocoder.yudao.module.iot; | |
| 2 | - | |
| 3 | -import cn.hutool.script.ScriptUtil; | |
| 4 | -import javax.script.Bindings; | |
| 5 | -import javax.script.ScriptEngine; | |
| 6 | -import javax.script.ScriptException; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * TODO 芋艿:测试脚本的接入 | |
| 10 | - */ | |
| 11 | -public class ScriptTest { | |
| 12 | - | |
| 13 | - public static void main2(String[] args) { | |
| 14 | - // 创建一个 Groovy 脚本引擎 | |
| 15 | - ScriptEngine engine = ScriptUtil.createGroovyEngine(); | |
| 16 | - | |
| 17 | - // 创建绑定参数 | |
| 18 | - Bindings bindings = engine.createBindings(); | |
| 19 | - bindings.put("name", "Alice"); | |
| 20 | - bindings.put("age", 30); | |
| 21 | - | |
| 22 | - // 定义一个稍微复杂的 Groovy 脚本 | |
| 23 | - String script = "def greeting = 'Hello, ' + name + '!';\n" + | |
| 24 | - "def ageInFiveYears = age + 5;\n" + | |
| 25 | - "def message = greeting + ' In five years, you will be ' + ageInFiveYears + ' years old.';\n" + | |
| 26 | - "return message.toUpperCase();\n"; | |
| 27 | - | |
| 28 | - try { | |
| 29 | - // 执行脚本并获取结果 | |
| 30 | - Object result = engine.eval(script, bindings); | |
| 31 | - System.out.println(result); // 输出: HELLO, ALICE! IN FIVE YEARS, YOU WILL BE 35 YEARS OLD. | |
| 32 | - } catch (ScriptException e) { | |
| 33 | - e.printStackTrace(); | |
| 34 | - } | |
| 35 | - } | |
| 36 | - | |
| 37 | - public static void main(String[] args) { | |
| 38 | - // 创建一个 JavaScript 脚本引擎 | |
| 39 | - ScriptEngine jsEngine = ScriptUtil.createJsEngine(); | |
| 40 | - | |
| 41 | - // 创建绑定参数 | |
| 42 | - Bindings jsBindings = jsEngine.createBindings(); | |
| 43 | - jsBindings.put("name", "Bob"); | |
| 44 | - jsBindings.put("age", 25); | |
| 45 | - | |
| 46 | - // 定义一个简单的 JavaScript 脚本 | |
| 47 | - String jsScript = "var greeting = 'Hello, ' + name + '!';\n" + | |
| 48 | - "var ageInTenYears = age + 10;\n" + | |
| 49 | - "var message = greeting + ' In ten years, you will be ' + ageInTenYears + ' years old.';\n" + | |
| 50 | - "message.toUpperCase();\n"; | |
| 51 | - | |
| 52 | - try { | |
| 53 | - // 执行脚本并获取结果 | |
| 54 | - Object jsResult = jsEngine.eval(jsScript, jsBindings); | |
| 55 | - System.out.println(jsResult); // 输出: HELLO, BOB! IN TEN YEARS, YOU WILL BE 35 YEARS OLD. | |
| 56 | - } catch (ScriptException e) { | |
| 57 | - e.printStackTrace(); | |
| 58 | - } | |
| 59 | - } | |
| 60 | - | |
| 61 | -} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/api/device/IoTDeviceApiImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.api.device; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.enums.RpcConstants; | |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 5 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 6 | +import cn.iocoder.yudao.module.iot.core.biz.IotDeviceCommonApi; | |
| 7 | +import cn.iocoder.yudao.module.iot.core.biz.dto.IotDeviceAuthReqDTO; | |
| 8 | +import cn.iocoder.yudao.module.iot.core.biz.dto.IotDeviceGetReqDTO; | |
| 9 | +import cn.iocoder.yudao.module.iot.core.biz.dto.IotDeviceRespDTO; | |
| 10 | +import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; | |
| 11 | +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; | |
| 12 | +import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; | |
| 13 | +import cn.iocoder.yudao.module.iot.service.product.IotProductService; | |
| 14 | +import jakarta.annotation.Resource; | |
| 15 | +import jakarta.annotation.security.PermitAll; | |
| 16 | +import org.springframework.context.annotation.Primary; | |
| 17 | +import org.springframework.validation.annotation.Validated; | |
| 18 | +import org.springframework.web.bind.annotation.PostMapping; | |
| 19 | +import org.springframework.web.bind.annotation.RequestBody; | |
| 20 | +import org.springframework.web.bind.annotation.RestController; | |
| 21 | + | |
| 22 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 23 | + | |
| 24 | +/** | |
| 25 | + * IoT 设备 API 实现类 | |
| 26 | + * | |
| 27 | + * @author haohao | |
| 28 | + */ | |
| 29 | +@RestController | |
| 30 | +@Validated | |
| 31 | +@Primary // 保证优先匹配,因为 yudao-iot-gateway 也有 IotDeviceCommonApi 的实现,并且也可能会被 biz 引入 | |
| 32 | +public class IoTDeviceApiImpl implements IotDeviceCommonApi { | |
| 33 | + | |
| 34 | + @Resource | |
| 35 | + private IotDeviceService deviceService; | |
| 36 | + @Resource | |
| 37 | + private IotProductService productService; | |
| 38 | + | |
| 39 | + @Override | |
| 40 | + @PostMapping(RpcConstants.RPC_API_PREFIX + "/iot/device/auth") | |
| 41 | + @PermitAll | |
| 42 | + public CommonResult<Boolean> authDevice(@RequestBody IotDeviceAuthReqDTO authReqDTO) { | |
| 43 | + return success(deviceService.authDevice(authReqDTO)); | |
| 44 | + } | |
| 45 | + | |
| 46 | + @Override | |
| 47 | + @PostMapping(RpcConstants.RPC_API_PREFIX + "/iot/device/get") // 特殊:方便调用,暂时使用 POST,实际更推荐 GET | |
| 48 | + @PermitAll | |
| 49 | + public CommonResult<IotDeviceRespDTO> getDevice(@RequestBody IotDeviceGetReqDTO getReqDTO) { | |
| 50 | + IotDeviceDO device = getReqDTO.getId() != null ? deviceService.getDeviceFromCache(getReqDTO.getId()) | |
| 51 | + : deviceService.getDeviceFromCache(getReqDTO.getProductKey(), getReqDTO.getDeviceName()); | |
| 52 | + return success(BeanUtils.toBean(device, IotDeviceRespDTO.class, deviceDTO -> { | |
| 53 | + IotProductDO product = productService.getProductFromCache(deviceDTO.getProductId()); | |
| 54 | + if (product != null) { | |
| 55 | + deviceDTO.setCodecType(product.getCodecType()); | |
| 56 | + } | |
| 57 | + })); | |
| 58 | + } | |
| 59 | + | |
| 60 | +} | |
| 0 | 61 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/api/device/IoTDeviceUpstreamApiImpl.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.api.device; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | -import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.*; | |
| 5 | -import cn.iocoder.yudao.module.iot.service.device.control.IotDeviceUpstreamService; | |
| 6 | -import cn.iocoder.yudao.module.iot.service.plugin.IotPluginInstanceService; | |
| 7 | -import jakarta.annotation.Resource; | |
| 8 | -import org.springframework.validation.annotation.Validated; | |
| 9 | -import org.springframework.web.bind.annotation.RestController; | |
| 10 | - | |
| 11 | -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 12 | - | |
| 13 | -/** | |
| 14 | - * * 设备数据 Upstream 上行 API 实现类 | |
| 15 | - */ | |
| 16 | -@RestController | |
| 17 | -@Validated | |
| 18 | -public class IoTDeviceUpstreamApiImpl implements IotDeviceUpstreamApi { | |
| 19 | - | |
| 20 | - @Resource | |
| 21 | - private IotDeviceUpstreamService deviceUpstreamService; | |
| 22 | - @Resource | |
| 23 | - private IotPluginInstanceService pluginInstanceService; | |
| 24 | - | |
| 25 | - // ========== 设备相关 ========== | |
| 26 | - | |
| 27 | - @Override | |
| 28 | - public CommonResult<Boolean> updateDeviceState(IotDeviceStateUpdateReqDTO updateReqDTO) { | |
| 29 | - deviceUpstreamService.updateDeviceState(updateReqDTO); | |
| 30 | - return success(true); | |
| 31 | - } | |
| 32 | - | |
| 33 | - @Override | |
| 34 | - public CommonResult<Boolean> reportDeviceProperty(IotDevicePropertyReportReqDTO reportReqDTO) { | |
| 35 | - deviceUpstreamService.reportDeviceProperty(reportReqDTO); | |
| 36 | - return success(true); | |
| 37 | - } | |
| 38 | - | |
| 39 | - @Override | |
| 40 | - public CommonResult<Boolean> reportDeviceEvent(IotDeviceEventReportReqDTO reportReqDTO) { | |
| 41 | - deviceUpstreamService.reportDeviceEvent(reportReqDTO); | |
| 42 | - return success(true); | |
| 43 | - } | |
| 44 | - | |
| 45 | - @Override | |
| 46 | - public CommonResult<Boolean> registerDevice(IotDeviceRegisterReqDTO registerReqDTO) { | |
| 47 | - deviceUpstreamService.registerDevice(registerReqDTO); | |
| 48 | - return success(true); | |
| 49 | - } | |
| 50 | - | |
| 51 | - @Override | |
| 52 | - public CommonResult<Boolean> registerSubDevice(IotDeviceRegisterSubReqDTO registerReqDTO) { | |
| 53 | - deviceUpstreamService.registerSubDevice(registerReqDTO); | |
| 54 | - return success(true); | |
| 55 | - } | |
| 56 | - | |
| 57 | - @Override | |
| 58 | - public CommonResult<Boolean> addDeviceTopology(IotDeviceTopologyAddReqDTO addReqDTO) { | |
| 59 | - deviceUpstreamService.addDeviceTopology(addReqDTO); | |
| 60 | - return success(true); | |
| 61 | - } | |
| 62 | - | |
| 63 | - @Override | |
| 64 | - public CommonResult<Boolean> authenticateEmqxConnection(IotDeviceEmqxAuthReqDTO authReqDTO) { | |
| 65 | - boolean result = deviceUpstreamService.authenticateEmqxConnection(authReqDTO); | |
| 66 | - return success(result); | |
| 67 | - } | |
| 68 | - | |
| 69 | - // ========== 插件相关 ========== | |
| 70 | - | |
| 71 | - @Override | |
| 72 | - public CommonResult<Boolean> heartbeatPluginInstance(IotPluginInstanceHeartbeatReqDTO heartbeatReqDTO) { | |
| 73 | - pluginInstanceService.heartbeatPluginInstance(heartbeatReqDTO); | |
| 74 | - return success(true); | |
| 75 | - } | |
| 76 | - | |
| 77 | -} | |
| 78 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/api/package-info.java
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/IotAlertConfigController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.alert; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 5 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 6 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 7 | +import cn.iocoder.yudao.module.iot.controller.admin.alert.vo.config.IotAlertConfigPageReqVO; | |
| 8 | +import cn.iocoder.yudao.module.iot.controller.admin.alert.vo.config.IotAlertConfigRespVO; | |
| 9 | +import cn.iocoder.yudao.module.iot.controller.admin.alert.vo.config.IotAlertConfigSaveReqVO; | |
| 10 | +import cn.iocoder.yudao.module.iot.dal.dataobject.alert.IotAlertConfigDO; | |
| 11 | +import cn.iocoder.yudao.module.iot.service.alert.IotAlertConfigService; | |
| 12 | +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | |
| 13 | +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | |
| 14 | +import io.swagger.v3.oas.annotations.Operation; | |
| 15 | +import io.swagger.v3.oas.annotations.Parameter; | |
| 16 | +import io.swagger.v3.oas.annotations.tags.Tag; | |
| 17 | +import jakarta.annotation.Resource; | |
| 18 | +import jakarta.validation.Valid; | |
| 19 | + | |
| 20 | +import org.springframework.security.access.prepost.PreAuthorize; | |
| 21 | +import org.springframework.validation.annotation.Validated; | |
| 22 | +import org.springframework.web.bind.annotation.*; | |
| 23 | + | |
| 24 | +import java.util.List; | |
| 25 | +import java.util.Map; | |
| 26 | +import java.util.Objects; | |
| 27 | +import java.util.stream.Collectors; | |
| 28 | + | |
| 29 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 30 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | |
| 31 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; | |
| 32 | + | |
| 33 | +@Tag(name = "管理后台 - IoT 告警配置") | |
| 34 | +@RestController | |
| 35 | +@RequestMapping("/iot/alert-config") | |
| 36 | +@Validated | |
| 37 | +public class IotAlertConfigController { | |
| 38 | + | |
| 39 | + @Resource | |
| 40 | + private IotAlertConfigService alertConfigService; | |
| 41 | + | |
| 42 | + @Resource | |
| 43 | + private AdminUserApi adminUserApi; | |
| 44 | + | |
| 45 | + @PostMapping("/create") | |
| 46 | + @Operation(summary = "创建告警配置") | |
| 47 | + @PreAuthorize("@ss.hasPermission('iot:alert-config:create')") | |
| 48 | + public CommonResult<Long> createAlertConfig(@Valid @RequestBody IotAlertConfigSaveReqVO createReqVO) { | |
| 49 | + return success(alertConfigService.createAlertConfig(createReqVO)); | |
| 50 | + } | |
| 51 | + | |
| 52 | + @PutMapping("/update") | |
| 53 | + @Operation(summary = "更新告警配置") | |
| 54 | + @PreAuthorize("@ss.hasPermission('iot:alert-config:update')") | |
| 55 | + public CommonResult<Boolean> updateAlertConfig(@Valid @RequestBody IotAlertConfigSaveReqVO updateReqVO) { | |
| 56 | + alertConfigService.updateAlertConfig(updateReqVO); | |
| 57 | + return success(true); | |
| 58 | + } | |
| 59 | + | |
| 60 | + @DeleteMapping("/delete") | |
| 61 | + @Operation(summary = "删除告警配置") | |
| 62 | + @Parameter(name = "id", description = "编号", required = true) | |
| 63 | + @PreAuthorize("@ss.hasPermission('iot:alert-config:delete')") | |
| 64 | + public CommonResult<Boolean> deleteAlertConfig(@RequestParam("id") Long id) { | |
| 65 | + alertConfigService.deleteAlertConfig(id); | |
| 66 | + return success(true); | |
| 67 | + } | |
| 68 | + | |
| 69 | + @GetMapping("/get") | |
| 70 | + @Operation(summary = "获得告警配置") | |
| 71 | + @Parameter(name = "id", description = "编号", required = true, example = "1024") | |
| 72 | + @PreAuthorize("@ss.hasPermission('iot:alert-config:query')") | |
| 73 | + public CommonResult<IotAlertConfigRespVO> getAlertConfig(@RequestParam("id") Long id) { | |
| 74 | + IotAlertConfigDO alertConfig = alertConfigService.getAlertConfig(id); | |
| 75 | + return success(BeanUtils.toBean(alertConfig, IotAlertConfigRespVO.class)); | |
| 76 | + } | |
| 77 | + | |
| 78 | + @GetMapping("/page") | |
| 79 | + @Operation(summary = "获得告警配置分页") | |
| 80 | + @PreAuthorize("@ss.hasPermission('iot:alert-config:query')") | |
| 81 | + public CommonResult<PageResult<IotAlertConfigRespVO>> getAlertConfigPage(@Valid IotAlertConfigPageReqVO pageReqVO) { | |
| 82 | + PageResult<IotAlertConfigDO> pageResult = alertConfigService.getAlertConfigPage(pageReqVO); | |
| 83 | + | |
| 84 | + // 转换返回 | |
| 85 | + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( | |
| 86 | + convertSetByFlatMap(pageResult.getList(), config -> config.getReceiveUserIds().stream())); | |
| 87 | + return success(BeanUtils.toBean(pageResult, IotAlertConfigRespVO.class, vo -> { | |
| 88 | + vo.setReceiveUserNames(vo.getReceiveUserIds().stream() | |
| 89 | + .map(userMap::get) | |
| 90 | + .filter(Objects::nonNull) | |
| 91 | + .map(AdminUserRespDTO::getNickname) | |
| 92 | + .collect(Collectors.toList())); | |
| 93 | + })); | |
| 94 | + } | |
| 95 | + | |
| 96 | + @GetMapping("/simple-list") | |
| 97 | + @Operation(summary = "获得告警配置简单列表", description = "只包含被开启的告警配置,主要用于前端的下拉选项") | |
| 98 | + @PreAuthorize("@ss.hasPermission('iot:alert-config:query')") | |
| 99 | + public CommonResult<List<IotAlertConfigRespVO>> getAlertConfigSimpleList() { | |
| 100 | + List<IotAlertConfigDO> list = alertConfigService.getAlertConfigListByStatus(CommonStatusEnum.ENABLE.getStatus()); | |
| 101 | + return success(convertList(list, config -> // 只返回 id、name 字段 | |
| 102 | + new IotAlertConfigRespVO().setId(config.getId()).setName(config.getName()))); | |
| 103 | + } | |
| 104 | + | |
| 105 | +} | |
| 0 | 106 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/IotAlertRecordController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.alert; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 5 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 6 | +import cn.iocoder.yudao.module.iot.controller.admin.alert.vo.recrod.IotAlertRecordPageReqVO; | |
| 7 | +import cn.iocoder.yudao.module.iot.controller.admin.alert.vo.recrod.IotAlertRecordProcessReqVO; | |
| 8 | +import cn.iocoder.yudao.module.iot.controller.admin.alert.vo.recrod.IotAlertRecordRespVO; | |
| 9 | +import cn.iocoder.yudao.module.iot.dal.dataobject.alert.IotAlertRecordDO; | |
| 10 | +import cn.iocoder.yudao.module.iot.service.alert.IotAlertRecordService; | |
| 11 | +import io.swagger.v3.oas.annotations.Operation; | |
| 12 | +import io.swagger.v3.oas.annotations.Parameter; | |
| 13 | +import io.swagger.v3.oas.annotations.tags.Tag; | |
| 14 | +import jakarta.annotation.Resource; | |
| 15 | +import jakarta.validation.Valid; | |
| 16 | +import org.springframework.security.access.prepost.PreAuthorize; | |
| 17 | +import org.springframework.validation.annotation.Validated; | |
| 18 | +import org.springframework.web.bind.annotation.*; | |
| 19 | + | |
| 20 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 21 | +import static java.util.Collections.singleton; | |
| 22 | + | |
| 23 | +@Tag(name = "管理后台 - IoT 告警记录") | |
| 24 | +@RestController | |
| 25 | +@RequestMapping("/iot/alert-record") | |
| 26 | +@Validated | |
| 27 | +public class IotAlertRecordController { | |
| 28 | + | |
| 29 | + @Resource | |
| 30 | + private IotAlertRecordService alertRecordService; | |
| 31 | + | |
| 32 | + @GetMapping("/get") | |
| 33 | + @Operation(summary = "获得告警记录") | |
| 34 | + @Parameter(name = "id", description = "编号", required = true, example = "1024") | |
| 35 | + @PreAuthorize("@ss.hasPermission('iot:alert-record:query')") | |
| 36 | + public CommonResult<IotAlertRecordRespVO> getAlertRecord(@RequestParam("id") Long id) { | |
| 37 | + IotAlertRecordDO alertRecord = alertRecordService.getAlertRecord(id); | |
| 38 | + return success(BeanUtils.toBean(alertRecord, IotAlertRecordRespVO.class)); | |
| 39 | + } | |
| 40 | + | |
| 41 | + @GetMapping("/page") | |
| 42 | + @Operation(summary = "获得告警记录分页") | |
| 43 | + @PreAuthorize("@ss.hasPermission('iot:alert-record:query')") | |
| 44 | + public CommonResult<PageResult<IotAlertRecordRespVO>> getAlertRecordPage(@Valid IotAlertRecordPageReqVO pageReqVO) { | |
| 45 | + PageResult<IotAlertRecordDO> pageResult = alertRecordService.getAlertRecordPage(pageReqVO); | |
| 46 | + return success(BeanUtils.toBean(pageResult, IotAlertRecordRespVO.class)); | |
| 47 | + } | |
| 48 | + | |
| 49 | + @PutMapping("/process") | |
| 50 | + @Operation(summary = "处理告警记录") | |
| 51 | + @PreAuthorize("@ss.hasPermission('iot:alert-record:process')") | |
| 52 | + public CommonResult<Boolean> processAlertRecord(@Valid @RequestBody IotAlertRecordProcessReqVO processReqVO) { | |
| 53 | + alertRecordService.processAlertRecordList(singleton(processReqVO.getId()), processReqVO.getProcessRemark()); | |
| 54 | + return success(true); | |
| 55 | + } | |
| 56 | + | |
| 57 | +} | |
| 0 | 58 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/config/IotAlertConfigPageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.alert.vo.config; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 5 | +import lombok.Data; | |
| 6 | +import org.springframework.format.annotation.DateTimeFormat; | |
| 7 | + | |
| 8 | +import java.time.LocalDateTime; | |
| 9 | + | |
| 10 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | |
| 11 | + | |
| 12 | +@Schema(description = "管理后台 - IoT 告警配置分页 Request VO") | |
| 13 | +@Data | |
| 14 | +public class IotAlertConfigPageReqVO extends PageParam { | |
| 15 | + | |
| 16 | + @Schema(description = "配置名称", example = "赵六") | |
| 17 | + private String name; | |
| 18 | + | |
| 19 | + @Schema(description = "配置状态", example = "1") | |
| 20 | + private Integer status; | |
| 21 | + | |
| 22 | + @Schema(description = "创建时间") | |
| 23 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 24 | + private LocalDateTime[] createTime; | |
| 25 | + | |
| 26 | +} | |
| 0 | 27 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/config/IotAlertConfigRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.alert.vo.config; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import lombok.Data; | |
| 5 | + | |
| 6 | +import java.time.LocalDateTime; | |
| 7 | +import java.util.List; | |
| 8 | + | |
| 9 | +@Schema(description = "管理后台 - IoT 告警配置 Response VO") | |
| 10 | +@Data | |
| 11 | +public class IotAlertConfigRespVO { | |
| 12 | + | |
| 13 | + @Schema(description = "配置编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3566") | |
| 14 | + private Long id; | |
| 15 | + | |
| 16 | + @Schema(description = "配置名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") | |
| 17 | + private String name; | |
| 18 | + | |
| 19 | + @Schema(description = "配置描述", example = "你猜") | |
| 20 | + private String description; | |
| 21 | + | |
| 22 | + @Schema(description = "告警级别", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 23 | + private Integer level; | |
| 24 | + | |
| 25 | + @Schema(description = "配置状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 26 | + private Integer status; | |
| 27 | + | |
| 28 | + @Schema(description = "关联的场景联动规则编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3") | |
| 29 | + private List<Long> sceneRuleIds; | |
| 30 | + | |
| 31 | + @Schema(description = "接收的用户编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "100,200") | |
| 32 | + private List<Long> receiveUserIds; | |
| 33 | + | |
| 34 | + @Schema(description = "接收的用户名称数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三,李四") | |
| 35 | + private List<String> receiveUserNames; | |
| 36 | + | |
| 37 | + @Schema(description = "接收的类型数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3") | |
| 38 | + private List<Integer> receiveTypes; | |
| 39 | + | |
| 40 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 41 | + private LocalDateTime createTime; | |
| 42 | + | |
| 43 | +} | |
| 0 | 44 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/config/IotAlertConfigSaveReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.alert.vo.config; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | |
| 4 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 5 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 6 | +import jakarta.validation.constraints.NotEmpty; | |
| 7 | +import jakarta.validation.constraints.NotNull; | |
| 8 | +import lombok.Data; | |
| 9 | + | |
| 10 | +import java.util.List; | |
| 11 | + | |
| 12 | +@Schema(description = "管理后台 - IoT 告警配置新增/修改 Request VO") | |
| 13 | +@Data | |
| 14 | +public class IotAlertConfigSaveReqVO { | |
| 15 | + | |
| 16 | + @Schema(description = "配置编号", example = "3566") | |
| 17 | + private Long id; | |
| 18 | + | |
| 19 | + @Schema(description = "配置名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") | |
| 20 | + @NotEmpty(message = "配置名称不能为空") | |
| 21 | + private String name; | |
| 22 | + | |
| 23 | + @Schema(description = "配置描述", example = "你猜") | |
| 24 | + private String description; | |
| 25 | + | |
| 26 | + @Schema(description = "告警级别", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 27 | + @NotNull(message = "告警级别不能为空") | |
| 28 | + private Integer level; | |
| 29 | + | |
| 30 | + @Schema(description = "配置状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 31 | + @NotNull(message = "配置状态不能为空") | |
| 32 | + @InEnum(CommonStatusEnum.class) | |
| 33 | + private Integer status; | |
| 34 | + | |
| 35 | + @Schema(description = "关联的场景联动规则编号数组") | |
| 36 | + @NotEmpty(message = "关联的场景联动规则编号数组不能为空") | |
| 37 | + private List<Long> sceneRuleIds; | |
| 38 | + | |
| 39 | + @Schema(description = "接收的用户编号数组") | |
| 40 | + @NotEmpty(message = "接收的用户编号数组不能为空") | |
| 41 | + private List<Long> receiveUserIds; | |
| 42 | + | |
| 43 | + @Schema(description = "接收的类型数组") | |
| 44 | + @NotEmpty(message = "接收的类型数组不能为空") | |
| 45 | + private List<Integer> receiveTypes; | |
| 46 | + | |
| 47 | +} | |
| 0 | 48 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/recrod/IotAlertRecordPageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.alert.vo.recrod; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 5 | +import lombok.Data; | |
| 6 | +import org.springframework.format.annotation.DateTimeFormat; | |
| 7 | + | |
| 8 | +import java.time.LocalDateTime; | |
| 9 | + | |
| 10 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | |
| 11 | + | |
| 12 | +@Schema(description = "管理后台 - IoT 告警记录分页 Request VO") | |
| 13 | +@Data | |
| 14 | +public class IotAlertRecordPageReqVO extends PageParam { | |
| 15 | + | |
| 16 | + @Schema(description = "告警配置编号", example = "29320") | |
| 17 | + private Long configId; | |
| 18 | + | |
| 19 | + @Schema(description = "告警级别", example = "1") | |
| 20 | + private Integer level; | |
| 21 | + | |
| 22 | + @Schema(description = "产品编号", example = "2050") | |
| 23 | + private Long productId; | |
| 24 | + | |
| 25 | + @Schema(description = "设备编号", example = "21727") | |
| 26 | + private String deviceId; | |
| 27 | + | |
| 28 | + @Schema(description = "是否处理", example = "true") | |
| 29 | + private Boolean processStatus; | |
| 30 | + | |
| 31 | + @Schema(description = "创建时间") | |
| 32 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 33 | + private LocalDateTime[] createTime; | |
| 34 | + | |
| 35 | +} | |
| 0 | 36 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/recrod/IotAlertRecordProcessReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.alert.vo.recrod; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import jakarta.validation.constraints.NotNull; | |
| 5 | +import lombok.Data; | |
| 6 | + | |
| 7 | +@Schema(description = "管理后台 - IoT 告警记录处理 Request VO") | |
| 8 | +@Data | |
| 9 | +public class IotAlertRecordProcessReqVO { | |
| 10 | + | |
| 11 | + @Schema(description = "记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 12 | + @NotNull(message = "记录编号不能为空") | |
| 13 | + private Long id; | |
| 14 | + | |
| 15 | + @Schema(description = "处理结果(备注)", requiredMode = Schema.RequiredMode.REQUIRED, example = "已处理告警,问题已解决") | |
| 16 | + private String processRemark; | |
| 17 | + | |
| 18 | +} | |
| 0 | 19 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/recrod/IotAlertRecordRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.alert.vo.recrod; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage; | |
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 5 | +import lombok.Data; | |
| 6 | + | |
| 7 | +import java.time.LocalDateTime; | |
| 8 | + | |
| 9 | +@Schema(description = "管理后台 - IoT 告警记录 Response VO") | |
| 10 | +@Data | |
| 11 | +public class IotAlertRecordRespVO { | |
| 12 | + | |
| 13 | + @Schema(description = "记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "19904") | |
| 14 | + private Long id; | |
| 15 | + | |
| 16 | + @Schema(description = "告警配置编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "29320") | |
| 17 | + private Long configId; | |
| 18 | + | |
| 19 | + @Schema(description = "告警名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") | |
| 20 | + private String configName; | |
| 21 | + | |
| 22 | + @Schema(description = "告警级别", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 23 | + private Integer configLevel; | |
| 24 | + | |
| 25 | + @Schema(description = "产品编号", example = "2050") | |
| 26 | + private Long productId; | |
| 27 | + | |
| 28 | + @Schema(description = "设备编号", example = "21727") | |
| 29 | + private Long deviceId; | |
| 30 | + | |
| 31 | + @Schema(description = "触发的设备消息") | |
| 32 | + private IotDeviceMessage deviceMessage; | |
| 33 | + | |
| 34 | + @Schema(description = "是否处理", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 35 | + private Boolean processStatus; | |
| 36 | + | |
| 37 | + @Schema(description = "处理结果(备注)", example = "你说的对") | |
| 38 | + private String processRemark; | |
| 39 | + | |
| 40 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 41 | + private LocalDateTime createTime; | |
| 42 | + | |
| 43 | +} | |
| 0 | 44 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java
| ... | ... | @@ -6,15 +6,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 6 | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | 7 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 8 | 8 | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| 9 | -import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceDownstreamReqVO; | |
| 10 | -import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceUpstreamReqVO; | |
| 11 | 9 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*; |
| 12 | 10 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; |
| 11 | +import cn.iocoder.yudao.module.iot.enums.product.IotLocationTypeEnum; | |
| 13 | 12 | import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; |
| 14 | -import cn.iocoder.yudao.module.iot.service.device.control.IotDeviceDownstreamService; | |
| 15 | -import cn.iocoder.yudao.module.iot.service.device.control.IotDeviceUpstreamService; | |
| 16 | 13 | import io.swagger.v3.oas.annotations.Operation; |
| 17 | 14 | import io.swagger.v3.oas.annotations.Parameter; |
| 15 | +import io.swagger.v3.oas.annotations.Parameters; | |
| 18 | 16 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 19 | 17 | import jakarta.annotation.Resource; |
| 20 | 18 | import jakarta.servlet.http.HttpServletResponse; |
| ... | ... | @@ -41,10 +39,6 @@ public class IotDeviceController { |
| 41 | 39 | |
| 42 | 40 | @Resource |
| 43 | 41 | private IotDeviceService deviceService; |
| 44 | - @Resource | |
| 45 | - private IotDeviceUpstreamService deviceUpstreamService; | |
| 46 | - @Resource | |
| 47 | - private IotDeviceDownstreamService deviceDownstreamService; | |
| 48 | 42 | |
| 49 | 43 | @PostMapping("/create") |
| 50 | 44 | @Operation(summary = "创建设备") |
| ... | ... | @@ -111,7 +105,7 @@ public class IotDeviceController { |
| 111 | 105 | @PreAuthorize("@ss.hasPermission('iot:device:export')") |
| 112 | 106 | @ApiAccessLog(operateType = EXPORT) |
| 113 | 107 | public void exportDeviceExcel(@Valid IotDevicePageReqVO exportReqVO, |
| 114 | - HttpServletResponse response) throws IOException { | |
| 108 | + HttpServletResponse response) throws IOException { | |
| 115 | 109 | exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| 116 | 110 | CommonResult<PageResult<IotDeviceRespVO>> result = getDevicePage(exportReqVO); |
| 117 | 111 | // 导出 Excel |
| ... | ... | @@ -129,12 +123,17 @@ public class IotDeviceController { |
| 129 | 123 | |
| 130 | 124 | @GetMapping("/simple-list") |
| 131 | 125 | @Operation(summary = "获取设备的精简信息列表", description = "主要用于前端的下拉选项") |
| 132 | - @Parameter(name = "deviceType", description = "设备类型", example = "1") | |
| 133 | - public CommonResult<List<IotDeviceRespVO>> getSimpleDeviceList( | |
| 134 | - @RequestParam(value = "deviceType", required = false) Integer deviceType) { | |
| 135 | - List<IotDeviceDO> list = deviceService.getDeviceListByDeviceType(deviceType); | |
| 136 | - return success(convertList(list, device -> // 只返回 id、name 字段 | |
| 137 | - new IotDeviceRespVO().setId(device.getId()).setDeviceName(device.getDeviceName()))); | |
| 126 | + @Parameters({ | |
| 127 | + @Parameter(name = "deviceType", description = "设备类型", example = "1"), | |
| 128 | + @Parameter(name = "productId", description = "产品编号", example = "1024") | |
| 129 | + }) | |
| 130 | + public CommonResult<List<IotDeviceRespVO>> getDeviceSimpleList( | |
| 131 | + @RequestParam(value = "deviceType", required = false) Integer deviceType, | |
| 132 | + @RequestParam(value = "productId", required = false) Long productId) { | |
| 133 | + List<IotDeviceDO> list = deviceService.getDeviceListByCondition(deviceType, productId); | |
| 134 | + return success(convertList(list, device -> // 只返回 id、name、productId 字段 | |
| 135 | + new IotDeviceRespVO().setId(device.getId()).setDeviceName(device.getDeviceName()) | |
| 136 | + .setProductId(device.getProductId()).setState(device.getState()))); | |
| 138 | 137 | } |
| 139 | 138 | |
| 140 | 139 | @PostMapping("/import") |
| ... | ... | @@ -154,35 +153,28 @@ public class IotDeviceController { |
| 154 | 153 | // 手动创建导出 demo |
| 155 | 154 | List<IotDeviceImportExcelVO> list = Arrays.asList( |
| 156 | 155 | IotDeviceImportExcelVO.builder().deviceName("温度传感器001").parentDeviceName("gateway110") |
| 157 | - .productKey("1de24640dfe").groupNames("灰度分组,生产分组").build(), | |
| 158 | - IotDeviceImportExcelVO.builder().deviceName("biubiu") | |
| 159 | - .productKey("YzvHxd4r67sT4s2B").groupNames("").build()); | |
| 156 | + .productKey("1de24640dfe").groupNames("灰度分组,生产分组") | |
| 157 | + .locationType(IotLocationTypeEnum.IP.getType()).build(), | |
| 158 | + IotDeviceImportExcelVO.builder().deviceName("biubiu").productKey("YzvHxd4r67sT4s2B") | |
| 159 | + .groupNames("").locationType(IotLocationTypeEnum.MANUAL.getType()).build()); | |
| 160 | 160 | // 输出 |
| 161 | 161 | ExcelUtils.write(response, "设备导入模板.xls", "数据", IotDeviceImportExcelVO.class, list); |
| 162 | 162 | } |
| 163 | 163 | |
| 164 | - @PostMapping("/upstream") | |
| 165 | - @Operation(summary = "设备上行", description = "可用于设备模拟") | |
| 166 | - @PreAuthorize("@ss.hasPermission('iot:device:upstream')") | |
| 167 | - public CommonResult<Boolean> upstreamDevice(@Valid @RequestBody IotDeviceUpstreamReqVO upstreamReqVO) { | |
| 168 | - deviceUpstreamService.upstreamDevice(upstreamReqVO); | |
| 169 | - return success(true); | |
| 164 | + @GetMapping("/get-auth-info") | |
| 165 | + @Operation(summary = "获得设备连接信息") | |
| 166 | + @PreAuthorize("@ss.hasPermission('iot:device:auth-info')") | |
| 167 | + public CommonResult<IotDeviceAuthInfoRespVO> getDeviceAuthInfo(@RequestParam("id") Long id) { | |
| 168 | + return success(deviceService.getDeviceAuthInfo(id)); | |
| 170 | 169 | } |
| 171 | 170 | |
| 172 | - @PostMapping("/downstream") | |
| 173 | - @Operation(summary = "设备下行", description = "可用于设备模拟") | |
| 174 | - @PreAuthorize("@ss.hasPermission('iot:device:downstream')") | |
| 175 | - public CommonResult<Boolean> downstreamDevice(@Valid @RequestBody IotDeviceDownstreamReqVO downstreamReqVO) { | |
| 176 | - deviceDownstreamService.downstreamDevice(downstreamReqVO); | |
| 177 | - return success(true); | |
| 178 | - } | |
| 179 | - | |
| 180 | - // TODO @haohao:是不是默认详情接口,不返回 secret,然后这个接口,用于统一返回。然后接口名可以更通用一点。 | |
| 181 | - @GetMapping("/mqtt-connection-params") | |
| 182 | - @Operation(summary = "获取 MQTT 连接参数") | |
| 183 | - @PreAuthorize("@ss.hasPermission('iot:device:mqtt-connection-params')") | |
| 184 | - public CommonResult<IotDeviceMqttConnectionParamsRespVO> getMqttConnectionParams(@RequestParam("deviceId") Long deviceId) { | |
| 185 | - return success(deviceService.getMqttConnectionParams(deviceId)); | |
| 171 | + // TODO @haohao:可以使用 @RequestParam("productKey") String productKey, @RequestParam("deviceNames") List<String> deviceNames 来接收哇? | |
| 172 | + @GetMapping("/list-by-product-key-and-names") | |
| 173 | + @Operation(summary = "通过产品标识和设备名称列表获取设备") | |
| 174 | + @PreAuthorize("@ss.hasPermission('iot:device:query')") | |
| 175 | + public CommonResult<List<IotDeviceRespVO>> getDevicesByProductKeyAndNames(@Valid IotDeviceByProductKeyAndNamesReqVO reqVO) { | |
| 176 | + List<IotDeviceDO> devices = deviceService.getDeviceListByProductKeyAndNames(reqVO.getProductKey(), reqVO.getDeviceNames()); | |
| 177 | + return success(BeanUtils.toBean(devices, IotDeviceRespVO.class)); | |
| 186 | 178 | } |
| 187 | 179 | |
| 188 | -} | |
| 189 | 180 | \ No newline at end of file |
| 181 | +} | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceLogController.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.device; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 5 | -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 6 | -import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDeviceLogPageReqVO; | |
| 7 | -import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDeviceLogRespVO; | |
| 8 | -import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceLogDO; | |
| 9 | -import cn.iocoder.yudao.module.iot.service.device.data.IotDeviceLogService; | |
| 10 | -import io.swagger.v3.oas.annotations.Operation; | |
| 11 | -import io.swagger.v3.oas.annotations.tags.Tag; | |
| 12 | -import jakarta.annotation.Resource; | |
| 13 | -import jakarta.validation.Valid; | |
| 14 | -import org.springframework.security.access.prepost.PreAuthorize; | |
| 15 | -import org.springframework.validation.annotation.Validated; | |
| 16 | -import org.springframework.web.bind.annotation.GetMapping; | |
| 17 | -import org.springframework.web.bind.annotation.RequestMapping; | |
| 18 | -import org.springframework.web.bind.annotation.RestController; | |
| 19 | - | |
| 20 | -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 21 | - | |
| 22 | -@Tag(name = "管理后台 - IoT 设备日志") | |
| 23 | -@RestController | |
| 24 | -@RequestMapping("/iot/device/log") | |
| 25 | -@Validated | |
| 26 | -public class IotDeviceLogController { | |
| 27 | - | |
| 28 | - @Resource | |
| 29 | - private IotDeviceLogService deviceLogService; | |
| 30 | - | |
| 31 | - @GetMapping("/page") | |
| 32 | - @Operation(summary = "获得设备日志分页") | |
| 33 | - @PreAuthorize("@ss.hasPermission('iot:device:log-query')") | |
| 34 | - public CommonResult<PageResult<IotDeviceLogRespVO>> getDeviceLogPage(@Valid IotDeviceLogPageReqVO pageReqVO) { | |
| 35 | - PageResult<IotDeviceLogDO> pageResult = deviceLogService.getDeviceLogPage(pageReqVO); | |
| 36 | - return success(BeanUtils.toBean(pageResult, IotDeviceLogRespVO.class)); | |
| 37 | - } | |
| 38 | - | |
| 39 | -} | |
| 40 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.http renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceMessageController.http
| 1 | -### 请求 /iot/device/downstream 接口(服务调用) => 成功 | |
| 1 | +### 请求 /iot/device/message/send 接口(属性上报)=> 成功 | |
| 2 | +POST {{baseUrl}}/iot/device/message/send | |
| 3 | +Content-Type: application/json | |
| 4 | +tenant-id: {{adminTenantId}} | |
| 5 | +Authorization: Bearer {{token}} | |
| 6 | + | |
| 7 | +{ | |
| 8 | + "deviceId": 25, | |
| 9 | + "method": "thing.property.post", | |
| 10 | + "params": { | |
| 11 | + "width": 1, | |
| 12 | + "height": "2", | |
| 13 | + "oneThree": "3" | |
| 14 | + } | |
| 15 | +} | |
| 16 | + | |
| 17 | +### 请求 /iot/device/downstream 接口(服务调用)=> 成功 TODO 芋艿:未更新为最新 | |
| 2 | 18 | POST {{baseUrl}}/iot/device/downstream |
| 3 | 19 | Content-Type: application/json |
| 4 | -tenant-id: {{adminTenentId}} | |
| 20 | +tenant-id: {{adminTenantId}} | |
| 5 | 21 | Authorization: Bearer {{token}} |
| 6 | 22 | |
| 7 | 23 | { |
| ... | ... | @@ -13,10 +29,10 @@ Authorization: Bearer {{token}} |
| 13 | 29 | } |
| 14 | 30 | } |
| 15 | 31 | |
| 16 | -### 请求 /iot/device/downstream 接口(属性设置) => 成功 | |
| 32 | +### 请求 /iot/device/downstream 接口(属性设置)=> 成功 TODO 芋艿:未更新为最新 | |
| 17 | 33 | POST {{baseUrl}}/iot/device/downstream |
| 18 | 34 | Content-Type: application/json |
| 19 | -tenant-id: {{adminTenentId}} | |
| 35 | +tenant-id: {{adminTenantId}} | |
| 20 | 36 | Authorization: Bearer {{token}} |
| 21 | 37 | |
| 22 | 38 | { |
| ... | ... | @@ -28,10 +44,10 @@ Authorization: Bearer {{token}} |
| 28 | 44 | } |
| 29 | 45 | } |
| 30 | 46 | |
| 31 | -### 请求 /iot/device/downstream 接口(属性获取) => 成功 | |
| 47 | +### 请求 /iot/device/downstream 接口(属性获取)=> 成功 TODO 芋艿:未更新为最新 | |
| 32 | 48 | POST {{baseUrl}}/iot/device/downstream |
| 33 | 49 | Content-Type: application/json |
| 34 | -tenant-id: {{adminTenentId}} | |
| 50 | +tenant-id: {{adminTenantId}} | |
| 35 | 51 | Authorization: Bearer {{token}} |
| 36 | 52 | |
| 37 | 53 | { |
| ... | ... | @@ -41,10 +57,10 @@ Authorization: Bearer {{token}} |
| 41 | 57 | "data": ["xx", "yy"] |
| 42 | 58 | } |
| 43 | 59 | |
| 44 | -### 请求 /iot/device/downstream 接口(配置设置) => 成功 | |
| 60 | +### 请求 /iot/device/downstream 接口(配置设置)=> 成功 TODO 芋艿:未更新为最新 | |
| 45 | 61 | POST {{baseUrl}}/iot/device/downstream |
| 46 | 62 | Content-Type: application/json |
| 47 | -tenant-id: {{adminTenentId}} | |
| 63 | +tenant-id: {{adminTenantId}} | |
| 48 | 64 | Authorization: Bearer {{token}} |
| 49 | 65 | |
| 50 | 66 | { |
| ... | ... | @@ -53,10 +69,10 @@ Authorization: Bearer {{token}} |
| 53 | 69 | "identifier": "set" |
| 54 | 70 | } |
| 55 | 71 | |
| 56 | -### 请求 /iot/device/downstream 接口(OTA 升级) => 成功 | |
| 72 | +### 请求 /iot/device/downstream 接口(OTA 升级)=> 成功 TODO 芋艿:未更新为最新 | |
| 57 | 73 | POST {{baseUrl}}/iot/device/downstream |
| 58 | 74 | Content-Type: application/json |
| 59 | -tenant-id: {{adminTenentId}} | |
| 75 | +tenant-id: {{adminTenantId}} | |
| 60 | 76 | Authorization: Bearer {{token}} |
| 61 | 77 | |
| 62 | 78 | { |
| ... | ... | @@ -72,4 +88,14 @@ Authorization: Bearer {{token}} |
| 72 | 88 | "fileUrl": "http://example.com/firmware.bin", |
| 73 | 89 | "information": "{\"desc\":\"升级到最新版本\"}" |
| 74 | 90 | } |
| 75 | -} | |
| 76 | 91 | \ No newline at end of file |
| 92 | +} | |
| 93 | + | |
| 94 | +### 查询设备消息对分页 - 基础查询(设备编号25) | |
| 95 | +GET {{baseUrl}}/iot/device/message/pair-page?deviceId=25&pageNo=1&pageSize=10 | |
| 96 | +Authorization: Bearer {{token}} | |
| 97 | +tenant-id: {{adminTenantId}} | |
| 98 | + | |
| 99 | +### 查询设备消息对分页 - 按标识符过滤(identifier=eat) | |
| 100 | +GET {{baseUrl}}/iot/device/message/pair-page?deviceId=25&identifier=eat&pageNo=1&pageSize=10 | |
| 101 | +Authorization: Bearer {{token}} | |
| 102 | +tenant-id: {{adminTenantId}} | |
| 77 | 103 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceMessageController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.device; | |
| 2 | + | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 5 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 6 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 7 | +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceMessagePageReqVO; | |
| 8 | +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceMessageRespPairVO; | |
| 9 | +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceMessageRespVO; | |
| 10 | +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceMessageSendReqVO; | |
| 11 | +import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage; | |
| 12 | +import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO; | |
| 13 | +import cn.iocoder.yudao.module.iot.dal.tdengine.IotDeviceMessageMapper; | |
| 14 | +import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; | |
| 15 | +import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceMessageService; | |
| 16 | +import cn.iocoder.yudao.module.iot.service.thingmodel.IotThingModelService; | |
| 17 | +import io.swagger.v3.oas.annotations.Operation; | |
| 18 | +import io.swagger.v3.oas.annotations.tags.Tag; | |
| 19 | +import jakarta.annotation.Resource; | |
| 20 | +import jakarta.validation.Valid; | |
| 21 | +import org.springframework.security.access.prepost.PreAuthorize; | |
| 22 | +import org.springframework.validation.annotation.Validated; | |
| 23 | +import org.springframework.web.bind.annotation.*; | |
| 24 | + | |
| 25 | +import java.util.List; | |
| 26 | +import java.util.Map; | |
| 27 | + | |
| 28 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 29 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | |
| 30 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; | |
| 31 | + | |
| 32 | +@Tag(name = "管理后台 - IoT 设备消息") | |
| 33 | +@RestController | |
| 34 | +@RequestMapping("/iot/device/message") | |
| 35 | +@Validated | |
| 36 | +public class IotDeviceMessageController { | |
| 37 | + | |
| 38 | + @Resource | |
| 39 | + private IotDeviceMessageService deviceMessageService; | |
| 40 | + @Resource | |
| 41 | + private IotDeviceService deviceService; | |
| 42 | + @Resource | |
| 43 | + private IotThingModelService thingModelService; | |
| 44 | + @Resource | |
| 45 | + private IotDeviceMessageMapper deviceMessageMapper; | |
| 46 | + | |
| 47 | + @GetMapping("/page") | |
| 48 | + @Operation(summary = "获得设备消息分页") | |
| 49 | + @PreAuthorize("@ss.hasPermission('iot:device:message-query')") | |
| 50 | + public CommonResult<PageResult<IotDeviceMessageRespVO>> getDeviceMessagePage( | |
| 51 | + @Valid IotDeviceMessagePageReqVO pageReqVO) { | |
| 52 | + PageResult<IotDeviceMessageDO> pageResult = deviceMessageService.getDeviceMessagePage(pageReqVO); | |
| 53 | + return success(BeanUtils.toBean(pageResult, IotDeviceMessageRespVO.class)); | |
| 54 | + } | |
| 55 | + | |
| 56 | + @GetMapping("/pair-page") | |
| 57 | + @Operation(summary = "获得设备消息对分页") | |
| 58 | + @PreAuthorize("@ss.hasPermission('iot:device:message-query')") | |
| 59 | + public CommonResult<PageResult<IotDeviceMessageRespPairVO>> getDeviceMessagePairPage( | |
| 60 | + @Valid IotDeviceMessagePageReqVO pageReqVO) { | |
| 61 | + // 1.1 先按照条件,查询 request 的消息(非 reply) | |
| 62 | + pageReqVO.setReply(false); | |
| 63 | + PageResult<IotDeviceMessageDO> requestMessagePageResult = deviceMessageService.getDeviceMessagePage(pageReqVO); | |
| 64 | + if (CollUtil.isEmpty(requestMessagePageResult.getList())) { | |
| 65 | + return success(PageResult.empty()); | |
| 66 | + } | |
| 67 | + // 1.2 接着按照 requestIds,批量查询 reply 消息 | |
| 68 | + List<String> requestIds = convertList(requestMessagePageResult.getList(), IotDeviceMessageDO::getRequestId); | |
| 69 | + List<IotDeviceMessageDO> replyMessageList = deviceMessageService.getDeviceMessageListByRequestIdsAndReply( | |
| 70 | + pageReqVO.getDeviceId(), requestIds, true); | |
| 71 | + Map<String, IotDeviceMessageDO> replyMessages = convertMap(replyMessageList, IotDeviceMessageDO::getRequestId); | |
| 72 | + | |
| 73 | + // 2. 组装结果 | |
| 74 | + List<IotDeviceMessageRespPairVO> pairMessages = convertList(requestMessagePageResult.getList(), | |
| 75 | + requestMessage -> { | |
| 76 | + IotDeviceMessageDO replyMessage = replyMessages.get(requestMessage.getRequestId()); | |
| 77 | + return new IotDeviceMessageRespPairVO() | |
| 78 | + .setRequest(BeanUtils.toBean(requestMessage, IotDeviceMessageRespVO.class)) | |
| 79 | + .setReply(BeanUtils.toBean(replyMessage, IotDeviceMessageRespVO.class)); | |
| 80 | + }); | |
| 81 | + return success(new PageResult<>(pairMessages, requestMessagePageResult.getTotal())); | |
| 82 | + } | |
| 83 | + | |
| 84 | + @PostMapping("/send") | |
| 85 | + @Operation(summary = "发送消息", description = "可用于设备模拟") | |
| 86 | + @PreAuthorize("@ss.hasPermission('iot:device:message-end')") | |
| 87 | + public CommonResult<Boolean> sendDeviceMessage(@Valid @RequestBody IotDeviceMessageSendReqVO sendReqVO) { | |
| 88 | + deviceMessageService.sendDeviceMessage(BeanUtils.toBean(sendReqVO, IotDeviceMessage.class)); | |
| 89 | + return success(true); | |
| 90 | + } | |
| 91 | + | |
| 92 | +} | |
| 0 | 93 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDevicePropertyController.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.controller.admin.device; |
| 2 | 2 | |
| 3 | -import cn.hutool.core.collection.CollUtil; | |
| 4 | 3 | import cn.hutool.core.date.LocalDateTimeUtil; |
| 5 | 4 | import cn.hutool.core.lang.Assert; |
| 6 | -import cn.hutool.core.util.StrUtil; | |
| 7 | 5 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 8 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 9 | -import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDevicePropertyHistoryPageReqVO; | |
| 10 | -import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDevicePropertyRespVO; | |
| 6 | +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.property.IotDevicePropertyDetailRespVO; | |
| 7 | +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.property.IotDevicePropertyHistoryListReqVO; | |
| 8 | +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.property.IotDevicePropertyRespVO; | |
| 9 | +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelProperty; | |
| 11 | 10 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; |
| 12 | 11 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDevicePropertyDO; |
| 13 | 12 | import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO; |
| 13 | +import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum; | |
| 14 | 14 | import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; |
| 15 | -import cn.iocoder.yudao.module.iot.service.device.data.IotDevicePropertyService; | |
| 15 | +import cn.iocoder.yudao.module.iot.service.device.property.IotDevicePropertyService; | |
| 16 | 16 | import cn.iocoder.yudao.module.iot.service.thingmodel.IotThingModelService; |
| 17 | 17 | import io.swagger.v3.oas.annotations.Operation; |
| 18 | 18 | import io.swagger.v3.oas.annotations.Parameter; |
| 19 | -import io.swagger.v3.oas.annotations.Parameters; | |
| 20 | 19 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 21 | 20 | import jakarta.annotation.Resource; |
| 22 | 21 | import jakarta.validation.Valid; |
| ... | ... | @@ -46,50 +45,45 @@ public class IotDevicePropertyController { |
| 46 | 45 | @Resource |
| 47 | 46 | private IotDeviceService deviceService; |
| 48 | 47 | |
| 49 | - @GetMapping("/latest") | |
| 48 | + @GetMapping("/get-latest") | |
| 50 | 49 | @Operation(summary = "获取设备属性最新属性") |
| 51 | - @Parameters({ | |
| 52 | - @Parameter(name = "deviceId", description = "设备编号", required = true), | |
| 53 | - @Parameter(name = "identifier", description = "标识符"), | |
| 54 | - @Parameter(name = "name", description = "名称") | |
| 55 | - }) | |
| 50 | + @Parameter(name = "deviceId", description = "设备编号", required = true) | |
| 56 | 51 | @PreAuthorize("@ss.hasPermission('iot:device:property-query')") |
| 57 | - public CommonResult<List<IotDevicePropertyRespVO>> getLatestDeviceProperties( | |
| 58 | - @RequestParam("deviceId") Long deviceId, | |
| 59 | - @RequestParam(value = "identifier", required = false) String identifier, | |
| 60 | - @RequestParam(value = "name", required = false) String name) { | |
| 61 | - Map<String, IotDevicePropertyDO> properties = devicePropertyService.getLatestDeviceProperties(deviceId); | |
| 62 | - | |
| 63 | - // 拼接数据 | |
| 52 | + public CommonResult<List<IotDevicePropertyDetailRespVO>> getLatestDeviceProperties( | |
| 53 | + @RequestParam("deviceId") Long deviceId) { | |
| 54 | + // 1.1 获取设备信息 | |
| 64 | 55 | IotDeviceDO device = deviceService.getDevice(deviceId); |
| 65 | 56 | Assert.notNull(device, "设备不存在"); |
| 66 | - List<IotThingModelDO> thingModels = thingModelService.getThingModelListByProductId(device.getProductId()); | |
| 67 | - return success(convertList(properties.entrySet(), entry -> { | |
| 68 | - IotThingModelDO thingModel = CollUtil.findOne(thingModels, | |
| 69 | - item -> item.getIdentifier().equals(entry.getKey())); | |
| 70 | - if (thingModel == null || thingModel.getProperty() == null) { | |
| 71 | - return null; | |
| 72 | - } | |
| 73 | - if (StrUtil.isNotEmpty(identifier) && !StrUtil.contains(thingModel.getIdentifier(), identifier)) { | |
| 74 | - return null; | |
| 75 | - } | |
| 76 | - if (StrUtil.isNotEmpty(name) && !StrUtil.contains(thingModel.getName(), name)) { | |
| 77 | - return null; | |
| 57 | + // 1.2 获取设备最新属性 | |
| 58 | + Map<String, IotDevicePropertyDO> properties = devicePropertyService.getLatestDeviceProperties(deviceId); | |
| 59 | + // 1.3 根据 productId + type 查询属性类型的物模型 | |
| 60 | + List<IotThingModelDO> thingModels = thingModelService.getThingModelListByProductIdAndType( | |
| 61 | + device.getProductId(), IotThingModelTypeEnum.PROPERTY.getType()); | |
| 62 | + | |
| 63 | + // 2. 基于 thingModels 遍历,拼接 properties | |
| 64 | + return success(convertList(thingModels, thingModel -> { | |
| 65 | + ThingModelProperty thingModelProperty = thingModel.getProperty(); | |
| 66 | + Assert.notNull(thingModelProperty, "属性不能为空"); | |
| 67 | + IotDevicePropertyDetailRespVO result = new IotDevicePropertyDetailRespVO() | |
| 68 | + .setName(thingModel.getName()).setDataType(thingModelProperty.getDataType()) | |
| 69 | + .setDataSpecs(thingModelProperty.getDataSpecs()) | |
| 70 | + .setDataSpecsList(thingModelProperty.getDataSpecsList()); | |
| 71 | + result.setIdentifier(thingModel.getIdentifier()); | |
| 72 | + IotDevicePropertyDO property = properties.get(thingModel.getIdentifier()); | |
| 73 | + if (property != null) { | |
| 74 | + result.setValue(property.getValue()) | |
| 75 | + .setUpdateTime(LocalDateTimeUtil.toEpochMilli(property.getUpdateTime())); | |
| 78 | 76 | } |
| 79 | - // 构建对象 | |
| 80 | - IotDevicePropertyDO property = entry.getValue(); | |
| 81 | - return new IotDevicePropertyRespVO().setProperty(thingModel.getProperty()) | |
| 82 | - .setValue(property.getValue()).setUpdateTime(LocalDateTimeUtil.toEpochMilli(property.getUpdateTime())); | |
| 77 | + return result; | |
| 83 | 78 | })); |
| 84 | 79 | } |
| 85 | 80 | |
| 86 | - @GetMapping("/history-page") | |
| 87 | - @Operation(summary = "获取设备属性历史数据") | |
| 81 | + @GetMapping("/history-list") | |
| 82 | + @Operation(summary = "获取设备属性历史数据列表") | |
| 88 | 83 | @PreAuthorize("@ss.hasPermission('iot:device:property-query')") |
| 89 | - public CommonResult<PageResult<IotDevicePropertyRespVO>> getHistoryDevicePropertyPage( | |
| 90 | - @Valid IotDevicePropertyHistoryPageReqVO pageReqVO) { | |
| 91 | - Assert.notEmpty(pageReqVO.getIdentifier(), "标识符不能为空"); | |
| 92 | - return success(devicePropertyService.getHistoryDevicePropertyPage(pageReqVO)); | |
| 84 | + public CommonResult<List<IotDevicePropertyRespVO>> getHistoryDevicePropertyList( | |
| 85 | + @Valid IotDevicePropertyHistoryListReqVO listReqVO) { | |
| 86 | + return success(devicePropertyService.getHistoryDevicePropertyList(listReqVO)); | |
| 93 | 87 | } |
| 94 | 88 | |
| 95 | 89 | } |
| 96 | 90 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/control/IotDeviceDownstreamReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.device.vo.control; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 4 | -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum; | |
| 5 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 6 | -import jakarta.validation.constraints.NotEmpty; | |
| 7 | -import jakarta.validation.constraints.NotNull; | |
| 8 | -import lombok.Data; | |
| 9 | - | |
| 10 | -@Schema(description = "管理后台 - IoT 设备下行 Request VO") // 服务调用、属性设置、属性获取等 | |
| 11 | -@Data | |
| 12 | -public class IotDeviceDownstreamReqVO { | |
| 13 | - | |
| 14 | - @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "177") | |
| 15 | - @NotNull(message = "设备编号不能为空") | |
| 16 | - private Long id; | |
| 17 | - | |
| 18 | - @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "property") | |
| 19 | - @NotEmpty(message = "消息类型不能为空") | |
| 20 | - @InEnum(IotDeviceMessageTypeEnum.class) | |
| 21 | - private String type; | |
| 22 | - | |
| 23 | - @Schema(description = "标识符", requiredMode = Schema.RequiredMode.REQUIRED, example = "report") | |
| 24 | - @NotEmpty(message = "标识符不能为空") | |
| 25 | - private String identifier; // 参见 IotDeviceMessageIdentifierEnum 枚举类 | |
| 26 | - | |
| 27 | - @Schema(description = "请求参数", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 28 | - private Object data; // 例如说:服务调用的 params、属性设置的 properties | |
| 29 | - | |
| 30 | -} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/control/IotDeviceUpstreamReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.device.vo.control; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 4 | -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum; | |
| 5 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 6 | -import jakarta.validation.constraints.NotEmpty; | |
| 7 | -import jakarta.validation.constraints.NotNull; | |
| 8 | -import lombok.Data; | |
| 9 | - | |
| 10 | -@Schema(description = "管理后台 - IoT 设备上行 Request VO") // 属性上报、事件上报、状态变更等 | |
| 11 | -@Data | |
| 12 | -public class IotDeviceUpstreamReqVO { | |
| 13 | - | |
| 14 | - @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "177") | |
| 15 | - @NotNull(message = "设备编号不能为空") | |
| 16 | - private Long id; | |
| 17 | - | |
| 18 | - @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "property") | |
| 19 | - @NotEmpty(message = "消息类型不能为空") | |
| 20 | - @InEnum(IotDeviceMessageTypeEnum.class) | |
| 21 | - private String type; | |
| 22 | - | |
| 23 | - @Schema(description = "标识符", requiredMode = Schema.RequiredMode.REQUIRED, example = "report") | |
| 24 | - @NotEmpty(message = "标识符不能为空") | |
| 25 | - private String identifier; // 参见 IotDeviceMessageIdentifierEnum 枚举类 | |
| 26 | - | |
| 27 | - @Schema(description = "请求参数", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 28 | - private Object data; // 例如说:属性上报的 properties、事件上报的 params | |
| 29 | - | |
| 30 | -} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/data/IotDeviceLogPageReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.device.vo.data; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 4 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 5 | -import jakarta.validation.constraints.NotEmpty; | |
| 6 | -import lombok.Data; | |
| 7 | - | |
| 8 | -@Schema(description = "管理后台 - IoT 设备日志分页查询 Request VO") | |
| 9 | -@Data | |
| 10 | -public class IotDeviceLogPageReqVO extends PageParam { | |
| 11 | - | |
| 12 | - @Schema(description = "设备标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "device123") | |
| 13 | - @NotEmpty(message = "设备标识不能为空") | |
| 14 | - private String deviceKey; | |
| 15 | - | |
| 16 | - @Schema(description = "消息类型", example = "property") | |
| 17 | - private String type; // 参见 IotDeviceMessageTypeEnum 枚举,精准匹配 | |
| 18 | - | |
| 19 | - @Schema(description = "标识符", example = "temperature") | |
| 20 | - private String identifier; // 参见 IotDeviceMessageIdentifierEnum 枚举,模糊匹配 | |
| 21 | - | |
| 22 | -} | |
| 23 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/data/IotDeviceLogRespVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.device.vo.data; | |
| 2 | - | |
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.time.LocalDateTime; | |
| 7 | - | |
| 8 | -@Schema(description = "管理后台 - IoT 设备日志 Response VO") | |
| 9 | -@Data | |
| 10 | -public class IotDeviceLogRespVO { | |
| 11 | - | |
| 12 | - @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 13 | - private String id; | |
| 14 | - | |
| 15 | - @Schema(description = "产品标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "product123") | |
| 16 | - private String productKey; | |
| 17 | - | |
| 18 | - @Schema(description = "设备标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "device123") | |
| 19 | - private String deviceKey; | |
| 20 | - | |
| 21 | - @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "property") | |
| 22 | - private String type; | |
| 23 | - | |
| 24 | - @Schema(description = "标识符", requiredMode = Schema.RequiredMode.REQUIRED, example = "temperature") | |
| 25 | - private String identifier; | |
| 26 | - | |
| 27 | - @Schema(description = "日志内容", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 28 | - private String content; | |
| 29 | - | |
| 30 | - @Schema(description = "上报时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 31 | - private LocalDateTime reportTime; | |
| 32 | - | |
| 33 | - @Schema(description = "记录时间戳", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 34 | - private LocalDateTime ts; | |
| 35 | - | |
| 36 | -} | |
| 37 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceAuthInfoRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import jakarta.validation.constraints.NotBlank; | |
| 5 | +import lombok.Data; | |
| 6 | + | |
| 7 | +@Schema(description = "管理后台 - IoT 设备认证信息 Response VO") | |
| 8 | +@Data | |
| 9 | +public class IotDeviceAuthInfoRespVO { | |
| 10 | + | |
| 11 | + @Schema(description = "客户端 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "product123.device001") | |
| 12 | + @NotBlank(message = "客户端 ID 不能为空") | |
| 13 | + private String clientId; | |
| 14 | + | |
| 15 | + @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "device001&product123") | |
| 16 | + @NotBlank(message = "用户名不能为空") | |
| 17 | + private String username; | |
| 18 | + | |
| 19 | + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1a2b3c4d5e6f7890abcdef1234567890") | |
| 20 | + @NotBlank(message = "密码不能为空") | |
| 21 | + private String password; | |
| 22 | + | |
| 23 | +} | |
| 0 | 24 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceByProductKeyAndNamesReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import jakarta.validation.constraints.NotBlank; | |
| 5 | +import jakarta.validation.constraints.NotEmpty; | |
| 6 | +import lombok.Data; | |
| 7 | + | |
| 8 | +import java.util.List; | |
| 9 | + | |
| 10 | +@Schema(description = "管理后台 - 通过产品标识和设备名称列表获取设备 Request VO") | |
| 11 | +@Data | |
| 12 | +public class IotDeviceByProductKeyAndNamesReqVO { | |
| 13 | + | |
| 14 | + @Schema(description = "产品标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "1de24640dfe") | |
| 15 | + @NotBlank(message = "产品标识不能为空") | |
| 16 | + private String productKey; | |
| 17 | + | |
| 18 | + @Schema(description = "设备名称列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "device001,device002") | |
| 19 | + @NotEmpty(message = "设备名称列表不能为空") | |
| 20 | + private List<String> deviceNames; | |
| 21 | + | |
| 22 | +} | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceImportExcelVO.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; |
| 2 | 2 | |
| 3 | 3 | import cn.idev.excel.annotation.ExcelProperty; |
| 4 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 5 | +import cn.iocoder.yudao.module.iot.enums.product.IotLocationTypeEnum; | |
| 4 | 6 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | 7 | import jakarta.validation.constraints.NotEmpty; |
| 8 | +import jakarta.validation.constraints.NotNull; | |
| 6 | 9 | import lombok.AllArgsConstructor; |
| 7 | 10 | import lombok.Builder; |
| 8 | 11 | import lombok.Data; |
| ... | ... | @@ -34,4 +37,9 @@ public class IotDeviceImportExcelVO { |
| 34 | 37 | @ExcelProperty("设备分组") |
| 35 | 38 | private String groupNames; |
| 36 | 39 | |
| 40 | + @ExcelProperty("上报方式(1:IP 定位, 2:设备上报,3:手动定位)") | |
| 41 | + @NotNull(message = "上报方式不能为空") | |
| 42 | + @InEnum(IotLocationTypeEnum.class) | |
| 43 | + private Integer locationType; | |
| 44 | + | |
| 37 | 45 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceMqttConnectionParamsRespVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; | |
| 2 | - | |
| 3 | -import cn.idev.excel.annotation.ExcelIgnoreUnannotated; | |
| 4 | -import cn.idev.excel.annotation.ExcelProperty; | |
| 5 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 6 | -import lombok.Data; | |
| 7 | - | |
| 8 | -@Schema(description = "管理后台 - IoT 设备 MQTT 连接参数 Response VO") | |
| 9 | -@Data | |
| 10 | -@ExcelIgnoreUnannotated | |
| 11 | -public class IotDeviceMqttConnectionParamsRespVO { | |
| 12 | - | |
| 13 | - @Schema(description = "MQTT 客户端 ID", example = "24602") | |
| 14 | - @ExcelProperty("MQTT 客户端 ID") | |
| 15 | - private String mqttClientId; | |
| 16 | - | |
| 17 | - @Schema(description = "MQTT 用户名", example = "芋艿") | |
| 18 | - @ExcelProperty("MQTT 用户名") | |
| 19 | - private String mqttUsername; | |
| 20 | - | |
| 21 | - @Schema(description = "MQTT 密码") | |
| 22 | - @ExcelProperty("MQTT 密码") | |
| 23 | - private String mqttPassword; | |
| 24 | - | |
| 25 | -} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDevicePageReqVO.java
| ... | ... | @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 4 | 4 | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| 5 | -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; | |
| 5 | +import cn.iocoder.yudao.module.iot.core.enums.IotDeviceStateEnum; | |
| 6 | 6 | import cn.iocoder.yudao.module.iot.enums.product.IotProductDeviceTypeEnum; |
| 7 | 7 | import io.swagger.v3.oas.annotations.media.Schema; |
| 8 | 8 | import lombok.Data; | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceRespVO.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; | |
| 4 | -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; | |
| 5 | 3 | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| 6 | 4 | import cn.idev.excel.annotation.ExcelProperty; |
| 5 | +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; | |
| 6 | +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; | |
| 7 | +import cn.iocoder.yudao.module.iot.enums.DictTypeConstants; | |
| 7 | 8 | import io.swagger.v3.oas.annotations.media.Schema; |
| 8 | 9 | import lombok.Data; |
| 9 | 10 | |
| 11 | +import java.math.BigDecimal; | |
| 10 | 12 | import java.time.LocalDateTime; |
| 11 | 13 | import java.util.Set; |
| 12 | 14 | |
| ... | ... | @@ -20,10 +22,6 @@ public class IotDeviceRespVO { |
| 20 | 22 | @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "177") |
| 21 | 23 | private Long id; |
| 22 | 24 | |
| 23 | - @Schema(description = "设备唯一标识符", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 24 | - @ExcelProperty("设备唯一标识符") | |
| 25 | - private String deviceKey; | |
| 26 | - | |
| 27 | 25 | @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") |
| 28 | 26 | @ExcelProperty("设备名称") |
| 29 | 27 | private String deviceName; |
| ... | ... | @@ -86,8 +84,19 @@ public class IotDeviceRespVO { |
| 86 | 84 | @Schema(description = "设备配置", example = "{\"abc\": \"efg\"}") |
| 87 | 85 | private String config; |
| 88 | 86 | |
| 87 | + @Schema(description = "定位方式", example = "2") | |
| 88 | + @ExcelProperty(value = "定位方式", converter = DictConvert.class) | |
| 89 | + @DictFormat(DictTypeConstants.LOCATION_TYPE) | |
| 90 | + private Integer locationType; | |
| 91 | + | |
| 92 | + @Schema(description = "设备位置的纬度", example = "45.000000") | |
| 93 | + private BigDecimal latitude; | |
| 94 | + | |
| 95 | + @Schema(description = "设备位置的经度", example = "45.000000") | |
| 96 | + private BigDecimal longitude; | |
| 97 | + | |
| 89 | 98 | @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) |
| 90 | 99 | @ExcelProperty("创建时间") |
| 91 | 100 | private LocalDateTime createTime; |
| 92 | 101 | |
| 93 | 102 | -} |
| 103 | +} | |
| 94 | 104 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceSaveReqVO.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 4 | +import cn.iocoder.yudao.module.iot.enums.product.IotLocationTypeEnum; | |
| 3 | 5 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | -import jakarta.validation.constraints.Size; | |
| 5 | 6 | import lombok.Data; |
| 6 | 7 | |
| 8 | +import java.math.BigDecimal; | |
| 7 | 9 | import java.util.Set; |
| 8 | 10 | |
| 9 | 11 | @Schema(description = "管理后台 - IoT 设备新增/修改 Request VO") |
| ... | ... | @@ -13,10 +15,6 @@ public class IotDeviceSaveReqVO { |
| 13 | 15 | @Schema(description = "设备编号", example = "177") |
| 14 | 16 | private Long id; |
| 15 | 17 | |
| 16 | - @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.AUTO, example = "177") | |
| 17 | - @Size(max = 50, message = "设备编号长度不能超过 50 个字符") | |
| 18 | - private String deviceKey; | |
| 19 | - | |
| 20 | 18 | @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.AUTO, example = "王五") |
| 21 | 19 | private String deviceName; |
| 22 | 20 | |
| ... | ... | @@ -41,4 +39,14 @@ public class IotDeviceSaveReqVO { |
| 41 | 39 | @Schema(description = "设备配置", example = "{\"abc\": \"efg\"}") |
| 42 | 40 | private String config; |
| 43 | 41 | |
| 42 | + @Schema(description = "定位类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") | |
| 43 | + @InEnum(value = IotLocationTypeEnum.class, message = "定位方式必须是 {value}") | |
| 44 | + private Integer locationType; | |
| 45 | + | |
| 46 | + @Schema(description = "设备位置的纬度", example = "16380") | |
| 47 | + private BigDecimal latitude; | |
| 48 | + | |
| 49 | + @Schema(description = "设备位置的经度", example = "16380") | |
| 50 | + private BigDecimal longitude; | |
| 51 | + | |
| 44 | 52 | } |
| 45 | 53 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/message/IotDeviceMessagePageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.message; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 4 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 5 | +import cn.iocoder.yudao.module.iot.core.enums.IotDeviceMessageMethodEnum; | |
| 6 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 7 | +import jakarta.validation.constraints.NotNull; | |
| 8 | +import jakarta.validation.constraints.Size; | |
| 9 | +import lombok.Data; | |
| 10 | +import org.springframework.format.annotation.DateTimeFormat; | |
| 11 | + | |
| 12 | +import java.time.LocalDateTime; | |
| 13 | + | |
| 14 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | |
| 15 | + | |
| 16 | +@Schema(description = "管理后台 - IoT 设备消息分页查询 Request VO") | |
| 17 | +@Data | |
| 18 | +public class IotDeviceMessagePageReqVO extends PageParam { | |
| 19 | + | |
| 20 | + @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 21 | + @NotNull(message = "设备编号不能为空") | |
| 22 | + private Long deviceId; | |
| 23 | + | |
| 24 | + @Schema(description = "消息类型", example = "property") | |
| 25 | + @InEnum(IotDeviceMessageMethodEnum.class) | |
| 26 | + private String method; | |
| 27 | + | |
| 28 | + @Schema(description = "是否上行", example = "true") | |
| 29 | + private Boolean upstream; | |
| 30 | + | |
| 31 | + @Schema(description = "是否回复", example = "true") | |
| 32 | + private Boolean reply; | |
| 33 | + | |
| 34 | + @Schema(description = "标识符", example = "temperature") | |
| 35 | + private String identifier; | |
| 36 | + | |
| 37 | + @Schema(description = "时间范围", requiredMode = Schema.RequiredMode.NOT_REQUIRED) | |
| 38 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 39 | + @Size(min = 2, max = 2, message = "请选择时间范围") | |
| 40 | + private LocalDateTime[] times; | |
| 41 | + | |
| 42 | +} | |
| 0 | 43 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/message/IotDeviceMessageRespPairVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.message; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import lombok.Data; | |
| 5 | + | |
| 6 | +@Schema(description = "管理后台 - IoT 设备消息对 Response VO") | |
| 7 | +@Data | |
| 8 | +public class IotDeviceMessageRespPairVO { | |
| 9 | + | |
| 10 | + @Schema(description = "请求消息", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 11 | + private IotDeviceMessageRespVO request; | |
| 12 | + | |
| 13 | + @Schema(description = "响应消息") | |
| 14 | + private IotDeviceMessageRespVO reply; // 通过 requestId 配对 | |
| 15 | + | |
| 16 | +} | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/message/IotDeviceMessageRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.message; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import lombok.Data; | |
| 5 | + | |
| 6 | +import java.time.LocalDateTime; | |
| 7 | + | |
| 8 | +@Schema(description = "管理后台 - IoT 设备消息 Response VO") | |
| 9 | +@Data | |
| 10 | +public class IotDeviceMessageRespVO { | |
| 11 | + | |
| 12 | + @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 13 | + private String id; | |
| 14 | + | |
| 15 | + @Schema(description = "上报时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 16 | + private LocalDateTime reportTime; | |
| 17 | + | |
| 18 | + @Schema(description = "记录时间戳", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 19 | + private LocalDateTime ts; | |
| 20 | + | |
| 21 | + @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123") | |
| 22 | + private Long deviceId; | |
| 23 | + | |
| 24 | + @Schema(description = "服务编号", example = "server_123") | |
| 25 | + private String serverId; | |
| 26 | + | |
| 27 | + @Schema(description = "是否上行消息", example = "true", examples = "false") | |
| 28 | + private Boolean upstream; | |
| 29 | + | |
| 30 | + @Schema(description = "是否回复消息", example = "false", examples = "true") | |
| 31 | + private Boolean reply; | |
| 32 | + | |
| 33 | + @Schema(description = "标识符", example = "temperature") | |
| 34 | + private String identifier; | |
| 35 | + | |
| 36 | + // ========== codec(编解码)字段 ========== | |
| 37 | + | |
| 38 | + @Schema(description = "请求编号", example = "req_123") | |
| 39 | + private String requestId; | |
| 40 | + | |
| 41 | + @Schema(description = "请求方法", requiredMode = Schema.RequiredMode.REQUIRED, example = "thing.property.report") | |
| 42 | + private String method; | |
| 43 | + | |
| 44 | + @Schema(description = "请求参数") | |
| 45 | + private Object params; | |
| 46 | + | |
| 47 | + @Schema(description = "响应结果") | |
| 48 | + private Object data; | |
| 49 | + | |
| 50 | + @Schema(description = "响应错误码", example = "200") | |
| 51 | + private Integer code; | |
| 52 | + | |
| 53 | + @Schema(description = "响应提示", example = "操作成功") | |
| 54 | + private String msg; | |
| 55 | + | |
| 56 | +} | |
| 0 | 57 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/message/IotDeviceMessageSendReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.message; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 4 | +import cn.iocoder.yudao.module.iot.core.enums.IotDeviceMessageMethodEnum; | |
| 5 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 6 | +import jakarta.validation.constraints.NotEmpty; | |
| 7 | +import jakarta.validation.constraints.NotNull; | |
| 8 | +import lombok.Data; | |
| 9 | + | |
| 10 | +@Schema(description = "管理后台 - IoT 设备消息发送 Request VO") // 属性上报、事件上报、状态变更等 | |
| 11 | +@Data | |
| 12 | +public class IotDeviceMessageSendReqVO { | |
| 13 | + | |
| 14 | + @Schema(description = "请求方法", requiredMode = Schema.RequiredMode.REQUIRED, example = "report") | |
| 15 | + @NotEmpty(message = "请求方法不能为空") | |
| 16 | + @InEnum(IotDeviceMessageMethodEnum.class) | |
| 17 | + private String method; | |
| 18 | + | |
| 19 | + @Schema(description = "请求参数") | |
| 20 | + private Object params; // 例如说:属性上报的 properties、事件上报的 params | |
| 21 | + | |
| 22 | + @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "177") | |
| 23 | + @NotNull(message = "设备编号不能为空") | |
| 24 | + private Long deviceId; | |
| 25 | + | |
| 26 | +} | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/property/IotDevicePropertyDetailRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.property; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.dataType.ThingModelDataSpecs; | |
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 5 | +import lombok.Data; | |
| 6 | + | |
| 7 | +import java.util.List; | |
| 8 | + | |
| 9 | +@Schema(description = "管理后台 - IoT 设备属性详细 Response VO") // 额外增加 来自 ThingModelProperty 的变量 属性 | |
| 10 | +@Data | |
| 11 | +public class IotDevicePropertyDetailRespVO extends IotDevicePropertyRespVO { | |
| 12 | + | |
| 13 | + @Schema(description = "属性名称", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 14 | + private String name; | |
| 15 | + | |
| 16 | + @Schema(description = "数据类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "int") | |
| 17 | + private String dataType; | |
| 18 | + | |
| 19 | + @Schema(description = "数据定义") | |
| 20 | + private ThingModelDataSpecs dataSpecs; | |
| 21 | + | |
| 22 | + @Schema(description = "数据定义列表") | |
| 23 | + private List<ThingModelDataSpecs> dataSpecsList; | |
| 24 | + | |
| 25 | +} | |
| 0 | 26 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/data/IotDevicePropertyHistoryPageReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/property/IotDevicePropertyHistoryListReqVO.java
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.device.vo.data; | |
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.property; | |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 4 | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | 4 | import jakarta.validation.constraints.NotEmpty; |
| 6 | 5 | import jakarta.validation.constraints.NotNull; |
| ... | ... | @@ -12,17 +11,14 @@ import java.time.LocalDateTime; |
| 12 | 11 | |
| 13 | 12 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| 14 | 13 | |
| 15 | -@Schema(description = "管理后台 - IoT 设备属性历史分页 Request VO") | |
| 14 | +@Schema(description = "管理后台 - IoT 设备属性历史列表 Request VO") | |
| 16 | 15 | @Data |
| 17 | -public class IotDevicePropertyHistoryPageReqVO extends PageParam { | |
| 16 | +public class IotDevicePropertyHistoryListReqVO { | |
| 18 | 17 | |
| 19 | 18 | @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "177") |
| 20 | 19 | @NotNull(message = "设备编号不能为空") |
| 21 | 20 | private Long deviceId; |
| 22 | 21 | |
| 23 | - @Schema(description = "设备 Key", hidden = true) | |
| 24 | - private String deviceKey; // 非前端传递,后端自己查询设置 | |
| 25 | - | |
| 26 | 22 | @Schema(description = "属性标识符", requiredMode = Schema.RequiredMode.REQUIRED) |
| 27 | 23 | @NotEmpty(message = "属性标识符不能为空") |
| 28 | 24 | private String identifier; | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/data/IotDevicePropertyRespVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/property/IotDevicePropertyRespVO.java
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.device.vo.data; | |
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.property; | |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelProperty; | |
| 4 | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | 4 | import lombok.Data; |
| 6 | 5 | |
| ... | ... | @@ -8,10 +7,10 @@ import lombok.Data; |
| 8 | 7 | @Data |
| 9 | 8 | public class IotDevicePropertyRespVO { |
| 10 | 9 | |
| 11 | - @Schema(description = "属性定义", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 12 | - private ThingModelProperty property; | |
| 10 | + @Schema(description = "属性标识符", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 11 | + private String identifier; | |
| 13 | 12 | |
| 14 | - @Schema(description = "最新值", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 13 | + @Schema(description = "属性值", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 15 | 14 | private Object value; |
| 16 | 15 | |
| 17 | 16 | @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/IotOtaFirmwareController.java
| ... | ... | @@ -3,13 +3,14 @@ package cn.iocoder.yudao.module.iot.controller.admin.ota; |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | 5 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 6 | +import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareCreateReqVO; | |
| 6 | 7 | import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwarePageReqVO; |
| 7 | 8 | import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareRespVO; |
| 8 | -import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareCreateReqVO; | |
| 9 | 9 | import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareUpdateReqVO; |
| 10 | 10 | import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO; |
| 11 | +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; | |
| 11 | 12 | import cn.iocoder.yudao.module.iot.service.ota.IotOtaFirmwareService; |
| 12 | -import com.fhs.core.trans.anno.TransMethodResult; | |
| 13 | +import cn.iocoder.yudao.module.iot.service.product.IotProductService; | |
| 13 | 14 | import io.swagger.v3.oas.annotations.Operation; |
| 14 | 15 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 15 | 16 | import jakarta.annotation.Resource; |
| ... | ... | @@ -22,12 +23,14 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 22 | 23 | |
| 23 | 24 | @Tag(name = "管理后台 - IoT OTA 固件") |
| 24 | 25 | @RestController |
| 25 | -@RequestMapping("/iot/ota-firmware") | |
| 26 | +@RequestMapping("/iot/ota/firmware") | |
| 26 | 27 | @Validated |
| 27 | 28 | public class IotOtaFirmwareController { |
| 28 | 29 | |
| 29 | 30 | @Resource |
| 30 | 31 | private IotOtaFirmwareService otaFirmwareService; |
| 32 | + @Resource | |
| 33 | + private IotProductService productService; | |
| 31 | 34 | |
| 32 | 35 | @PostMapping("/create") |
| 33 | 36 | @Operation(summary = "创建 OTA 固件") |
| ... | ... | @@ -47,10 +50,17 @@ public class IotOtaFirmwareController { |
| 47 | 50 | @GetMapping("/get") |
| 48 | 51 | @Operation(summary = "获得 OTA 固件") |
| 49 | 52 | @PreAuthorize("@ss.hasPermission('iot:ota-firmware:query')") |
| 50 | - @TransMethodResult | |
| 51 | 53 | public CommonResult<IotOtaFirmwareRespVO> getOtaFirmware(@RequestParam("id") Long id) { |
| 52 | - IotOtaFirmwareDO otaFirmware = otaFirmwareService.getOtaFirmware(id); | |
| 53 | - return success(BeanUtils.toBean(otaFirmware, IotOtaFirmwareRespVO.class)); | |
| 54 | + IotOtaFirmwareDO firmware = otaFirmwareService.getOtaFirmware(id); | |
| 55 | + if (firmware == null) { | |
| 56 | + return success(null); | |
| 57 | + } | |
| 58 | + return success(BeanUtils.toBean(firmware, IotOtaFirmwareRespVO.class, o -> { | |
| 59 | + IotProductDO product = productService.getProduct(firmware.getProductId()); | |
| 60 | + if (product != null) { | |
| 61 | + o.setProductName(product.getName()); | |
| 62 | + } | |
| 63 | + })); | |
| 54 | 64 | } |
| 55 | 65 | |
| 56 | 66 | @GetMapping("/page") | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/IotOtaTaskController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.ota; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 5 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 6 | +import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.IotOtaTaskPageReqVO; | |
| 7 | +import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.IotOtaTaskRespVO; | |
| 8 | +import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.IotOtaTaskCreateReqVO; | |
| 9 | +import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskDO; | |
| 10 | +import cn.iocoder.yudao.module.iot.service.ota.IotOtaTaskService; | |
| 11 | +import io.swagger.v3.oas.annotations.Operation; | |
| 12 | +import io.swagger.v3.oas.annotations.Parameter; | |
| 13 | +import io.swagger.v3.oas.annotations.tags.Tag; | |
| 14 | +import jakarta.annotation.Resource; | |
| 15 | +import jakarta.validation.Valid; | |
| 16 | +import org.springframework.security.access.prepost.PreAuthorize; | |
| 17 | +import org.springframework.validation.annotation.Validated; | |
| 18 | +import org.springframework.web.bind.annotation.*; | |
| 19 | + | |
| 20 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 21 | + | |
| 22 | +@Tag(name = "管理后台 - IoT OTA 升级任务") | |
| 23 | +@RestController | |
| 24 | +@RequestMapping("/iot/ota/task") | |
| 25 | +@Validated | |
| 26 | +public class IotOtaTaskController { | |
| 27 | + | |
| 28 | + @Resource | |
| 29 | + private IotOtaTaskService otaTaskService; | |
| 30 | + | |
| 31 | + @PostMapping("/create") | |
| 32 | + @Operation(summary = "创建 OTA 升级任务") | |
| 33 | + @PreAuthorize(value = "@ss.hasPermission('iot:ota-task:create')") | |
| 34 | + public CommonResult<Long> createOtaTask(@Valid @RequestBody IotOtaTaskCreateReqVO createReqVO) { | |
| 35 | + return success(otaTaskService.createOtaTask(createReqVO)); | |
| 36 | + } | |
| 37 | + | |
| 38 | + @PostMapping("/cancel") | |
| 39 | + @Operation(summary = "取消 OTA 升级任务") | |
| 40 | + @Parameter(name = "id", description = "升级任务编号", required = true) | |
| 41 | + @PreAuthorize(value = "@ss.hasPermission('iot:ota-task:cancel')") | |
| 42 | + public CommonResult<Boolean> cancelOtaTask(@RequestParam("id") Long id) { | |
| 43 | + otaTaskService.cancelOtaTask(id); | |
| 44 | + return success(true); | |
| 45 | + } | |
| 46 | + | |
| 47 | + @GetMapping("/page") | |
| 48 | + @Operation(summary = "获得 OTA 升级任务分页") | |
| 49 | + @PreAuthorize(value = "@ss.hasPermission('iot:ota-task:query')") | |
| 50 | + public CommonResult<PageResult<IotOtaTaskRespVO>> getOtaTaskPage(@Valid IotOtaTaskPageReqVO pageReqVO) { | |
| 51 | + PageResult<IotOtaTaskDO> pageResult = otaTaskService.getOtaTaskPage(pageReqVO); | |
| 52 | + return success(BeanUtils.toBean(pageResult, IotOtaTaskRespVO.class)); | |
| 53 | + } | |
| 54 | + | |
| 55 | + @GetMapping("/get") | |
| 56 | + @Operation(summary = "获得 OTA 升级任务") | |
| 57 | + @Parameter(name = "id", description = "升级任务编号", required = true, example = "1024") | |
| 58 | + @PreAuthorize(value = "@ss.hasPermission('iot:ota-task:query')") | |
| 59 | + public CommonResult<IotOtaTaskRespVO> getOtaTask(@RequestParam("id") Long id) { | |
| 60 | + IotOtaTaskDO upgradeTask = otaTaskService.getOtaTask(id); | |
| 61 | + return success(BeanUtils.toBean(upgradeTask, IotOtaTaskRespVO.class)); | |
| 62 | + } | |
| 63 | + | |
| 64 | +} | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/IotOtaTaskRecordController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.ota; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 5 | +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | |
| 6 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 7 | +import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record.IotOtaTaskRecordPageReqVO; | |
| 8 | +import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record.IotOtaTaskRecordRespVO; | |
| 9 | +import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; | |
| 10 | +import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO; | |
| 11 | +import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskRecordDO; | |
| 12 | +import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; | |
| 13 | +import cn.iocoder.yudao.module.iot.service.ota.IotOtaFirmwareService; | |
| 14 | +import cn.iocoder.yudao.module.iot.service.ota.IotOtaTaskRecordService; | |
| 15 | +import io.swagger.v3.oas.annotations.Operation; | |
| 16 | +import io.swagger.v3.oas.annotations.Parameter; | |
| 17 | +import io.swagger.v3.oas.annotations.Parameters; | |
| 18 | +import io.swagger.v3.oas.annotations.tags.Tag; | |
| 19 | +import jakarta.annotation.Resource; | |
| 20 | +import jakarta.validation.Valid; | |
| 21 | +import org.dromara.hutool.core.collection.CollUtil; | |
| 22 | +import org.springframework.security.access.prepost.PreAuthorize; | |
| 23 | +import org.springframework.validation.annotation.Validated; | |
| 24 | +import org.springframework.web.bind.annotation.GetMapping; | |
| 25 | +import org.springframework.web.bind.annotation.PutMapping; | |
| 26 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 27 | +import org.springframework.web.bind.annotation.RequestParam; | |
| 28 | +import org.springframework.web.bind.annotation.RestController; | |
| 29 | + | |
| 30 | +import java.util.Map; | |
| 31 | + | |
| 32 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 33 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | |
| 34 | + | |
| 35 | +@Tag(name = "管理后台 - IoT OTA 升级任务记录") | |
| 36 | +@RestController | |
| 37 | +@RequestMapping("/iot/ota/task/record") | |
| 38 | +@Validated | |
| 39 | +public class IotOtaTaskRecordController { | |
| 40 | + | |
| 41 | + @Resource | |
| 42 | + private IotOtaTaskRecordService otaTaskRecordService; | |
| 43 | + @Resource | |
| 44 | + private IotDeviceService deviceService; | |
| 45 | + @Resource | |
| 46 | + private IotOtaFirmwareService otaFirmwareService; | |
| 47 | + | |
| 48 | + @GetMapping("/get-status-statistics") | |
| 49 | + @Operation(summary = "获得 OTA 升级记录状态统计") | |
| 50 | + @Parameters({ | |
| 51 | + @Parameter(name = "firmwareId", description = "固件编号", example = "1024"), | |
| 52 | + @Parameter(name = "taskId", description = "升级任务编号", example = "2048") | |
| 53 | + }) | |
| 54 | + @PreAuthorize("@ss.hasPermission('iot:ota-task-record:query')") | |
| 55 | + public CommonResult<Map<Integer, Long>> getOtaTaskRecordStatusStatistics( | |
| 56 | + @RequestParam(value = "firmwareId", required = false) Long firmwareId, | |
| 57 | + @RequestParam(value = "taskId", required = false) Long taskId) { | |
| 58 | + return success(otaTaskRecordService.getOtaTaskRecordStatusStatistics(firmwareId, taskId)); | |
| 59 | + } | |
| 60 | + | |
| 61 | + @GetMapping("/page") | |
| 62 | + @Operation(summary = "获得 OTA 升级记录分页") | |
| 63 | + @PreAuthorize("@ss.hasPermission('iot:ota-task-record:query')") | |
| 64 | + public CommonResult<PageResult<IotOtaTaskRecordRespVO>> getOtaTaskRecordPage( | |
| 65 | + @Valid IotOtaTaskRecordPageReqVO pageReqVO) { | |
| 66 | + PageResult<IotOtaTaskRecordDO> pageResult = otaTaskRecordService.getOtaTaskRecordPage(pageReqVO); | |
| 67 | + if (CollUtil.isEmpty(pageResult.getList())) { | |
| 68 | + return success(PageResult.empty()); | |
| 69 | + } | |
| 70 | + | |
| 71 | + // 批量查询固件信息 | |
| 72 | + Map<Long, IotOtaFirmwareDO> firmwareMap = otaFirmwareService.getOtaFirmwareMap( | |
| 73 | + convertSet(pageResult.getList(), IotOtaTaskRecordDO::getFromFirmwareId)); | |
| 74 | + Map<Long, IotDeviceDO> deviceMap = deviceService.getDeviceMap( | |
| 75 | + convertSet(pageResult.getList(), IotOtaTaskRecordDO::getDeviceId)); | |
| 76 | + // 转换为响应 VO | |
| 77 | + return success(BeanUtils.toBean(pageResult, IotOtaTaskRecordRespVO.class, (vo) -> { | |
| 78 | + MapUtils.findAndThen(firmwareMap, vo.getFromFirmwareId(), firmware -> | |
| 79 | + vo.setFromFirmwareVersion(firmware.getVersion())); | |
| 80 | + MapUtils.findAndThen(deviceMap, vo.getDeviceId(), device -> | |
| 81 | + vo.setDeviceName(device.getDeviceName())); | |
| 82 | + })); | |
| 83 | + } | |
| 84 | + | |
| 85 | + @GetMapping("/get") | |
| 86 | + @Operation(summary = "获得 OTA 升级记录") | |
| 87 | + @PreAuthorize("@ss.hasPermission('iot:ota-task-record:query')") | |
| 88 | + @Parameter(name = "id", description = "升级记录编号", required = true, example = "1024") | |
| 89 | + public CommonResult<IotOtaTaskRecordRespVO> getOtaTaskRecord(@RequestParam("id") Long id) { | |
| 90 | + IotOtaTaskRecordDO upgradeRecord = otaTaskRecordService.getOtaTaskRecord(id); | |
| 91 | + return success(BeanUtils.toBean(upgradeRecord, IotOtaTaskRecordRespVO.class)); | |
| 92 | + } | |
| 93 | + | |
| 94 | + @PutMapping("/cancel") | |
| 95 | + @Operation(summary = "取消 OTA 升级记录") | |
| 96 | + @PreAuthorize("@ss.hasPermission('iot:ota-task-record:cancel')") | |
| 97 | + @Parameter(name = "id", description = "升级记录编号", required = true, example = "1024") | |
| 98 | + public CommonResult<Boolean> cancelOtaTaskRecord(@RequestParam("id") Long id) { | |
| 99 | + otaTaskRecordService.cancelOtaTaskRecord(id); | |
| 100 | + return success(true); | |
| 101 | + } | |
| 102 | + | |
| 103 | +} | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/IotOtaUpgradeRecordController.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.ota; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 5 | -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 6 | -import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record.IotOtaUpgradeRecordPageReqVO; | |
| 7 | -import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record.IotOtaUpgradeRecordRespVO; | |
| 8 | -import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeRecordDO; | |
| 9 | -import cn.iocoder.yudao.module.iot.service.ota.IotOtaUpgradeRecordService; | |
| 10 | -import com.fhs.core.trans.anno.TransMethodResult; | |
| 11 | -import io.swagger.v3.oas.annotations.Operation; | |
| 12 | -import io.swagger.v3.oas.annotations.Parameter; | |
| 13 | -import io.swagger.v3.oas.annotations.tags.Tag; | |
| 14 | -import jakarta.annotation.Resource; | |
| 15 | -import jakarta.validation.Valid; | |
| 16 | -import org.springframework.security.access.prepost.PreAuthorize; | |
| 17 | -import org.springframework.validation.annotation.Validated; | |
| 18 | -import org.springframework.web.bind.annotation.*; | |
| 19 | - | |
| 20 | -import java.util.Map; | |
| 21 | - | |
| 22 | -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 23 | - | |
| 24 | -@Tag(name = "管理后台 - IoT OTA 升级记录") | |
| 25 | -@RestController | |
| 26 | -@RequestMapping("/iot/ota-upgrade-record") | |
| 27 | -@Validated | |
| 28 | -public class IotOtaUpgradeRecordController { | |
| 29 | - | |
| 30 | - @Resource | |
| 31 | - private IotOtaUpgradeRecordService upgradeRecordService; | |
| 32 | - | |
| 33 | - @GetMapping("/get-statistics") | |
| 34 | - @Operation(summary = "固件升级设备统计") | |
| 35 | - @PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:query')") | |
| 36 | - @Parameter(name = "firmwareId", description = "固件编号", required = true, example = "1024") | |
| 37 | - public CommonResult<Map<Integer, Long>> getOtaUpgradeRecordStatistics(@RequestParam(value = "firmwareId") Long firmwareId) { | |
| 38 | - return success(upgradeRecordService.getOtaUpgradeRecordStatistics(firmwareId)); | |
| 39 | - } | |
| 40 | - | |
| 41 | - @GetMapping("/get-count") | |
| 42 | - @Operation(summary = "获得升级记录分页 tab 数量") | |
| 43 | - @PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:query')") | |
| 44 | - public CommonResult<Map<Integer, Long>> getOtaUpgradeRecordCount( | |
| 45 | - @Valid IotOtaUpgradeRecordPageReqVO pageReqVO) { | |
| 46 | - return success(upgradeRecordService.getOtaUpgradeRecordCount(pageReqVO)); | |
| 47 | - } | |
| 48 | - | |
| 49 | - @GetMapping("/page") | |
| 50 | - @Operation(summary = "获得升级记录分页") | |
| 51 | - @PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:query')") | |
| 52 | - @TransMethodResult | |
| 53 | - public CommonResult<PageResult<IotOtaUpgradeRecordRespVO>> getUpgradeRecordPage( | |
| 54 | - @Valid IotOtaUpgradeRecordPageReqVO pageReqVO) { | |
| 55 | - PageResult<IotOtaUpgradeRecordDO> pageResult = upgradeRecordService.getUpgradeRecordPage(pageReqVO); | |
| 56 | - return success(BeanUtils.toBean(pageResult, IotOtaUpgradeRecordRespVO.class)); | |
| 57 | - } | |
| 58 | - | |
| 59 | - @GetMapping("/get") | |
| 60 | - @Operation(summary = "获得升级记录") | |
| 61 | - @PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:query')") | |
| 62 | - @Parameter(name = "id", description = "升级记录编号", required = true, example = "1024") | |
| 63 | - @TransMethodResult | |
| 64 | - public CommonResult<IotOtaUpgradeRecordRespVO> getUpgradeRecord(@RequestParam("id") Long id) { | |
| 65 | - IotOtaUpgradeRecordDO upgradeRecord = upgradeRecordService.getUpgradeRecord(id); | |
| 66 | - return success(BeanUtils.toBean(upgradeRecord, IotOtaUpgradeRecordRespVO.class)); | |
| 67 | - } | |
| 68 | - | |
| 69 | - @PutMapping("/retry") | |
| 70 | - @Operation(summary = "重试升级记录") | |
| 71 | - @PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:retry')") | |
| 72 | - @Parameter(name = "id", description = "升级记录编号", required = true, example = "1024") | |
| 73 | - public CommonResult<Boolean> retryUpgradeRecord(@RequestParam("id") Long id) { | |
| 74 | - upgradeRecordService.retryUpgradeRecord(id); | |
| 75 | - return success(true); | |
| 76 | - } | |
| 77 | - | |
| 78 | -} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/IotOtaUpgradeTaskController.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.ota; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 5 | -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 6 | -import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task.IotOtaUpgradeTaskPageReqVO; | |
| 7 | -import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task.IotOtaUpgradeTaskRespVO; | |
| 8 | -import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task.IotOtaUpgradeTaskSaveReqVO; | |
| 9 | -import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeTaskDO; | |
| 10 | -import cn.iocoder.yudao.module.iot.service.ota.IotOtaUpgradeTaskService; | |
| 11 | -import io.swagger.v3.oas.annotations.Operation; | |
| 12 | -import io.swagger.v3.oas.annotations.Parameter; | |
| 13 | -import io.swagger.v3.oas.annotations.tags.Tag; | |
| 14 | -import jakarta.annotation.Resource; | |
| 15 | -import jakarta.validation.Valid; | |
| 16 | -import org.springframework.security.access.prepost.PreAuthorize; | |
| 17 | -import org.springframework.validation.annotation.Validated; | |
| 18 | -import org.springframework.web.bind.annotation.*; | |
| 19 | - | |
| 20 | -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 21 | - | |
| 22 | -@Tag(name = "管理后台 - IoT OTA 升级任务") | |
| 23 | -@RestController | |
| 24 | -@RequestMapping("/iot/ota-upgrade-task") | |
| 25 | -@Validated | |
| 26 | -public class IotOtaUpgradeTaskController { | |
| 27 | - | |
| 28 | - @Resource | |
| 29 | - private IotOtaUpgradeTaskService upgradeTaskService; | |
| 30 | - | |
| 31 | - @PostMapping("/create") | |
| 32 | - @Operation(summary = "创建升级任务") | |
| 33 | - @PreAuthorize(value = "@ss.hasPermission('iot:ota-upgrade-task:create')") | |
| 34 | - public CommonResult<Long> createUpgradeTask(@Valid @RequestBody IotOtaUpgradeTaskSaveReqVO createReqVO) { | |
| 35 | - return success(upgradeTaskService.createUpgradeTask(createReqVO)); | |
| 36 | - } | |
| 37 | - | |
| 38 | - @PostMapping("/cancel") | |
| 39 | - @Operation(summary = "取消升级任务") | |
| 40 | - @Parameter(name = "id", description = "升级任务编号", required = true) | |
| 41 | - @PreAuthorize(value = "@ss.hasPermission('iot:ota-upgrade-task:cancel')") | |
| 42 | - public CommonResult<Boolean> cancelUpgradeTask(@RequestParam("id") Long id) { | |
| 43 | - upgradeTaskService.cancelUpgradeTask(id); | |
| 44 | - return success(true); | |
| 45 | - } | |
| 46 | - | |
| 47 | - @GetMapping("/page") | |
| 48 | - @Operation(summary = "获得升级任务分页") | |
| 49 | - @PreAuthorize(value = "@ss.hasPermission('iot:ota-upgrade-task:query')") | |
| 50 | - public CommonResult<PageResult<IotOtaUpgradeTaskRespVO>> getUpgradeTaskPage(@Valid IotOtaUpgradeTaskPageReqVO pageReqVO) { | |
| 51 | - PageResult<IotOtaUpgradeTaskDO> pageResult = upgradeTaskService.getUpgradeTaskPage(pageReqVO); | |
| 52 | - return success(BeanUtils.toBean(pageResult, IotOtaUpgradeTaskRespVO.class)); | |
| 53 | - } | |
| 54 | - | |
| 55 | - @GetMapping("/get") | |
| 56 | - @Operation(summary = "获得升级任务") | |
| 57 | - @Parameter(name = "id", description = "升级任务编号", required = true, example = "1024") | |
| 58 | - @PreAuthorize(value = "@ss.hasPermission('iot:ota-upgrade-task:query')") | |
| 59 | - public CommonResult<IotOtaUpgradeTaskRespVO> getUpgradeTask(@RequestParam("id") Long id) { | |
| 60 | - IotOtaUpgradeTaskDO upgradeTask = upgradeTaskService.getUpgradeTask(id); | |
| 61 | - return success(BeanUtils.toBean(upgradeTask, IotOtaUpgradeTaskRespVO.class)); | |
| 62 | - } | |
| 63 | - | |
| 64 | -} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/firmware/IotOtaFirmwareCreateReqVO.java
| ... | ... | @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | 4 | import jakarta.validation.constraints.NotEmpty; |
| 5 | 5 | import jakarta.validation.constraints.NotNull; |
| 6 | 6 | import lombok.Data; |
| 7 | +import org.hibernate.validator.constraints.URL; | |
| 7 | 8 | |
| 8 | 9 | @Schema(description = "管理后台 - IoT OTA 固件创建 Request VO") |
| 9 | 10 | @Data |
| ... | ... | @@ -22,17 +23,11 @@ public class IotOtaFirmwareCreateReqVO { |
| 22 | 23 | |
| 23 | 24 | @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| 24 | 25 | @NotNull(message = "产品编号不能为空") |
| 25 | - private String productId; | |
| 26 | + private Long productId; | |
| 26 | 27 | |
| 27 | - @Schema(description = "签名方式", example = "MD5") | |
| 28 | - // TODO @li:是不是必传哈 | |
| 29 | - private String signMethod; | |
| 30 | - | |
| 31 | - @Schema(description = "固件文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/yudao-firmware.zip") | |
| 28 | + @Schema(description = "固件文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.zip") | |
| 32 | 29 | @NotEmpty(message = "固件文件 URL 不能为空") |
| 30 | + @URL(message = "固件文件 URL 格式错误") | |
| 33 | 31 | private String fileUrl; |
| 34 | 32 | |
| 35 | - @Schema(description = "自定义信息,建议使用 JSON 格式", example = "{\"key1\":\"value1\",\"key2\":\"value2\"}") | |
| 36 | - private String information; | |
| 37 | - | |
| 38 | 33 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/firmware/IotOtaFirmwarePageReqVO.java
| ... | ... | @@ -3,21 +3,24 @@ package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware; |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 4 | 4 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | 5 | import lombok.Data; |
| 6 | +import org.springframework.format.annotation.DateTimeFormat; | |
| 7 | + | |
| 8 | +import java.time.LocalDateTime; | |
| 9 | + | |
| 10 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | |
| 6 | 11 | |
| 7 | -@Data | |
| 8 | 12 | @Schema(description = "管理后台 - IoT OTA 固件分页 Request VO") |
| 13 | +@Data | |
| 9 | 14 | public class IotOtaFirmwarePageReqVO extends PageParam { |
| 10 | 15 | |
| 11 | - /** | |
| 12 | - * 固件名称 | |
| 13 | - */ | |
| 14 | 16 | @Schema(description = "固件名称", example = "智能开关固件") |
| 15 | 17 | private String name; |
| 16 | 18 | |
| 17 | - /** | |
| 18 | - * 产品标识 | |
| 19 | - */ | |
| 20 | 19 | @Schema(description = "产品标识", example = "1024") |
| 21 | 20 | private String productId; |
| 22 | 21 | |
| 22 | + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") | |
| 23 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 24 | + private LocalDateTime[] createTime; | |
| 25 | + | |
| 23 | 26 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/firmware/IotOtaFirmwareRespVO.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware; |
| 2 | 2 | |
| 3 | -import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; | |
| 4 | -import com.fhs.core.trans.anno.Trans; | |
| 5 | -import com.fhs.core.trans.constant.TransType; | |
| 6 | 3 | import com.fhs.core.trans.vo.VO; |
| 7 | 4 | import io.swagger.v3.oas.annotations.media.Schema; |
| 8 | 5 | import lombok.Data; |
| 9 | 6 | |
| 10 | -@Data | |
| 7 | +import java.time.LocalDateTime; | |
| 8 | + | |
| 11 | 9 | @Schema(description = "管理后台 - IoT OTA 固件 Response VO") |
| 10 | +@Data | |
| 12 | 11 | public class IotOtaFirmwareRespVO implements VO { |
| 13 | 12 | |
| 14 | - /** | |
| 15 | - * 固件编号 | |
| 16 | - */ | |
| 17 | 13 | @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| 18 | 14 | private Long id; |
| 19 | - /** | |
| 20 | - * 固件名称 | |
| 21 | - */ | |
| 22 | - @Schema(description = "固件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "OTA固件") | |
| 15 | + | |
| 16 | + @Schema(description = "固件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "OTA 固件") | |
| 23 | 17 | private String name; |
| 24 | - /** | |
| 25 | - * 固件描述 | |
| 26 | - */ | |
| 18 | + | |
| 27 | 19 | @Schema(description = "固件描述") |
| 28 | 20 | private String description; |
| 29 | - /** | |
| 30 | - * 版本号 | |
| 31 | - */ | |
| 21 | + | |
| 32 | 22 | @Schema(description = "版本号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1.0.0") |
| 33 | 23 | private String version; |
| 34 | 24 | |
| 35 | - /** | |
| 36 | - * 产品编号 | |
| 37 | - * <p> | |
| 38 | - * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()} | |
| 39 | - */ | |
| 40 | 25 | @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| 41 | - @Trans(type = TransType.SIMPLE, target = IotProductDO.class, fields = {"name"}, refs = {"productName"}) | |
| 42 | - private String productId; | |
| 43 | - /** | |
| 44 | - * 产品标识 | |
| 45 | - * <p> | |
| 46 | - * 冗余 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getProductKey()} | |
| 47 | - */ | |
| 48 | - @Schema(description = "产品标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "iot-product-key") | |
| 49 | - private String productKey; | |
| 50 | - /** | |
| 51 | - * 产品名称 | |
| 52 | - */ | |
| 53 | - @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "OTA产品") | |
| 26 | + private Long productId; | |
| 27 | + | |
| 28 | + @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "智能设备") | |
| 54 | 29 | private String productName; |
| 55 | - /** | |
| 56 | - * 签名方式 | |
| 57 | - * <p> | |
| 58 | - * 例如说:MD5、SHA256 | |
| 59 | - */ | |
| 60 | - @Schema(description = "签名方式", example = "MD5") | |
| 61 | - private String signMethod; | |
| 62 | - /** | |
| 63 | - * 固件文件签名 | |
| 64 | - */ | |
| 65 | - @Schema(description = "固件文件签名", example = "1024") | |
| 66 | - private String fileSign; | |
| 67 | - /** | |
| 68 | - * 固件文件大小 | |
| 69 | - */ | |
| 30 | + | |
| 31 | + @Schema(description = "固件文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/firmware.bin") | |
| 32 | + private String fileUrl; | |
| 33 | + | |
| 70 | 34 | @Schema(description = "固件文件大小", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| 71 | 35 | private Long fileSize; |
| 72 | - /** | |
| 73 | - * 固件文件 URL | |
| 74 | - */ | |
| 75 | - @Schema(description = "固件文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn") | |
| 76 | - private String fileUrl; | |
| 77 | - /** | |
| 78 | - * 自定义信息,建议使用 JSON 格式 | |
| 79 | - */ | |
| 80 | - @Schema(description = "自定义信息,建议使用 JSON 格式") | |
| 81 | - private String information; | |
| 36 | + | |
| 37 | + @Schema(description = "固件文件签名算法", example = "MD5") | |
| 38 | + private String fileDigestAlgorithm; | |
| 39 | + | |
| 40 | + @Schema(description = "固件文件签名结果", example = "d41d8cd98f00b204e9800998ecf8427e") | |
| 41 | + private String fileDigestValue; | |
| 42 | + | |
| 43 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 44 | + private LocalDateTime createTime; | |
| 45 | + | |
| 46 | + @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 47 | + private LocalDateTime updateTime; | |
| 82 | 48 | |
| 83 | 49 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/firmware/IotOtaFirmwareUpdateReqVO.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware; |
| 2 | 2 | |
| 3 | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | -import jakarta.validation.constraints.NotEmpty; | |
| 5 | 4 | import jakarta.validation.constraints.NotNull; |
| 6 | 5 | import lombok.Data; |
| 7 | 6 | |
| ... | ... | @@ -13,9 +12,7 @@ public class IotOtaFirmwareUpdateReqVO { |
| 13 | 12 | @NotNull(message = "固件编号不能为空") |
| 14 | 13 | private Long id; |
| 15 | 14 | |
| 16 | - // TODO @li:name 是不是可以飞必传哈 | |
| 17 | - @Schema(description = "固件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "智能开关固件") | |
| 18 | - @NotEmpty(message = "固件名称不能为空") | |
| 15 | + @Schema(description = "固件名称", example = "智能开关固件") | |
| 19 | 16 | private String name; |
| 20 | 17 | |
| 21 | 18 | @Schema(description = "固件描述", example = "某品牌型号固件,测试用") | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/upgrade/task/IotOtaUpgradeTaskSaveReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/task/IotOtaTaskCreateReqVO.java
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task; | |
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task; | |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| 4 | -import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; | |
| 5 | -import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO; | |
| 6 | -import cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskScopeEnum; | |
| 4 | +import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskDeviceScopeEnum; | |
| 7 | 5 | import io.swagger.v3.oas.annotations.media.Schema; |
| 8 | 6 | import jakarta.validation.constraints.NotEmpty; |
| 9 | 7 | import jakarta.validation.constraints.NotNull; |
| ... | ... | @@ -11,51 +9,29 @@ import lombok.Data; |
| 11 | 9 | |
| 12 | 10 | import java.util.List; |
| 13 | 11 | |
| 12 | +@Schema(description = "管理后台 - IoT OTA 升级任务创建 Request VO") | |
| 14 | 13 | @Data |
| 15 | -@Schema(description = "管理后台 - IoT OTA 升级任务创建/修改 Request VO") | |
| 16 | -public class IotOtaUpgradeTaskSaveReqVO { | |
| 14 | +public class IotOtaTaskCreateReqVO { | |
| 17 | 15 | |
| 18 | - // TODO @li:已经有注解,不用重复注释 | |
| 19 | - // TODO @li: @Schema 写在参数校验前面。先有定义;其他的,也检查下; | |
| 20 | - | |
| 21 | - /** | |
| 22 | - * 任务名称 | |
| 23 | - */ | |
| 24 | 16 | @NotEmpty(message = "任务名称不能为空") |
| 25 | 17 | @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "升级任务") |
| 26 | 18 | private String name; |
| 27 | 19 | |
| 28 | - /** | |
| 29 | - * 任务描述 | |
| 30 | - */ | |
| 31 | 20 | @Schema(description = "任务描述", example = "升级任务") |
| 32 | 21 | private String description; |
| 33 | 22 | |
| 34 | - /** | |
| 35 | - * 固件编号 | |
| 36 | - * <p> | |
| 37 | - * 关联 {@link IotOtaFirmwareDO#getId()} | |
| 38 | - */ | |
| 39 | - @NotNull(message = "固件编号不能为空") | |
| 40 | 23 | @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| 24 | + @NotNull(message = "固件编号不能为空") | |
| 41 | 25 | private Long firmwareId; |
| 42 | 26 | |
| 43 | - /** | |
| 44 | - * 升级范围 | |
| 45 | - * <p> | |
| 46 | - * 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskScopeEnum} | |
| 47 | - */ | |
| 48 | - @NotNull(message = "升级范围不能为空") | |
| 49 | - @InEnum(value = IotOtaUpgradeTaskScopeEnum.class) | |
| 50 | 27 | @Schema(description = "升级范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 51 | - private Integer scope; | |
| 52 | - | |
| 53 | - /** | |
| 54 | - * 选中的设备编号数组 | |
| 55 | - * <p> | |
| 56 | - * 关联 {@link IotDeviceDO#getId()} | |
| 57 | - */ | |
| 58 | - @Schema(description = "选中的设备编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2,3,4]") | |
| 28 | + @NotNull(message = "升级范围不能为空") | |
| 29 | + @InEnum(value = IotOtaTaskDeviceScopeEnum.class) | |
| 30 | + private Integer deviceScope; | |
| 31 | + | |
| 32 | + @Schema(description = "选中的设备编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3") | |
| 59 | 33 | private List<Long> deviceIds; |
| 60 | 34 | |
| 35 | + // TODO @li:如果 deviceScope 等于 2 时,deviceIds 校验非空; | |
| 36 | + | |
| 61 | 37 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/upgrade/task/IotOtaUpgradeTaskPageReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/task/IotOtaTaskPageReqVO.java
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task; | |
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task; | |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 4 | 4 | import io.swagger.v3.oas.annotations.media.Schema; |
| 5 | -import jakarta.validation.constraints.NotNull; | |
| 6 | 5 | import lombok.Data; |
| 7 | 6 | |
| 8 | -@Data | |
| 9 | 7 | @Schema(description = "管理后台 - IoT OTA 升级任务分页 Request VO") |
| 10 | -public class IotOtaUpgradeTaskPageReqVO extends PageParam { | |
| 8 | +@Data | |
| 9 | +public class IotOtaTaskPageReqVO extends PageParam { | |
| 11 | 10 | |
| 12 | - /** | |
| 13 | - * 任务名称字段,用于描述任务的名称 | |
| 14 | - */ | |
| 15 | 11 | @Schema(description = "任务名称", example = "升级任务") |
| 16 | 12 | private String name; |
| 17 | 13 | |
| 18 | - /** | |
| 19 | - * 固件编号字段,用于唯一标识固件,不能为空 | |
| 20 | - */ | |
| 21 | - @NotNull(message = "固件编号不能为空") | |
| 22 | - @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 14 | + @Schema(description = "固件编号", example = "1024") | |
| 23 | 15 | private Long firmwareId; |
| 24 | 16 | |
| 25 | 17 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/task/IotOtaTaskRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task; | |
| 2 | + | |
| 3 | +import com.fhs.core.trans.vo.VO; | |
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 5 | +import lombok.Data; | |
| 6 | + | |
| 7 | +import java.time.LocalDateTime; | |
| 8 | + | |
| 9 | +@Schema(description = "管理后台 - IoT OTA 升级任务 Response VO") | |
| 10 | +@Data | |
| 11 | +public class IotOtaTaskRespVO implements VO { | |
| 12 | + | |
| 13 | + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 14 | + private Long id; | |
| 15 | + | |
| 16 | + @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "升级任务") | |
| 17 | + private String name; | |
| 18 | + | |
| 19 | + @Schema(description = "任务描述", example = "升级任务") | |
| 20 | + private String description; | |
| 21 | + | |
| 22 | + @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 23 | + private Long firmwareId; | |
| 24 | + | |
| 25 | + @Schema(description = "任务状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") | |
| 26 | + private Integer status; | |
| 27 | + | |
| 28 | + @Schema(description = "升级范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 29 | + private Integer deviceScope; | |
| 30 | + | |
| 31 | + @Schema(description = "设备总共数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 32 | + private Integer deviceTotalCount; | |
| 33 | + | |
| 34 | + @Schema(description = "设备成功数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "66") | |
| 35 | + private Integer deviceSuccessCount; | |
| 36 | + | |
| 37 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-08 07:30:00") | |
| 38 | + private LocalDateTime createTime; | |
| 39 | + | |
| 40 | +} | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/task/record/IotOtaTaskRecordPageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 4 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 5 | +import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskRecordStatusEnum; | |
| 6 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 7 | +import lombok.Data; | |
| 8 | + | |
| 9 | +@Schema(description = "管理后台 - IoT OTA 升级记录分页 Request VO") | |
| 10 | +@Data | |
| 11 | +public class IotOtaTaskRecordPageReqVO extends PageParam { | |
| 12 | + | |
| 13 | + @Schema(description = "升级任务编号", example = "1024") | |
| 14 | + private Long taskId; | |
| 15 | + | |
| 16 | + @Schema(description = "升级记录状态", example = "5") | |
| 17 | + @InEnum(IotOtaTaskRecordStatusEnum.class) | |
| 18 | + private Integer status; | |
| 19 | + | |
| 20 | +} | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/task/record/IotOtaTaskRecordRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import lombok.Data; | |
| 5 | + | |
| 6 | +import java.time.LocalDateTime; | |
| 7 | + | |
| 8 | +@Schema(description = "管理后台 - IoT OTA 升级任务记录 Response VO") | |
| 9 | +@Data | |
| 10 | +public class IotOtaTaskRecordRespVO { | |
| 11 | + | |
| 12 | + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 13 | + private Long id; | |
| 14 | + | |
| 15 | + @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 16 | + private Long firmwareId; | |
| 17 | + | |
| 18 | + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") | |
| 19 | + private Long taskId; | |
| 20 | + | |
| 21 | + @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 22 | + private Long deviceId; | |
| 23 | + | |
| 24 | + @Schema(description = "设备名称", example = "智能开关") | |
| 25 | + private String deviceName; | |
| 26 | + | |
| 27 | + @Schema(description = "来源的固件编号", example = "1023") | |
| 28 | + private Long fromFirmwareId; | |
| 29 | + | |
| 30 | + @Schema(description = "来源固件版本", example = "1.0.0") | |
| 31 | + private String fromFirmwareVersion; | |
| 32 | + | |
| 33 | + @Schema(description = "升级状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 34 | + private Integer status; | |
| 35 | + | |
| 36 | + @Schema(description = "升级进度,百分比", requiredMode = Schema.RequiredMode.REQUIRED, example = "50") | |
| 37 | + private Integer progress; | |
| 38 | + | |
| 39 | + @Schema(description = "升级进度描述", example = "正在下载固件...") | |
| 40 | + private String description; | |
| 41 | + | |
| 42 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 43 | + private LocalDateTime createTime; | |
| 44 | + | |
| 45 | + @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 46 | + private LocalDateTime updateTime; | |
| 47 | + | |
| 48 | +} | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/upgrade/record/IotOtaUpgradeRecordPageReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 4 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 5 | -import jakarta.validation.constraints.NotNull; | |
| 6 | -import lombok.Data; | |
| 7 | - | |
| 8 | -@Data | |
| 9 | -@Schema(description = "管理后台 - IoT OTA 升级记录分页 Request VO") | |
| 10 | -public class IotOtaUpgradeRecordPageReqVO extends PageParam { | |
| 11 | - | |
| 12 | - // TODO @li:已经有注解,不用重复注释 | |
| 13 | - /** | |
| 14 | - * 升级任务编号字段。 | |
| 15 | - * <p> | |
| 16 | - * 该字段用于标识升级任务的唯一编号,不能为空。 | |
| 17 | - */ | |
| 18 | - @Schema(description = "升级任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 19 | - @NotNull(message = "升级任务编号不能为空") | |
| 20 | - private Long taskId; | |
| 21 | - | |
| 22 | - /** | |
| 23 | - * 设备标识字段。 | |
| 24 | - * <p> | |
| 25 | - * 该字段用于标识设备的名称,通常用于区分不同的设备。 | |
| 26 | - */ | |
| 27 | - @Schema(description = "设备标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "摄像头A1-1") | |
| 28 | - private String deviceName; | |
| 29 | - | |
| 30 | -} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/upgrade/record/IotOtaUpgradeRecordRespVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; | |
| 4 | -import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO; | |
| 5 | -import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeTaskDO; | |
| 6 | -import com.fhs.core.trans.anno.Trans; | |
| 7 | -import com.fhs.core.trans.constant.TransType; | |
| 8 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 9 | -import lombok.Data; | |
| 10 | - | |
| 11 | -import java.time.LocalDateTime; | |
| 12 | - | |
| 13 | -@Data | |
| 14 | -@Schema(description = "管理后台 - IoT OTA 升级记录 Response VO") | |
| 15 | -public class IotOtaUpgradeRecordRespVO { | |
| 16 | - | |
| 17 | - /** | |
| 18 | - * 升级记录编号 | |
| 19 | - */ | |
| 20 | - @Schema(description = "升级记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 21 | - private Long id; | |
| 22 | - /** | |
| 23 | - * 固件编号 | |
| 24 | - * <p> | |
| 25 | - * 关联 {@link IotOtaFirmwareDO#getId()} | |
| 26 | - */ | |
| 27 | - @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 28 | - @Trans(type = TransType.SIMPLE, target = IotOtaFirmwareDO.class, fields = {"version"}, refs = {"firmwareVersion"}) | |
| 29 | - private Long firmwareId; | |
| 30 | - /** | |
| 31 | - * 固件版本 | |
| 32 | - */ | |
| 33 | - @Schema(description = "固件版本", requiredMode = Schema.RequiredMode.REQUIRED, example = "v1.0.0") | |
| 34 | - private String firmwareVersion; | |
| 35 | - /** | |
| 36 | - * 任务编号 | |
| 37 | - * <p> | |
| 38 | - * 关联 {@link IotOtaUpgradeTaskDO#getId()} | |
| 39 | - */ | |
| 40 | - @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 41 | - private Long taskId; | |
| 42 | - /** | |
| 43 | - * 产品标识 | |
| 44 | - * <p> | |
| 45 | - * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()} | |
| 46 | - */ | |
| 47 | - @Schema(description = "产品标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "iot") | |
| 48 | - private String productKey; | |
| 49 | - /** | |
| 50 | - * 设备名称 | |
| 51 | - * <p> | |
| 52 | - * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO#getId()} | |
| 53 | - */ | |
| 54 | - @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "iot") | |
| 55 | - private String deviceName; | |
| 56 | - /** | |
| 57 | - * 设备编号 | |
| 58 | - * <p> | |
| 59 | - * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO#getId()} | |
| 60 | - */ | |
| 61 | - @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 62 | - private String deviceId; | |
| 63 | - /** | |
| 64 | - * 来源的固件编号 | |
| 65 | - * <p> | |
| 66 | - * 关联 {@link IotDeviceDO#getFirmwareId()} | |
| 67 | - */ | |
| 68 | - @Schema(description = "来源的固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 69 | - @Trans(type = TransType.SIMPLE, target = IotOtaFirmwareDO.class, fields = {"version"}, refs = {"fromFirmwareVersion"}) | |
| 70 | - private Long fromFirmwareId; | |
| 71 | - /** | |
| 72 | - * 来源的固件版本 | |
| 73 | - */ | |
| 74 | - @Schema(description = "来源的固件版本", requiredMode = Schema.RequiredMode.REQUIRED, example = "v1.0.0") | |
| 75 | - private String fromFirmwareVersion; | |
| 76 | - /** | |
| 77 | - * 升级状态 | |
| 78 | - * <p> | |
| 79 | - * 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeRecordStatusEnum} | |
| 80 | - */ | |
| 81 | - @Schema(description = "升级状态", requiredMode = Schema.RequiredMode.REQUIRED, allowableValues = {"0", "10", "20", "30", "40", "50"}) | |
| 82 | - private Integer status; | |
| 83 | - /** | |
| 84 | - * 升级进度,百分比 | |
| 85 | - */ | |
| 86 | - @Schema(description = "升级进度,百分比", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") | |
| 87 | - private Integer progress; | |
| 88 | - /** | |
| 89 | - * 升级进度描述 | |
| 90 | - * <p> | |
| 91 | - * 注意,只记录设备最后一次的升级进度描述 | |
| 92 | - * 如果想看历史记录,可以查看 {@link cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceLogDO} 设备日志 | |
| 93 | - */ | |
| 94 | - @Schema(description = "升级进度描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") | |
| 95 | - private String description; | |
| 96 | - /** | |
| 97 | - * 升级开始时间 | |
| 98 | - */ | |
| 99 | - @Schema(description = "升级开始时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-08 07:30:00") | |
| 100 | - private LocalDateTime startTime; | |
| 101 | - /** | |
| 102 | - * 升级结束时间 | |
| 103 | - */ | |
| 104 | - @Schema(description = "升级结束时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-08 07:30:00") | |
| 105 | - private LocalDateTime endTime; | |
| 106 | - | |
| 107 | -} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/upgrade/task/IotOtaUpgradeTaskRespVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; | |
| 4 | -import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO; | |
| 5 | -import com.fhs.core.trans.vo.VO; | |
| 6 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 7 | -import lombok.Data; | |
| 8 | - | |
| 9 | -import java.time.LocalDateTime; | |
| 10 | -import java.util.List; | |
| 11 | - | |
| 12 | -@Data | |
| 13 | -@Schema(description = "管理后台 - IoT OTA 升级任务 Response VO") | |
| 14 | -public class IotOtaUpgradeTaskRespVO implements VO { | |
| 15 | - | |
| 16 | - /** | |
| 17 | - * 任务编号 | |
| 18 | - */ | |
| 19 | - @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 20 | - private Long id; | |
| 21 | - /** | |
| 22 | - * 任务名称 | |
| 23 | - */ | |
| 24 | - @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "升级任务") | |
| 25 | - private String name; | |
| 26 | - /** | |
| 27 | - * 任务描述 | |
| 28 | - */ | |
| 29 | - @Schema(description = "任务描述", example = "升级任务") | |
| 30 | - private String description; | |
| 31 | - /** | |
| 32 | - * 固件编号 | |
| 33 | - * <p> | |
| 34 | - * 关联 {@link IotOtaFirmwareDO#getId()} | |
| 35 | - */ | |
| 36 | - @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 37 | - private Long firmwareId; | |
| 38 | - /** | |
| 39 | - * 任务状态 | |
| 40 | - * <p> | |
| 41 | - * 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskStatusEnum} | |
| 42 | - */ | |
| 43 | - @Schema(description = "任务状态", requiredMode = Schema.RequiredMode.REQUIRED, allowableValues = {"10", "20", "21", "30"}) | |
| 44 | - private Integer status; | |
| 45 | - /** | |
| 46 | - * 任务状态名称 | |
| 47 | - */ | |
| 48 | - @Schema(description = "任务状态名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "进行中") | |
| 49 | - private String statusName; | |
| 50 | - /** | |
| 51 | - * 升级范围 | |
| 52 | - * <p> | |
| 53 | - * 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskScopeEnum} | |
| 54 | - */ | |
| 55 | - @Schema(description = "升级范围", requiredMode = Schema.RequiredMode.REQUIRED, allowableValues = {"1", "2"}) | |
| 56 | - private Integer scope; | |
| 57 | - /** | |
| 58 | - * 设备数量 | |
| 59 | - */ | |
| 60 | - @Schema(description = "设备数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 61 | - private Long deviceCount; | |
| 62 | - /** | |
| 63 | - * 选中的设备编号数组 | |
| 64 | - * <p> | |
| 65 | - * 关联 {@link IotDeviceDO#getId()} | |
| 66 | - */ | |
| 67 | - @Schema(description = "选中的设备编号数组", example = "1024") | |
| 68 | - private List<Long> deviceIds; | |
| 69 | - /** | |
| 70 | - * 选中的设备名字数组 | |
| 71 | - * <p> | |
| 72 | - * 关联 {@link IotDeviceDO#getDeviceName()} | |
| 73 | - */ | |
| 74 | - @Schema(description = "选中的设备名字数组", example = "1024") | |
| 75 | - private List<String> deviceNames; | |
| 76 | - /** | |
| 77 | - * 创建时间 | |
| 78 | - */ | |
| 79 | - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-08 07:30:00") | |
| 80 | - private LocalDateTime createTime; | |
| 81 | - | |
| 82 | -} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/PluginConfigController.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.plugin; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 5 | -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 6 | -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.config.PluginConfigImportReqVO; | |
| 7 | -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.config.PluginConfigPageReqVO; | |
| 8 | -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.config.PluginConfigRespVO; | |
| 9 | -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.config.PluginConfigSaveReqVO; | |
| 10 | -import cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.config.PluginConfigStatusReqVO; | |
| 11 | -import cn.iocoder.yudao.module.iot.dal.dataobject.plugin.IotPluginConfigDO; | |
| 12 | -import cn.iocoder.yudao.module.iot.service.plugin.IotPluginConfigService; | |
| 13 | -import io.swagger.v3.oas.annotations.Operation; | |
| 14 | -import io.swagger.v3.oas.annotations.Parameter; | |
| 15 | -import io.swagger.v3.oas.annotations.tags.Tag; | |
| 16 | -import jakarta.annotation.Resource; | |
| 17 | -import jakarta.validation.Valid; | |
| 18 | -import org.springframework.security.access.prepost.PreAuthorize; | |
| 19 | -import org.springframework.validation.annotation.Validated; | |
| 20 | -import org.springframework.web.bind.annotation.*; | |
| 21 | - | |
| 22 | -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 23 | - | |
| 24 | -@Tag(name = "管理后台 - IoT 插件配置") | |
| 25 | -@RestController | |
| 26 | -@RequestMapping("/iot/plugin-config") | |
| 27 | -@Validated | |
| 28 | -public class PluginConfigController { | |
| 29 | - | |
| 30 | - @Resource | |
| 31 | - private IotPluginConfigService pluginConfigService; | |
| 32 | - | |
| 33 | - @PostMapping("/create") | |
| 34 | - @Operation(summary = "创建插件配置") | |
| 35 | - @PreAuthorize("@ss.hasPermission('iot:plugin-config:create')") | |
| 36 | - public CommonResult<Long> createPluginConfig(@Valid @RequestBody PluginConfigSaveReqVO createReqVO) { | |
| 37 | - return success(pluginConfigService.createPluginConfig(createReqVO)); | |
| 38 | - } | |
| 39 | - | |
| 40 | - @PutMapping("/update") | |
| 41 | - @Operation(summary = "更新插件配置") | |
| 42 | - @PreAuthorize("@ss.hasPermission('iot:plugin-config:update')") | |
| 43 | - public CommonResult<Boolean> updatePluginConfig(@Valid @RequestBody PluginConfigSaveReqVO updateReqVO) { | |
| 44 | - pluginConfigService.updatePluginConfig(updateReqVO); | |
| 45 | - return success(true); | |
| 46 | - } | |
| 47 | - | |
| 48 | - @DeleteMapping("/delete") | |
| 49 | - @Operation(summary = "删除插件配置") | |
| 50 | - @Parameter(name = "id", description = "编号", required = true) | |
| 51 | - @PreAuthorize("@ss.hasPermission('iot:plugin-config:delete')") | |
| 52 | - public CommonResult<Boolean> deletePluginConfig(@RequestParam("id") Long id) { | |
| 53 | - pluginConfigService.deletePluginConfig(id); | |
| 54 | - return success(true); | |
| 55 | - } | |
| 56 | - | |
| 57 | - @GetMapping("/get") | |
| 58 | - @Operation(summary = "获得插件配置") | |
| 59 | - @Parameter(name = "id", description = "编号", required = true, example = "1024") | |
| 60 | - @PreAuthorize("@ss.hasPermission('iot:plugin-config:query')") | |
| 61 | - public CommonResult<PluginConfigRespVO> getPluginConfig(@RequestParam("id") Long id) { | |
| 62 | - IotPluginConfigDO pluginConfig = pluginConfigService.getPluginConfig(id); | |
| 63 | - return success(BeanUtils.toBean(pluginConfig, PluginConfigRespVO.class)); | |
| 64 | - } | |
| 65 | - | |
| 66 | - @GetMapping("/page") | |
| 67 | - @Operation(summary = "获得插件配置分页") | |
| 68 | - @PreAuthorize("@ss.hasPermission('iot:plugin-config:query')") | |
| 69 | - public CommonResult<PageResult<PluginConfigRespVO>> getPluginConfigPage(@Valid PluginConfigPageReqVO pageReqVO) { | |
| 70 | - PageResult<IotPluginConfigDO> pageResult = pluginConfigService.getPluginConfigPage(pageReqVO); | |
| 71 | - return success(BeanUtils.toBean(pageResult, PluginConfigRespVO.class)); | |
| 72 | - } | |
| 73 | - | |
| 74 | - @PostMapping("/upload-file") | |
| 75 | - @Operation(summary = "上传插件文件") | |
| 76 | - @PreAuthorize("@ss.hasPermission('iot:plugin-config:update')") | |
| 77 | - public CommonResult<Boolean> uploadFile(@Valid PluginConfigImportReqVO reqVO) { | |
| 78 | - pluginConfigService.uploadFile(reqVO.getId(), reqVO.getFile()); | |
| 79 | - return success(true); | |
| 80 | - } | |
| 81 | - | |
| 82 | - @PutMapping("/update-status") | |
| 83 | - @Operation(summary = "修改插件状态") | |
| 84 | - @PreAuthorize("@ss.hasPermission('iot:plugin-config:update')") | |
| 85 | - public CommonResult<Boolean> updatePluginConfigStatus(@Valid @RequestBody PluginConfigStatusReqVO reqVO) { | |
| 86 | - pluginConfigService.updatePluginStatus(reqVO.getId(), reqVO.getStatus()); | |
| 87 | - return success(true); | |
| 88 | - } | |
| 89 | - | |
| 90 | -} | |
| 91 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/config/PluginConfigImportReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.config; | |
| 2 | - | |
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | -import jakarta.validation.constraints.NotNull; | |
| 5 | -import lombok.Data; | |
| 6 | -import org.springframework.web.multipart.MultipartFile; | |
| 7 | - | |
| 8 | -@Schema(description = "管理后台 - IoT 插件上传 Request VO") | |
| 9 | -@Data | |
| 10 | -public class PluginConfigImportReqVO { | |
| 11 | - | |
| 12 | - @Schema(description = "主键 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11546") | |
| 13 | - private Long id; | |
| 14 | - | |
| 15 | - @Schema(description = "插件文件", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 16 | - @NotNull(message = "插件文件不能为空") | |
| 17 | - private MultipartFile file; | |
| 18 | - | |
| 19 | -} | |
| 20 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/config/PluginConfigPageReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.config; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 4 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 5 | -import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum; | |
| 6 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 7 | -import lombok.Data; | |
| 8 | - | |
| 9 | -@Schema(description = "管理后台 - IoT 插件配置分页 Request VO") | |
| 10 | -@Data | |
| 11 | -public class PluginConfigPageReqVO extends PageParam { | |
| 12 | - | |
| 13 | - @Schema(description = "插件名称", example = "http") | |
| 14 | - private String name; | |
| 15 | - | |
| 16 | - @Schema(description = "状态", example = "1") | |
| 17 | - @InEnum(IotPluginStatusEnum.class) | |
| 18 | - private Integer status; | |
| 19 | - | |
| 20 | -} | |
| 21 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/config/PluginConfigRespVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.config; | |
| 2 | - | |
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.time.LocalDateTime; | |
| 7 | - | |
| 8 | -@Schema(description = "管理后台 - IoT 插件配置 Response VO") | |
| 9 | -@Data | |
| 10 | -public class PluginConfigRespVO { | |
| 11 | - | |
| 12 | - @Schema(description = "主键 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11546") | |
| 13 | - private Long id; | |
| 14 | - | |
| 15 | - @Schema(description = "插件包标识符", requiredMode = Schema.RequiredMode.REQUIRED, example = "24627") | |
| 16 | - private String pluginKey; | |
| 17 | - | |
| 18 | - @Schema(description = "插件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") | |
| 19 | - private String name; | |
| 20 | - | |
| 21 | - @Schema(description = "描述", example = "你猜") | |
| 22 | - private String description; | |
| 23 | - | |
| 24 | - @Schema(description = "部署方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | |
| 25 | - private Integer deployType; | |
| 26 | - | |
| 27 | - @Schema(description = "插件包文件名", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 28 | - private String fileName; | |
| 29 | - | |
| 30 | - @Schema(description = "插件版本", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 31 | - private String version; | |
| 32 | - | |
| 33 | - @Schema(description = "插件类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | |
| 34 | - private Integer type; | |
| 35 | - | |
| 36 | - @Schema(description = "设备插件协议类型") | |
| 37 | - private String protocol; | |
| 38 | - | |
| 39 | - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 40 | - private Integer status; | |
| 41 | - | |
| 42 | - @Schema(description = "插件配置项描述信息") | |
| 43 | - private String configSchema; | |
| 44 | - | |
| 45 | - @Schema(description = "插件配置信息") | |
| 46 | - private String config; | |
| 47 | - | |
| 48 | - @Schema(description = "插件脚本") | |
| 49 | - private String script; | |
| 50 | - | |
| 51 | - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 52 | - private LocalDateTime createTime; | |
| 53 | - | |
| 54 | -} | |
| 55 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/config/PluginConfigSaveReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.config; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 4 | -import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum; | |
| 5 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 6 | -import lombok.Data; | |
| 7 | - | |
| 8 | -@Schema(description = "管理后台 - IoT 插件配置新增/修改 Request VO") | |
| 9 | -@Data | |
| 10 | -public class PluginConfigSaveReqVO { | |
| 11 | - | |
| 12 | - // TODO @haohao:新增的字段有点多,每个都需要哇? | |
| 13 | - | |
| 14 | - // TODO @haohao:一些枚举字段,需要加枚举校验。例如说,deployType、status、type 等 | |
| 15 | - | |
| 16 | - @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11546") | |
| 17 | - private Long id; | |
| 18 | - | |
| 19 | - @Schema(description = "插件包标识符", requiredMode = Schema.RequiredMode.REQUIRED, example = "24627") | |
| 20 | - private String pluginKey; | |
| 21 | - | |
| 22 | - @Schema(description = "插件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") | |
| 23 | - private String name; | |
| 24 | - | |
| 25 | - @Schema(description = "描述", example = "你猜") | |
| 26 | - private String description; | |
| 27 | - | |
| 28 | - @Schema(description = "部署方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | |
| 29 | - private Integer deployType; | |
| 30 | - | |
| 31 | - @Schema(description = "插件包文件名", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 32 | - private String fileName; | |
| 33 | - | |
| 34 | - @Schema(description = "插件版本", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 35 | - private String version; | |
| 36 | - | |
| 37 | - @Schema(description = "插件类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | |
| 38 | - private Integer type; | |
| 39 | - | |
| 40 | - @Schema(description = "设备插件协议类型") | |
| 41 | - private String protocol; | |
| 42 | - | |
| 43 | - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 44 | - @InEnum(IotPluginStatusEnum.class) | |
| 45 | - private Integer status; | |
| 46 | - | |
| 47 | - @Schema(description = "插件配置项描述信息") | |
| 48 | - private String configSchema; | |
| 49 | - | |
| 50 | - @Schema(description = "插件配置信息") | |
| 51 | - private String config; | |
| 52 | - | |
| 53 | - @Schema(description = "插件脚本") | |
| 54 | - private String script; | |
| 55 | - | |
| 56 | -} | |
| 57 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/config/PluginConfigStatusReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.config; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 4 | -import cn.iocoder.yudao.module.iot.enums.plugin.IotPluginStatusEnum; | |
| 5 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 6 | -import lombok.Data; | |
| 7 | - | |
| 8 | -@Schema(description = "管理后台 - IoT 插件配置状态 Request VO") | |
| 9 | -@Data | |
| 10 | -public class PluginConfigStatusReqVO { | |
| 11 | - | |
| 12 | - @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11546") | |
| 13 | - private Long id; | |
| 14 | - | |
| 15 | - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 16 | - @InEnum(IotPluginStatusEnum.class) | |
| 17 | - private Integer status; | |
| 18 | - | |
| 19 | -} | |
| 20 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/instance/PluginInstancePageReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.instance; | |
| 2 | - | |
| 3 | -import lombok.*; | |
| 4 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 5 | -import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 6 | -import org.springframework.format.annotation.DateTimeFormat; | |
| 7 | -import java.time.LocalDateTime; | |
| 8 | - | |
| 9 | -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | |
| 10 | - | |
| 11 | -// TODO @haohao:后续需要使用下 | |
| 12 | -@Schema(description = "管理后台 - IoT 插件实例分页 Request VO") | |
| 13 | -@Data | |
| 14 | -public class PluginInstancePageReqVO extends PageParam { | |
| 15 | - | |
| 16 | - @Schema(description = "插件主程序编号", example = "23738") | |
| 17 | - private String mainId; | |
| 18 | - | |
| 19 | - @Schema(description = "插件id", example = "26498") | |
| 20 | - private Long pluginId; | |
| 21 | - | |
| 22 | - @Schema(description = "插件主程序所在ip") | |
| 23 | - private String ip; | |
| 24 | - | |
| 25 | - @Schema(description = "插件主程序端口") | |
| 26 | - private Integer port; | |
| 27 | - | |
| 28 | - @Schema(description = "心跳时间,心路时间超过30秒需要剔除") | |
| 29 | - private Long heartbeatAt; | |
| 30 | - | |
| 31 | - @Schema(description = "创建时间") | |
| 32 | - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 33 | - private LocalDateTime[] createTime; | |
| 34 | - | |
| 35 | -} | |
| 36 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/plugin/vo/instance/PluginInstanceRespVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.plugin.vo.instance; | |
| 2 | - | |
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | -import lombok.Data; | |
| 5 | - | |
| 6 | -import java.time.LocalDateTime; | |
| 7 | - | |
| 8 | -// TODO @haohao:后续需要使用下 | |
| 9 | -@Schema(description = "管理后台 - IoT 插件实例 Response VO") | |
| 10 | -@Data | |
| 11 | -public class PluginInstanceRespVO { | |
| 12 | - | |
| 13 | - @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23864") | |
| 14 | - private Long id; | |
| 15 | - | |
| 16 | - @Schema(description = "插件主程序id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23738") | |
| 17 | - private String mainId; | |
| 18 | - | |
| 19 | - @Schema(description = "插件id", requiredMode = Schema.RequiredMode.REQUIRED, example = "26498") | |
| 20 | - private Long pluginId; | |
| 21 | - | |
| 22 | - @Schema(description = "插件主程序所在ip", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 23 | - private String ip; | |
| 24 | - | |
| 25 | - @Schema(description = "插件主程序端口", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 26 | - private Integer port; | |
| 27 | - | |
| 28 | - @Schema(description = "心跳时间,心路时间超过30秒需要剔除", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 29 | - private Long heartbeatAt; | |
| 30 | - | |
| 31 | - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 32 | - private LocalDateTime createTime; | |
| 33 | - | |
| 34 | -} | |
| 35 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/IotProductController.java
| ... | ... | @@ -84,6 +84,27 @@ public class IotProductController { |
| 84 | 84 | @PreAuthorize("@ss.hasPermission('iot:product:query')") |
| 85 | 85 | public CommonResult<IotProductRespVO> getProduct(@RequestParam("id") Long id) { |
| 86 | 86 | IotProductDO product = productService.getProduct(id); |
| 87 | + if (product == null) { | |
| 88 | + return success(null); | |
| 89 | + } | |
| 90 | + // 拼接数据 | |
| 91 | + IotProductCategoryDO category = categoryService.getProductCategory(product.getCategoryId()); | |
| 92 | + return success(BeanUtils.toBean(product, IotProductRespVO.class, bean -> { | |
| 93 | + if (category != null) { | |
| 94 | + bean.setCategoryName(category.getName()); | |
| 95 | + } | |
| 96 | + })); | |
| 97 | + } | |
| 98 | + | |
| 99 | + @GetMapping("/get-by-key") | |
| 100 | + @Operation(summary = "通过 ProductKey 获得产品") | |
| 101 | + @Parameter(name = "productKey", description = "产品Key", required = true, example = "abc123") | |
| 102 | + @PreAuthorize("@ss.hasPermission('iot:product:query')") | |
| 103 | + public CommonResult<IotProductRespVO> getProductByKey(@RequestParam("productKey") String productKey) { | |
| 104 | + IotProductDO product = productService.getProductByProductKey(productKey); | |
| 105 | + if (product == null) { | |
| 106 | + return success(null); | |
| 107 | + } | |
| 87 | 108 | // 拼接数据 |
| 88 | 109 | IotProductCategoryDO category = categoryService.getProductCategory(product.getCategoryId()); |
| 89 | 110 | return success(BeanUtils.toBean(product, IotProductRespVO.class, bean -> { |
| ... | ... | @@ -122,11 +143,11 @@ public class IotProductController { |
| 122 | 143 | |
| 123 | 144 | @GetMapping("/simple-list") |
| 124 | 145 | @Operation(summary = "获取产品的精简信息列表", description = "主要用于前端的下拉选项") |
| 125 | - public CommonResult<List<IotProductRespVO>> getSimpleProductList() { | |
| 146 | + public CommonResult<List<IotProductRespVO>> getProductSimpleList() { | |
| 126 | 147 | List<IotProductDO> list = productService.getProductList(); |
| 127 | 148 | return success(convertList(list, product -> // 只返回 id、name 字段 |
| 128 | 149 | new IotProductRespVO().setId(product.getId()).setName(product.getName()) |
| 129 | - .setDeviceType(product.getDeviceType()))); | |
| 150 | + .setDeviceType(product.getDeviceType()).setLocationType(product.getLocationType()))); | |
| 130 | 151 | } |
| 131 | 152 | |
| 132 | 153 | } |
| 133 | 154 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/product/IotProductRespVO.java
| ... | ... | @@ -61,24 +61,15 @@ public class IotProductRespVO { |
| 61 | 61 | @DictFormat(DictTypeConstants.NET_TYPE) |
| 62 | 62 | private Integer netType; |
| 63 | 63 | |
| 64 | - @Schema(description = "接入网关协议", example = "2") | |
| 65 | - @ExcelProperty(value = "接入网关协议", converter = DictConvert.class) | |
| 66 | - @DictFormat(DictTypeConstants.PROTOCOL_TYPE) | |
| 67 | - private Integer protocolType; | |
| 64 | + @Schema(description = "定位方式", example = "2") | |
| 65 | + @ExcelProperty(value = "定位方式", converter = DictConvert.class) | |
| 66 | + @DictFormat(DictTypeConstants.LOCATION_TYPE) | |
| 67 | + private Integer locationType; | |
| 68 | 68 | |
| 69 | - @Schema(description = "协议编号(脚本解析 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "13177") | |
| 70 | - @ExcelProperty("协议编号(脚本解析 id)") | |
| 71 | - private Long protocolId; | |
| 72 | - | |
| 73 | - @Schema(description = "数据格式") | |
| 69 | + @Schema(description = "数据格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | |
| 74 | 70 | @ExcelProperty(value = "数据格式", converter = DictConvert.class) |
| 75 | - @DictFormat(DictTypeConstants.DATA_FORMAT) | |
| 76 | - private Integer dataFormat; | |
| 77 | - | |
| 78 | - @Schema(description = "数据校验级别", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 79 | - @ExcelProperty(value = "数据校验级别", converter = DictConvert.class) | |
| 80 | - @DictFormat(DictTypeConstants.VALIDATE_TYPE) | |
| 81 | - private Integer validateType; | |
| 71 | + @DictFormat(DictTypeConstants.CODEC_TYPE) | |
| 72 | + private String codecType; | |
| 82 | 73 | |
| 83 | 74 | @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) |
| 84 | 75 | @ExcelProperty("创建时间") | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/vo/product/IotProductSaveReqVO.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.controller.admin.product.vo.product; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| 4 | -import cn.iocoder.yudao.module.iot.enums.product.*; | |
| 4 | +import cn.iocoder.yudao.module.iot.enums.product.IotLocationTypeEnum; | |
| 5 | +import cn.iocoder.yudao.module.iot.enums.product.IotNetTypeEnum; | |
| 6 | +import cn.iocoder.yudao.module.iot.enums.product.IotProductDeviceTypeEnum; | |
| 5 | 7 | import io.swagger.v3.oas.annotations.media.Schema; |
| 6 | 8 | import jakarta.validation.constraints.NotEmpty; |
| 7 | 9 | import jakarta.validation.constraints.NotNull; |
| ... | ... | @@ -43,18 +45,12 @@ public class IotProductSaveReqVO { |
| 43 | 45 | @InEnum(value = IotNetTypeEnum.class, message = "联网方式必须是 {value}") |
| 44 | 46 | private Integer netType; |
| 45 | 47 | |
| 46 | - @Schema(description = "接入网关协议", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") | |
| 47 | - @InEnum(value = IotProtocolTypeEnum.class, message = "接入网关协议必须是 {value}") | |
| 48 | - private Integer protocolType; | |
| 48 | + @Schema(description = "定位类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") | |
| 49 | + @InEnum(value = IotLocationTypeEnum.class, message = "定位方式必须是 {value}") | |
| 50 | + private Integer locationType; | |
| 49 | 51 | |
| 50 | - @Schema(description = "数据格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") | |
| 51 | - @InEnum(value = IotDataFormatEnum.class, message = "数据格式必须是 {value}") | |
| 52 | - @NotNull(message = "数据格式不能为空") | |
| 53 | - private Integer dataFormat; | |
| 54 | - | |
| 55 | - @Schema(description = "数据校验级别", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") | |
| 56 | - @InEnum(value = IotValidateTypeEnum.class, message = "数据校验级别必须是 {value}") | |
| 57 | - @NotNull(message = "数据校验级别不能为空") | |
| 58 | - private Integer validateType; | |
| 52 | + @Schema(description = "数据格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") | |
| 53 | + @NotEmpty(message = "数据格式不能为空") | |
| 54 | + private String codecType; | |
| 59 | 55 | |
| 60 | 56 | } |
| 61 | 57 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/IotDataBridgeController.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.rule; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 5 | -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 6 | -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.IotDataBridgePageReqVO; | |
| 7 | -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.IotDataBridgeRespVO; | |
| 8 | -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.IotDataBridgeSaveReqVO; | |
| 9 | -import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataBridgeDO; | |
| 10 | -import cn.iocoder.yudao.module.iot.service.rule.IotDataBridgeService; | |
| 11 | -import io.swagger.v3.oas.annotations.Operation; | |
| 12 | -import io.swagger.v3.oas.annotations.Parameter; | |
| 13 | -import io.swagger.v3.oas.annotations.tags.Tag; | |
| 14 | -import jakarta.annotation.Resource; | |
| 15 | -import jakarta.validation.Valid; | |
| 16 | -import org.springframework.security.access.prepost.PreAuthorize; | |
| 17 | -import org.springframework.validation.annotation.Validated; | |
| 18 | -import org.springframework.web.bind.annotation.*; | |
| 19 | - | |
| 20 | -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 21 | - | |
| 22 | -@Tag(name = "管理后台 - IoT 数据桥梁") | |
| 23 | -@RestController | |
| 24 | -@RequestMapping("/iot/data-bridge") | |
| 25 | -@Validated | |
| 26 | -public class IotDataBridgeController { | |
| 27 | - | |
| 28 | - @Resource | |
| 29 | - private IotDataBridgeService dataBridgeService; | |
| 30 | - | |
| 31 | - @PostMapping("/create") | |
| 32 | - @Operation(summary = "创建数据桥梁") | |
| 33 | - @PreAuthorize("@ss.hasPermission('iot:data-bridge:create')") | |
| 34 | - public CommonResult<Long> createDataBridge(@Valid @RequestBody IotDataBridgeSaveReqVO createReqVO) { | |
| 35 | - return success(dataBridgeService.createDataBridge(createReqVO)); | |
| 36 | - } | |
| 37 | - | |
| 38 | - @PutMapping("/update") | |
| 39 | - @Operation(summary = "更新数据桥梁") | |
| 40 | - @PreAuthorize("@ss.hasPermission('iot:data-bridge:update')") | |
| 41 | - public CommonResult<Boolean> updateDataBridge(@Valid @RequestBody IotDataBridgeSaveReqVO updateReqVO) { | |
| 42 | - dataBridgeService.updateDataBridge(updateReqVO); | |
| 43 | - return success(true); | |
| 44 | - } | |
| 45 | - | |
| 46 | - @DeleteMapping("/delete") | |
| 47 | - @Operation(summary = "删除数据桥梁") | |
| 48 | - @Parameter(name = "id", description = "编号", required = true) | |
| 49 | - @PreAuthorize("@ss.hasPermission('iot:data-bridge:delete')") | |
| 50 | - public CommonResult<Boolean> deleteDataBridge(@RequestParam("id") Long id) { | |
| 51 | - dataBridgeService.deleteDataBridge(id); | |
| 52 | - return success(true); | |
| 53 | - } | |
| 54 | - | |
| 55 | - @GetMapping("/get") | |
| 56 | - @Operation(summary = "获得数据桥梁") | |
| 57 | - @Parameter(name = "id", description = "编号", required = true, example = "1024") | |
| 58 | - @PreAuthorize("@ss.hasPermission('iot:data-bridge:query')") | |
| 59 | - public CommonResult<IotDataBridgeRespVO> getDataBridge(@RequestParam("id") Long id) { | |
| 60 | - IotDataBridgeDO dataBridge = dataBridgeService.getDataBridge(id); | |
| 61 | - return success(BeanUtils.toBean(dataBridge, IotDataBridgeRespVO.class)); | |
| 62 | - } | |
| 63 | - | |
| 64 | - @GetMapping("/page") | |
| 65 | - @Operation(summary = "获得数据桥梁分页") | |
| 66 | - @PreAuthorize("@ss.hasPermission('iot:data-bridge:query')") | |
| 67 | - public CommonResult<PageResult<IotDataBridgeRespVO>> getDataBridgePage(@Valid IotDataBridgePageReqVO pageReqVO) { | |
| 68 | - PageResult<IotDataBridgeDO> pageResult = dataBridgeService.getDataBridgePage(pageReqVO); | |
| 69 | - return success(BeanUtils.toBean(pageResult, IotDataBridgeRespVO.class)); | |
| 70 | - } | |
| 71 | - | |
| 72 | -} | |
| 73 | 0 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/IotDataRuleController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.rule; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 5 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 6 | +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.rule.IotDataRulePageReqVO; | |
| 7 | +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.rule.IotDataRuleRespVO; | |
| 8 | +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.rule.IotDataRuleSaveReqVO; | |
| 9 | +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataRuleDO; | |
| 10 | +import cn.iocoder.yudao.module.iot.service.rule.data.IotDataRuleService; | |
| 11 | +import io.swagger.v3.oas.annotations.Operation; | |
| 12 | +import io.swagger.v3.oas.annotations.Parameter; | |
| 13 | +import io.swagger.v3.oas.annotations.tags.Tag; | |
| 14 | +import jakarta.annotation.Resource; | |
| 15 | +import jakarta.validation.Valid; | |
| 16 | +import org.springframework.security.access.prepost.PreAuthorize; | |
| 17 | +import org.springframework.validation.annotation.Validated; | |
| 18 | +import org.springframework.web.bind.annotation.*; | |
| 19 | + | |
| 20 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 21 | + | |
| 22 | +@Tag(name = "管理后台 - IoT 数据流转规则") | |
| 23 | +@RestController | |
| 24 | +@RequestMapping("/iot/data-rule") | |
| 25 | +@Validated | |
| 26 | +public class IotDataRuleController { | |
| 27 | + | |
| 28 | + @Resource | |
| 29 | + private IotDataRuleService dataRuleService; | |
| 30 | + | |
| 31 | + @PostMapping("/create") | |
| 32 | + @Operation(summary = "创建数据流转规则") | |
| 33 | + @PreAuthorize("@ss.hasPermission('iot:data-rule:create')") | |
| 34 | + public CommonResult<Long> createDataRule(@Valid @RequestBody IotDataRuleSaveReqVO createReqVO) { | |
| 35 | + return success(dataRuleService.createDataRule(createReqVO)); | |
| 36 | + } | |
| 37 | + | |
| 38 | + @PutMapping("/update") | |
| 39 | + @Operation(summary = "更新数据流转规则") | |
| 40 | + @PreAuthorize("@ss.hasPermission('iot:data-rule:update')") | |
| 41 | + public CommonResult<Boolean> updateDataRule(@Valid @RequestBody IotDataRuleSaveReqVO updateReqVO) { | |
| 42 | + dataRuleService.updateDataRule(updateReqVO); | |
| 43 | + return success(true); | |
| 44 | + } | |
| 45 | + | |
| 46 | + @DeleteMapping("/delete") | |
| 47 | + @Operation(summary = "删除数据流转规则") | |
| 48 | + @Parameter(name = "id", description = "编号", required = true) | |
| 49 | + @PreAuthorize("@ss.hasPermission('iot:data-rule:delete')") | |
| 50 | + public CommonResult<Boolean> deleteDataRule(@RequestParam("id") Long id) { | |
| 51 | + dataRuleService.deleteDataRule(id); | |
| 52 | + return success(true); | |
| 53 | + } | |
| 54 | + | |
| 55 | + @GetMapping("/get") | |
| 56 | + @Operation(summary = "获得数据流转规则") | |
| 57 | + @Parameter(name = "id", description = "编号", required = true, example = "1024") | |
| 58 | + @PreAuthorize("@ss.hasPermission('iot:data-rule:query')") | |
| 59 | + public CommonResult<IotDataRuleRespVO> getDataRule(@RequestParam("id") Long id) { | |
| 60 | + IotDataRuleDO dataRule = dataRuleService.getDataRule(id); | |
| 61 | + return success(BeanUtils.toBean(dataRule, IotDataRuleRespVO.class)); | |
| 62 | + } | |
| 63 | + | |
| 64 | + @GetMapping("/page") | |
| 65 | + @Operation(summary = "获得数据流转规则分页") | |
| 66 | + @PreAuthorize("@ss.hasPermission('iot:data-rule:query')") | |
| 67 | + public CommonResult<PageResult<IotDataRuleRespVO>> getDataRulePage(@Valid IotDataRulePageReqVO pageReqVO) { | |
| 68 | + PageResult<IotDataRuleDO> pageResult = dataRuleService.getDataRulePage(pageReqVO); | |
| 69 | + return success(BeanUtils.toBean(pageResult, IotDataRuleRespVO.class)); | |
| 70 | + } | |
| 71 | + | |
| 72 | +} | |
| 0 | 73 | \ No newline at end of file | ... | ... |