Commit 2905efec28827af68918d24bcfdb52d6980003c8

Authored by alwayssuper
2 parents b3398019 e5ce1952

Merge branch 'feature/iot' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/iot

Showing 192 changed files with 4623 additions and 2981 deletions

Too many changes.

To preserve performance only 100 of 192 files are displayed.

yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/YudaoMybatisAutoConfiguration.java
1 package cn.iocoder.yudao.framework.mybatis.config; 1 package cn.iocoder.yudao.framework.mybatis.config;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
4 import cn.iocoder.yudao.framework.mybatis.core.handler.DefaultDBFieldHandler; 5 import cn.iocoder.yudao.framework.mybatis.core.handler.DefaultDBFieldHandler;
5 import com.baomidou.mybatisplus.annotation.DbType; 6 import com.baomidou.mybatisplus.annotation.DbType;
6 import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; 7 import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
7 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; 8 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
8 import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; 9 import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
  10 +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
9 import com.baomidou.mybatisplus.extension.incrementer.*; 11 import com.baomidou.mybatisplus.extension.incrementer.*;
10 import com.baomidou.mybatisplus.extension.parser.JsqlParserGlobal; 12 import com.baomidou.mybatisplus.extension.parser.JsqlParserGlobal;
11 import com.baomidou.mybatisplus.extension.parser.cache.JdkSerialCaffeineJsqlParseCache; 13 import com.baomidou.mybatisplus.extension.parser.cache.JdkSerialCaffeineJsqlParseCache;
12 import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; 14 import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
13 import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; 15 import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  16 +import com.fasterxml.jackson.databind.ObjectMapper;
14 import org.apache.ibatis.annotations.Mapper; 17 import org.apache.ibatis.annotations.Mapper;
15 import org.mybatis.spring.annotation.MapperScan; 18 import org.mybatis.spring.annotation.MapperScan;
16 import org.springframework.boot.autoconfigure.AutoConfiguration; 19 import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -18,6 +21,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -18,6 +21,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
18 import org.springframework.context.annotation.Bean; 21 import org.springframework.context.annotation.Bean;
19 import org.springframework.core.env.ConfigurableEnvironment; 22 import org.springframework.core.env.ConfigurableEnvironment;
20 23
  24 +import java.util.List;
21 import java.util.concurrent.TimeUnit; 25 import java.util.concurrent.TimeUnit;
22 26
23 /** 27 /**
@@ -73,4 +77,11 @@ public class YudaoMybatisAutoConfiguration { @@ -73,4 +77,11 @@ public class YudaoMybatisAutoConfiguration {
73 throw new IllegalArgumentException(StrUtil.format("DbType{} 找不到合适的 IKeyGenerator 实现类", dbType)); 77 throw new IllegalArgumentException(StrUtil.format("DbType{} 找不到合适的 IKeyGenerator 实现类", dbType));
74 } 78 }
75 79
  80 + @Bean
  81 + public JacksonTypeHandler jacksonTypeHandler(List<ObjectMapper> objectMappers) {
  82 + // 特殊:设置 JacksonTypeHandler 的 ObjectMapper!
  83 + JacksonTypeHandler.setObjectMapper(CollUtil.getFirst(objectMappers));
  84 + return new JacksonTypeHandler(Object.class);
  85 + }
  86 +
76 } 87 }
yudao-module-iot/pom.xml
@@ -7,7 +7,6 @@ @@ -7,7 +7,6 @@
7 <version>${revision}</version> 7 <version>${revision}</version>
8 </parent> 8 </parent>
9 <modules> 9 <modules>
10 - <module>yudao-module-iot-api</module>  
11 <module>yudao-module-iot-biz</module> 10 <module>yudao-module-iot-biz</module>
12 <module>yudao-module-iot-core</module> 11 <module>yudao-module-iot-core</module>
13 <module>yudao-module-iot-gateway</module> 12 <module>yudao-module-iot-gateway</module>
yudao-module-iot/yudao-module-iot-api/pom.xml deleted
1 -<?xml version="1.0" encoding="UTF-8"?>  
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">  
5 - <parent>  
6 - <artifactId>yudao-module-iot</artifactId>  
7 - <groupId>cn.iocoder.boot</groupId>  
8 - <version>${revision}</version>  
9 - </parent>  
10 - <modelVersion>4.0.0</modelVersion>  
11 - <artifactId>yudao-module-iot-api</artifactId>  
12 - <packaging>jar</packaging>  
13 -  
14 - <name>${project.artifactId}</name>  
15 - <!-- TODO 芋艿:需要在整理下,特别是 PF4J -->  
16 - <description>  
17 - 物联网 模块 API,暴露给其它模块调用  
18 - </description>  
19 -  
20 - <dependencies>  
21 - <dependency>  
22 - <groupId>cn.iocoder.boot</groupId>  
23 - <artifactId>yudao-common</artifactId>  
24 - </dependency>  
25 -  
26 - <!-- Web 相关 -->  
27 - <dependency>  
28 - <groupId>org.springframework</groupId>  
29 - <artifactId>spring-web</artifactId>  
30 - <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->  
31 - </dependency>  
32 -  
33 - <!-- 工具类相关 -->  
34 - <dependency>  
35 - <groupId>com.fasterxml.jackson.core</groupId>  
36 - <artifactId>jackson-databind</artifactId>  
37 - <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->  
38 - </dependency>  
39 -  
40 - <!-- <dependency>-->  
41 - <!-- <groupId>org.pf4j</groupId> &lt;!&ndash; PF4J:内置插件机制 &ndash;&gt;-->  
42 - <!-- <artifactId>pf4j-spring</artifactId>-->  
43 - <!-- </dependency>-->  
44 -  
45 - <!-- 参数校验 -->  
46 - <dependency>  
47 - <groupId>org.springframework.boot</groupId>  
48 - <artifactId>spring-boot-starter-validation</artifactId>  
49 - <optional>true</optional>  
50 - </dependency>  
51 - </dependencies>  
52 -  
53 -</project>  
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/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 \ No newline at end of file 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/IotDeviceUpstreamAbstractReqDTO.java deleted
1 -package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream;  
2 -  
3 -import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeSerializer;  
4 -import com.fasterxml.jackson.databind.annotation.JsonSerialize;  
5 -import jakarta.validation.constraints.NotEmpty;  
6 -import lombok.Data;  
7 -  
8 -import java.time.LocalDateTime;  
9 -  
10 -/**  
11 - * IoT 设备上行的抽象 Request DTO  
12 - *  
13 - * @author 芋道源码  
14 - */  
15 -@Data  
16 -public abstract class IotDeviceUpstreamAbstractReqDTO {  
17 -  
18 - /**  
19 - * 请求编号  
20 - */  
21 - private String requestId;  
22 -  
23 - /**  
24 - * 插件实例的进程编号  
25 - */  
26 - private String processId;  
27 -  
28 - /**  
29 - * 产品标识  
30 - */  
31 - @NotEmpty(message = "产品标识不能为空")  
32 - private String productKey;  
33 - /**  
34 - * 设备名称  
35 - */  
36 - @NotEmpty(message = "设备名称不能为空")  
37 - private String deviceName;  
38 -  
39 - /**  
40 - * 上报时间  
41 - */  
42 - @JsonSerialize(using = TimestampLocalDateTimeSerializer.class) // 解决 iot plugins 序列化 LocalDateTime 是数组,导致无法解析的问题  
43 - private LocalDateTime reportTime;  
44 -  
45 -}  
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/rule/IotDataBridgeTypeEnum.java deleted
1 -package cn.iocoder.yudao.module.iot.enums.rule;  
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 芋道源码  
13 - */  
14 -@RequiredArgsConstructor  
15 -@Getter  
16 -public enum IotDataBridgeTypeEnum implements ArrayValuable<Integer> {  
17 -  
18 - HTTP(1, "HTTP"),  
19 - TCP(2, "TCP"),  
20 - WEBSOCKET(3, "WEBSOCKET"),  
21 -  
22 - MQTT(10, "MQTT"),  
23 -  
24 - DATABASE(20, "DATABASE"),  
25 - REDIS_STREAM(21, "REDIS_STREAM"),  
26 -  
27 - ROCKETMQ(30, "ROCKETMQ"),  
28 - RABBITMQ(31, "RABBITMQ"),  
29 - KAFKA(32, "KAFKA");  
30 -  
31 - private final Integer type;  
32 -  
33 - private final String name;  
34 -  
35 - public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotDataBridgeTypeEnum::getType).toArray(Integer[]::new);  
36 -  
37 - @Override  
38 - public Integer[] array() {  
39 - return ARRAYS;  
40 - }  
41 -  
42 -}  
yudao-module-iot/yudao-module-iot-biz/pom.xml
@@ -25,11 +25,6 @@ @@ -25,11 +25,6 @@
25 </dependency> 25 </dependency>
26 <dependency> 26 <dependency>
27 <groupId>cn.iocoder.boot</groupId> 27 <groupId>cn.iocoder.boot</groupId>
28 - <artifactId>yudao-module-iot-api</artifactId>  
29 - <version>${revision}</version>  
30 - </dependency>  
31 - <dependency>  
32 - <groupId>cn.iocoder.boot</groupId>  
33 <artifactId>yudao-module-iot-core</artifactId> 28 <artifactId>yudao-module-iot-core</artifactId>
34 <version>${revision}</version> 29 <version>${revision}</version>
35 </dependency> 30 </dependency>
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 \ No newline at end of file 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 \ No newline at end of file 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 \ No newline at end of file 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 \ No newline at end of file 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 \ No newline at end of file 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 \ No newline at end of file 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 \ No newline at end of file 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 \ No newline at end of file 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
@@ -9,9 +9,9 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; @@ -9,9 +9,9 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
9 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*; 9 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*;
10 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; 10 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
11 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; 11 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
12 -import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceMessageService;  
13 import io.swagger.v3.oas.annotations.Operation; 12 import io.swagger.v3.oas.annotations.Operation;
14 import io.swagger.v3.oas.annotations.Parameter; 13 import io.swagger.v3.oas.annotations.Parameter;
  14 +import io.swagger.v3.oas.annotations.Parameters;
15 import io.swagger.v3.oas.annotations.tags.Tag; 15 import io.swagger.v3.oas.annotations.tags.Tag;
16 import jakarta.annotation.Resource; 16 import jakarta.annotation.Resource;
17 import jakarta.servlet.http.HttpServletResponse; 17 import jakarta.servlet.http.HttpServletResponse;
@@ -38,8 +38,6 @@ public class IotDeviceController { @@ -38,8 +38,6 @@ public class IotDeviceController {
38 38
39 @Resource 39 @Resource
40 private IotDeviceService deviceService; 40 private IotDeviceService deviceService;
41 - @Resource  
42 - private IotDeviceMessageService deviceMessageService;  
43 41
44 @PostMapping("/create") 42 @PostMapping("/create")
45 @Operation(summary = "创建设备") 43 @Operation(summary = "创建设备")
@@ -124,12 +122,17 @@ public class IotDeviceController { @@ -124,12 +122,17 @@ public class IotDeviceController {
124 122
125 @GetMapping("/simple-list") 123 @GetMapping("/simple-list")
126 @Operation(summary = "获取设备的精简信息列表", description = "主要用于前端的下拉选项") 124 @Operation(summary = "获取设备的精简信息列表", description = "主要用于前端的下拉选项")
127 - @Parameter(name = "deviceType", description = "设备类型", example = "1")  
128 - public CommonResult<List<IotDeviceRespVO>> getSimpleDeviceList(  
129 - @RequestParam(value = "deviceType", required = false) Integer deviceType) {  
130 - List<IotDeviceDO> list = deviceService.getDeviceListByDeviceType(deviceType);  
131 - return success(convertList(list, device -> // 只返回 id、name 字段  
132 - new IotDeviceRespVO().setId(device.getId()).setDeviceName(device.getDeviceName()))); 125 + @Parameters({
  126 + @Parameter(name = "deviceType", description = "设备类型", example = "1"),
  127 + @Parameter(name = "productId", description = "产品编号", example = "1024")
  128 + })
  129 + public CommonResult<List<IotDeviceRespVO>> getDeviceSimpleList(
  130 + @RequestParam(value = "deviceType", required = false) Integer deviceType,
  131 + @RequestParam(value = "productId", required = false) Long productId) {
  132 + List<IotDeviceDO> list = deviceService.getDeviceListByCondition(deviceType, productId);
  133 + return success(convertList(list, device -> // 只返回 id、name、productId 字段
  134 + new IotDeviceRespVO().setId(device.getId()).setDeviceName(device.getDeviceName())
  135 + .setProductId(device.getProductId())));
133 } 136 }
134 137
135 @PostMapping("/import") 138 @PostMapping("/import")
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDevicePropertyController.java
@@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; @@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.property.IotDevicePropertyDetailRespVO; 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; 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; 8 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.property.IotDevicePropertyRespVO;
9 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelProperty; 9 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelProperty;
10 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; 10 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
11 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDevicePropertyDO; 11 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDevicePropertyDO;
12 import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO; 12 import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/property/IotDevicePropertyDetailRespVO.java
1 package cn.iocoder.yudao.module.iot.controller.admin.device.vo.property; 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.dataType.ThingModelDataSpecs; 3 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.dataType.ThingModelDataSpecs;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 5 import lombok.Data;
6 6
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/IotOtaFirmwareController.java
@@ -3,12 +3,14 @@ package cn.iocoder.yudao.module.iot.controller.admin.ota; @@ -3,12 +3,14 @@ package cn.iocoder.yudao.module.iot.controller.admin.ota;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareCreateReqVO;
6 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwarePageReqVO; 7 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwarePageReqVO;
7 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareRespVO; 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 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareUpdateReqVO; 9 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareUpdateReqVO;
10 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO; 10 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
  11 +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
11 import cn.iocoder.yudao.module.iot.service.ota.IotOtaFirmwareService; 12 import cn.iocoder.yudao.module.iot.service.ota.IotOtaFirmwareService;
  13 +import cn.iocoder.yudao.module.iot.service.product.IotProductService;
12 import io.swagger.v3.oas.annotations.Operation; 14 import io.swagger.v3.oas.annotations.Operation;
13 import io.swagger.v3.oas.annotations.tags.Tag; 15 import io.swagger.v3.oas.annotations.tags.Tag;
14 import jakarta.annotation.Resource; 16 import jakarta.annotation.Resource;
@@ -21,12 +23,14 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -21,12 +23,14 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
21 23
22 @Tag(name = "管理后台 - IoT OTA 固件") 24 @Tag(name = "管理后台 - IoT OTA 固件")
23 @RestController 25 @RestController
24 -@RequestMapping("/iot/ota-firmware") 26 +@RequestMapping("/iot/ota/firmware")
25 @Validated 27 @Validated
26 public class IotOtaFirmwareController { 28 public class IotOtaFirmwareController {
27 29
28 @Resource 30 @Resource
29 private IotOtaFirmwareService otaFirmwareService; 31 private IotOtaFirmwareService otaFirmwareService;
  32 + @Resource
  33 + private IotProductService productService;
30 34
31 @PostMapping("/create") 35 @PostMapping("/create")
32 @Operation(summary = "创建 OTA 固件") 36 @Operation(summary = "创建 OTA 固件")
@@ -47,8 +51,16 @@ public class IotOtaFirmwareController { @@ -47,8 +51,16 @@ public class IotOtaFirmwareController {
47 @Operation(summary = "获得 OTA 固件") 51 @Operation(summary = "获得 OTA 固件")
48 @PreAuthorize("@ss.hasPermission('iot:ota-firmware:query')") 52 @PreAuthorize("@ss.hasPermission('iot:ota-firmware:query')")
49 public CommonResult<IotOtaFirmwareRespVO> getOtaFirmware(@RequestParam("id") Long id) { 53 public CommonResult<IotOtaFirmwareRespVO> getOtaFirmware(@RequestParam("id") Long id) {
50 - IotOtaFirmwareDO otaFirmware = otaFirmwareService.getOtaFirmware(id);  
51 - 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 + }));
52 } 64 }
53 65
54 @GetMapping("/page") 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.RequestMapping;
  26 +import org.springframework.web.bind.annotation.RequestParam;
  27 +import org.springframework.web.bind.annotation.RestController;
  28 +
  29 +import java.util.Map;
  30 +
  31 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  32 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  33 +
  34 +@Tag(name = "管理后台 - IoT OTA 升级任务记录")
  35 +@RestController
  36 +@RequestMapping("/iot/ota/task/record")
  37 +@Validated
  38 +public class IotOtaTaskRecordController {
  39 +
  40 + @Resource
  41 + private IotOtaTaskRecordService otaTaskRecordService;
  42 + @Resource
  43 + private IotDeviceService deviceService;
  44 + @Resource
  45 + private IotOtaFirmwareService otaFirmwareService;
  46 +
  47 + @GetMapping("/get-status-statistics")
  48 + @Operation(summary = "获得 OTA 升级记录状态统计")
  49 + @Parameters({
  50 + @Parameter(name = "firmwareId", description = "固件编号", example = "1024"),
  51 + @Parameter(name = "taskId", description = "升级任务编号", example = "2048")
  52 + })
  53 + @PreAuthorize("@ss.hasPermission('iot:ota-task-record:query')")
  54 + public CommonResult<Map<Integer, Long>> getOtaTaskRecordStatusStatistics(
  55 + @RequestParam(value = "firmwareId", required = false) Long firmwareId,
  56 + @RequestParam(value = "taskId", required = false) Long taskId) {
  57 + return success(otaTaskRecordService.getOtaTaskRecordStatusStatistics(firmwareId, taskId));
  58 + }
  59 +
  60 + @GetMapping("/page")
  61 + @Operation(summary = "获得 OTA 升级记录分页")
  62 + @PreAuthorize("@ss.hasPermission('iot:ota-task-record:query')")
  63 + public CommonResult<PageResult<IotOtaTaskRecordRespVO>> getOtaTaskRecordPage(
  64 + @Valid IotOtaTaskRecordPageReqVO pageReqVO) {
  65 + PageResult<IotOtaTaskRecordDO> pageResult = otaTaskRecordService.getOtaTaskRecordPage(pageReqVO);
  66 + if (CollUtil.isEmpty(pageResult.getList())) {
  67 + return success(PageResult.empty());
  68 + }
  69 +
  70 + // 批量查询固件信息
  71 + Map<Long, IotOtaFirmwareDO> firmwareMap = otaFirmwareService.getOtaFirmwareMap(
  72 + convertSet(pageResult.getList(), IotOtaTaskRecordDO::getFromFirmwareId));
  73 + Map<Long, IotDeviceDO> deviceMap = deviceService.getDeviceMap(
  74 + convertSet(pageResult.getList(), IotOtaTaskRecordDO::getDeviceId));
  75 + // 转换为响应 VO
  76 + return success(BeanUtils.toBean(pageResult, IotOtaTaskRecordRespVO.class, (vo) -> {
  77 + MapUtils.findAndThen(firmwareMap, vo.getFromFirmwareId(), firmware ->
  78 + vo.setFromFirmwareVersion(firmware.getVersion()));
  79 + MapUtils.findAndThen(deviceMap, vo.getDeviceId(), device ->
  80 + vo.setDeviceName(device.getDeviceName()));
  81 + }));
  82 + }
  83 +
  84 + @GetMapping("/get")
  85 + @Operation(summary = "获得 OTA 升级记录")
  86 + @PreAuthorize("@ss.hasPermission('iot:ota-task-record:query')")
  87 + @Parameter(name = "id", description = "升级记录编号", required = true, example = "1024")
  88 + public CommonResult<IotOtaTaskRecordRespVO> getOtaTaskRecord(@RequestParam("id") Long id) {
  89 + IotOtaTaskRecordDO upgradeRecord = otaTaskRecordService.getOtaTaskRecord(id);
  90 + return success(BeanUtils.toBean(upgradeRecord, IotOtaTaskRecordRespVO.class));
  91 + }
  92 +
  93 +}
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 io.swagger.v3.oas.annotations.Operation;  
11 -import io.swagger.v3.oas.annotations.Parameter;  
12 -import io.swagger.v3.oas.annotations.tags.Tag;  
13 -import jakarta.annotation.Resource;  
14 -import jakarta.validation.Valid;  
15 -import org.springframework.security.access.prepost.PreAuthorize;  
16 -import org.springframework.validation.annotation.Validated;  
17 -import org.springframework.web.bind.annotation.*;  
18 -  
19 -import java.util.Map;  
20 -  
21 -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;  
22 -  
23 -@Tag(name = "管理后台 - IoT OTA 升级记录")  
24 -@RestController  
25 -@RequestMapping("/iot/ota-upgrade-record")  
26 -@Validated  
27 -public class IotOtaUpgradeRecordController {  
28 -  
29 - @Resource  
30 - private IotOtaUpgradeRecordService upgradeRecordService;  
31 -  
32 - @GetMapping("/get-statistics")  
33 - @Operation(summary = "固件升级设备统计")  
34 - @PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:query')")  
35 - @Parameter(name = "firmwareId", description = "固件编号", required = true, example = "1024")  
36 - public CommonResult<Map<Integer, Long>> getOtaUpgradeRecordStatistics(@RequestParam(value = "firmwareId") Long firmwareId) {  
37 - return success(upgradeRecordService.getOtaUpgradeRecordStatistics(firmwareId));  
38 - }  
39 -  
40 - @GetMapping("/get-count")  
41 - @Operation(summary = "获得升级记录分页 tab 数量")  
42 - @PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:query')")  
43 - public CommonResult<Map<Integer, Long>> getOtaUpgradeRecordCount(  
44 - @Valid IotOtaUpgradeRecordPageReqVO pageReqVO) {  
45 - return success(upgradeRecordService.getOtaUpgradeRecordCount(pageReqVO));  
46 - }  
47 -  
48 - @GetMapping("/page")  
49 - @Operation(summary = "获得升级记录分页")  
50 - @PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:query')")  
51 - public CommonResult<PageResult<IotOtaUpgradeRecordRespVO>> getUpgradeRecordPage(  
52 - @Valid IotOtaUpgradeRecordPageReqVO pageReqVO) {  
53 - PageResult<IotOtaUpgradeRecordDO> pageResult = upgradeRecordService.getUpgradeRecordPage(pageReqVO);  
54 - return success(BeanUtils.toBean(pageResult, IotOtaUpgradeRecordRespVO.class));  
55 - }  
56 -  
57 - @GetMapping("/get")  
58 - @Operation(summary = "获得升级记录")  
59 - @PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:query')")  
60 - @Parameter(name = "id", description = "升级记录编号", required = true, example = "1024")  
61 - public CommonResult<IotOtaUpgradeRecordRespVO> getUpgradeRecord(@RequestParam("id") Long id) {  
62 - IotOtaUpgradeRecordDO upgradeRecord = upgradeRecordService.getUpgradeRecord(id);  
63 - return success(BeanUtils.toBean(upgradeRecord, IotOtaUpgradeRecordRespVO.class));  
64 - }  
65 -  
66 - @PutMapping("/retry")  
67 - @Operation(summary = "重试升级记录")  
68 - @PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:retry')")  
69 - @Parameter(name = "id", description = "升级记录编号", required = true, example = "1024")  
70 - public CommonResult<Boolean> retryUpgradeRecord(@RequestParam("id") Long id) {  
71 - upgradeRecordService.retryUpgradeRecord(id);  
72 - return success(true);  
73 - }  
74 -  
75 -}  
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,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
4 import jakarta.validation.constraints.NotEmpty; 4 import jakarta.validation.constraints.NotEmpty;
5 import jakarta.validation.constraints.NotNull; 5 import jakarta.validation.constraints.NotNull;
6 import lombok.Data; 6 import lombok.Data;
  7 +import org.hibernate.validator.constraints.URL;
7 8
8 @Schema(description = "管理后台 - IoT OTA 固件创建 Request VO") 9 @Schema(description = "管理后台 - IoT OTA 固件创建 Request VO")
9 @Data 10 @Data
@@ -22,17 +23,11 @@ public class IotOtaFirmwareCreateReqVO { @@ -22,17 +23,11 @@ public class IotOtaFirmwareCreateReqVO {
22 23
23 @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 24 @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
24 @NotNull(message = "产品编号不能为空") 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 @NotEmpty(message = "固件文件 URL 不能为空") 29 @NotEmpty(message = "固件文件 URL 不能为空")
  30 + @URL(message = "固件文件 URL 格式错误")
33 private String fileUrl; 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,21 +3,24 @@ package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware;
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 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 @Schema(description = "管理后台 - IoT OTA 固件分页 Request VO") 12 @Schema(description = "管理后台 - IoT OTA 固件分页 Request VO")
  13 +@Data
9 public class IotOtaFirmwarePageReqVO extends PageParam { 14 public class IotOtaFirmwarePageReqVO extends PageParam {
10 15
11 - /**  
12 - * 固件名称  
13 - */  
14 @Schema(description = "固件名称", example = "智能开关固件") 16 @Schema(description = "固件名称", example = "智能开关固件")
15 private String name; 17 private String name;
16 18
17 - /**  
18 - * 产品标识  
19 - */  
20 @Schema(description = "产品标识", example = "1024") 19 @Schema(description = "产品标识", example = "1024")
21 private String productId; 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 package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware; 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 import com.fhs.core.trans.vo.VO; 3 import com.fhs.core.trans.vo.VO;
7 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
8 import lombok.Data; 5 import lombok.Data;
9 6
10 -@Data 7 +import java.time.LocalDateTime;
  8 +
11 @Schema(description = "管理后台 - IoT OTA 固件 Response VO") 9 @Schema(description = "管理后台 - IoT OTA 固件 Response VO")
  10 +@Data
12 public class IotOtaFirmwareRespVO implements VO { 11 public class IotOtaFirmwareRespVO implements VO {
13 12
14 - /**  
15 - * 固件编号  
16 - */  
17 @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 13 @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
18 private Long id; 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 private String name; 17 private String name;
24 - /**  
25 - * 固件描述  
26 - */ 18 +
27 @Schema(description = "固件描述") 19 @Schema(description = "固件描述")
28 private String description; 20 private String description;
29 - /**  
30 - * 版本号  
31 - */ 21 +
32 @Schema(description = "版本号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1.0.0") 22 @Schema(description = "版本号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1.0.0")
33 private String version; 23 private String version;
34 24
35 - /**  
36 - * 产品编号  
37 - * <p>  
38 - * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()}  
39 - */  
40 @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 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 private String productName; 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 @Schema(description = "固件文件大小", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 34 @Schema(description = "固件文件大小", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
71 private Long fileSize; 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 package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware; 1 package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 -import jakarta.validation.constraints.NotEmpty;  
5 import jakarta.validation.constraints.NotNull; 4 import jakarta.validation.constraints.NotNull;
6 import lombok.Data; 5 import lombok.Data;
7 6
@@ -13,9 +12,7 @@ public class IotOtaFirmwareUpdateReqVO { @@ -13,9 +12,7 @@ public class IotOtaFirmwareUpdateReqVO {
13 @NotNull(message = "固件编号不能为空") 12 @NotNull(message = "固件编号不能为空")
14 private Long id; 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 private String name; 16 private String name;
20 17
21 @Schema(description = "固件描述", example = "某品牌型号固件,测试用") 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 import cn.iocoder.yudao.framework.common.validation.InEnum; 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 import io.swagger.v3.oas.annotations.media.Schema; 5 import io.swagger.v3.oas.annotations.media.Schema;
8 import jakarta.validation.constraints.NotEmpty; 6 import jakarta.validation.constraints.NotEmpty;
9 import jakarta.validation.constraints.NotNull; 7 import jakarta.validation.constraints.NotNull;
@@ -11,51 +9,29 @@ import lombok.Data; @@ -11,51 +9,29 @@ import lombok.Data;
11 9
12 import java.util.List; 10 import java.util.List;
13 11
  12 +@Schema(description = "管理后台 - IoT OTA 升级任务创建 Request VO")
14 @Data 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 @NotEmpty(message = "任务名称不能为空") 16 @NotEmpty(message = "任务名称不能为空")
25 @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "升级任务") 17 @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "升级任务")
26 private String name; 18 private String name;
27 19
28 - /**  
29 - * 任务描述  
30 - */  
31 @Schema(description = "任务描述", example = "升级任务") 20 @Schema(description = "任务描述", example = "升级任务")
32 private String description; 21 private String description;
33 22
34 - /**  
35 - * 固件编号  
36 - * <p>  
37 - * 关联 {@link IotOtaFirmwareDO#getId()}  
38 - */  
39 - @NotNull(message = "固件编号不能为空")  
40 @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 23 @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  24 + @NotNull(message = "固件编号不能为空")
41 private Long firmwareId; 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 @Schema(description = "升级范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 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 private List<Long> deviceIds; 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 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
5 -import jakarta.validation.constraints.NotNull;  
6 import lombok.Data; 5 import lombok.Data;
7 6
8 -@Data  
9 @Schema(description = "管理后台 - IoT OTA 升级任务分页 Request VO") 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 @Schema(description = "任务名称", example = "升级任务") 11 @Schema(description = "任务名称", example = "升级任务")
16 private String name; 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 private Long firmwareId; 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.device.IotDeviceMessageDO;  
5 -import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;  
6 -import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeTaskDO;  
7 -import com.fhs.core.trans.anno.Trans;  
8 -import com.fhs.core.trans.constant.TransType;  
9 -import io.swagger.v3.oas.annotations.media.Schema;  
10 -import lombok.Data;  
11 -  
12 -import java.time.LocalDateTime;  
13 -  
14 -@Data  
15 -@Schema(description = "管理后台 - IoT OTA 升级记录 Response VO")  
16 -public class IotOtaUpgradeRecordRespVO {  
17 -  
18 - /**  
19 - * 升级记录编号  
20 - */  
21 - @Schema(description = "升级记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")  
22 - private Long id;  
23 - /**  
24 - * 固件编号  
25 - * <p>  
26 - * 关联 {@link IotOtaFirmwareDO#getId()}  
27 - */  
28 - @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")  
29 - @Trans(type = TransType.SIMPLE, target = IotOtaFirmwareDO.class, fields = {"version"}, refs = {"firmwareVersion"})  
30 - private Long firmwareId;  
31 - /**  
32 - * 固件版本  
33 - */  
34 - @Schema(description = "固件版本", requiredMode = Schema.RequiredMode.REQUIRED, example = "v1.0.0")  
35 - private String firmwareVersion;  
36 - /**  
37 - * 任务编号  
38 - * <p>  
39 - * 关联 {@link IotOtaUpgradeTaskDO#getId()}  
40 - */  
41 - @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")  
42 - private Long taskId;  
43 - /**  
44 - * 产品标识  
45 - * <p>  
46 - * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()}  
47 - */  
48 - @Schema(description = "产品标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "iot")  
49 - private String productKey;  
50 - /**  
51 - * 设备名称  
52 - * <p>  
53 - * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO#getId()}  
54 - */  
55 - @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "iot")  
56 - private String deviceName;  
57 - /**  
58 - * 设备编号  
59 - * <p>  
60 - * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO#getId()}  
61 - */  
62 - @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")  
63 - private String deviceId;  
64 - /**  
65 - * 来源的固件编号  
66 - * <p>  
67 - * 关联 {@link IotDeviceDO#getFirmwareId()}  
68 - */  
69 - @Schema(description = "来源的固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")  
70 - @Trans(type = TransType.SIMPLE, target = IotOtaFirmwareDO.class, fields = {"version"}, refs = {"fromFirmwareVersion"})  
71 - private Long fromFirmwareId;  
72 - /**  
73 - * 来源的固件版本  
74 - */  
75 - @Schema(description = "来源的固件版本", requiredMode = Schema.RequiredMode.REQUIRED, example = "v1.0.0")  
76 - private String fromFirmwareVersion;  
77 - /**  
78 - * 升级状态  
79 - * <p>  
80 - * 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeRecordStatusEnum}  
81 - */  
82 - @Schema(description = "升级状态", requiredMode = Schema.RequiredMode.REQUIRED, allowableValues = {"0", "10", "20", "30", "40", "50"})  
83 - private Integer status;  
84 - /**  
85 - * 升级进度,百分比  
86 - */  
87 - @Schema(description = "升级进度,百分比", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")  
88 - private Integer progress;  
89 - /**  
90 - * 升级进度描述  
91 - * <p>  
92 - * 注意,只记录设备最后一次的升级进度描述  
93 - * 如果想看历史记录,可以查看 {@link IotDeviceMessageDO} 设备日志  
94 - */  
95 - @Schema(description = "升级进度描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")  
96 - private String description;  
97 - /**  
98 - * 升级开始时间  
99 - */  
100 - @Schema(description = "升级开始时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-08 07:30:00")  
101 - private LocalDateTime startTime;  
102 - /**  
103 - * 升级结束时间  
104 - */  
105 - @Schema(description = "升级结束时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-08 07:30:00")  
106 - private LocalDateTime endTime;  
107 -  
108 -}  
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/product/IotProductController.java
@@ -143,7 +143,7 @@ public class IotProductController { @@ -143,7 +143,7 @@ public class IotProductController {
143 143
144 @GetMapping("/simple-list") 144 @GetMapping("/simple-list")
145 @Operation(summary = "获取产品的精简信息列表", description = "主要用于前端的下拉选项") 145 @Operation(summary = "获取产品的精简信息列表", description = "主要用于前端的下拉选项")
146 - public CommonResult<List<IotProductRespVO>> getSimpleProductList() { 146 + public CommonResult<List<IotProductRespVO>> getProductSimpleList() {
147 List<IotProductDO> list = productService.getProductList(); 147 List<IotProductDO> list = productService.getProductList();
148 return success(convertList(list, product -> // 只返回 id、name 字段 148 return success(convertList(list, product -> // 只返回 id、name 字段
149 new IotProductRespVO().setId(product.getId()).setName(product.getName()) 149 new IotProductRespVO().setId(product.getId()).setName(product.getName())
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.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.rule.vo.databridge.IotDataBridgePageReqVO;  
8 -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.IotDataBridgeRespVO;  
9 -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.IotDataBridgeSaveReqVO;  
10 -import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataBridgeDO;  
11 -import cn.iocoder.yudao.module.iot.service.rule.IotDataBridgeService;  
12 -import io.swagger.v3.oas.annotations.Operation;  
13 -import io.swagger.v3.oas.annotations.Parameter;  
14 -import io.swagger.v3.oas.annotations.tags.Tag;  
15 -import jakarta.annotation.Resource;  
16 -import jakarta.validation.Valid;  
17 -import org.springframework.security.access.prepost.PreAuthorize;  
18 -import org.springframework.validation.annotation.Validated;  
19 -import org.springframework.web.bind.annotation.*;  
20 -  
21 -import java.util.List;  
22 -  
23 -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;  
24 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;  
25 -  
26 -@Tag(name = "管理后台 - IoT 数据桥梁")  
27 -@RestController  
28 -@RequestMapping("/iot/data-bridge")  
29 -@Validated  
30 -public class IotDataBridgeController {  
31 -  
32 - @Resource  
33 - private IotDataBridgeService dataBridgeService;  
34 -  
35 - @PostMapping("/create")  
36 - @Operation(summary = "创建数据桥梁")  
37 - @PreAuthorize("@ss.hasPermission('iot:data-bridge:create')")  
38 - public CommonResult<Long> createDataBridge(@Valid @RequestBody IotDataBridgeSaveReqVO createReqVO) {  
39 - return success(dataBridgeService.createDataBridge(createReqVO));  
40 - }  
41 -  
42 - @PutMapping("/update")  
43 - @Operation(summary = "更新数据桥梁")  
44 - @PreAuthorize("@ss.hasPermission('iot:data-bridge:update')")  
45 - public CommonResult<Boolean> updateDataBridge(@Valid @RequestBody IotDataBridgeSaveReqVO updateReqVO) {  
46 - dataBridgeService.updateDataBridge(updateReqVO);  
47 - return success(true);  
48 - }  
49 -  
50 - @DeleteMapping("/delete")  
51 - @Operation(summary = "删除数据桥梁")  
52 - @Parameter(name = "id", description = "编号", required = true)  
53 - @PreAuthorize("@ss.hasPermission('iot:data-bridge:delete')")  
54 - public CommonResult<Boolean> deleteDataBridge(@RequestParam("id") Long id) {  
55 - dataBridgeService.deleteDataBridge(id);  
56 - return success(true);  
57 - }  
58 -  
59 - @GetMapping("/get")  
60 - @Operation(summary = "获得数据桥梁")  
61 - @Parameter(name = "id", description = "编号", required = true, example = "1024")  
62 - @PreAuthorize("@ss.hasPermission('iot:data-bridge:query')")  
63 - public CommonResult<IotDataBridgeRespVO> getDataBridge(@RequestParam("id") Long id) {  
64 - IotDataBridgeDO dataBridge = dataBridgeService.getDataBridge(id);  
65 - return success(BeanUtils.toBean(dataBridge, IotDataBridgeRespVO.class));  
66 - }  
67 -  
68 - @GetMapping("/page")  
69 - @Operation(summary = "获得数据桥梁分页")  
70 - @PreAuthorize("@ss.hasPermission('iot:data-bridge:query')")  
71 - public CommonResult<PageResult<IotDataBridgeRespVO>> getDataBridgePage(@Valid IotDataBridgePageReqVO pageReqVO) {  
72 - PageResult<IotDataBridgeDO> pageResult = dataBridgeService.getDataBridgePage(pageReqVO);  
73 - return success(BeanUtils.toBean(pageResult, IotDataBridgeRespVO.class));  
74 - }  
75 -  
76 - @GetMapping("/simple-list")  
77 - @Operation(summary = "获取数据桥梁的精简信息列表", description = "主要用于前端的下拉选项")  
78 - public CommonResult<List<IotDataBridgeRespVO>> getSimpleDataBridgeList() {  
79 - List<IotDataBridgeDO> list = dataBridgeService.getDataBridgeList(CommonStatusEnum.ENABLE.getStatus());  
80 - return success(convertList(list, dataBridge -> // 只返回 id、name 字段  
81 - new IotDataBridgeRespVO().setId(dataBridge.getId()).setName(dataBridge.getName())));  
82 - }  
83 -  
84 -}  
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 \ No newline at end of file 73 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/IotDataSinkController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.rule;
  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.rule.vo.data.sink.IotDataSinkPageReqVO;
  8 +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.sink.IotDataSinkRespVO;
  9 +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.sink.IotDataSinkSaveReqVO;
  10 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataSinkDO;
  11 +import cn.iocoder.yudao.module.iot.service.rule.data.IotDataSinkService;
  12 +import io.swagger.v3.oas.annotations.Operation;
  13 +import io.swagger.v3.oas.annotations.Parameter;
  14 +import io.swagger.v3.oas.annotations.tags.Tag;
  15 +import jakarta.annotation.Resource;
  16 +import jakarta.validation.Valid;
  17 +import org.springframework.security.access.prepost.PreAuthorize;
  18 +import org.springframework.validation.annotation.Validated;
  19 +import org.springframework.web.bind.annotation.*;
  20 +
  21 +import java.util.List;
  22 +
  23 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  24 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  25 +
  26 +@Tag(name = "管理后台 - IoT 数据流转目的")
  27 +@RestController
  28 +@RequestMapping("/iot/data-sink")
  29 +@Validated
  30 +public class IotDataSinkController {
  31 +
  32 + @Resource
  33 + private IotDataSinkService dataSinkService;
  34 +
  35 + @PostMapping("/create")
  36 + @Operation(summary = "创建数据目的")
  37 + @PreAuthorize("@ss.hasPermission('iot:data-sink:create')")
  38 + public CommonResult<Long> createDataSink(@Valid @RequestBody IotDataSinkSaveReqVO createReqVO) {
  39 + return success(dataSinkService.createDataSink(createReqVO));
  40 + }
  41 +
  42 + @PutMapping("/update")
  43 + @Operation(summary = "更新数据目的")
  44 + @PreAuthorize("@ss.hasPermission('iot:data-sink:update')")
  45 + public CommonResult<Boolean> updateDataSink(@Valid @RequestBody IotDataSinkSaveReqVO updateReqVO) {
  46 + dataSinkService.updateDataSink(updateReqVO);
  47 + return success(true);
  48 + }
  49 +
  50 + @DeleteMapping("/delete")
  51 + @Operation(summary = "删除数据目的")
  52 + @Parameter(name = "id", description = "编号", required = true)
  53 + @PreAuthorize("@ss.hasPermission('iot:data-sink:delete')")
  54 + public CommonResult<Boolean> deleteDataSink(@RequestParam("id") Long id) {
  55 + dataSinkService.deleteDataSink(id);
  56 + return success(true);
  57 + }
  58 +
  59 + @GetMapping("/get")
  60 + @Operation(summary = "获得数据目的")
  61 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  62 + @PreAuthorize("@ss.hasPermission('iot:data-sink:query')")
  63 + public CommonResult<IotDataSinkRespVO> getDataSink(@RequestParam("id") Long id) {
  64 + IotDataSinkDO sink = dataSinkService.getDataSink(id);
  65 + return success(BeanUtils.toBean(sink, IotDataSinkRespVO.class));
  66 + }
  67 +
  68 + @GetMapping("/page")
  69 + @Operation(summary = "获得数据目的分页")
  70 + @PreAuthorize("@ss.hasPermission('iot:data-sink:query')")
  71 + public CommonResult<PageResult<IotDataSinkRespVO>> getDataSinkPage(@Valid IotDataSinkPageReqVO pageReqVO) {
  72 + PageResult<IotDataSinkDO> pageResult = dataSinkService.getDataSinkPage(pageReqVO);
  73 + return success(BeanUtils.toBean(pageResult, IotDataSinkRespVO.class));
  74 + }
  75 +
  76 + @GetMapping("/simple-list")
  77 + @Operation(summary = "获取数据目的的精简信息列表", description = "主要用于前端的下拉选项")
  78 + public CommonResult<List<IotDataSinkRespVO>> getDataSinkSimpleList() {
  79 + List<IotDataSinkDO> list = dataSinkService.getDataSinkListByStatus(CommonStatusEnum.ENABLE.getStatus());
  80 + return success(convertList(list, sink -> // 只返回 id、name 字段
  81 + new IotDataSinkRespVO().setId(sink.getId()).setName(sink.getName())));
  82 + }
  83 +
  84 +}
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/IotRuleSceneController.java
1 package cn.iocoder.yudao.module.iot.controller.admin.rule; 1 package cn.iocoder.yudao.module.iot.controller.admin.rule;
2 2
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -7,7 +8,7 @@ import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleScenePa @@ -7,7 +8,7 @@ import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleScenePa
7 import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleSceneRespVO; 8 import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleSceneRespVO;
8 import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleSceneSaveReqVO; 9 import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleSceneSaveReqVO;
9 import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO; 10 import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
10 -import cn.iocoder.yudao.module.iot.service.rule.IotRuleSceneService; 11 +import cn.iocoder.yudao.module.iot.service.rule.scene.IotRuleSceneService;
11 import io.swagger.v3.oas.annotations.Operation; 12 import io.swagger.v3.oas.annotations.Operation;
12 import io.swagger.v3.oas.annotations.Parameter; 13 import io.swagger.v3.oas.annotations.Parameter;
13 import io.swagger.v3.oas.annotations.tags.Tag; 14 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -18,7 +19,10 @@ import org.springframework.security.access.prepost.PreAuthorize; @@ -18,7 +19,10 @@ import org.springframework.security.access.prepost.PreAuthorize;
18 import org.springframework.validation.annotation.Validated; 19 import org.springframework.validation.annotation.Validated;
19 import org.springframework.web.bind.annotation.*; 20 import org.springframework.web.bind.annotation.*;
20 21
  22 +import java.util.List;
  23 +
21 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 24 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  25 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
22 26
23 @Tag(name = "管理后台 - IoT 场景联动") 27 @Tag(name = "管理后台 - IoT 场景联动")
24 @RestController 28 @RestController
@@ -70,6 +74,14 @@ public class IotRuleSceneController { @@ -70,6 +74,14 @@ public class IotRuleSceneController {
70 return success(BeanUtils.toBean(pageResult, IotRuleSceneRespVO.class)); 74 return success(BeanUtils.toBean(pageResult, IotRuleSceneRespVO.class));
71 } 75 }
72 76
  77 + @GetMapping("/simple-list")
  78 + @Operation(summary = "获取场景联动的精简信息列表", description = "主要用于前端的下拉选项")
  79 + public CommonResult<List<IotRuleSceneRespVO>> getRuleSceneSimpleList() {
  80 + List<IotRuleSceneDO> list = ruleSceneService.getRuleSceneListByStatus(CommonStatusEnum.ENABLE.getStatus());
  81 + return success(convertList(list, scene -> // 只返回 id、name 字段
  82 + new IotRuleSceneRespVO().setId(scene.getId()).setName(scene.getName())));
  83 + }
  84 +
73 @GetMapping("/test") 85 @GetMapping("/test")
74 @PermitAll 86 @PermitAll
75 public void test() { 87 public void test() {
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/data/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data;
0 \ No newline at end of file 2 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/data/rule/IotDataRulePageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.rule;
  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 IotDataRulePageReqVO 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 \ No newline at end of file 27 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/data/rule/IotDataRuleRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.rule;
  2 +
  3 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataRuleDO;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +
  7 +import java.time.LocalDateTime;
  8 +import java.util.List;
  9 +
  10 +@Schema(description = "管理后台 - IoT 数据流转规则 Response VO")
  11 +@Data
  12 +public class IotDataRuleRespVO {
  13 +
  14 + @Schema(description = "数据流转规则编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8540")
  15 + private Long id;
  16 +
  17 + @Schema(description = "数据流转规则名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
  18 + private String name;
  19 +
  20 + @Schema(description = "数据流转规则描述", example = "你猜")
  21 + private String description;
  22 +
  23 + @Schema(description = "数据流转规则状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  24 + private Integer status;
  25 +
  26 + @Schema(description = "数据源配置数组", requiredMode = Schema.RequiredMode.REQUIRED)
  27 + private List<IotDataRuleDO.SourceConfig> sourceConfigs;
  28 +
  29 + @Schema(description = "数据目的编号数组", requiredMode = Schema.RequiredMode.REQUIRED)
  30 + private List<Long> sinkIds;
  31 +
  32 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  33 + private LocalDateTime createTime;
  34 +
  35 +}
0 \ No newline at end of file 36 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/data/rule/IotDataRuleSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.rule;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataRuleDO;
  6 +import io.swagger.v3.oas.annotations.media.Schema;
  7 +import jakarta.validation.constraints.NotEmpty;
  8 +import jakarta.validation.constraints.NotNull;
  9 +import lombok.Data;
  10 +
  11 +import java.util.List;
  12 +
  13 +@Schema(description = "管理后台 - IoT 数据流转规则新增/修改 Request VO")
  14 +@Data
  15 +public class IotDataRuleSaveReqVO {
  16 +
  17 + @Schema(description = "数据流转规则编号", example = "8540")
  18 + private Long id;
  19 +
  20 + @Schema(description = "数据流转规则名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
  21 + @NotEmpty(message = "数据流转规则名称不能为空")
  22 + private String name;
  23 +
  24 + @Schema(description = "数据流转规则描述", example = "你猜")
  25 + private String description;
  26 +
  27 + @Schema(description = "数据流转规则状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  28 + @NotNull(message = "数据流转规则状态不能为空")
  29 + @InEnum(CommonStatusEnum.class)
  30 + private Integer status;
  31 +
  32 + @Schema(description = "数据源配置数组", requiredMode = Schema.RequiredMode.REQUIRED)
  33 + @NotEmpty(message = "数据源配置数组不能为空")
  34 + private List<IotDataRuleDO.SourceConfig> sourceConfigs;
  35 +
  36 + @Schema(description = "数据目的编号数组", requiredMode = Schema.RequiredMode.REQUIRED)
  37 + @NotEmpty(message = "数据目的编号数组不能为空")
  38 + private List<Long> sinkIds;
  39 +
  40 +}
0 \ No newline at end of file 41 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/IotDataBridgePageReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/data/sink/IotDataSinkPageReqVO.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge; 1 +package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.sink;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.common.pojo.PageParam; 4 import cn.iocoder.yudao.framework.common.pojo.PageParam;
@@ -11,14 +11,14 @@ import java.time.LocalDateTime; @@ -11,14 +11,14 @@ import java.time.LocalDateTime;
11 11
12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
13 13
14 -@Schema(description = "管理后台 - IoT 数据桥梁分页 Request VO") 14 +@Schema(description = "管理后台 - IoT 数据流转目的分页 Request VO")
15 @Data 15 @Data
16 -public class IotDataBridgePageReqVO extends PageParam { 16 +public class IotDataSinkPageReqVO extends PageParam {
17 17
18 - @Schema(description = "桥梁名称", example = "赵六") 18 + @Schema(description = "数据目的名称", example = "赵六")
19 private String name; 19 private String name;
20 20
21 - @Schema(description = "桥梁状态", example = "1") 21 + @Schema(description = "数据目的状态", example = "2")
22 @InEnum(CommonStatusEnum.class) 22 @InEnum(CommonStatusEnum.class)
23 private Integer status; 23 private Integer status;
24 24
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/data/sink/IotDataSinkRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.sink;
  2 +
  3 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.config.IotAbstractDataSinkConfig;
  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 IotDataSinkRespVO {
  12 +
  13 + @Schema(description = "数据目的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18564")
  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 status;
  24 +
  25 + @Schema(description = "数据目的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  26 + private Integer type;
  27 +
  28 + @Schema(description = "数据目的配置")
  29 + private IotAbstractDataSinkConfig config;
  30 +
  31 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  32 + private LocalDateTime createTime;
  33 +
  34 +}
0 \ No newline at end of file 35 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/data/sink/IotDataSinkSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.sink;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.config.IotAbstractDataSinkConfig;
  6 +import cn.iocoder.yudao.module.iot.enums.rule.IotDataSinkTypeEnum;
  7 +import io.swagger.v3.oas.annotations.media.Schema;
  8 +import jakarta.validation.constraints.NotEmpty;
  9 +import jakarta.validation.constraints.NotNull;
  10 +import lombok.Data;
  11 +
  12 +@Schema(description = "管理后台 - IoT 数据流转目的新增/修改 Request VO")
  13 +@Data
  14 +public class IotDataSinkSaveReqVO {
  15 +
  16 + @Schema(description = "数据目的编号", example = "18564")
  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 + @InEnum(CommonStatusEnum.class)
  29 + private Integer status;
  30 +
  31 + @Schema(description = "数据目的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  32 + @NotNull(message = "数据目的类型不能为空")
  33 + @InEnum(IotDataSinkTypeEnum.class)
  34 + private Integer type;
  35 +
  36 + @Schema(description = "数据目的配置")
  37 + @NotNull(message = "数据目的配置不能为空")
  38 + private IotAbstractDataSinkConfig config;
  39 +
  40 +}
0 \ No newline at end of file 41 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/IotDataBridgeRespVO.java deleted
1 -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge;  
2 -  
3 -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config.IotDataBridgeAbstractConfig;  
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 IotDataBridgeRespVO {  
12 -  
13 - @Schema(description = "桥梁编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18564")  
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 status;  
24 -  
25 - @Schema(description = "桥梁方向", requiredMode = Schema.RequiredMode.REQUIRED)  
26 - private Integer direction;  
27 -  
28 - @Schema(description = "桥梁类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
29 - private Integer type;  
30 -  
31 - @Schema(description = "桥梁配置")  
32 - private IotDataBridgeAbstractConfig config;  
33 -  
34 - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)  
35 - private LocalDateTime createTime;  
36 -  
37 -}  
38 \ No newline at end of file 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/vo/databridge/IotDataBridgeSaveReqVO.java deleted
1 -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge;  
2 -  
3 -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;  
4 -import cn.iocoder.yudao.framework.common.validation.InEnum;  
5 -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config.IotDataBridgeAbstractConfig;  
6 -import cn.iocoder.yudao.module.iot.enums.rule.IotDataBridgeDirectionEnum;  
7 -import cn.iocoder.yudao.module.iot.enums.rule.IotDataBridgeTypeEnum;  
8 -import io.swagger.v3.oas.annotations.media.Schema;  
9 -import jakarta.validation.constraints.NotEmpty;  
10 -import jakarta.validation.constraints.NotNull;  
11 -import lombok.Data;  
12 -  
13 -@Schema(description = "管理后台 - IoT 数据桥梁新增/修改 Request VO")  
14 -@Data  
15 -public class IotDataBridgeSaveReqVO {  
16 -  
17 - @Schema(description = "桥梁编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18564")  
18 - private Long id;  
19 -  
20 - @Schema(description = "桥梁名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")  
21 - @NotEmpty(message = "桥梁名称不能为空")  
22 - private String name;  
23 -  
24 - @Schema(description = "桥梁描述", example = "随便")  
25 - private String description;  
26 -  
27 - @Schema(description = "桥梁状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")  
28 - @NotNull(message = "桥梁状态不能为空")  
29 - @InEnum(CommonStatusEnum.class)  
30 - private Integer status;  
31 -  
32 - @Schema(description = "桥梁方向", requiredMode = Schema.RequiredMode.REQUIRED)  
33 - @NotNull(message = "桥梁方向不能为空")  
34 - @InEnum(IotDataBridgeDirectionEnum.class)  
35 - private Integer direction;  
36 -  
37 - @Schema(description = "桥梁类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
38 - @NotNull(message = "桥梁类型不能为空")  
39 - @InEnum(IotDataBridgeTypeEnum.class)  
40 - private Integer type;  
41 -  
42 - @Schema(description = "桥梁配置")  
43 - @NotNull(message = "桥梁配置不能为空")  
44 - private IotDataBridgeAbstractConfig config;  
45 -  
46 -}  
47 \ No newline at end of file 0 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/IotThingModelController.java
1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel; 1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel;
2 2
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.hutool.core.util.ObjUtil;  
5 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
8 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.*; 6 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.*;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
9 import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO; 8 import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO;
10 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum; 9 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum;
  10 +import cn.iocoder.yudao.module.iot.service.product.IotProductService;
11 import cn.iocoder.yudao.module.iot.service.thingmodel.IotThingModelService; 11 import cn.iocoder.yudao.module.iot.service.thingmodel.IotThingModelService;
  12 +import com.google.common.base.Objects;
12 import io.swagger.v3.oas.annotations.Operation; 13 import io.swagger.v3.oas.annotations.Operation;
13 import io.swagger.v3.oas.annotations.Parameter; 14 import io.swagger.v3.oas.annotations.Parameter;
14 import io.swagger.v3.oas.annotations.tags.Tag; 15 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -32,6 +33,8 @@ public class IotThingModelController { @@ -32,6 +33,8 @@ public class IotThingModelController {
32 33
33 @Resource 34 @Resource
34 private IotThingModelService thingModelService; 35 private IotThingModelService thingModelService;
  36 + @Resource
  37 + private IotProductService productService;
35 38
36 @PostMapping("/create") 39 @PostMapping("/create")
37 @Operation(summary = "创建产品物模型") 40 @Operation(summary = "创建产品物模型")
@@ -71,23 +74,21 @@ public class IotThingModelController { @@ -71,23 +74,21 @@ public class IotThingModelController {
71 @Parameter(name = "productId", description = "产品 ID", required = true, example = "1024") 74 @Parameter(name = "productId", description = "产品 ID", required = true, example = "1024")
72 @PreAuthorize("@ss.hasPermission('iot:thing-model:query')") 75 @PreAuthorize("@ss.hasPermission('iot:thing-model:query')")
73 public CommonResult<IotThingModelTSLRespVO> getThingModelTsl(@RequestParam("productId") Long productId) { 76 public CommonResult<IotThingModelTSLRespVO> getThingModelTsl(@RequestParam("productId") Long productId) {
74 - IotThingModelTSLRespVO tslRespVO = new IotThingModelTSLRespVO();  
75 - // TODO @puhui999:是不是要先查询产品哈?原因是,万一没配置物模型,但是产品已经有了!  
76 - // 1. 获得产品所有物模型定义  
77 - List<IotThingModelDO> thingModels = thingModelService.getThingModelListByProductId(productId);  
78 - if (CollUtil.isEmpty(thingModels)) {  
79 - return success(tslRespVO); 77 + // 1. 获得产品
  78 + IotProductDO product = productService.getProduct(productId);
  79 + if (product == null) {
  80 + return success(null);
80 } 81 }
81 -  
82 - // 2. 设置公共部分参数  
83 - IotThingModelDO thingModel = thingModels.get(0);  
84 - tslRespVO.setProductId(thingModel.getProductId()).setProductKey(thingModel.getProductKey()); 82 + IotThingModelTSLRespVO tslRespVO = new IotThingModelTSLRespVO()
  83 + .setProductId(product.getId()).setProductKey(product.getProductKey());
  84 + // 2. 获得物模型定义
  85 + List<IotThingModelDO> thingModels = thingModelService.getThingModelListByProductId(productId);
85 tslRespVO.setProperties(convertList(filterList(thingModels, item -> 86 tslRespVO.setProperties(convertList(filterList(thingModels, item ->
86 - ObjUtil.equal(IotThingModelTypeEnum.PROPERTY.getType(), item.getType())), IotThingModelDO::getProperty));  
87 - tslRespVO.setServices(convertList(filterList(thingModels, item ->  
88 - ObjUtil.equal(IotThingModelTypeEnum.SERVICE.getType(), item.getType())), IotThingModelDO::getService));  
89 - tslRespVO.setEvents(convertList(filterList(thingModels, item ->  
90 - ObjUtil.equal(IotThingModelTypeEnum.EVENT.getType(), item.getType())), IotThingModelDO::getEvent)); 87 + Objects.equal(IotThingModelTypeEnum.PROPERTY.getType(), item.getType())), IotThingModelDO::getProperty))
  88 + .setServices(convertList(filterList(thingModels, item ->
  89 + Objects.equal(IotThingModelTypeEnum.SERVICE.getType(), item.getType())), IotThingModelDO::getService))
  90 + .setEvents(convertList(filterList(thingModels, item ->
  91 + Objects.equal(IotThingModelTypeEnum.EVENT.getType(), item.getType())), IotThingModelDO::getEvent));
91 return success(tslRespVO); 92 return success(tslRespVO);
92 } 93 }
93 94
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelRespVO.java
1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo; 1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo;
2 2
3 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelEvent;  
4 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelProperty;  
5 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelService; 3 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelEvent;
  4 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelProperty;
  5 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelService;
6 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
7 import lombok.Data; 7 import lombok.Data;
8 8
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelSaveReqVO.java
1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo; 1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelEvent;  
5 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelProperty;  
6 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelService; 4 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelEvent;
  5 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelProperty;
  6 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelService;
7 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum; 7 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum;
8 import io.swagger.v3.oas.annotations.media.Schema; 8 import io.swagger.v3.oas.annotations.media.Schema;
9 import jakarta.validation.Valid; 9 import jakarta.validation.Valid;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelTSLRespVO.java
1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo; 1 package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo;
2 2
3 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelEvent;  
4 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelProperty;  
5 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelService; 3 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelEvent;
  4 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelProperty;
  5 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelService;
6 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
7 import lombok.Data; 7 import lombok.Data;
8 8
@@ -12,7 +12,7 @@ import java.util.List; @@ -12,7 +12,7 @@ import java.util.List;
12 @Data 12 @Data
13 public class IotThingModelTSLRespVO { 13 public class IotThingModelTSLRespVO {
14 14
15 - @Schema(description = "产品标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 15 + @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
16 private Long productId; 16 private Long productId;
17 17
18 @Schema(description = "产品标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "temperature_sensor") 18 @Schema(description = "产品标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "temperature_sensor")
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/convert/thingmodel/IotThingModelConvert.java
1 package cn.iocoder.yudao.module.iot.convert.thingmodel; 1 package cn.iocoder.yudao.module.iot.convert.thingmodel;
2 2
3 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelEvent;  
4 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelProperty;  
5 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelService; 3 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelEvent;
  4 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelProperty;
  5 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelService;
6 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.IotThingModelSaveReqVO; 6 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.IotThingModelSaveReqVO;
7 import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO; 7 import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO;
8 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum; 8 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotAlertConfig.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/alert/IotAlertConfigDO.java
1 -package cn.iocoder.yudao.module.iot.dal.dataobject.rule; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.alert;
2 2
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.module.iot.enums.rule.IotAlertConfigReceiveTypeEnum; 5 +import cn.iocoder.yudao.framework.mybatis.core.type.IntegerListTypeHandler;
  6 +import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
  8 +import cn.iocoder.yudao.module.iot.enums.DictTypeConstants;
  9 +import cn.iocoder.yudao.module.iot.enums.alert.IotAlertReceiveTypeEnum;
5 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 10 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
6 import com.baomidou.mybatisplus.annotation.KeySequence; 11 import com.baomidou.mybatisplus.annotation.KeySequence;
7 import com.baomidou.mybatisplus.annotation.TableField; 12 import com.baomidou.mybatisplus.annotation.TableField;
8 import com.baomidou.mybatisplus.annotation.TableId; 13 import com.baomidou.mybatisplus.annotation.TableId;
9 import com.baomidou.mybatisplus.annotation.TableName; 14 import com.baomidou.mybatisplus.annotation.TableName;
10 -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;  
11 -import lombok.*; 15 +import lombok.AllArgsConstructor;
  16 +import lombok.Builder;
  17 +import lombok.Data;
  18 +import lombok.NoArgsConstructor;
12 19
13 import java.util.List; 20 import java.util.List;
14 21
@@ -17,13 +24,13 @@ import java.util.List; @@ -17,13 +24,13 @@ import java.util.List;
17 * 24 *
18 * @author 芋道源码 25 * @author 芋道源码
19 */ 26 */
20 -@TableName("iot_alert_config") 27 +@TableName(value = "iot_alert_config", autoResultMap = true)
21 @KeySequence("iot_alert_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 28 @KeySequence("iot_alert_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
22 @Data 29 @Data
23 @Builder 30 @Builder
24 @NoArgsConstructor 31 @NoArgsConstructor
25 @AllArgsConstructor 32 @AllArgsConstructor
26 -public class IotAlertConfig extends BaseDO { 33 +public class IotAlertConfigDO extends BaseDO {
27 34
28 /** 35 /**
29 * 配置编号 36 * 配置编号
@@ -41,37 +48,37 @@ public class IotAlertConfig extends BaseDO { @@ -41,37 +48,37 @@ public class IotAlertConfig extends BaseDO {
41 /** 48 /**
42 * 配置状态 49 * 配置状态
43 * 50 *
44 - * TODO 数据字典 51 + * 字典 {@link DictTypeConstants#ALERT_LEVEL}
45 */ 52 */
46 private Integer level; 53 private Integer level;
47 /** 54 /**
48 * 配置状态 55 * 配置状态
49 * 56 *
50 - * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} 57 + * 枚举 {@link CommonStatusEnum}
51 */ 58 */
52 private Integer status; 59 private Integer status;
53 60
54 /** 61 /**
55 - * 关联的规则场景编号数组 62 + * 关联的场景联动规则编号数组
56 * 63 *
57 * 关联 {@link IotRuleSceneDO#getId()} 64 * 关联 {@link IotRuleSceneDO#getId()}
58 */ 65 */
59 - @TableField(typeHandler = JacksonTypeHandler.class)  
60 - private List<Long> ruleSceneIds; 66 + @TableField(typeHandler = LongListTypeHandler.class)
  67 + private List<Long> sceneRuleIds;
61 68
62 /** 69 /**
63 * 接收的用户编号数组 70 * 接收的用户编号数组
64 * 71 *
65 * 关联 {@link AdminUserRespDTO#getId()} 72 * 关联 {@link AdminUserRespDTO#getId()}
66 */ 73 */
67 - @TableField(typeHandler = JacksonTypeHandler.class) 74 + @TableField(typeHandler = LongListTypeHandler.class)
68 private List<Long> receiveUserIds; 75 private List<Long> receiveUserIds;
69 /** 76 /**
70 * 接收的类型数组 77 * 接收的类型数组
71 * 78 *
72 - * 枚举 {@link IotAlertConfigReceiveTypeEnum} 79 + * 枚举 {@link IotAlertReceiveTypeEnum}
73 */ 80 */
74 - @TableField(typeHandler = JacksonTypeHandler.class) 81 + @TableField(typeHandler = IntegerListTypeHandler.class)
75 private List<Integer> receiveTypes; 82 private List<Integer> receiveTypes;
76 83
77 } 84 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotAlertRecordDO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/alert/IotAlertRecordDO.java
1 -package cn.iocoder.yudao.module.iot.dal.dataobject.rule; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.alert;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage; 4 import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
5 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; 5 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
6 import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; 6 import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
7 import com.baomidou.mybatisplus.annotation.KeySequence; 8 import com.baomidou.mybatisplus.annotation.KeySequence;
8 import com.baomidou.mybatisplus.annotation.TableField; 9 import com.baomidou.mybatisplus.annotation.TableField;
  10 +import com.baomidou.mybatisplus.annotation.TableId;
9 import com.baomidou.mybatisplus.annotation.TableName; 11 import com.baomidou.mybatisplus.annotation.TableName;
10 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; 12 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
11 import lombok.AllArgsConstructor; 13 import lombok.AllArgsConstructor;
@@ -18,7 +20,7 @@ import lombok.NoArgsConstructor; @@ -18,7 +20,7 @@ import lombok.NoArgsConstructor;
18 * 20 *
19 * @author 芋道源码 21 * @author 芋道源码
20 */ 22 */
21 -@TableName("iot_alert_record") 23 +@TableName(value = "iot_alert_record", autoResultMap = true)
22 @KeySequence("iot_alert_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 24 @KeySequence("iot_alert_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
23 @Data 25 @Data
24 @Builder 26 @Builder
@@ -29,47 +31,54 @@ public class IotAlertRecordDO extends BaseDO { @@ -29,47 +31,54 @@ public class IotAlertRecordDO extends BaseDO {
29 /** 31 /**
30 * 记录编号 32 * 记录编号
31 */ 33 */
32 - @TableField 34 + @TableId
33 private Long id; 35 private Long id;
34 /** 36 /**
35 * 告警名称 37 * 告警名称
36 * 38 *
37 - * 冗余 {@link IotAlertConfig#getName()} 39 + * 冗余 {@link IotAlertConfigDO#getId()}
38 */ 40 */
39 private Long configId; 41 private Long configId;
40 /** 42 /**
41 * 告警名称 43 * 告警名称
42 * 44 *
43 - * 冗余 {@link IotAlertConfig#getName()} 45 + * 冗余 {@link IotAlertConfigDO#getName()}
44 */ 46 */
45 - private String name;  
46 - 47 + private String configName;
47 /** 48 /**
48 - * 产品标识 49 + * 告警级别
49 * 50 *
50 - * 关联 {@link IotProductDO#getProductKey()} ()} 51 + * 冗余 {@link IotAlertConfigDO#getLevel()}
  52 + * 字典 {@link cn.iocoder.yudao.module.iot.enums.DictTypeConstants#ALERT_LEVEL}
51 */ 53 */
52 - private String productKey; 54 + private Integer configLevel;
53 /** 55 /**
54 - * 设备名称 56 + * 场景规则编号
55 * 57 *
56 - * 冗余 {@link IotDeviceDO#getDeviceName()} 58 + * 关联 {@link IotRuleSceneDO#getId()}
57 */ 59 */
58 - private String deviceName; 60 + private Long sceneRuleId;
59 61
60 - // TODO @芋艿:有没更好的方式 62 + /**
  63 + * 产品编号
  64 + *
  65 + * 关联 {@link IotProductDO#getId()}
  66 + */
  67 + private Long productId;
  68 + /**
  69 + * 设备编号
  70 + *
  71 + * 关联 {@link IotDeviceDO#getId()}
  72 + */
  73 + private Long deviceId;
61 /** 74 /**
62 * 触发的设备消息 75 * 触发的设备消息
63 */ 76 */
64 @TableField(typeHandler = JacksonTypeHandler.class) 77 @TableField(typeHandler = JacksonTypeHandler.class)
65 private IotDeviceMessage deviceMessage; 78 private IotDeviceMessage deviceMessage;
66 79
67 - // TODO @芋艿:换成枚举,枚举对应 ApiErrorLogProcessStatusEnum  
68 /** 80 /**
69 - * 处理状态  
70 - *  
71 - * true - 已处理  
72 - * false - 未处理 81 + * 是否处理
73 */ 82 */
74 private Boolean processStatus; 83 private Boolean processStatus;
75 /** 84 /**
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/IotDeviceDO.java
@@ -29,6 +29,11 @@ import java.util.Set; @@ -29,6 +29,11 @@ import java.util.Set;
29 public class IotDeviceDO extends TenantBaseDO { 29 public class IotDeviceDO extends TenantBaseDO {
30 30
31 /** 31 /**
  32 + * 设备编号 - 全部设备
  33 + */
  34 + public static final Long DEVICE_ID_ALL = 0L;
  35 +
  36 + /**
32 * 设备 ID,主键,自增 37 * 设备 ID,主键,自增
33 */ 38 */
34 @TableId 39 @TableId
@@ -112,7 +117,7 @@ public class IotDeviceDO extends TenantBaseDO { @@ -112,7 +117,7 @@ public class IotDeviceDO extends TenantBaseDO {
112 * 117 *
113 * 关联 {@link IotOtaFirmwareDO#getId()} 118 * 关联 {@link IotOtaFirmwareDO#getId()}
114 */ 119 */
115 - private String firmwareId; 120 + private Long firmwareId;
116 121
117 /** 122 /**
118 * 设备密钥,用于设备认证 123 * 设备密钥,用于设备认证
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaFirmwareDO.java
1 package cn.iocoder.yudao.module.iot.dal.dataobject.ota; 1 package cn.iocoder.yudao.module.iot.dal.dataobject.ota;
2 2
  3 +import cn.hutool.crypto.digest.DigestAlgorithm;
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import com.baomidou.mybatisplus.annotation.KeySequence; 5 import com.baomidou.mybatisplus.annotation.KeySequence;
5 -import com.baomidou.mybatisplus.annotation.TableField; 6 +import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
7 -import lombok.*; 8 +import lombok.AllArgsConstructor;
  9 +import lombok.Builder;
  10 +import lombok.Data;
  11 +import lombok.NoArgsConstructor;
8 12
9 /** 13 /**
10 * IoT OTA 固件 DO 14 * IoT OTA 固件 DO
@@ -24,14 +28,14 @@ public class IotOtaFirmwareDO extends BaseDO { @@ -24,14 +28,14 @@ public class IotOtaFirmwareDO extends BaseDO {
24 /** 28 /**
25 * 固件编号 29 * 固件编号
26 */ 30 */
27 - @TableField 31 + @TableId
28 private Long id; 32 private Long id;
29 /** 33 /**
30 * 固件名称 34 * 固件名称
31 */ 35 */
32 private String name; 36 private String name;
33 /** 37 /**
34 - * 固件版本 38 + * 固件描述
35 */ 39 */
36 private String description; 40 private String description;
37 /** 41 /**
@@ -44,37 +48,25 @@ public class IotOtaFirmwareDO extends BaseDO { @@ -44,37 +48,25 @@ public class IotOtaFirmwareDO extends BaseDO {
44 * 48 *
45 * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()} 49 * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()}
46 */ 50 */
47 - // TODO @li:帮我改成 Long 哈,写错了  
48 - private String productId;  
49 - /**  
50 - * 产品标识  
51 - *  
52 - * 冗余 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getProductKey()}  
53 - */  
54 - private String productKey; 51 + private Long productId;
55 52
56 /** 53 /**
57 - * 签名方式  
58 - *  
59 - * 例如说:MD5、SHA256  
60 - */  
61 - private String signMethod;  
62 - /**  
63 - * 固件文件签名 54 + * 固件文件 URL
64 */ 55 */
65 - private String fileSign; 56 + private String fileUrl;
66 /** 57 /**
67 * 固件文件大小 58 * 固件文件大小
68 */ 59 */
69 private Long fileSize; 60 private Long fileSize;
70 /** 61 /**
71 - * 固件文件 URL 62 + * 固件文件签名算法
  63 + *
  64 + * 枚举 {@link DigestAlgorithm},目前只使用 MD5
72 */ 65 */
73 - private String fileUrl;  
74 - 66 + private String fileDigestAlgorithm;
75 /** 67 /**
76 - * 自定义信息,建议使用 JSON 格式 68 + * 固件文件签名结果
77 */ 69 */
78 - private String information; 70 + private String fileDigestValue;
79 71
80 } 72 }
81 \ No newline at end of file 73 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaUpgradeTaskDO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaTaskDO.java
1 package cn.iocoder.yudao.module.iot.dal.dataobject.ota; 1 package cn.iocoder.yudao.module.iot.dal.dataobject.ota;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; 4 +import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskDeviceScopeEnum;
  5 +import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskStatusEnum;
5 import com.baomidou.mybatisplus.annotation.KeySequence; 6 import com.baomidou.mybatisplus.annotation.KeySequence;
6 -import com.baomidou.mybatisplus.annotation.TableField; 7 +import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 8 import com.baomidou.mybatisplus.annotation.TableName;
8 -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;  
9 -import lombok.*;  
10 -  
11 -import java.util.List; 9 +import lombok.AllArgsConstructor;
  10 +import lombok.Builder;
  11 +import lombok.Data;
  12 +import lombok.NoArgsConstructor;
12 13
13 /** 14 /**
14 * IoT OTA 升级任务 DO 15 * IoT OTA 升级任务 DO
15 * 16 *
16 * @author 芋道源码 17 * @author 芋道源码
17 */ 18 */
18 -@TableName(value = "iot_ota_upgrade_task", autoResultMap = true)  
19 -@KeySequence("iot_ota_upgrade_task_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 19 +@TableName(value = "iot_ota_task", autoResultMap = true)
  20 +@KeySequence("iot_ota_task_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
20 @Data 21 @Data
21 @Builder 22 @Builder
22 @NoArgsConstructor 23 @NoArgsConstructor
23 @AllArgsConstructor 24 @AllArgsConstructor
24 -public class IotOtaUpgradeTaskDO extends BaseDO { 25 +public class IotOtaTaskDO extends BaseDO {
25 26
26 /** 27 /**
27 * 任务编号 28 * 任务编号
28 */ 29 */
29 - @TableField 30 + @TableId
30 private Long id; 31 private Long id;
31 /** 32 /**
32 * 任务名称 33 * 任务名称
@@ -47,26 +48,23 @@ public class IotOtaUpgradeTaskDO extends BaseDO { @@ -47,26 +48,23 @@ public class IotOtaUpgradeTaskDO extends BaseDO {
47 /** 48 /**
48 * 任务状态 49 * 任务状态
49 * <p> 50 * <p>
50 - * 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskStatusEnum} 51 + * 关联 {@link IotOtaTaskStatusEnum}
51 */ 52 */
52 private Integer status; 53 private Integer status;
53 54
54 /** 55 /**
55 - * 升级范围 56 + * 设备升级范围
56 * <p> 57 * <p>
57 - * 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskScopeEnum} 58 + * 关联 {@link IotOtaTaskDeviceScopeEnum}
58 */ 59 */
59 - private Integer scope; 60 + private Integer deviceScope;
60 /** 61 /**
61 - * 设备数量 62 + * 设备总数数量
62 */ 63 */
63 - private Long deviceCount; 64 + private Integer deviceTotalCount;
64 /** 65 /**
65 - * 选中的设备编号数组  
66 - * <p>  
67 - * 关联 {@link IotDeviceDO#getId()} 66 + * 设备成功数量
68 */ 67 */
69 - @TableField(typeHandler = JacksonTypeHandler.class)  
70 - private List<Long> deviceIds; 68 + private Integer deviceSuccessCount;
71 69
72 } 70 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaUpgradeRecordDO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaTaskRecordDO.java
@@ -3,25 +3,27 @@ package cn.iocoder.yudao.module.iot.dal.dataobject.ota; @@ -3,25 +3,27 @@ package cn.iocoder.yudao.module.iot.dal.dataobject.ota;
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; 4 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
5 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO; 5 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO;
  6 +import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskRecordStatusEnum;
6 import com.baomidou.mybatisplus.annotation.KeySequence; 7 import com.baomidou.mybatisplus.annotation.KeySequence;
7 import com.baomidou.mybatisplus.annotation.TableId; 8 import com.baomidou.mybatisplus.annotation.TableId;
8 import com.baomidou.mybatisplus.annotation.TableName; 9 import com.baomidou.mybatisplus.annotation.TableName;
9 -import lombok.*;  
10 -  
11 -import java.time.LocalDateTime; 10 +import lombok.AllArgsConstructor;
  11 +import lombok.Builder;
  12 +import lombok.Data;
  13 +import lombok.NoArgsConstructor;
12 14
13 /** 15 /**
14 - * IoT OTA 升级记录 DO 16 + * IoT OTA 升级任务记录 DO
15 * 17 *
16 * @author 芋道源码 18 * @author 芋道源码
17 */ 19 */
18 -@TableName(value = "iot_ota_upgrade_record", autoResultMap = true)  
19 -@KeySequence("iot_ota_upgrade_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 20 +@TableName(value = "iot_ota_task_record", autoResultMap = true)
  21 +@KeySequence("iot_ota_task_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
20 @Data 22 @Data
21 @Builder 23 @Builder
22 @NoArgsConstructor 24 @NoArgsConstructor
23 @AllArgsConstructor 25 @AllArgsConstructor
24 -public class IotOtaUpgradeRecordDO extends BaseDO { 26 +public class IotOtaTaskRecordDO extends BaseDO {
25 27
26 @TableId 28 @TableId
27 private Long id; 29 private Long id;
@@ -35,28 +37,16 @@ public class IotOtaUpgradeRecordDO extends BaseDO { @@ -35,28 +37,16 @@ public class IotOtaUpgradeRecordDO extends BaseDO {
35 /** 37 /**
36 * 任务编号 38 * 任务编号
37 * 39 *
38 - * 关联 {@link IotOtaUpgradeTaskDO#getId()} 40 + * 关联 {@link IotOtaTaskDO#getId()}
39 */ 41 */
40 private Long taskId; 42 private Long taskId;
41 43
42 /** 44 /**
43 - * 产品标识  
44 - *  
45 - * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()}  
46 - */  
47 - private String productKey;  
48 - /**  
49 - * 设备名称  
50 - *  
51 - * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO#getId()}  
52 - */  
53 - private String deviceName;  
54 - /**  
55 * 设备编号 45 * 设备编号
56 * 46 *
57 - * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO#getId()} 47 + * 关联 {@link IotDeviceDO#getId()}
58 */ 48 */
59 - private String deviceId; 49 + private Long deviceId;
60 /** 50 /**
61 * 来源的固件编号 51 * 来源的固件编号
62 * 52 *
@@ -67,7 +57,7 @@ public class IotOtaUpgradeRecordDO extends BaseDO { @@ -67,7 +57,7 @@ public class IotOtaUpgradeRecordDO extends BaseDO {
67 /** 57 /**
68 * 升级状态 58 * 升级状态
69 * 59 *
70 - * 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeRecordStatusEnum} 60 + * 关联 {@link IotOtaTaskRecordStatusEnum}
71 */ 61 */
72 private Integer status; 62 private Integer status;
73 /** 63 /**
@@ -81,13 +71,5 @@ public class IotOtaUpgradeRecordDO extends BaseDO { @@ -81,13 +71,5 @@ public class IotOtaUpgradeRecordDO extends BaseDO {
81 * 如果想看历史记录,可以查看 {@link IotDeviceMessageDO} 设备日志 71 * 如果想看历史记录,可以查看 {@link IotDeviceMessageDO} 设备日志
82 */ 72 */
83 private String description; 73 private String description;
84 - /**  
85 - * 升级开始时间  
86 - */  
87 - private LocalDateTime startTime;  
88 - /**  
89 - * 升级结束时间  
90 - */  
91 - private LocalDateTime endTime;  
92 74
93 } 75 }
94 \ No newline at end of file 76 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotDataRuleDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.dal.dataobject.rule;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  5 +import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
  6 +import cn.iocoder.yudao.module.iot.core.enums.IotDeviceMessageMethodEnum;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
  8 +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
  9 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO;
  10 +import com.baomidou.mybatisplus.annotation.KeySequence;
  11 +import com.baomidou.mybatisplus.annotation.TableField;
  12 +import com.baomidou.mybatisplus.annotation.TableName;
  13 +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
  14 +import jakarta.validation.constraints.NotEmpty;
  15 +import lombok.AllArgsConstructor;
  16 +import lombok.Builder;
  17 +import lombok.Data;
  18 +import lombok.NoArgsConstructor;
  19 +
  20 +import java.util.List;
  21 +
  22 +/**
  23 + * IoT 数据流转规则 DO
  24 + *
  25 + * 监听 {@link SourceConfig} 数据源,转发到 {@link IotDataSinkDO} 数据目的
  26 + *
  27 + * @author 芋道源码
  28 + */
  29 +@TableName(value = "iot_data_rule", autoResultMap = true)
  30 +@KeySequence("iot_data_rule_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  31 +@Data
  32 +@Builder
  33 +@NoArgsConstructor
  34 +@AllArgsConstructor
  35 +public class IotDataRuleDO extends BaseDO {
  36 +
  37 + /**
  38 + * 数据流转规格编号
  39 + */
  40 + private Long id;
  41 + /**
  42 + * 数据流转规格名称
  43 + */
  44 + private String name;
  45 + /**
  46 + * 数据流转规格描述
  47 + */
  48 + private String description;
  49 + /**
  50 + * 数据流转规格状态
  51 + *
  52 + * 枚举 {@link CommonStatusEnum}
  53 + */
  54 + private Integer status;
  55 +
  56 + /**
  57 + * 数据源配置数组
  58 + */
  59 + @TableField(typeHandler = JacksonTypeHandler.class)
  60 + private List<SourceConfig> sourceConfigs;
  61 + /**
  62 + * 数据目的编号数组
  63 + *
  64 + * 关联 {@link IotDataSinkDO#getId()}
  65 + */
  66 + @TableField(typeHandler = LongListTypeHandler.class)
  67 + private List<Long> sinkIds;
  68 +
  69 + // TODO @芋艿:未来考虑使用 groovy;支持数据处理;
  70 +
  71 + /**
  72 + * 数据源配置
  73 + */
  74 + @Data
  75 + public static class SourceConfig {
  76 +
  77 + /**
  78 + * 消息方法
  79 + *
  80 + * 枚举 {@link IotDeviceMessageMethodEnum} 中的 upstream 上行部分
  81 + */
  82 + @NotEmpty(message = "消息方法不能为空")
  83 + private String method;
  84 +
  85 + /**
  86 + * 产品编号
  87 + *
  88 + * 关联 {@link IotProductDO#getId()}
  89 + */
  90 + private Long productId;
  91 + /**
  92 + * 设备编号
  93 + *
  94 + * 关联 {@link IotDeviceDO#getId()}
  95 + * 特殊:如果为 {@link IotDeviceDO#DEVICE_ID_ALL} 时,则是全部设备
  96 + */
  97 + @NotEmpty(message = "设备编号不能为空")
  98 + private Long deviceId;
  99 +
  100 + /**
  101 + * 标识符
  102 + *
  103 + * 1. 物模型时,对应:{@link IotThingModelDO#getIdentifier()}
  104 + */
  105 + private String identifier;
  106 +
  107 + }
  108 +
  109 +}
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotDataBridgeDO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotDataSinkDO.java
@@ -2,66 +2,61 @@ package cn.iocoder.yudao.module.iot.dal.dataobject.rule; @@ -2,66 +2,61 @@ package cn.iocoder.yudao.module.iot.dal.dataobject.rule;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5 -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config.IotDataBridgeAbstractConfig;  
6 -import cn.iocoder.yudao.module.iot.enums.rule.IotDataBridgeDirectionEnum;  
7 -import cn.iocoder.yudao.module.iot.enums.rule.IotDataBridgeTypeEnum; 5 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.config.IotAbstractDataSinkConfig;
  6 +import cn.iocoder.yudao.module.iot.enums.rule.IotDataSinkTypeEnum;
8 import com.baomidou.mybatisplus.annotation.KeySequence; 7 import com.baomidou.mybatisplus.annotation.KeySequence;
9 import com.baomidou.mybatisplus.annotation.TableField; 8 import com.baomidou.mybatisplus.annotation.TableField;
10 import com.baomidou.mybatisplus.annotation.TableId; 9 import com.baomidou.mybatisplus.annotation.TableId;
11 import com.baomidou.mybatisplus.annotation.TableName; 10 import com.baomidou.mybatisplus.annotation.TableName;
12 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; 11 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
13 -import lombok.*; 12 +import lombok.AllArgsConstructor;
  13 +import lombok.Builder;
  14 +import lombok.Data;
  15 +import lombok.NoArgsConstructor;
14 16
15 /** 17 /**
16 - * IoT 数据桥梁 DO 18 + * IoT 数据流转目的 DO
17 * 19 *
18 * @author 芋道源码 20 * @author 芋道源码
19 */ 21 */
20 -@TableName(value = "iot_data_bridge", autoResultMap = true) 22 +@TableName(value = "iot_data_sink", autoResultMap = true)
21 @KeySequence("iot_data_bridge_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 23 @KeySequence("iot_data_bridge_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
22 @Data 24 @Data
23 @Builder 25 @Builder
24 @NoArgsConstructor 26 @NoArgsConstructor
25 @AllArgsConstructor 27 @AllArgsConstructor
26 -public class IotDataBridgeDO extends BaseDO { 28 +public class IotDataSinkDO extends BaseDO {
27 29
28 /** 30 /**
29 - * 桥梁编号 31 + * 数据流转目的编号
30 */ 32 */
31 @TableId 33 @TableId
32 private Long id; 34 private Long id;
33 /** 35 /**
34 - * 桥梁名称 36 + * 数据流转目的名称
35 */ 37 */
36 private String name; 38 private String name;
37 /** 39 /**
38 - * 桥梁描述 40 + * 数据流转目的描述
39 */ 41 */
40 private String description; 42 private String description;
41 /** 43 /**
42 - * 桥梁状态 44 + * 数据流转目的状态
43 * 45 *
44 - * 枚举 {@link CommonStatusEnum} 46 + * 枚举 {@link CommonStatusEnum}
45 */ 47 */
46 private Integer status; 48 private Integer status;
47 - /**  
48 - * 桥梁方向  
49 - *  
50 - * 枚举 {@link IotDataBridgeDirectionEnum}  
51 - */  
52 - private Integer direction;  
53 49
54 /** 50 /**
55 - * 桥梁类型 51 + * 数据流转目的类型
56 * 52 *
57 - * 枚举 {@link IotDataBridgeTypeEnum} 53 + * 枚举 {@link IotDataSinkTypeEnum}
58 */ 54 */
59 private Integer type; 55 private Integer type;
60 -  
61 /** 56 /**
62 - * 桥梁配置 57 + * 数据流转目的配置
63 */ 58 */
64 @TableField(typeHandler = JacksonTypeHandler.class) 59 @TableField(typeHandler = JacksonTypeHandler.class)
65 - private IotDataBridgeAbstractConfig config; 60 + private IotAbstractDataSinkConfig config;
66 61
67 } 62 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotRuleSceneDO.java
@@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO; @@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO;
7 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum; 7 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum;
8 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum; 8 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
9 import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum; 9 import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum;
10 -import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerConditionParameterOperatorEnum; 10 +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneConditionOperatorEnum;
11 import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum; 11 import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum;
12 import com.baomidou.mybatisplus.annotation.KeySequence; 12 import com.baomidou.mybatisplus.annotation.KeySequence;
13 import com.baomidou.mybatisplus.annotation.TableField; 13 import com.baomidou.mybatisplus.annotation.TableField;
@@ -22,8 +22,9 @@ import lombok.NoArgsConstructor; @@ -22,8 +22,9 @@ import lombok.NoArgsConstructor;
22 import java.util.List; 22 import java.util.List;
23 import java.util.Map; 23 import java.util.Map;
24 24
  25 +// TODO @芋艿:优化注释;
25 /** 26 /**
26 - * IoT 场景联动 DO 27 + * IoT 场景联动规则 DO
27 * 28 *
28 * @author 芋道源码 29 * @author 芋道源码
29 */ 30 */
@@ -163,7 +164,7 @@ public class IotRuleSceneDO extends TenantBaseDO { @@ -163,7 +164,7 @@ public class IotRuleSceneDO extends TenantBaseDO {
163 /** 164 /**
164 * 操作符 165 * 操作符
165 * 166 *
166 - * 枚举 {@link IotRuleSceneTriggerConditionParameterOperatorEnum} 167 + * 枚举 {@link IotRuleSceneConditionOperatorEnum}
167 */ 168 */
168 private String operator; 169 private String operator;
169 170
@@ -171,7 +172,7 @@ public class IotRuleSceneDO extends TenantBaseDO { @@ -171,7 +172,7 @@ public class IotRuleSceneDO extends TenantBaseDO {
171 * 比较值 172 * 比较值
172 * 173 *
173 * 如果有多个值,则使用 "," 分隔,类似 "1,2,3"。 174 * 如果有多个值,则使用 "," 分隔,类似 "1,2,3"。
174 - * 例如说,{@link IotRuleSceneTriggerConditionParameterOperatorEnum#IN}、{@link IotRuleSceneTriggerConditionParameterOperatorEnum#BETWEEN} 175 + * 例如说,{@link IotRuleSceneConditionOperatorEnum#IN}、{@link IotRuleSceneConditionOperatorEnum#BETWEEN}
175 */ 176 */
176 private String value; 177 private String value;
177 178
@@ -193,18 +194,10 @@ public class IotRuleSceneDO extends TenantBaseDO { @@ -193,18 +194,10 @@ public class IotRuleSceneDO extends TenantBaseDO {
193 /** 194 /**
194 * 设备控制 195 * 设备控制
195 * 196 *
196 - * 必填:当 {@link #type} 为 {@link IotRuleSceneActionTypeEnum#DEVICE_CONTROL} 时 197 + * 必填:当 {@link #type} 为 {@link IotRuleSceneActionTypeEnum#DEVICE_PROPERTY_SET} 时
197 */ 198 */
198 private ActionDeviceControl deviceControl; 199 private ActionDeviceControl deviceControl;
199 200
200 - /**  
201 - * 数据桥接编号  
202 - *  
203 - * 必填:当 {@link #type} 为 {@link IotRuleSceneActionTypeEnum#DATA_BRIDGE} 时  
204 - * 关联:{@link IotDataBridgeDO#getId()}  
205 - */  
206 - private Long dataBridgeId;  
207 -  
208 } 201 }
209 202
210 /** 203 /**
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotSceneRuleDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.dal.dataobject.rule;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
  5 +import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
  6 +import cn.iocoder.yudao.module.iot.dal.dataobject.alert.IotAlertConfigDO;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
  8 +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
  9 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO;
  10 +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum;
  11 +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneConditionOperatorEnum;
  12 +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneConditionTypeEnum;
  13 +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum;
  14 +import com.baomidou.mybatisplus.annotation.KeySequence;
  15 +import com.baomidou.mybatisplus.annotation.TableField;
  16 +import com.baomidou.mybatisplus.annotation.TableId;
  17 +import com.baomidou.mybatisplus.annotation.TableName;
  18 +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
  19 +import lombok.AllArgsConstructor;
  20 +import lombok.Builder;
  21 +import lombok.Data;
  22 +import lombok.NoArgsConstructor;
  23 +
  24 +import java.util.List;
  25 +
  26 +// TODO @puhui999:还是在 IotRuleSceneDO 里搞,这里主要可以看到变化字段哈。
  27 +/**
  28 + * IoT 场景联动 DO
  29 + *
  30 + * 基于 {@link Trigger} 触发 {@link Action}
  31 + *
  32 + * @author 芋道源码
  33 + */
  34 +@TableName(value = "iot_scene_rule", autoResultMap = true)
  35 +@KeySequence("iot_scene_rule_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  36 +@Data
  37 +@Builder
  38 +@NoArgsConstructor
  39 +@AllArgsConstructor
  40 +public class IotSceneRuleDO extends TenantBaseDO {
  41 +
  42 + /**
  43 + * 场景联动编号
  44 + */
  45 + @TableId
  46 + private Long id;
  47 + /**
  48 + * 场景联动名称
  49 + */
  50 + private String name;
  51 + /**
  52 + * 场景联动描述
  53 + */
  54 + private String description;
  55 + /**
  56 + * 场景联动状态
  57 + *
  58 + * 枚举 {@link CommonStatusEnum}
  59 + */
  60 + private Integer status;
  61 +
  62 + /**
  63 + * 场景定义配置
  64 + */
  65 + @TableField(typeHandler = JacksonTypeHandler.class)
  66 + private List<Trigger> triggers;
  67 +
  68 + /**
  69 + * 场景动作配置
  70 + */
  71 + @TableField(typeHandler = JacksonTypeHandler.class)
  72 + private List<Action> actions;
  73 +
  74 + /**
  75 + * 场景定义配置
  76 + */
  77 + @Data
  78 + public static class Trigger {
  79 +
  80 + // ========== 事件部分 ==========
  81 +
  82 + /**
  83 + * 场景事件类型
  84 + *
  85 + * 枚举 {@link IotRuleSceneTriggerTypeEnum}
  86 + * 1. {@link IotRuleSceneTriggerTypeEnum#DEVICE_STATE_UPDATE} 时,operator 非空,并且 value 为在线状态
  87 + * 2. {@link IotRuleSceneTriggerTypeEnum#DEVICE_PROPERTY_POST}
  88 + * {@link IotRuleSceneTriggerTypeEnum#DEVICE_EVENT_POST} 时,identifier、operator 非空,并且 value 为属性值
  89 + * 3. {@link IotRuleSceneTriggerTypeEnum#DEVICE_EVENT_POST}
  90 + * {@link IotRuleSceneTriggerTypeEnum#DEVICE_SERVICE_INVOKE} 时,identifier 非空,但是 operator、value 为空
  91 + * 4. {@link IotRuleSceneTriggerTypeEnum#TIMER} 时,conditions 非空,并且设备无关(无需 productId、deviceId 字段)
  92 + */
  93 + private Integer type;
  94 +
  95 + /**
  96 + * 产品编号
  97 + *
  98 + * 关联 {@link IotProductDO#getId()}
  99 + */
  100 + private Long productId;
  101 + /**
  102 + * 设备编号
  103 + *
  104 + * 关联 {@link IotDeviceDO#getId()}
  105 + * 特殊:如果为 {@link IotDeviceDO#DEVICE_ID_ALL} 时,则是全部设备
  106 + */
  107 + private Long deviceId;
  108 + /**
  109 + * 物模型标识符
  110 + *
  111 + * 对应:{@link IotThingModelDO#getIdentifier()}
  112 + */
  113 + private String identifier;
  114 + /**
  115 + * 操作符
  116 + *
  117 + * 枚举 {@link IotRuleSceneConditionOperatorEnum}
  118 + */
  119 + private String operator;
  120 + /**
  121 + * 参数(属性值、在线状态)
  122 + *
  123 + * 如果有多个值,则使用 "," 分隔,类似 "1,2,3"。
  124 + * 例如说,{@link IotRuleSceneConditionOperatorEnum#IN}、{@link IotRuleSceneConditionOperatorEnum#BETWEEN}
  125 + */
  126 + private String value;
  127 +
  128 + /**
  129 + * CRON 表达式
  130 + */
  131 + private String cronExpression;
  132 +
  133 + // ========== 条件部分 ==========
  134 +
  135 + /**
  136 + * 触发条件分组(状态条件分组)的数组
  137 + *
  138 + * 第一层 List:分组与分组之间,是“或”的关系
  139 + * 第二层 List:条件与条件之间,是“且”的关系
  140 + */
  141 + private List<List<TriggerCondition>> conditionGroups;
  142 +
  143 + }
  144 +
  145 + /**
  146 + * 触发条件(状态条件)
  147 + */
  148 + @Data
  149 + public static class TriggerCondition {
  150 +
  151 + /**
  152 + * 触发条件类型
  153 + *
  154 + * 枚举 {@link IotRuleSceneConditionTypeEnum}
  155 + * 1. {@link IotRuleSceneConditionTypeEnum#DEVICE_STATE} 时,operator 非空,并且 value 为在线状态
  156 + * 2. {@link IotRuleSceneConditionTypeEnum#DEVICE_PROPERTY} 时,identifier、operator 非空,并且 value 为属性值
  157 + * 3. {@link IotRuleSceneConditionTypeEnum#CURRENT_TIME} 时,operator 非空(使用 DATE_TIME_ 和 TIME_ 部分),并且 value 非空
  158 + */
  159 + private Integer type;
  160 +
  161 + /**
  162 + * 产品编号
  163 + *
  164 + * 关联 {@link IotProductDO#getId()}
  165 + */
  166 + private Long productId;
  167 + /**
  168 + * 设备编号
  169 + *
  170 + * 关联 {@link IotDeviceDO#getId()}
  171 + */
  172 + private Long deviceId;
  173 + /**
  174 + * 标识符(属性)
  175 + *
  176 + * 关联 {@link IotThingModelDO#getIdentifier()}
  177 + */
  178 + private String identifier;
  179 + /**
  180 + * 操作符
  181 + *
  182 + * 枚举 {@link IotRuleSceneConditionOperatorEnum}
  183 + */
  184 + private String operator;
  185 + /**
  186 + * 参数
  187 + *
  188 + * 如果有多个值,则使用 "," 分隔,类似 "1,2,3"。
  189 + * 例如说,{@link IotRuleSceneConditionOperatorEnum#IN}、{@link IotRuleSceneConditionOperatorEnum#BETWEEN}
  190 + */
  191 + private String param;
  192 +
  193 + }
  194 +
  195 + /**
  196 + * 场景动作配置
  197 + */
  198 + @Data
  199 + public static class Action {
  200 +
  201 + /**
  202 + * 执行类型
  203 + *
  204 + * 枚举 {@link IotRuleSceneActionTypeEnum}
  205 + * 1. {@link IotRuleSceneActionTypeEnum#DEVICE_PROPERTY_SET} 时,params 非空
  206 + * {@link IotRuleSceneActionTypeEnum#DEVICE_SERVICE_INVOKE} 时,params 非空
  207 + * 2. {@link IotRuleSceneActionTypeEnum#ALERT_TRIGGER} 时,alertConfigId 为空,因为是 {@link IotAlertConfigDO} 里面关联它
  208 + * 3. {@link IotRuleSceneActionTypeEnum#ALERT_RECOVER} 时,alertConfigId 非空
  209 + */
  210 + private Integer type;
  211 +
  212 + /**
  213 + * 产品编号
  214 + *
  215 + * 关联 {@link IotProductDO#getId()}
  216 + */
  217 + private Long productId;
  218 + /**
  219 + * 设备编号
  220 + *
  221 + * 关联 {@link IotDeviceDO#getId()}
  222 + */
  223 + private Long deviceId;
  224 + /**
  225 + * 请求参数
  226 + *
  227 + * 一般来说,对应 {@link IotDeviceMessage#getParams()} 请求参数
  228 + */
  229 + private Object params;
  230 +
  231 + /**
  232 + * 告警配置编号
  233 + *
  234 + * 关联 {@link IotAlertConfigDO#getId()}
  235 + */
  236 + private Long alertConfigId;
  237 +
  238 + }
  239 +
  240 +}
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeAbstractConfig.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/config/IotAbstractDataSinkConfig.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.rule.config;
2 2
3 -import cn.iocoder.yudao.module.iot.enums.rule.IotDataBridgeTypeEnum; 3 +import cn.iocoder.yudao.module.iot.enums.rule.IotDataSinkTypeEnum;
4 import com.fasterxml.jackson.annotation.JsonSubTypes; 4 import com.fasterxml.jackson.annotation.JsonSubTypes;
5 import com.fasterxml.jackson.annotation.JsonTypeInfo; 5 import com.fasterxml.jackson.annotation.JsonTypeInfo;
6 import lombok.Data; 6 import lombok.Data;
@@ -8,7 +8,7 @@ import lombok.Data; @@ -8,7 +8,7 @@ import lombok.Data;
8 /** 8 /**
9 * IoT IotDataBridgeConfig 抽象类 9 * IoT IotDataBridgeConfig 抽象类
10 * 10 *
11 - * 用于表示数据桥梁配置数据的通用类型,根据具体的 "type" 字段动态映射到对应的子类 11 + * 用于表示数据目的配置数据的通用类型,根据具体的 "type" 字段动态映射到对应的子类
12 * 提供多态支持,适用于不同类型的数据结构序列化和反序列化场景。 12 * 提供多态支持,适用于不同类型的数据结构序列化和反序列化场景。
13 * 13 *
14 * @author HUIHUI 14 * @author HUIHUI
@@ -16,19 +16,19 @@ import lombok.Data; @@ -16,19 +16,19 @@ import lombok.Data;
16 @Data 16 @Data
17 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", visible = true) 17 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", visible = true)
18 @JsonSubTypes({ 18 @JsonSubTypes({
19 - @JsonSubTypes.Type(value = IotDataBridgeHttpConfig.class, name = "1"),  
20 - @JsonSubTypes.Type(value = IotDataBridgeMqttConfig.class, name = "10"),  
21 - @JsonSubTypes.Type(value = IotDataBridgeRedisStreamConfig.class, name = "21"),  
22 - @JsonSubTypes.Type(value = IotDataBridgeRocketMQConfig.class, name = "30"),  
23 - @JsonSubTypes.Type(value = IotDataBridgeRabbitMQConfig.class, name = "31"),  
24 - @JsonSubTypes.Type(value = IotDataBridgeKafkaMQConfig.class, name = "32"), 19 + @JsonSubTypes.Type(value = IotDataSinkHttpConfig.class, name = "1"),
  20 + @JsonSubTypes.Type(value = IotDataSinkMqttConfig.class, name = "10"),
  21 + @JsonSubTypes.Type(value = IotDataSinkRedisStreamConfig.class, name = "21"),
  22 + @JsonSubTypes.Type(value = IotDataSinkRocketMQConfig.class, name = "30"),
  23 + @JsonSubTypes.Type(value = IotDataSinkRabbitMQConfig.class, name = "31"),
  24 + @JsonSubTypes.Type(value = IotDataSinkKafkaConfig.class, name = "32"),
25 }) 25 })
26 -public abstract class IotDataBridgeAbstractConfig { 26 +public abstract class IotAbstractDataSinkConfig {
27 27
28 /** 28 /**
29 * 配置类型 29 * 配置类型
30 * 30 *
31 - * 枚举 {@link IotDataBridgeTypeEnum#getType()} 31 + * 枚举 {@link IotDataSinkTypeEnum#getType()}
32 */ 32 */
33 private String type; 33 private String type;
34 34
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeHttpConfig.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/config/IotDataSinkHttpConfig.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.rule.config;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
5 import java.util.Map; 5 import java.util.Map;
6 6
7 /** 7 /**
8 - * IoT HTTP 配置 {@link IotDataBridgeAbstractConfig} 实现类 8 + * IoT HTTP 配置 {@link IotAbstractDataSinkConfig} 实现类
9 * 9 *
10 * @author HUIHUI 10 * @author HUIHUI
11 */ 11 */
12 @Data 12 @Data
13 -public class IotDataBridgeHttpConfig extends IotDataBridgeAbstractConfig { 13 +public class IotDataSinkHttpConfig extends IotAbstractDataSinkConfig {
14 14
15 /** 15 /**
16 * 请求 URL 16 * 请求 URL
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeKafkaMQConfig.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/config/IotDataSinkKafkaConfig.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.rule.config;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
5 /** 5 /**
6 - * IoT Kafka 配置 {@link IotDataBridgeAbstractConfig} 实现类 6 + * IoT Kafka 配置 {@link IotAbstractDataSinkConfig} 实现类
7 * 7 *
8 * @author HUIHUI 8 * @author HUIHUI
9 */ 9 */
10 @Data 10 @Data
11 -public class IotDataBridgeKafkaMQConfig extends IotDataBridgeAbstractConfig { 11 +public class IotDataSinkKafkaConfig extends IotAbstractDataSinkConfig {
12 12
13 /** 13 /**
14 * Kafka 服务器地址 14 * Kafka 服务器地址
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeMqttConfig.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/config/IotDataSinkMqttConfig.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.rule.config;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
5 /** 5 /**
6 - * IoT MQTT 配置 {@link IotDataBridgeAbstractConfig} 实现类 6 + * IoT MQTT 配置 {@link IotAbstractDataSinkConfig} 实现类
7 * 7 *
8 * @author HUIHUI 8 * @author HUIHUI
9 */ 9 */
10 @Data 10 @Data
11 -public class IotDataBridgeMqttConfig extends IotDataBridgeAbstractConfig { 11 +public class IotDataSinkMqttConfig extends IotAbstractDataSinkConfig {
12 12
13 /** 13 /**
14 * MQTT 服务器地址 14 * MQTT 服务器地址
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeRabbitMQConfig.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/config/IotDataSinkRabbitMQConfig.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.rule.config;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
5 /** 5 /**
6 - * IoT RabbitMQ 配置 {@link IotDataBridgeAbstractConfig} 实现类 6 + * IoT RabbitMQ 配置 {@link IotAbstractDataSinkConfig} 实现类
7 * 7 *
8 * @author HUIHUI 8 * @author HUIHUI
9 */ 9 */
10 @Data 10 @Data
11 -public class IotDataBridgeRabbitMQConfig extends IotDataBridgeAbstractConfig { 11 +public class IotDataSinkRabbitMQConfig extends IotAbstractDataSinkConfig {
12 12
13 /** 13 /**
14 * RabbitMQ 服务器地址 14 * RabbitMQ 服务器地址
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeRedisStreamConfig.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/config/IotDataSinkRedisStreamConfig.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.rule.config;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
5 /** 5 /**
6 - * IoT Redis Stream 配置 {@link IotDataBridgeAbstractConfig} 实现类 6 + * IoT Redis Stream 配置 {@link IotAbstractDataSinkConfig} 实现类
7 * 7 *
8 * @author HUIHUI 8 * @author HUIHUI
9 */ 9 */
10 @Data 10 @Data
11 -public class IotDataBridgeRedisStreamConfig extends IotDataBridgeAbstractConfig { 11 +public class IotDataSinkRedisStreamConfig extends IotAbstractDataSinkConfig {
12 12
13 /** 13 /**
14 * Redis 服务器地址 14 * Redis 服务器地址
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/databridge/config/IotDataBridgeRocketMQConfig.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/config/IotDataSinkRocketMQConfig.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.config; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.rule.config;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
5 /** 5 /**
6 - * IoT RocketMQ 配置 {@link IotDataBridgeAbstractConfig} 实现类 6 + * IoT RocketMQ 配置 {@link IotAbstractDataSinkConfig} 实现类
7 * 7 *
8 * @author HUIHUI 8 * @author HUIHUI
9 */ 9 */
10 @Data 10 @Data
11 -public class IotDataBridgeRocketMQConfig extends IotDataBridgeAbstractConfig { 11 +public class IotDataSinkRocketMQConfig extends IotAbstractDataSinkConfig {
12 12
13 /** 13 /**
14 * RocketMQ 名称服务器地址 14 * RocketMQ 名称服务器地址
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/thingmodel/IotThingModelDO.java
1 package cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel; 1 package cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelEvent;  
5 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelProperty;  
6 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelService; 4 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelEvent;
  5 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelProperty;
  6 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.ThingModelService;
7 import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; 7 import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
8 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum; 8 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum;
9 import com.baomidou.mybatisplus.annotation.KeySequence; 9 import com.baomidou.mybatisplus.annotation.KeySequence;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelEvent.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/thingmodel/model/ThingModelEvent.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelServiceEventTypeEnum; 4 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelServiceEventTypeEnum;
@@ -9,6 +9,7 @@ import lombok.Data; @@ -9,6 +9,7 @@ import lombok.Data;
9 9
10 import java.util.List; 10 import java.util.List;
11 11
  12 +// TODO @puhui999:感觉这个,是不是放到 dal 里会好点?(讨论下,先不改哈)
12 /** 13 /**
13 * IoT 物模型中的事件 14 * IoT 物模型中的事件
14 * 15 *
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelParam.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/thingmodel/model/ThingModelParam.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType.ThingModelDataSpecs; 4 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.dataType.ThingModelDataSpecs;
5 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotDataSpecsDataTypeEnum; 5 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotDataSpecsDataTypeEnum;
6 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelParamDirectionEnum; 6 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelParamDirectionEnum;
7 import jakarta.validation.constraints.NotEmpty; 7 import jakarta.validation.constraints.NotEmpty;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelProperty.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/thingmodel/model/ThingModelProperty.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType.ThingModelDataSpecs; 4 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.dataType.ThingModelDataSpecs;
5 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotDataSpecsDataTypeEnum; 5 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotDataSpecsDataTypeEnum;
6 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelAccessModeEnum; 6 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelAccessModeEnum;
7 import jakarta.validation.constraints.NotEmpty; 7 import jakarta.validation.constraints.NotEmpty;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelService.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/thingmodel/model/ThingModelService.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelServiceCallTypeEnum; 4 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelServiceCallTypeEnum;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelArrayDataSpecs.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/thingmodel/model/dataType/ThingModelArrayDataSpecs.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.dataType;
2 2
3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4 import jakarta.validation.Valid; 4 import jakarta.validation.Valid;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelBoolOrEnumDataSpecs.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/thingmodel/model/dataType/ThingModelBoolOrEnumDataSpecs.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.dataType;
2 2
3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4 import jakarta.validation.constraints.NotEmpty; 4 import jakarta.validation.constraints.NotEmpty;
@@ -10,7 +10,7 @@ import lombok.EqualsAndHashCode; @@ -10,7 +10,7 @@ import lombok.EqualsAndHashCode;
10 /** 10 /**
11 * IoT 物模型数据类型为布尔型或枚举型的 DataSpec 定义 11 * IoT 物模型数据类型为布尔型或枚举型的 DataSpec 定义
12 * 12 *
13 - * 数据类型,取值为 bool 或 enum。 13 + * 数据类型,取值为 bool 或 enum
14 * 14 *
15 * @author HUIHUI 15 * @author HUIHUI
16 */ 16 */
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelDataSpecs.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/thingmodel/model/dataType/ThingModelDataSpecs.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.dataType;
2 2
3 import com.fasterxml.jackson.annotation.JsonSubTypes; 3 import com.fasterxml.jackson.annotation.JsonSubTypes;
4 import com.fasterxml.jackson.annotation.JsonTypeInfo; 4 import com.fasterxml.jackson.annotation.JsonTypeInfo;
@@ -7,8 +7,8 @@ import lombok.Data; @@ -7,8 +7,8 @@ import lombok.Data;
7 /** 7 /**
8 * IoT ThingModelDataSpecs 抽象类 8 * IoT ThingModelDataSpecs 抽象类
9 * 9 *
10 - * 用于表示物模型数据的通用类型,根据具体的 "dataType" 字段动态映射到对应的子类。  
11 - * 提供多态支持,适用于不同类型的数据结构序列化和反序列化场景。 10 + * 用于表示物模型数据的通用类型,根据具体的 "dataType" 字段动态映射到对应的子类
  11 + * 提供多态支持,适用于不同类型的数据结构序列化和反序列化场景
12 * 12 *
13 * @author HUIHUI 13 * @author HUIHUI
14 */ 14 */
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelDateOrTextDataSpecs.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/thingmodel/model/dataType/ThingModelDateOrTextDataSpecs.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.dataType;
2 2
3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4 import jakarta.validation.constraints.Max; 4 import jakarta.validation.constraints.Max;
@@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode; @@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode;
8 /** 8 /**
9 * IoT 物模型数据类型为时间型或文本型的 DataSpec 定义 9 * IoT 物模型数据类型为时间型或文本型的 DataSpec 定义
10 * 10 *
11 - * 数据类型,取值为 date 或 text。 11 + * 数据类型,取值为 date 或 text
12 * 12 *
13 * @author HUIHUI 13 * @author HUIHUI
14 */ 14 */
@@ -18,13 +18,14 @@ import lombok.EqualsAndHashCode; @@ -18,13 +18,14 @@ import lombok.EqualsAndHashCode;
18 public class ThingModelDateOrTextDataSpecs extends ThingModelDataSpecs { 18 public class ThingModelDateOrTextDataSpecs extends ThingModelDataSpecs {
19 19
20 /** 20 /**
21 - * 数据长度,单位为字节。取值不能超过 2048。  
22 - * 当 dataType 为 text 时,需传入该参数。 21 + * 数据长度,单位为字节。取值不能超过 2048
  22 + *
  23 + * 当 dataType 为 text 时,需传入该参数
23 */ 24 */
24 @Max(value = 2048, message = "数据长度不能超过 2048") 25 @Max(value = 2048, message = "数据长度不能超过 2048")
25 private Integer length; 26 private Integer length;
26 /** 27 /**
27 - * 默认值,可选参数,用于存储默认值。 28 + * 默认值,可选参数,用于存储默认值
28 */ 29 */
29 private String defaultValue; 30 private String defaultValue;
30 31
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelNumericDataSpec.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/thingmodel/model/dataType/ThingModelNumericDataSpec.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.dataType;
2 2
3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 3 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4 import jakarta.validation.constraints.NotEmpty; 4 import jakarta.validation.constraints.NotEmpty;
@@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode; @@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode;
9 /** 9 /**
10 * IoT 物模型数据类型为数值的 DataSpec 定义 10 * IoT 物模型数据类型为数值的 DataSpec 定义
11 * 11 *
12 - * 数据类型,取值为 int、float 或 double。 12 + * 数据类型,取值为 int、float 或 double
13 * 13 *
14 * @author HUIHUI 14 * @author HUIHUI
15 */ 15 */
@@ -19,37 +19,37 @@ import lombok.EqualsAndHashCode; @@ -19,37 +19,37 @@ import lombok.EqualsAndHashCode;
19 public class ThingModelNumericDataSpec extends ThingModelDataSpecs { 19 public class ThingModelNumericDataSpec extends ThingModelDataSpecs {
20 20
21 /** 21 /**
22 - * 最大值,需转为字符串类型。值必须与 dataType 类型一致。 22 + * 最大值,需转为字符串类型。值必须与 dataType 类型一致
23 */ 23 */
24 @NotEmpty(message = "最大值不能为空") 24 @NotEmpty(message = "最大值不能为空")
25 @Pattern(regexp = "^-?\\d+(\\.\\d+)?$", message = "最大值必须为数值类型") 25 @Pattern(regexp = "^-?\\d+(\\.\\d+)?$", message = "最大值必须为数值类型")
26 private String max; 26 private String max;
27 /** 27 /**
28 - * 最小值,需转为字符串类型。值必须与 dataType 类型一致。 28 + * 最小值,需转为字符串类型。值必须与 dataType 类型一致
29 */ 29 */
30 @NotEmpty(message = "最小值不能为空") 30 @NotEmpty(message = "最小值不能为空")
31 @Pattern(regexp = "^-?\\d+(\\.\\d+)?$", message = "最小值必须为数值类型") 31 @Pattern(regexp = "^-?\\d+(\\.\\d+)?$", message = "最小值必须为数值类型")
32 private String min; 32 private String min;
33 /** 33 /**
34 - * 步长,需转为字符串类型。值必须与 dataType 类型一致。 34 + * 步长,需转为字符串类型。值必须与 dataType 类型一致
35 */ 35 */
36 @NotEmpty(message = "步长不能为空") 36 @NotEmpty(message = "步长不能为空")
37 @Pattern(regexp = "^-?\\d+(\\.\\d+)?$", message = "步长必须为数值类型") 37 @Pattern(regexp = "^-?\\d+(\\.\\d+)?$", message = "步长必须为数值类型")
38 private String step; 38 private String step;
39 /** 39 /**
40 - * 精度。当 dataType 为 float 或 double 时可选传入。 40 + * 精度。当 dataType 为 float 或 double 时可选传入
41 */ 41 */
42 private String precise; 42 private String precise;
43 /** 43 /**
44 - * 默认值,可传入用于存储的默认值。 44 + * 默认值,可传入用于存储的默认值
45 */ 45 */
46 private String defaultValue; 46 private String defaultValue;
47 /** 47 /**
48 - * 单位的符号。 48 + * 单位的符号
49 */ 49 */
50 private String unit; 50 private String unit;
51 /** 51 /**
52 - * 单位的名称。 52 + * 单位的名称
53 */ 53 */
54 private String unitName; 54 private String unitName;
55 55
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/dataType/ThingModelStructDataSpecs.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/thingmodel/model/dataType/ThingModelStructDataSpecs.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType; 1 +package cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.model.dataType;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelAccessModeEnum; 4 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelAccessModeEnum;
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/alert/IotAlertConfigMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.dal.mysql.alert;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
  7 +import cn.iocoder.yudao.module.iot.controller.admin.alert.vo.config.IotAlertConfigPageReqVO;
  8 +import cn.iocoder.yudao.module.iot.dal.dataobject.alert.IotAlertConfigDO;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * IoT 告警配置 Mapper
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +@Mapper
  19 +public interface IotAlertConfigMapper extends BaseMapperX<IotAlertConfigDO> {
  20 +
  21 + default PageResult<IotAlertConfigDO> selectPage(IotAlertConfigPageReqVO reqVO) {
  22 + return selectPage(reqVO, new LambdaQueryWrapperX<IotAlertConfigDO>()
  23 + .likeIfPresent(IotAlertConfigDO::getName, reqVO.getName())
  24 + .eqIfPresent(IotAlertConfigDO::getStatus, reqVO.getStatus())
  25 + .betweenIfPresent(IotAlertConfigDO::getCreateTime, reqVO.getCreateTime())
  26 + .orderByDesc(IotAlertConfigDO::getId));
  27 + }
  28 +
  29 + default List<IotAlertConfigDO> selectListByStatus(Integer status) {
  30 + return selectList(IotAlertConfigDO::getStatus, status);
  31 + }
  32 +
  33 + default List<IotAlertConfigDO> selectListBySceneRuleIdAndStatus(Long sceneRuleId, Integer status) {
  34 + return selectList(new LambdaQueryWrapperX<IotAlertConfigDO>()
  35 + .eq(IotAlertConfigDO::getStatus, status)
  36 + .apply(MyBatisUtils.findInSet("scene_rule_id", sceneRuleId)));
  37 + }
  38 +
  39 +}
0 \ No newline at end of file 40 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/alert/IotAlertRecordMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.dal.mysql.alert;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.alert.vo.recrod.IotAlertRecordPageReqVO;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.alert.IotAlertRecordDO;
  8 +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +
  11 +import java.util.Collection;
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * IoT 告警记录 Mapper
  16 + *
  17 + * @author 芋道源码
  18 + */
  19 +@Mapper
  20 +public interface IotAlertRecordMapper extends BaseMapperX<IotAlertRecordDO> {
  21 +
  22 + default PageResult<IotAlertRecordDO> selectPage(IotAlertRecordPageReqVO reqVO) {
  23 + return selectPage(reqVO, new LambdaQueryWrapperX<IotAlertRecordDO>()
  24 + .eqIfPresent(IotAlertRecordDO::getConfigId, reqVO.getConfigId())
  25 + .eqIfPresent(IotAlertRecordDO::getConfigLevel, reqVO.getLevel())
  26 + .eqIfPresent(IotAlertRecordDO::getProductId, reqVO.getProductId())
  27 + .eqIfPresent(IotAlertRecordDO::getDeviceId, reqVO.getDeviceId())
  28 + .eqIfPresent(IotAlertRecordDO::getProcessStatus, reqVO.getProcessStatus())
  29 + .betweenIfPresent(IotAlertRecordDO::getCreateTime, reqVO.getCreateTime())
  30 + .orderByDesc(IotAlertRecordDO::getId));
  31 + }
  32 +
  33 + default List<IotAlertRecordDO> selectListBySceneRuleId(Long sceneRuleId, Long deviceId, Boolean processStatus) {
  34 + return selectList(new LambdaQueryWrapperX<IotAlertRecordDO>()
  35 + .eq(IotAlertRecordDO::getSceneRuleId, sceneRuleId)
  36 + .eqIfPresent(IotAlertRecordDO::getDeviceId, deviceId)
  37 + .eqIfPresent(IotAlertRecordDO::getProcessStatus, processStatus)
  38 + .orderByDesc(IotAlertRecordDO::getId));
  39 + }
  40 +
  41 + default int updateList(Collection<Long> ids, IotAlertRecordDO updateObj) {
  42 + return update(updateObj, new LambdaUpdateWrapper<IotAlertRecordDO>()
  43 + .in(IotAlertRecordDO::getId, ids));
  44 + }
  45 +
  46 +}
0 \ No newline at end of file 47 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/IotDeviceMapper.java
@@ -6,13 +6,15 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -6,13 +6,15 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDevicePageReqVO; 7 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDevicePageReqVO;
8 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; 8 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
  9 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  10 +import jakarta.annotation.Nullable;
9 import org.apache.ibatis.annotations.Mapper; 11 import org.apache.ibatis.annotations.Mapper;
10 12
11 -import javax.annotation.Nullable;  
12 import java.time.LocalDateTime; 13 import java.time.LocalDateTime;
13 import java.util.Collection; 14 import java.util.Collection;
14 import java.util.List; 15 import java.util.List;
15 import java.util.Map; 16 import java.util.Map;
  17 +import java.util.stream.Collectors;
16 18
17 /** 19 /**
18 * IoT 设备 Mapper 20 * IoT 设备 Mapper
@@ -50,8 +52,11 @@ public interface IotDeviceMapper extends BaseMapperX&lt;IotDeviceDO&gt; { @@ -50,8 +52,11 @@ public interface IotDeviceMapper extends BaseMapperX&lt;IotDeviceDO&gt; {
50 return selectCount(IotDeviceDO::getProductId, productId); 52 return selectCount(IotDeviceDO::getProductId, productId);
51 } 53 }
52 54
53 - default List<IotDeviceDO> selectListByDeviceType(Integer deviceType) {  
54 - return selectList(IotDeviceDO::getDeviceType, deviceType); 55 + default List<IotDeviceDO> selectListByCondition(@Nullable Integer deviceType,
  56 + @Nullable Long productId) {
  57 + return selectList(new LambdaQueryWrapperX<IotDeviceDO>()
  58 + .eqIfPresent(IotDeviceDO::getDeviceType, deviceType)
  59 + .eqIfPresent(IotDeviceDO::getProductId, productId));
55 } 60 }
56 61
57 default List<IotDeviceDO> selectListByState(Integer state) { 62 default List<IotDeviceDO> selectListByState(Integer state) {
@@ -78,20 +83,38 @@ public interface IotDeviceMapper extends BaseMapperX&lt;IotDeviceDO&gt; { @@ -78,20 +83,38 @@ public interface IotDeviceMapper extends BaseMapperX&lt;IotDeviceDO&gt; {
78 .in(IotDeviceDO::getDeviceName, deviceNames)); 83 .in(IotDeviceDO::getDeviceName, deviceNames));
79 } 84 }
80 85
  86 + default IotDeviceDO selectBySerialNumber(String serialNumber) {
  87 + return selectOne(IotDeviceDO::getSerialNumber, serialNumber);
  88 + }
  89 +
81 /** 90 /**
82 - * 查询指定产品下各状态的设备数量 91 + * 查询指定产品下的设备数量
83 * 92 *
84 - * @return 设备数量统计列表 93 + * @return 产品编号 -> 设备数量的映射
85 */ 94 */
86 - // TODO @super:通过 mybatis-plus 来写哈,然后返回 Map 貌似就行了?!  
87 - List<Map<String, Object>> selectDeviceCountMapByProductId(); 95 + default Map<Long, Integer> selectDeviceCountMapByProductId() {
  96 + List<Map<String, Object>> result = selectMaps(new QueryWrapper<IotDeviceDO>()
  97 + .select("product_id AS productId", "COUNT(1) AS deviceCount")
  98 + .groupBy("product_id"));
  99 + return result.stream().collect(Collectors.toMap(
  100 + map -> Long.valueOf(map.get("productId").toString()),
  101 + map -> Integer.valueOf(map.get("deviceCount").toString())
  102 + ));
  103 + }
88 104
89 - // TODO @super:通过 mybatis-plus 来写哈,然后返回 Map 貌似就行了?!  
90 /** 105 /**
91 * 查询各个状态下的设备数量 106 * 查询各个状态下的设备数量
92 * 107 *
93 - * @return 设备数量统计列表 108 + * @return 设备状态 -> 设备数量的映射
94 */ 109 */
95 - List<Map<String, Object>> selectDeviceCountGroupByState(); 110 + default Map<Integer, Long> selectDeviceCountGroupByState() {
  111 + List<Map<String, Object>> result = selectMaps(new QueryWrapper<IotDeviceDO>()
  112 + .select("state", "COUNT(1) AS deviceCount")
  113 + .groupBy("state"));
  114 + return result.stream().collect(Collectors.toMap(
  115 + map -> Integer.valueOf(map.get("state").toString()),
  116 + map -> Long.valueOf(map.get("deviceCount").toString())
  117 + ));
  118 + }
96 119
97 } 120 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/ota/IotOtaFirmwareMapper.java
@@ -7,34 +7,19 @@ import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwa @@ -7,34 +7,19 @@ import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwa
7 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO; 7 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
10 -import java.util.List;  
11 -  
12 -// TODO @li:参考 IotOtaUpgradeRecordMapper 的写法  
13 @Mapper 10 @Mapper
14 public interface IotOtaFirmwareMapper extends BaseMapperX<IotOtaFirmwareDO> { 11 public interface IotOtaFirmwareMapper extends BaseMapperX<IotOtaFirmwareDO> {
15 12
16 - /**  
17 - * 根据产品ID和固件版本号查询固件信息列表。  
18 - *  
19 - * @param productId 产品ID,用于筛选固件信息。  
20 - * @param version 固件版本号,用于筛选固件信息。  
21 - * @return 返回符合条件的固件信息列表。  
22 - */  
23 - default List<IotOtaFirmwareDO> selectByProductIdAndVersion(String productId, String version) {  
24 - return selectList(IotOtaFirmwareDO::getProductId, productId, 13 + default IotOtaFirmwareDO selectByProductIdAndVersion(Long productId, String version) {
  14 + return selectOne(IotOtaFirmwareDO::getProductId, productId,
25 IotOtaFirmwareDO::getVersion, version); 15 IotOtaFirmwareDO::getVersion, version);
26 } 16 }
27 17
28 - /**  
29 - * 分页查询固件信息,支持根据名称和产品ID进行筛选,并按创建时间降序排列。  
30 - *  
31 - * @param pageReqVO 分页查询请求对象,包含分页参数和筛选条件。  
32 - * @return 返回分页查询结果,包含符合条件的固件信息列表。  
33 - */  
34 default PageResult<IotOtaFirmwareDO> selectPage(IotOtaFirmwarePageReqVO pageReqVO) { 18 default PageResult<IotOtaFirmwareDO> selectPage(IotOtaFirmwarePageReqVO pageReqVO) {
35 return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaFirmwareDO>() 19 return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaFirmwareDO>()
36 .likeIfPresent(IotOtaFirmwareDO::getName, pageReqVO.getName()) 20 .likeIfPresent(IotOtaFirmwareDO::getName, pageReqVO.getName())
37 .eqIfPresent(IotOtaFirmwareDO::getProductId, pageReqVO.getProductId()) 21 .eqIfPresent(IotOtaFirmwareDO::getProductId, pageReqVO.getProductId())
  22 + .betweenIfPresent(IotOtaFirmwareDO::getCreateTime, pageReqVO.getCreateTime())
38 .orderByDesc(IotOtaFirmwareDO::getCreateTime)); 23 .orderByDesc(IotOtaFirmwareDO::getCreateTime));
39 } 24 }
40 25
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/ota/IotOtaTaskMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.dal.mysql.ota;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.IotOtaTaskPageReqVO;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +@Mapper
  11 +public interface IotOtaTaskMapper extends BaseMapperX<IotOtaTaskDO> {
  12 +
  13 + default IotOtaTaskDO selectByFirmwareIdAndName(Long firmwareId, String name) {
  14 + return selectOne(IotOtaTaskDO::getFirmwareId, firmwareId,
  15 + IotOtaTaskDO::getName, name);
  16 + }
  17 +
  18 + default PageResult<IotOtaTaskDO> selectUpgradeTaskPage(IotOtaTaskPageReqVO pageReqVO) {
  19 + return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaTaskDO>()
  20 + .eqIfPresent(IotOtaTaskDO::getFirmwareId, pageReqVO.getFirmwareId())
  21 + .likeIfPresent(IotOtaTaskDO::getName, pageReqVO.getName()));
  22 + }
  23 +
  24 +}
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/ota/IotOtaTaskRecordMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.dal.mysql.ota;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record.IotOtaTaskRecordPageReqVO;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskRecordDO;
  8 +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +
  11 +import java.util.List;
  12 +import java.util.Set;
  13 +
  14 +@Mapper
  15 +public interface IotOtaTaskRecordMapper extends BaseMapperX<IotOtaTaskRecordDO> {
  16 +
  17 + default List<IotOtaTaskRecordDO> selectListByFirmwareIdAndTaskId(Long firmwareId, Long taskId) {
  18 + return selectList(new LambdaQueryWrapperX<IotOtaTaskRecordDO>()
  19 + .eqIfPresent(IotOtaTaskRecordDO::getFirmwareId, firmwareId)
  20 + .eqIfPresent(IotOtaTaskRecordDO::getTaskId, taskId)
  21 + .select(IotOtaTaskRecordDO::getDeviceId, IotOtaTaskRecordDO::getStatus));
  22 + }
  23 +
  24 + default PageResult<IotOtaTaskRecordDO> selectPage(IotOtaTaskRecordPageReqVO pageReqVO) {
  25 + return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaTaskRecordDO>()
  26 + .eqIfPresent(IotOtaTaskRecordDO::getTaskId, pageReqVO.getTaskId())
  27 + .eqIfPresent(IotOtaTaskRecordDO::getStatus, pageReqVO.getStatus()));
  28 + }
  29 +
  30 + default void updateByTaskIdAndStatus(Long taskId, Integer fromStatus, IotOtaTaskRecordDO updateRecord) {
  31 + update(updateRecord, new LambdaUpdateWrapper<IotOtaTaskRecordDO>()
  32 + .eq(IotOtaTaskRecordDO::getTaskId, taskId)
  33 + .eq(IotOtaTaskRecordDO::getStatus, fromStatus));
  34 + }
  35 +
  36 + default List<IotOtaTaskRecordDO> selectListByDeviceIdAndStatus(Set<Long> deviceIds, Set<Integer> statuses) {
  37 + return selectList(new LambdaQueryWrapperX<IotOtaTaskRecordDO>()
  38 + .inIfPresent(IotOtaTaskRecordDO::getDeviceId, deviceIds)
  39 + .inIfPresent(IotOtaTaskRecordDO::getStatus, statuses));
  40 + }
  41 +
  42 +}
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/ota/IotOtaUpgradeRecordMapper.java deleted
1 -package cn.iocoder.yudao.module.iot.dal.mysql.ota;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;  
5 -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;  
6 -import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record.IotOtaUpgradeRecordPageReqVO;  
7 -import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeRecordDO;  
8 -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;  
9 -import org.apache.ibatis.annotations.Mapper;  
10 -import org.apache.ibatis.annotations.Param;  
11 -import org.apache.ibatis.annotations.Select;  
12 -  
13 -import java.util.List;  
14 -import java.util.Map;  
15 -  
16 -@Mapper  
17 -public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeRecordDO> {  
18 -  
19 - // TODO @li:selectByFirmwareIdAndTaskIdAndDeviceId;让方法自解释  
20 - /**  
21 - * 根据条件查询单个OTA升级记录  
22 - *  
23 - * @param firmwareId 固件ID,可选参数,用于筛选固件ID匹配的记录  
24 - * @param taskId 任务ID,可选参数,用于筛选任务ID匹配的记录  
25 - * @param deviceId 设备ID,可选参数,用于筛选设备ID匹配的记录  
26 - * @return 返回符合条件的单个OTA升级记录,如果不存在则返回null  
27 - */  
28 - default IotOtaUpgradeRecordDO selectByConditions(Long firmwareId, Long taskId, String deviceId) {  
29 - // 使用LambdaQueryWrapperX构建查询条件,根据传入的参数动态添加查询条件  
30 - return selectOne(new LambdaQueryWrapperX<IotOtaUpgradeRecordDO>()  
31 - .eqIfPresent(IotOtaUpgradeRecordDO::getFirmwareId, firmwareId)  
32 - .eqIfPresent(IotOtaUpgradeRecordDO::getTaskId, taskId)  
33 - .eqIfPresent(IotOtaUpgradeRecordDO::getDeviceId, deviceId));  
34 - }  
35 -  
36 - // TODO @li:这个是不是 groupby status 就 ok 拉?  
37 - /**  
38 - * 根据任务ID和设备名称查询OTA升级记录的状态统计信息。  
39 - * 该函数通过SQL查询统计不同状态(0到5)的记录数量,并返回一个包含统计结果的Map列表。  
40 - *  
41 - * @param taskId 任务ID,用于筛选特定任务的OTA升级记录。  
42 - * @param deviceName 设备名称,支持模糊查询,用于筛选特定设备的OTA升级记录。  
43 - * @return 返回一个Map列表,每个Map包含不同状态(0到5)的记录数量。  
44 - */  
45 - @Select("select count(case when status = 0 then 1 else 0) as `0` " +  
46 - "count(case when status = 1 then 1 else 0) as `1` " +  
47 - "count(case when status = 2 then 1 else 0) as `2` " +  
48 - "count(case when status = 3 then 1 else 0) as `3` " +  
49 - "count(case when status = 4 then 1 else 0) as `4` " +  
50 - "count(case when status = 5 then 1 else 0) as `5` " +  
51 - "from iot_ota_upgrade_record " +  
52 - "where task_id = #{taskId} " +  
53 - "and device_name like concat('%', #{deviceName}, '%') " +  
54 - "and status = #{status}")  
55 - List<Map<String, Object>> selectOtaUpgradeRecordCount(@Param("taskId") Long taskId,  
56 - @Param("deviceName") String deviceName);  
57 -  
58 - /**  
59 - * 根据固件ID查询OTA升级记录的状态统计信息。  
60 - * 该函数通过SQL查询统计不同状态(0到5)的记录数量,并返回一个包含统计结果的Map列表。  
61 - *  
62 - * @param firmwareId 固件ID,用于筛选特定固件的OTA升级记录。  
63 - * @return 返回一个Map列表,每个Map包含不同状态(0到5)的记录数量。  
64 - */  
65 - @Select("select count(case when status = 0 then 1 else 0) as `0` " +  
66 - "count(case when status = 1 then 1 else 0) as `1` " +  
67 - "count(case when status = 2 then 1 else 0) as `2` " +  
68 - "count(case when status = 3 then 1 else 0) as `3` " +  
69 - "count(case when status = 4 then 1 else 0) as `4` " +  
70 - "count(case when status = 5 then 1 else 0) as `5` " +  
71 - "from iot_ota_upgrade_record " +  
72 - "where firmware_id = #{firmwareId}")  
73 - List<Map<String, Object>> selectOtaUpgradeRecordStatistics(Long firmwareId);  
74 -  
75 - // TODO @li:这里的注释,可以去掉哈  
76 - /**  
77 - * 根据分页查询条件获取 OTA升级记录的分页结果  
78 - *  
79 - * @param pageReqVO 分页查询请求参数,包含设备名称、任务ID等查询条件  
80 - * @return 返回分页查询结果,包含符合条件的 OTA升级记录列表  
81 - */  
82 - // TODO @li:selectPage 就 ok 拉。  
83 - default PageResult<IotOtaUpgradeRecordDO> selectUpgradeRecordPage(IotOtaUpgradeRecordPageReqVO pageReqVO) {  
84 - // TODO @li:这里的注释,可以去掉哈;然后下面的“如果”。。。也没必要注释  
85 - // 使用LambdaQueryWrapperX构建查询条件,并根据请求参数动态添加查询条件  
86 - return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaUpgradeRecordDO>()  
87 - .likeIfPresent(IotOtaUpgradeRecordDO::getDeviceName, pageReqVO.getDeviceName()) // 如果设备名称存在,则添加模糊查询条件  
88 - .eqIfPresent(IotOtaUpgradeRecordDO::getTaskId, pageReqVO.getTaskId())); // 如果任务ID存在,则添加等值查询条件  
89 - }  
90 -  
91 - // TODO @li:这里的注释,可以去掉哈  
92 - /**  
93 - * 根据任务ID和状态更新升级记录的状态  
94 - * <p>  
95 - * 该函数用于将符合指定任务ID和状态的升级记录的状态更新为新的状态。  
96 - *  
97 - * @param setStatus 要设置的新状态值,类型为Integer  
98 - * @param taskId 要更新的升级记录对应的任务ID,类型为Long  
99 - * @param whereStatus 用于筛选升级记录的当前状态值,类型为Integer  
100 - */  
101 - // TODO @li:改成 updateByTaskIdAndStatus(taskId, status, IotOtaUpgradeRecordDO) 更通用一些。  
102 - default void updateUpgradeRecordStatusByTaskIdAndStatus(Integer setStatus, Long taskId, Integer whereStatus) {  
103 - // 使用LambdaUpdateWrapper构建更新条件,将指定状态的记录更新为指定状态  
104 - update(new LambdaUpdateWrapper<IotOtaUpgradeRecordDO>()  
105 - .set(IotOtaUpgradeRecordDO::getStatus, setStatus)  
106 - .eq(IotOtaUpgradeRecordDO::getTaskId, taskId)  
107 - .eq(IotOtaUpgradeRecordDO::getStatus, whereStatus)  
108 - );  
109 - }  
110 -  
111 - // TODO @li:参考上面的建议,调整下这个方法  
112 - /**  
113 - * 根据状态查询符合条件的升级记录列表  
114 - * <p>  
115 - * 该函数使用LambdaQueryWrapperX构建查询条件,查询指定状态的升级记录。  
116 - *  
117 - * @param state 升级记录的状态,用于筛选符合条件的记录  
118 - * @return 返回符合指定状态的升级记录列表,类型为List<IotOtaUpgradeRecordDO>  
119 - */  
120 - default List<IotOtaUpgradeRecordDO> selectUpgradeRecordListByState(Integer state) {  
121 - // 使用LambdaQueryWrapperX构建查询条件,根据状态查询符合条件的升级记录  
122 - return selectList(new LambdaQueryWrapperX<IotOtaUpgradeRecordDO>()  
123 - .eq(IotOtaUpgradeRecordDO::getStatus, state));  
124 - }  
125 -  
126 - // TODO @li:参考上面的建议,调整下这个方法  
127 - /**  
128 - * 更新升级记录状态  
129 - * <p>  
130 - * 该函数用于批量更新指定ID列表中的升级记录状态。通过传入的ID列表和状态值,使用LambdaUpdateWrapper构建更新条件,  
131 - * 并执行更新操作。  
132 - *  
133 - * @param ids 需要更新的升级记录ID列表,类型为List<Long>。传入的ID列表中的记录将被更新。  
134 - * @param status 要更新的状态值,类型为Integer。该值将被设置到符合条件的升级记录中。  
135 - */  
136 - default void updateUpgradeRecordStatus(List<Long> ids, Integer status) {  
137 - // 使用LambdaUpdateWrapper构建更新条件,设置状态字段,并根据ID列表进行筛选  
138 - update(new LambdaUpdateWrapper<IotOtaUpgradeRecordDO>()  
139 - .set(IotOtaUpgradeRecordDO::getStatus, status)  
140 - .in(IotOtaUpgradeRecordDO::getId, ids)  
141 - );  
142 - }  
143 -  
144 - // TODO @li:参考上面的建议,调整下这个方法  
145 - /**  
146 - * 根据任务ID查询升级记录列表  
147 - * <p>  
148 - * 该函数通过任务ID查询符合条件的升级记录,并返回查询结果列表。  
149 - *  
150 - * @param taskId 任务ID,用于筛选升级记录  
151 - * @return 返回符合条件的升级记录列表,若未找到则返回空列表  
152 - */  
153 - default List<IotOtaUpgradeRecordDO> selectUpgradeRecordListByTaskId(Long taskId) {  
154 - // 使用LambdaQueryWrapperX构建查询条件,根据任务ID查询符合条件的升级记录  
155 - return selectList(new LambdaQueryWrapperX<IotOtaUpgradeRecordDO>()  
156 - .eq(IotOtaUpgradeRecordDO::getTaskId, taskId));  
157 - }  
158 -  
159 -}  
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/ota/IotOtaUpgradeTaskMapper.java deleted
1 -package cn.iocoder.yudao.module.iot.dal.mysql.ota;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;  
5 -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;  
6 -import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task.IotOtaUpgradeTaskPageReqVO;  
7 -import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeTaskDO;  
8 -import org.apache.ibatis.annotations.Mapper;  
9 -  
10 -import java.util.List;  
11 -  
12 -/**  
13 - * OTA 升级任务Mapper  
14 - *  
15 - * @author Shelly  
16 - */  
17 -@Mapper  
18 -public interface IotOtaUpgradeTaskMapper extends BaseMapperX<IotOtaUpgradeTaskDO> {  
19 -  
20 - /**  
21 - * 根据固件ID和任务名称查询升级任务列表。  
22 - *  
23 - * @param firmwareId 固件ID,用于筛选升级任务  
24 - * @param name 任务名称,用于筛选升级任务  
25 - * @return 符合条件的升级任务列表  
26 - */  
27 - default List<IotOtaUpgradeTaskDO> selectByFirmwareIdAndName(Long firmwareId, String name) {  
28 - return selectList(new LambdaQueryWrapperX<IotOtaUpgradeTaskDO>()  
29 - .eqIfPresent(IotOtaUpgradeTaskDO::getFirmwareId, firmwareId)  
30 - .eqIfPresent(IotOtaUpgradeTaskDO::getName, name));  
31 - }  
32 -  
33 - /**  
34 - * 分页查询升级任务列表,支持根据固件ID和任务名称进行筛选。  
35 - *  
36 - * @param pageReqVO 分页查询请求对象,包含分页参数和筛选条件  
37 - * @return 分页结果,包含符合条件的升级任务列表  
38 - */  
39 - default PageResult<IotOtaUpgradeTaskDO> selectUpgradeTaskPage(IotOtaUpgradeTaskPageReqVO pageReqVO) {  
40 - return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaUpgradeTaskDO>()  
41 - .eqIfPresent(IotOtaUpgradeTaskDO::getFirmwareId, pageReqVO.getFirmwareId())  
42 - .likeIfPresent(IotOtaUpgradeTaskDO::getName, pageReqVO.getName()));  
43 - }  
44 -  
45 - /**  
46 - * 根据任务状态查询升级任务列表  
47 - * <p>  
48 - * 该函数通过传入的任务状态,查询数据库中符合条件的升级任务列表。  
49 - *  
50 - * @param status 任务状态,用于筛选升级任务的状态值  
51 - * @return 返回符合条件的升级任务列表,列表中的每个元素为 IotOtaUpgradeTaskDO 对象  
52 - */  
53 - default List<IotOtaUpgradeTaskDO> selectUpgradeTaskByState(Integer status) {  
54 - return selectList(IotOtaUpgradeTaskDO::getStatus, status);  
55 - }  
56 -  
57 -}  
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/rule/IotDataRuleMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.dal.mysql.rule;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
  7 +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.rule.IotDataRulePageReqVO;
  8 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataRuleDO;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * IoT 数据流转规则 Mapper
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +@Mapper
  19 +public interface IotDataRuleMapper extends BaseMapperX<IotDataRuleDO> {
  20 +
  21 + default PageResult<IotDataRuleDO> selectPage(IotDataRulePageReqVO reqVO) {
  22 + return selectPage(reqVO, new LambdaQueryWrapperX<IotDataRuleDO>()
  23 + .likeIfPresent(IotDataRuleDO::getName, reqVO.getName())
  24 + .eqIfPresent(IotDataRuleDO::getStatus, reqVO.getStatus())
  25 + .betweenIfPresent(IotDataRuleDO::getCreateTime, reqVO.getCreateTime())
  26 + .orderByDesc(IotDataRuleDO::getId));
  27 + }
  28 +
  29 + default List<IotDataRuleDO> selectListBySinkId(Long sinkId) {
  30 + return selectList(new LambdaQueryWrapperX<IotDataRuleDO>()
  31 + .apply(MyBatisUtils.findInSet("sink_ids", sinkId)));
  32 + }
  33 +
  34 + default List<IotDataRuleDO> selectListByStatus(Integer status) {
  35 + return selectList(IotDataRuleDO::getStatus, status);
  36 + }
  37 +
  38 +}
0 \ No newline at end of file 39 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/rule/IotDataBridgeMapper.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/rule/IotDataSinkMapper.java
@@ -3,32 +3,30 @@ package cn.iocoder.yudao.module.iot.dal.mysql.rule; @@ -3,32 +3,30 @@ package cn.iocoder.yudao.module.iot.dal.mysql.rule;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.IotDataBridgePageReqVO;  
7 -import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataBridgeDO; 6 +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.data.sink.IotDataSinkPageReqVO;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataSinkDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
10 import java.util.List; 10 import java.util.List;
11 11
12 /** 12 /**
13 - * IoT 数据桥梁 Mapper 13 + * IoT 数据流转目的 Mapper
14 * 14 *
15 * @author HUIHUI 15 * @author HUIHUI
16 */ 16 */
17 @Mapper 17 @Mapper
18 -public interface IotDataBridgeMapper extends BaseMapperX<IotDataBridgeDO> { 18 +public interface IotDataSinkMapper extends BaseMapperX<IotDataSinkDO> {
19 19
20 - default PageResult<IotDataBridgeDO> selectPage(IotDataBridgePageReqVO reqVO) {  
21 - return selectPage(reqVO, new LambdaQueryWrapperX<IotDataBridgeDO>()  
22 - .likeIfPresent(IotDataBridgeDO::getName, reqVO.getName())  
23 - .eqIfPresent(IotDataBridgeDO::getStatus, reqVO.getStatus())  
24 - .betweenIfPresent(IotDataBridgeDO::getCreateTime, reqVO.getCreateTime())  
25 - .orderByDesc(IotDataBridgeDO::getId)); 20 + default PageResult<IotDataSinkDO> selectPage(IotDataSinkPageReqVO reqVO) {
  21 + return selectPage(reqVO, new LambdaQueryWrapperX<IotDataSinkDO>()
  22 + .likeIfPresent(IotDataSinkDO::getName, reqVO.getName())
  23 + .eqIfPresent(IotDataSinkDO::getStatus, reqVO.getStatus())
  24 + .betweenIfPresent(IotDataSinkDO::getCreateTime, reqVO.getCreateTime())
  25 + .orderByDesc(IotDataSinkDO::getId));
26 } 26 }
27 27
28 - default List<IotDataBridgeDO> selectList(Integer status) {  
29 - return selectList(new LambdaQueryWrapperX<IotDataBridgeDO>()  
30 - .eqIfPresent(IotDataBridgeDO::getStatus, status)  
31 - .orderByDesc(IotDataBridgeDO::getId)); 28 + default List<IotDataSinkDO> selectListByStatus(Integer status) {
  29 + return selectList(IotDataSinkDO::getStatus, status);
32 } 30 }
33 31
34 } 32 }
35 \ No newline at end of file 33 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/rule/IotRuleSceneMapper.java
@@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleScenePa @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleScenePa
7 import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO; 7 import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
  10 +import java.util.List;
  11 +
10 /** 12 /**
11 * IoT 场景联动 Mapper 13 * IoT 场景联动 Mapper
12 * 14 *
@@ -24,4 +26,8 @@ public interface IotRuleSceneMapper extends BaseMapperX&lt;IotRuleSceneDO&gt; { @@ -24,4 +26,8 @@ public interface IotRuleSceneMapper extends BaseMapperX&lt;IotRuleSceneDO&gt; {
24 .orderByDesc(IotRuleSceneDO::getId)); 26 .orderByDesc(IotRuleSceneDO::getId));
25 } 27 }
26 28
  29 + default List<IotRuleSceneDO> selectListByStatus(Integer status) {
  30 + return selectList(IotRuleSceneDO::getStatus, status);
  31 + }
  32 +
27 } 33 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/thingmodel/IotThingModelMapper.java
@@ -25,8 +25,6 @@ public interface IotThingModelMapper extends BaseMapperX&lt;IotThingModelDO&gt; { @@ -25,8 +25,6 @@ public interface IotThingModelMapper extends BaseMapperX&lt;IotThingModelDO&gt; {
25 .likeIfPresent(IotThingModelDO::getName, reqVO.getName()) 25 .likeIfPresent(IotThingModelDO::getName, reqVO.getName())
26 .eqIfPresent(IotThingModelDO::getType, reqVO.getType()) 26 .eqIfPresent(IotThingModelDO::getType, reqVO.getType())
27 .eqIfPresent(IotThingModelDO::getProductId, reqVO.getProductId()) 27 .eqIfPresent(IotThingModelDO::getProductId, reqVO.getProductId())
28 - // TODO @芋艿:看看要不要加枚举  
29 - .notIn(IotThingModelDO::getIdentifier, "get", "set", "post")  
30 .orderByDesc(IotThingModelDO::getId)); 28 .orderByDesc(IotThingModelDO::getId));
31 } 29 }
32 30
@@ -36,8 +34,6 @@ public interface IotThingModelMapper extends BaseMapperX&lt;IotThingModelDO&gt; { @@ -36,8 +34,6 @@ public interface IotThingModelMapper extends BaseMapperX&lt;IotThingModelDO&gt; {
36 .likeIfPresent(IotThingModelDO::getName, reqVO.getName()) 34 .likeIfPresent(IotThingModelDO::getName, reqVO.getName())
37 .eqIfPresent(IotThingModelDO::getType, reqVO.getType()) 35 .eqIfPresent(IotThingModelDO::getType, reqVO.getType())
38 .eqIfPresent(IotThingModelDO::getProductId, reqVO.getProductId()) 36 .eqIfPresent(IotThingModelDO::getProductId, reqVO.getProductId())
39 - // TODO @芋艿:看看要不要加枚举  
40 - .notIn(IotThingModelDO::getIdentifier, "get", "set", "post")  
41 .orderByDesc(IotThingModelDO::getId)); 37 .orderByDesc(IotThingModelDO::getId));
42 } 38 }
43 39
@@ -61,15 +57,6 @@ public interface IotThingModelMapper extends BaseMapperX&lt;IotThingModelDO&gt; { @@ -61,15 +57,6 @@ public interface IotThingModelMapper extends BaseMapperX&lt;IotThingModelDO&gt; {
61 IotThingModelDO::getType, type); 57 IotThingModelDO::getType, type);
62 } 58 }
63 59
64 - default List<IotThingModelDO> selectListByProductIdAndIdentifiersAndTypes(Long productId,  
65 - List<String> identifiers,  
66 - List<Integer> types) {  
67 - return selectList(new LambdaQueryWrapperX<IotThingModelDO>()  
68 - .eq(IotThingModelDO::getProductId, productId)  
69 - .in(IotThingModelDO::getIdentifier, identifiers)  
70 - .in(IotThingModelDO::getType, types));  
71 - }  
72 -  
73 default IotThingModelDO selectByProductIdAndName(Long productId, String name) { 60 default IotThingModelDO selectByProductIdAndName(Long productId, String name) {
74 return selectOne(IotThingModelDO::getProductId, productId, 61 return selectOne(IotThingModelDO::getProductId, productId,
75 IotThingModelDO::getName, name); 62 IotThingModelDO::getName, name);
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/redis/RedisKeyConstants.java
@@ -60,4 +60,20 @@ public interface RedisKeyConstants { @@ -60,4 +60,20 @@ public interface RedisKeyConstants {
60 */ 60 */
61 String THING_MODEL_LIST = "iot:thing_model_list"; 61 String THING_MODEL_LIST = "iot:thing_model_list";
62 62
  63 + /**
  64 + * 数据流转规则的数据缓存,使用 Spring Cache 操作
  65 + *
  66 + * KEY 格式:data_rule_list_${deviceId}_${method}_${identifier}
  67 + * VALUE 数据类型:String 数组(JSON),即 {@link cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataRuleDO} 列表
  68 + */
  69 + String DATA_RULE_LIST = "iot:data_rule_list";
  70 +
  71 + /**
  72 + * 数据目的的数据缓存,使用 Spring Cache 操作
  73 + *
  74 + * KEY 格式:data_sink_${id}
  75 + * VALUE 数据类型:String(JSON),即 {@link cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataSinkDO}
  76 + */
  77 + String DATA_SINK = "iot:data_sink";
  78 +
63 } 79 }
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/DictTypeConstants.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/enums/DictTypeConstants.java
@@ -14,5 +14,10 @@ public class DictTypeConstants { @@ -14,5 +14,10 @@ public class DictTypeConstants {
14 14
15 public static final String DEVICE_STATE = "iot_device_state"; 15 public static final String DEVICE_STATE = "iot_device_state";
16 16
  17 + public static final String ALERT_LEVEL = "iot_alert_level";
  18 +
  19 + public static final String OTA_TASK_DEVICE_SCOPE = "iot_ota_task_device_scope";
  20 + public static final String OTA_TASK_STATUS = "iot_ota_task_status";
  21 + public static final String OTA_TASK_RECORD_STATUS = "iot_ota_task_record_status";
17 22
18 } 23 }
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java
@@ -14,6 +14,7 @@ public interface ErrorCodeConstants { @@ -14,6 +14,7 @@ public interface ErrorCodeConstants {
14 ErrorCode PRODUCT_KEY_EXISTS = new ErrorCode(1_050_001_001, "产品标识已经存在"); 14 ErrorCode PRODUCT_KEY_EXISTS = new ErrorCode(1_050_001_001, "产品标识已经存在");
15 ErrorCode PRODUCT_STATUS_NOT_DELETE = new ErrorCode(1_050_001_002, "产品状是发布状态,不允许删除"); 15 ErrorCode PRODUCT_STATUS_NOT_DELETE = new ErrorCode(1_050_001_002, "产品状是发布状态,不允许删除");
16 ErrorCode PRODUCT_STATUS_NOT_ALLOW_THING_MODEL = new ErrorCode(1_050_001_003, "产品状是发布状态,不允许操作物模型"); 16 ErrorCode PRODUCT_STATUS_NOT_ALLOW_THING_MODEL = new ErrorCode(1_050_001_003, "产品状是发布状态,不允许操作物模型");
  17 + ErrorCode PRODUCT_DELETE_FAIL_HAS_DEVICE = new ErrorCode(1_050_001_004, "产品下存在设备,不允许删除");
17 18
18 // ========== 产品物模型 1-050-002-000 ============ 19 // ========== 产品物模型 1-050-002-000 ============
19 ErrorCode THING_MODEL_NOT_EXISTS = new ErrorCode(1_050_002_000, "产品物模型不存在"); 20 ErrorCode THING_MODEL_NOT_EXISTS = new ErrorCode(1_050_002_000, "产品物模型不存在");
@@ -31,6 +32,7 @@ public interface ErrorCodeConstants { @@ -31,6 +32,7 @@ public interface ErrorCodeConstants {
31 ErrorCode DEVICE_NOT_GATEWAY = new ErrorCode(1_050_003_005, "设备不是网关设备"); 32 ErrorCode DEVICE_NOT_GATEWAY = new ErrorCode(1_050_003_005, "设备不是网关设备");
32 ErrorCode DEVICE_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_050_003_006, "导入设备数据不能为空!"); 33 ErrorCode DEVICE_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_050_003_006, "导入设备数据不能为空!");
33 ErrorCode DEVICE_DOWNSTREAM_FAILED_SERVER_ID_NULL = new ErrorCode(1_050_003_007, "下行设备消息失败,原因:设备未连接网关"); 34 ErrorCode DEVICE_DOWNSTREAM_FAILED_SERVER_ID_NULL = new ErrorCode(1_050_003_007, "下行设备消息失败,原因:设备未连接网关");
  35 + ErrorCode DEVICE_SERIAL_NUMBER_EXISTS = new ErrorCode(1_050_003_008, "设备序列号已存在,序列号必须全局唯一");
34 36
35 // ========== 产品分类 1-050-004-000 ========== 37 // ========== 产品分类 1-050-004-000 ==========
36 ErrorCode PRODUCT_CATEGORY_NOT_EXISTS = new ErrorCode(1_050_004_000, "产品分类不存在"); 38 ErrorCode PRODUCT_CATEGORY_NOT_EXISTS = new ErrorCode(1_050_004_000, "产品分类不存在");
@@ -39,25 +41,40 @@ public interface ErrorCodeConstants { @@ -39,25 +41,40 @@ public interface ErrorCodeConstants {
39 ErrorCode DEVICE_GROUP_NOT_EXISTS = new ErrorCode(1_050_005_000, "设备分组不存在"); 41 ErrorCode DEVICE_GROUP_NOT_EXISTS = new ErrorCode(1_050_005_000, "设备分组不存在");
40 ErrorCode DEVICE_GROUP_DELETE_FAIL_DEVICE_EXISTS = new ErrorCode(1_050_005_001, "设备分组下存在设备,不允许删除"); 42 ErrorCode DEVICE_GROUP_DELETE_FAIL_DEVICE_EXISTS = new ErrorCode(1_050_005_001, "设备分组下存在设备,不允许删除");
41 43
42 - // ========== 固件相关 1-050-008-000 ========== 44 + // ========== OTA 固件相关 1-050-008-000 ==========
43 45
44 ErrorCode OTA_FIRMWARE_NOT_EXISTS = new ErrorCode(1_050_008_000, "固件信息不存在"); 46 ErrorCode OTA_FIRMWARE_NOT_EXISTS = new ErrorCode(1_050_008_000, "固件信息不存在");
45 ErrorCode OTA_FIRMWARE_PRODUCT_VERSION_DUPLICATE = new ErrorCode(1_050_008_001, "产品版本号重复"); 47 ErrorCode OTA_FIRMWARE_PRODUCT_VERSION_DUPLICATE = new ErrorCode(1_050_008_001, "产品版本号重复");
46 48
47 - ErrorCode OTA_UPGRADE_TASK_NOT_EXISTS = new ErrorCode(1_050_008_100, "升级任务不存在");  
48 - ErrorCode OTA_UPGRADE_TASK_NAME_DUPLICATE = new ErrorCode(1_050_008_101, "升级任务名称重复");  
49 - ErrorCode OTA_UPGRADE_TASK_DEVICE_IDS_EMPTY = new ErrorCode(1_050_008_102, "设备编号列表不能为空");  
50 - ErrorCode OTA_UPGRADE_TASK_DEVICE_LIST_EMPTY = new ErrorCode(1_050_008_103, "设备列表不能为空");  
51 - ErrorCode OTA_UPGRADE_TASK_CANNOT_CANCEL = new ErrorCode(1_050_008_104, "升级任务不能取消"); 49 + // ========== OTA 升级任务相关 1-050-008-100 ==========
52 50
53 - ErrorCode OTA_UPGRADE_RECORD_NOT_EXISTS = new ErrorCode(1_050_008_200, "升级记录不存在");  
54 - ErrorCode OTA_UPGRADE_RECORD_DUPLICATE = new ErrorCode(1_050_008_201, "升级记录重复");  
55 - ErrorCode OTA_UPGRADE_RECORD_CANNOT_RETRY = new ErrorCode(1_050_008_202, "升级记录不能重试"); 51 + ErrorCode OTA_TASK_NOT_EXISTS = new ErrorCode(1_050_008_100, "升级任务不存在");
  52 + ErrorCode OTA_TASK_CREATE_FAIL_NAME_DUPLICATE = new ErrorCode(1_050_008_101, "创建 OTA 任务失败,原因:任务名称重复");
  53 + ErrorCode OTA_TASK_CREATE_FAIL_DEVICE_FIRMWARE_EXISTS = new ErrorCode(1_050_008_102,
  54 + "创建 OTA 任务失败,原因:设备({})已经是该固件版本");
  55 + ErrorCode OTA_TASK_CREATE_FAIL_DEVICE_OTA_IN_PROCESS = new ErrorCode(1_050_008_102,
  56 + "创建 OTA 任务失败,原因:设备({})已经在升级中...");
  57 + ErrorCode OTA_TASK_CREATE_FAIL_DEVICE_EMPTY = new ErrorCode(1_050_008_103, "创建 OTA 任务失败,原因:没有可升级的设备");
  58 + ErrorCode OTA_TASK_CANCEL_FAIL_STATUS_END = new ErrorCode(1_050_008_104, "取消 OTA 任务失败,原因:任务状态不是进行中");
56 59
57 - // ========== IoT 数据桥梁 1-050-010-000 ==========  
58 - ErrorCode DATA_BRIDGE_NOT_EXISTS = new ErrorCode(1_050_010_000, "IoT 数据桥梁不存在"); 60 + // ========== OTA 升级任务相关 1-050-008-100 ==========
59 61
60 - // ========== IoT 场景联动 1-050-011-000 ==========  
61 - ErrorCode RULE_SCENE_NOT_EXISTS = new ErrorCode(1_050_011_000, "IoT 场景联动不存在"); 62 + ErrorCode OTA_TASK_RECORD_NOT_EXISTS = new ErrorCode(1_050_008_200, "升级记录不存在");
  63 +
  64 + // ========== IoT 数据流转规则 1-050-010-000 ==========
  65 + ErrorCode DATA_RULE_NOT_EXISTS = new ErrorCode(1_050_010_000, "数据流转规则不存在");
  66 +
  67 + // ========== IoT 数据流转目的 1-050-011-000 ==========
  68 + ErrorCode DATA_SINK_NOT_EXISTS = new ErrorCode(1_050_011_000, "数据桥梁不存在");
  69 + ErrorCode DATA_SINK_DELETE_FAIL_USED_BY_RULE = new ErrorCode(1_050_011_001, "数据流转目的正在被数据流转规则使用,无法删除");
  70 +
  71 + // ========== IoT 场景联动 1-050-012-000 ==========
  72 + ErrorCode RULE_SCENE_NOT_EXISTS = new ErrorCode(1_050_012_000, "场景联动不存在");
  73 +
  74 + // ========== IoT 告警配置 1-050-013-000 ==========
  75 + ErrorCode ALERT_CONFIG_NOT_EXISTS = new ErrorCode(1_050_013_000, "IoT 告警配置不存在");
  76 +
  77 + // ========== IoT 告警记录 1-050-014-000 ==========
  78 + ErrorCode ALERT_RECORD_NOT_EXISTS = new ErrorCode(1_050_014_000, "IoT 告警记录不存在");
62 79
63 } 80 }
64 \ No newline at end of file 81 \ No newline at end of file
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/rule/IotAlertConfigReceiveTypeEnum.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/enums/alert/IotAlertReceiveTypeEnum.java
1 -package cn.iocoder.yudao.module.iot.enums.rule; 1 +package cn.iocoder.yudao.module.iot.enums.alert;
2 2
3 import cn.iocoder.yudao.framework.common.core.ArrayValuable; 3 import cn.iocoder.yudao.framework.common.core.ArrayValuable;
4 import lombok.Getter; 4 import lombok.Getter;
@@ -7,21 +7,22 @@ import lombok.RequiredArgsConstructor; @@ -7,21 +7,22 @@ import lombok.RequiredArgsConstructor;
7 import java.util.Arrays; 7 import java.util.Arrays;
8 8
9 /** 9 /**
10 - * IoT 告警配置的接收方式枚举 10 + * IoT 告警的接收方式枚举
11 * 11 *
12 * @author 芋道源码 12 * @author 芋道源码
13 */ 13 */
14 @RequiredArgsConstructor 14 @RequiredArgsConstructor
15 @Getter 15 @Getter
16 -public enum IotAlertConfigReceiveTypeEnum implements ArrayValuable<Integer> { 16 +public enum IotAlertReceiveTypeEnum implements ArrayValuable<Integer> {
17 17
18 SMS(1), // 短信 18 SMS(1), // 短信
19 MAIL(2), // 邮箱 19 MAIL(2), // 邮箱
20 - NOTIFY(3); // 通知 20 + NOTIFY(3); // 站内信
  21 + // TODO 待实现(欢迎 pull request):webhook 4
21 22
22 private final Integer type; 23 private final Integer type;
23 24
24 - public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotAlertConfigReceiveTypeEnum::getType).toArray(Integer[]::new); 25 + public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotAlertReceiveTypeEnum::getType).toArray(Integer[]::new);
25 26
26 @Override 27 @Override
27 public Integer[] array() { 28 public Integer[] array() {
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceMessageIdentifierEnum.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceMessageIdentifierEnum.java
@@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor; @@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor;
7 /** 7 /**
8 * IoT 设备消息标识符枚举 8 * IoT 设备消息标识符枚举
9 */ 9 */
  10 +@Deprecated
10 @Getter 11 @Getter
11 @RequiredArgsConstructor 12 @RequiredArgsConstructor
12 public enum IotDeviceMessageIdentifierEnum { 13 public enum IotDeviceMessageIdentifierEnum {