Commit 343353b8f8c437e1f3e51d24d3386475f866d23b

Authored by puhui999
1 parent e3e3a00f

【代码优化】IoT: 场景联动

Showing 22 changed files with 287 additions and 350 deletions
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java
... ... @@ -72,8 +72,8 @@ public interface ErrorCodeConstants {
72 72 // ========== IoT 数据桥梁 1-050-010-000 ==========
73 73 ErrorCode DATA_BRIDGE_NOT_EXISTS = new ErrorCode(1_050_010_000, "IoT 数据桥梁不存在");
74 74  
75   - // ========== IoT 规则场景(场景联动) 1-050-011-000 ==========
76   - ErrorCode RULE_SCENE_NOT_EXISTS = new ErrorCode(1_050_011_000, "IoT 规则场景(场景联动)不存在");
  75 + // ========== IoT 场景联动 1-050-011-000 ==========
  76 + ErrorCode RULE_SCENE_NOT_EXISTS = new ErrorCode(1_050_011_000, "IoT 场景联动不存在");
77 77  
78 78 // ========== IoT 产品脚本信息 1-050-012-000 ==========
79 79 ErrorCode PRODUCT_SCRIPT_NOT_EXISTS = new ErrorCode(1_050_012_000, "IoT 产品脚本信息不存在");
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/IotRuleSceneController.java
... ... @@ -20,8 +20,7 @@ import org.springframework.web.bind.annotation.*;
20 20  
21 21 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
22 22  
23   -// TODO @芋艿:规则场景 要不要,统一改成 场景联动
24   -@Tag(name = "管理后台 - IoT 规则场景")
  23 +@Tag(name = "管理后台 - IoT 场景联动")
25 24 @RestController
26 25 @RequestMapping("/iot/rule-scene")
27 26 @Validated
... ... @@ -31,14 +30,14 @@ public class IotRuleSceneController {
31 30 private IotRuleSceneService ruleSceneService;
32 31  
33 32 @PostMapping("/create")
34   - @Operation(summary = "创建规则场景(场景联动)")
  33 + @Operation(summary = "创建场景联动")
35 34 @PreAuthorize("@ss.hasPermission('iot:rule-scene:create')")
36 35 public CommonResult<Long> createRuleScene(@Valid @RequestBody IotRuleSceneSaveReqVO createReqVO) {
37 36 return success(ruleSceneService.createRuleScene(createReqVO));
38 37 }
39 38  
40 39 @PutMapping("/update")
41   - @Operation(summary = "更新规则场景(场景联动)")
  40 + @Operation(summary = "更新场景联动")
42 41 @PreAuthorize("@ss.hasPermission('iot:rule-scene:update')")
43 42 public CommonResult<Boolean> updateRuleScene(@Valid @RequestBody IotRuleSceneSaveReqVO updateReqVO) {
44 43 ruleSceneService.updateRuleScene(updateReqVO);
... ... @@ -46,7 +45,7 @@ public class IotRuleSceneController {
46 45 }
47 46  
48 47 @DeleteMapping("/delete")
49   - @Operation(summary = "删除规则场景(场景联动)")
  48 + @Operation(summary = "删除场景联动")
50 49 @Parameter(name = "id", description = "编号", required = true)
51 50 @PreAuthorize("@ss.hasPermission('iot:rule-scene:delete')")
52 51 public CommonResult<Boolean> deleteRuleScene(@RequestParam("id") Long id) {
... ... @@ -55,7 +54,7 @@ public class IotRuleSceneController {
55 54 }
56 55  
57 56 @GetMapping("/get")
58   - @Operation(summary = "获得规则场景(场景联动)")
  57 + @Operation(summary = "获得场景联动")
59 58 @Parameter(name = "id", description = "编号", required = true, example = "1024")
60 59 @PreAuthorize("@ss.hasPermission('iot:rule-scene:query')")
61 60 public CommonResult<IotRuleSceneRespVO> getRuleScene(@RequestParam("id") Long id) {
... ... @@ -64,7 +63,7 @@ public class IotRuleSceneController {
64 63 }
65 64  
66 65 @GetMapping("/page")
67   - @Operation(summary = "获得规则场景(场景联动)分页")
  66 + @Operation(summary = "获得场景联动分页")
68 67 @PreAuthorize("@ss.hasPermission('iot:rule-scene:query')")
69 68 public CommonResult<PageResult<IotRuleSceneRespVO>> getRuleScenePage(@Valid IotRuleScenePageReqVO pageReqVO) {
70 69 PageResult<IotRuleSceneDO> pageResult = ruleSceneService.getRuleScenePage(pageReqVO);
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/package-info.java deleted
1   -// TODO @芋艿:占位
2   -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo;
3 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/scene/IotRuleScenePageReqVO.java
... ... @@ -13,7 +13,7 @@ import java.time.LocalDateTime;
13 13  
14 14 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
15 15  
16   -@Schema(description = "管理后台 - IoT 规则场景(场景联动)分页 Request VO")
  16 +@Schema(description = "管理后台 - IoT 场景联动分页 Request VO")
17 17 @Data
18 18 @EqualsAndHashCode(callSuper = true)
19 19 @ToString(callSuper = true)
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/scene/IotRuleSceneRespVO.java
1 1 package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene;
2 2  
3   -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config.IotRuleSceneActionConfig;
4   -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config.IotRuleSceneTriggerConfig;
  3 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
5 4 import io.swagger.v3.oas.annotations.media.Schema;
6 5 import lombok.Data;
7 6  
8 7 import java.time.LocalDateTime;
9 8 import java.util.List;
10 9  
11   -@Schema(description = "管理后台 - IoT 规则场景(场景联动) Response VO")
  10 +@Schema(description = "管理后台 - IoT 场景联动 Response VO")
12 11 @Data
13 12 public class IotRuleSceneRespVO {
14 13  
... ... @@ -25,10 +24,10 @@ public class IotRuleSceneRespVO {
25 24 private Integer status;
26 25  
27 26 @Schema(description = "触发器数组", requiredMode = Schema.RequiredMode.REQUIRED)
28   - private List<IotRuleSceneTriggerConfig> triggers;
  27 + private List<IotRuleSceneDO.TriggerConfig> triggers;
29 28  
30 29 @Schema(description = "执行器数组", requiredMode = Schema.RequiredMode.REQUIRED)
31   - private List<IotRuleSceneActionConfig> actions;
  30 + private List<IotRuleSceneDO.ActionConfig> actions;
32 31  
33 32 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
34 33 private LocalDateTime createTime;
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/scene/IotRuleSceneSaveReqVO.java
... ... @@ -2,8 +2,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.common.validation.InEnum;
5   -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config.IotRuleSceneActionConfig;
6   -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config.IotRuleSceneTriggerConfig;
  5 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
7 6 import io.swagger.v3.oas.annotations.media.Schema;
8 7 import jakarta.validation.constraints.NotEmpty;
9 8 import jakarta.validation.constraints.NotNull;
... ... @@ -11,7 +10,7 @@ import lombok.Data;
11 10  
12 11 import java.util.List;
13 12  
14   -@Schema(description = "管理后台 - IoT 规则场景(场景联动)新增/修改 Request VO")
  13 +@Schema(description = "管理后台 - IoT 场景联动新增/修改 Request VO")
15 14 @Data
16 15 public class IotRuleSceneSaveReqVO {
17 16  
... ... @@ -32,10 +31,10 @@ public class IotRuleSceneSaveReqVO {
32 31  
33 32 @Schema(description = "触发器数组", requiredMode = Schema.RequiredMode.REQUIRED)
34 33 @NotEmpty(message = "触发器数组不能为空")
35   - private List<IotRuleSceneTriggerConfig> triggers;
  34 + private List<IotRuleSceneDO.TriggerConfig> triggers;
36 35  
37 36 @Schema(description = "执行器数组", requiredMode = Schema.RequiredMode.REQUIRED)
38 37 @NotEmpty(message = "执行器数组不能为空")
39   - private List<IotRuleSceneActionConfig> actions;
  38 + private List<IotRuleSceneDO.ActionConfig> actions;
40 39  
41 40 }
42 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/scene/config/IotRuleSceneActionConfig.java deleted
1   -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config;
2   -
3   -import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataBridgeDO;
4   -import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum;
5   -import lombok.Data;
6   -
7   -// TODO @puhui999:这个要不内嵌到 IoTRuleSceneDO 里面?
8   -/**
9   - * 执行器配置
10   - *
11   - * @author 芋道源码
12   - */
13   -@Data
14   -public class IotRuleSceneActionConfig {
15   -
16   - /**
17   - * 执行类型
18   - *
19   - * 枚举 {@link IotRuleSceneActionTypeEnum}
20   - */
21   - private Integer type;
22   -
23   - /**
24   - * 设备控制
25   - *
26   - * 必填:当 {@link #type} 为 {@link IotRuleSceneActionTypeEnum#DEVICE_CONTROL} 时
27   - */
28   - private IotRuleSceneActionDeviceControl deviceControl;
29   -
30   - /**
31   - * 数据桥接编号
32   - *
33   - * 必填:当 {@link #type} 为 {@link IotRuleSceneActionTypeEnum#DATA_BRIDGE} 时
34   - * 关联:{@link IotDataBridgeDO#getId()}
35   - */
36   - private Long dataBridgeId;
37   -
38   -}
39 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/scene/config/IotRuleSceneActionDeviceControl.java deleted
1   -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config;
2   -
3   -import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
4   -import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
5   -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum;
6   -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
7   -import lombok.Data;
8   -
9   -import java.util.List;
10   -import java.util.Map;
11   -
12   -// TODO @puhui999:这个要不内嵌到 IoTRuleSceneDO 里面?
13   -/**
14   - * 执行设备控制
15   - *
16   - * @author 芋道源码
17   - */
18   -@Data
19   -public class IotRuleSceneActionDeviceControl {
20   -
21   - /**
22   - * 产品标识
23   - *
24   - * 关联 {@link IotProductDO#getProductKey()}
25   - */
26   - private String productKey;
27   - /**
28   - * 设备名称数组
29   - *
30   - * 关联 {@link IotDeviceDO#getDeviceName()}
31   - */
32   - private List<String> deviceNames;
33   -
34   - /**
35   - * 消息类型
36   - *
37   - * 枚举 {@link IotDeviceMessageTypeEnum#PROPERTY}、{@link IotDeviceMessageTypeEnum#SERVICE}
38   - */
39   - private String type;
40   - /**
41   - * 消息标识符
42   - *
43   - * 枚举 {@link IotDeviceMessageIdentifierEnum}
44   - *
45   - * 1. 属性设置:对应 {@link IotDeviceMessageIdentifierEnum#PROPERTY_SET}
46   - * 2. 服务调用:对应 {@link IotDeviceMessageIdentifierEnum#SERVICE_INVOKE}
47   - */
48   - private String identifier;
49   -
50   - /**
51   - * 具体数据
52   - *
53   - * 1. 属性设置:在 {@link #type} 是 {@link IotDeviceMessageTypeEnum#PROPERTY} 时,对应 properties
54   - * 2. 服务调用:在 {@link #type} 是 {@link IotDeviceMessageTypeEnum#SERVICE} 时,对应 params
55   - */
56   - private Map<String, Object> data;
57   -
58   -}
59 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/scene/config/IotRuleSceneTriggerCondition.java deleted
1   -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config;
2   -
3   -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum;
4   -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
5   -import lombok.Data;
6   -
7   -import java.util.List;
8   -
9   -// TODO @puhui999:这个要不内嵌到 IoTRuleSceneDO 里面?
10   -/**
11   - * 触发条件
12   - *
13   - * @author 芋道源码
14   - */
15   -@Data
16   -public class IotRuleSceneTriggerCondition {
17   -
18   - /**
19   - * 消息类型
20   - *
21   - * 枚举 {@link IotDeviceMessageTypeEnum}
22   - */
23   - private String type;
24   - /**
25   - * 消息标识符
26   - *
27   - * 枚举 {@link IotDeviceMessageIdentifierEnum}
28   - */
29   - private String identifier;
30   -
31   - /**
32   - * 参数数组
33   - *
34   - * 参数与参数之间,是“或”的关系
35   - */
36   - private List<IotRuleSceneTriggerConditionParameter> parameters;
37   -
38   -}
39 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/scene/config/IotRuleSceneTriggerConditionParameter.java deleted
1   -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config;
2   -
3   -import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO;
4   -import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerConditionParameterOperatorEnum;
5   -import lombok.Data;
6   -
7   -// TODO @puhui999:这个要不内嵌到 IoTRuleSceneDO 里面?
8   -/**
9   - * 触发条件参数
10   - *
11   - * @author 芋道源码
12   - */
13   -@Data
14   -public class IotRuleSceneTriggerConditionParameter {
15   -
16   - /**
17   - * 标识符(属性、事件、服务)
18   - *
19   - * 关联 {@link IotThingModelDO#getIdentifier()}
20   - */
21   - private String identifier;
22   -
23   - /**
24   - * 操作符
25   - *
26   - * 枚举 {@link IotRuleSceneTriggerConditionParameterOperatorEnum}
27   - */
28   - private String operator;
29   -
30   - /**
31   - * 比较值
32   - *
33   - * 如果有多个值,则使用 "," 分隔,类似 "1,2,3"。
34   - * 例如说,{@link IotRuleSceneTriggerConditionParameterOperatorEnum#IN}、{@link IotRuleSceneTriggerConditionParameterOperatorEnum#BETWEEN}
35   - */
36   - private String value;
37   -
38   -}
39 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/scene/config/IotRuleSceneTriggerConfig.java deleted
1   -package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config;
2   -
3   -import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
4   -import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
5   -import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum;
6   -import lombok.Data;
7   -
8   -import java.util.List;
9   -
10   -// TODO @puhui999:这个要不内嵌到 IoTRuleSceneDO 里面?
11   -/**
12   - * 触发器配置
13   - *
14   - * @author 芋道源码
15   - */
16   -@Data
17   -public class IotRuleSceneTriggerConfig {
18   -
19   - /**
20   - * 触发类型
21   - *
22   - * 枚举 {@link IotRuleSceneTriggerTypeEnum}
23   - */
24   - private Integer type;
25   -
26   - /**
27   - * 产品标识
28   - *
29   - * 关联 {@link IotProductDO#getProductKey()}
30   - */
31   - private String productKey;
32   - /**
33   - * 设备名称数组
34   - *
35   - * 关联 {@link IotDeviceDO#getDeviceName()}
36   - */
37   - private List<String> deviceNames;
38   -
39   - /**
40   - * 触发条件数组
41   - *
42   - * 必填:当 {@link #type} 为 {@link IotRuleSceneTriggerTypeEnum#DEVICE} 时
43   - * 条件与条件之间,是“或”的关系
44   - */
45   - private List<IotRuleSceneTriggerCondition> conditions;
46   -
47   - /**
48   - * CRON 表达式
49   - *
50   - * 必填:当 {@link #type} 为 {@link IotRuleSceneTriggerTypeEnum#TIMER} 时
51   - */
52   - private String cronExpression;
53   -
54   -}
55 0 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/IotThingModelController.java
1 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;
3 5 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 8 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.*;
7 9 import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO;
  10 +import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum;
8 11 import cn.iocoder.yudao.module.iot.service.thingmodel.IotThingModelService;
9 12 import io.swagger.v3.oas.annotations.Operation;
10 13 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -18,6 +21,8 @@ import org.springframework.web.bind.annotation.*;
18 21 import java.util.List;
19 22  
20 23 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  24 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  25 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
21 26  
22 27 @Tag(name = "管理后台 - IoT 产品物模型")
23 28 @RestController
... ... @@ -61,13 +66,31 @@ public class IotThingModelController {
61 66 return success(BeanUtils.toBean(thingModel, IotThingModelRespVO.class));
62 67 }
63 68  
64   - // TODO @puhui999:要不叫 get-tsl,去掉 product-id;后续,把
65   - @GetMapping("/tsl-by-product-id")
  69 + @GetMapping("/get-tsl")
66 70 @Operation(summary = "获得产品物模型 TSL")
67 71 @Parameter(name = "productId", description = "产品 ID", required = true, example = "1024")
68 72 @PreAuthorize("@ss.hasPermission('iot:thing-model:query')")
69   - public CommonResult<IotThingModelTSLRespVO> getThingModelTslByProductId(@RequestParam("productId") Long productId) {
70   - return success(thingModelService.getThingModelTslByProductId(productId));
  73 + public CommonResult<IotThingModelTSLRespVO> getThingModelTsl(@RequestParam("productId") Long productId) {
  74 + IotThingModelTSLRespVO tslRespVO = new IotThingModelTSLRespVO();
  75 + // 1. 获得产品所有物模型定义
  76 + List<IotThingModelDO> thingModels = thingModelService.getThingModelListByProductId(productId);
  77 + if (CollUtil.isEmpty(thingModels)) {
  78 + return success(tslRespVO);
  79 + }
  80 +
  81 + // 2.1 设置公共部分参数
  82 + IotThingModelDO thingModel = thingModels.get(0);
  83 + tslRespVO.setProductId(thingModel.getProductId()).setProductKey(thingModel.getProductKey());
  84 + // 2.2 处理属性列表
  85 + tslRespVO.setProperties(convertList(filterList(thingModels, item ->
  86 + ObjUtil.equal(IotThingModelTypeEnum.PROPERTY.getType(), item.getType())), IotThingModelDO::getProperty));
  87 + // 2.3 处理服务列表
  88 + tslRespVO.setServices(convertList(filterList(thingModels, item ->
  89 + ObjUtil.equal(IotThingModelTypeEnum.SERVICE.getType(), item.getType())), IotThingModelDO::getService));
  90 + // 2.4 处理事件列表
  91 + tslRespVO.setEvents(convertList(filterList(thingModels, item ->
  92 + ObjUtil.equal(IotThingModelTypeEnum.EVENT.getType(), item.getType())), IotThingModelDO::getEvent));
  93 + return success(tslRespVO);
71 94 }
72 95  
73 96 @GetMapping("/list")
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotRuleSceneDO.java
1 1 package cn.iocoder.yudao.module.iot.dal.dataobject.rule;
2 2  
3 3 import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
4   -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config.IotRuleSceneActionConfig;
5   -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config.IotRuleSceneTriggerConfig;
  4 +import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
  5 +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
  6 +import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO;
  7 +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum;
  8 +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
  9 +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum;
  10 +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerConditionParameterOperatorEnum;
  11 +import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum;
6 12 import com.baomidou.mybatisplus.annotation.KeySequence;
7 13 import com.baomidou.mybatisplus.annotation.TableField;
8 14 import com.baomidou.mybatisplus.annotation.TableId;
... ... @@ -14,13 +20,14 @@ import lombok.Data;
14 20 import lombok.NoArgsConstructor;
15 21  
16 22 import java.util.List;
  23 +import java.util.Map;
17 24  
18 25 /**
19   - * IoT 规则场景(场景联动) DO
  26 + * IoT 场景联动 DO
20 27 *
21 28 * @author 芋道源码
22 29 */
23   -@TableName("iot_rule_scene")
  30 +@TableName(value = "iot_rule_scene", autoResultMap = true)
24 31 @KeySequence("iot_rule_scene_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
25 32 @Data
26 33 @Builder
... ... @@ -52,12 +59,188 @@ public class IotRuleSceneDO extends TenantBaseDO {
52 59 * 触发器数组
53 60 */
54 61 @TableField(typeHandler = JacksonTypeHandler.class)
55   - private List<IotRuleSceneTriggerConfig> triggers;
  62 + private List<TriggerConfig> triggers;
56 63  
57 64 /**
58 65 * 执行器数组
59 66 */
60 67 @TableField(typeHandler = JacksonTypeHandler.class)
61   - private List<IotRuleSceneActionConfig> actions;
  68 + private List<ActionConfig> actions;
  69 +
  70 + /**
  71 + * 触发器配置
  72 + */
  73 + @Data
  74 + public static class TriggerConfig {
  75 +
  76 + /**
  77 + * 触发类型
  78 + *
  79 + * 枚举 {@link IotRuleSceneTriggerTypeEnum}
  80 + */
  81 + private Integer type;
  82 +
  83 + /**
  84 + * 产品标识
  85 + *
  86 + * 关联 {@link IotProductDO#getProductKey()}
  87 + */
  88 + private String productKey;
  89 + /**
  90 + * 设备名称数组
  91 + *
  92 + * 关联 {@link IotDeviceDO#getDeviceName()}
  93 + */
  94 + private List<String> deviceNames;
  95 +
  96 + /**
  97 + * 触发条件数组
  98 + *
  99 + * 必填:当 {@link #type} 为 {@link IotRuleSceneTriggerTypeEnum#DEVICE} 时
  100 + * 条件与条件之间,是“或”的关系
  101 + */
  102 + private List<TriggerCondition> conditions;
  103 +
  104 + /**
  105 + * CRON 表达式
  106 + *
  107 + * 必填:当 {@link #type} 为 {@link IotRuleSceneTriggerTypeEnum#TIMER} 时
  108 + */
  109 + private String cronExpression;
  110 +
  111 + }
  112 +
  113 + /**
  114 + * 触发条件
  115 + */
  116 + @Data
  117 + public static class TriggerCondition {
  118 +
  119 + /**
  120 + * 消息类型
  121 + *
  122 + * 枚举 {@link IotDeviceMessageTypeEnum}
  123 + */
  124 + private String type;
  125 + /**
  126 + * 消息标识符
  127 + *
  128 + * 枚举 {@link IotDeviceMessageIdentifierEnum}
  129 + */
  130 + private String identifier;
  131 +
  132 + /**
  133 + * 参数数组
  134 + *
  135 + * 参数与参数之间,是“或”的关系
  136 + */
  137 + private List<TriggerConditionParameter> parameters;
  138 +
  139 + }
  140 +
  141 + /**
  142 + * 触发条件参数
  143 + */
  144 + @Data
  145 + public static class TriggerConditionParameter {
  146 +
  147 + /**
  148 + * 标识符(属性、事件、服务)
  149 + *
  150 + * 关联 {@link IotThingModelDO#getIdentifier()}
  151 + */
  152 + private String identifier;
  153 +
  154 + /**
  155 + * 操作符
  156 + *
  157 + * 枚举 {@link IotRuleSceneTriggerConditionParameterOperatorEnum}
  158 + */
  159 + private String operator;
  160 +
  161 + /**
  162 + * 比较值
  163 + *
  164 + * 如果有多个值,则使用 "," 分隔,类似 "1,2,3"。
  165 + * 例如说,{@link IotRuleSceneTriggerConditionParameterOperatorEnum#IN}、{@link IotRuleSceneTriggerConditionParameterOperatorEnum#BETWEEN}
  166 + */
  167 + private String value;
  168 +
  169 + }
  170 +
  171 + /**
  172 + * 执行器配置
  173 + */
  174 + @Data
  175 + public static class ActionConfig {
  176 +
  177 + /**
  178 + * 执行类型
  179 + *
  180 + * 枚举 {@link IotRuleSceneActionTypeEnum}
  181 + */
  182 + private Integer type;
  183 +
  184 + /**
  185 + * 设备控制
  186 + *
  187 + * 必填:当 {@link #type} 为 {@link IotRuleSceneActionTypeEnum#DEVICE_CONTROL} 时
  188 + */
  189 + private ActionDeviceControl deviceControl;
  190 +
  191 + /**
  192 + * 数据桥接编号
  193 + *
  194 + * 必填:当 {@link #type} 为 {@link IotRuleSceneActionTypeEnum#DATA_BRIDGE} 时
  195 + * 关联:{@link IotDataBridgeDO#getId()}
  196 + */
  197 + private Long dataBridgeId;
  198 +
  199 + }
  200 +
  201 + /**
  202 + * 执行设备控制
  203 + */
  204 + @Data
  205 + public static class ActionDeviceControl {
  206 +
  207 + /**
  208 + * 产品标识
  209 + *
  210 + * 关联 {@link IotProductDO#getProductKey()}
  211 + */
  212 + private String productKey;
  213 + /**
  214 + * 设备名称数组
  215 + *
  216 + * 关联 {@link IotDeviceDO#getDeviceName()}
  217 + */
  218 + private List<String> deviceNames;
  219 +
  220 + /**
  221 + * 消息类型
  222 + *
  223 + * 枚举 {@link IotDeviceMessageTypeEnum#PROPERTY}、{@link IotDeviceMessageTypeEnum#SERVICE}
  224 + */
  225 + private String type;
  226 + /**
  227 + * 消息标识符
  228 + *
  229 + * 枚举 {@link IotDeviceMessageIdentifierEnum}
  230 + *
  231 + * 1. 属性设置:对应 {@link IotDeviceMessageIdentifierEnum#PROPERTY_SET}
  232 + * 2. 服务调用:对应 {@link IotDeviceMessageIdentifierEnum#SERVICE_INVOKE}
  233 + */
  234 + private String identifier;
  235 +
  236 + /**
  237 + * 具体数据
  238 + *
  239 + * 1. 属性设置:在 {@link #type} 是 {@link IotDeviceMessageTypeEnum#PROPERTY} 时,对应 properties
  240 + * 2. 服务调用:在 {@link #type} 是 {@link IotDeviceMessageTypeEnum#SERVICE} 时,对应 params
  241 + */
  242 + private Map<String, Object> data;
  243 +
  244 + }
62 245  
63 246 }
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/rule/IotRuleSceneMapper.java
... ... @@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
8 8 import org.apache.ibatis.annotations.Mapper;
9 9  
10 10 /**
11   - * IoT 规则场景(场景联动) Mapper
  11 + * IoT 场景联动 Mapper
12 12 *
13 13 * @author HUIHUI
14 14 */
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/IotRuleSceneService.java
... ... @@ -18,7 +18,7 @@ import java.util.List;
18 18 public interface IotRuleSceneService {
19 19  
20 20 /**
21   - * 创建规则场景(场景联动)
  21 + * 创建场景联动
22 22 *
23 23 * @param createReqVO 创建信息
24 24 * @return 编号
... ... @@ -26,32 +26,32 @@ public interface IotRuleSceneService {
26 26 Long createRuleScene(@Valid IotRuleSceneSaveReqVO createReqVO);
27 27  
28 28 /**
29   - * 更新规则场景(场景联动)
  29 + * 更新场景联动
30 30 *
31 31 * @param updateReqVO 更新信息
32 32 */
33 33 void updateRuleScene(@Valid IotRuleSceneSaveReqVO updateReqVO);
34 34  
35 35 /**
36   - * 删除规则场景(场景联动)
  36 + * 删除场景联动
37 37 *
38 38 * @param id 编号
39 39 */
40 40 void deleteRuleScene(Long id);
41 41  
42 42 /**
43   - * 获得规则场景(场景联动)
  43 + * 获得场景联动
44 44 *
45 45 * @param id 编号
46   - * @return 规则场景(场景联动)
  46 + * @return 场景联动
47 47 */
48 48 IotRuleSceneDO getRuleScene(Long id);
49 49  
50 50 /**
51   - * 获得规则场景(场景联动)分页
  51 + * 获得场景联动分页
52 52 *
53 53 * @param pageReqVO 分页查询
54   - * @return 规则场景(场景联动)分页
  54 + * @return 场景联动分页
55 55 */
56 56 PageResult<IotRuleSceneDO> getRuleScenePage(IotRuleScenePageReqVO pageReqVO);
57 57  
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/IotRuleSceneServiceImpl.java
... ... @@ -17,7 +17,6 @@ import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
17 17 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
18 18 import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleScenePageReqVO;
19 19 import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleSceneSaveReqVO;
20   -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config.*;
21 20 import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
22 21 import cn.iocoder.yudao.module.iot.dal.mysql.rule.IotRuleSceneMapper;
23 22 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum;
... ... @@ -118,82 +117,82 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
118 117 if (true) {
119 118 IotRuleSceneDO ruleScene01 = new IotRuleSceneDO();
120 119 ruleScene01.setTriggers(CollUtil.newArrayList());
121   - IotRuleSceneTriggerConfig trigger01 = new IotRuleSceneTriggerConfig();
  120 + IotRuleSceneDO.TriggerConfig trigger01 = new IotRuleSceneDO.TriggerConfig();
122 121 trigger01.setType(IotRuleSceneTriggerTypeEnum.DEVICE.getType());
123 122 trigger01.setConditions(CollUtil.newArrayList());
124 123 // 属性
125   - IotRuleSceneTriggerCondition condition01 = new IotRuleSceneTriggerCondition();
  124 + IotRuleSceneDO.TriggerCondition condition01 = new IotRuleSceneDO.TriggerCondition();
126 125 condition01.setType(IotDeviceMessageTypeEnum.PROPERTY.getType());
127 126 condition01.setIdentifier(IotDeviceMessageIdentifierEnum.PROPERTY_REPORT.getIdentifier());
128 127 condition01.setParameters(CollUtil.newArrayList());
129   -// IotRuleSceneTriggerConditionParameter parameter010 = new IotRuleSceneTriggerConditionParameter();
  128 +// IotRuleSceneDO.TriggerConditionParameter parameter010 = new IotRuleSceneDO.TriggerConditionParameter();
130 129 // parameter010.setIdentifier("width");
131 130 // parameter010.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.EQUALS.getOperator());
132 131 // parameter010.setValue("abc");
133 132 // condition01.getParameters().add(parameter010);
134   - IotRuleSceneTriggerConditionParameter parameter011 = new IotRuleSceneTriggerConditionParameter();
  133 + IotRuleSceneDO.TriggerConditionParameter parameter011 = new IotRuleSceneDO.TriggerConditionParameter();
135 134 parameter011.setIdentifier("width");
136 135 parameter011.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.EQUALS.getOperator());
137 136 parameter011.setValue("1");
138 137 condition01.getParameters().add(parameter011);
139   - IotRuleSceneTriggerConditionParameter parameter012 = new IotRuleSceneTriggerConditionParameter();
  138 + IotRuleSceneDO.TriggerConditionParameter parameter012 = new IotRuleSceneDO.TriggerConditionParameter();
140 139 parameter012.setIdentifier("width");
141 140 parameter012.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_EQUALS.getOperator());
142 141 parameter012.setValue("2");
143 142 condition01.getParameters().add(parameter012);
144   - IotRuleSceneTriggerConditionParameter parameter013 = new IotRuleSceneTriggerConditionParameter();
  143 + IotRuleSceneDO.TriggerConditionParameter parameter013 = new IotRuleSceneDO.TriggerConditionParameter();
145 144 parameter013.setIdentifier("width");
146 145 parameter013.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN.getOperator());
147 146 parameter013.setValue("0");
148 147 condition01.getParameters().add(parameter013);
149   - IotRuleSceneTriggerConditionParameter parameter014 = new IotRuleSceneTriggerConditionParameter();
  148 + IotRuleSceneDO.TriggerConditionParameter parameter014 = new IotRuleSceneDO.TriggerConditionParameter();
150 149 parameter014.setIdentifier("width");
151 150 parameter014.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN_OR_EQUALS.getOperator());
152 151 parameter014.setValue("0");
153 152 condition01.getParameters().add(parameter014);
154   - IotRuleSceneTriggerConditionParameter parameter015 = new IotRuleSceneTriggerConditionParameter();
  153 + IotRuleSceneDO.TriggerConditionParameter parameter015 = new IotRuleSceneDO.TriggerConditionParameter();
155 154 parameter015.setIdentifier("width");
156 155 parameter015.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN.getOperator());
157 156 parameter015.setValue("2");
158 157 condition01.getParameters().add(parameter015);
159   - IotRuleSceneTriggerConditionParameter parameter016 = new IotRuleSceneTriggerConditionParameter();
  158 + IotRuleSceneDO.TriggerConditionParameter parameter016 = new IotRuleSceneDO.TriggerConditionParameter();
160 159 parameter016.setIdentifier("width");
161 160 parameter016.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN_OR_EQUALS.getOperator());
162 161 parameter016.setValue("2");
163 162 condition01.getParameters().add(parameter016);
164   - IotRuleSceneTriggerConditionParameter parameter017 = new IotRuleSceneTriggerConditionParameter();
  163 + IotRuleSceneDO.TriggerConditionParameter parameter017 = new IotRuleSceneDO.TriggerConditionParameter();
165 164 parameter017.setIdentifier("width");
166 165 parameter017.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.IN.getOperator());
167 166 parameter017.setValue("1,2,3");
168 167 condition01.getParameters().add(parameter017);
169   - IotRuleSceneTriggerConditionParameter parameter018 = new IotRuleSceneTriggerConditionParameter();
  168 + IotRuleSceneDO.TriggerConditionParameter parameter018 = new IotRuleSceneDO.TriggerConditionParameter();
170 169 parameter018.setIdentifier("width");
171 170 parameter018.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_IN.getOperator());
172 171 parameter018.setValue("0,2,3");
173 172 condition01.getParameters().add(parameter018);
174   - IotRuleSceneTriggerConditionParameter parameter019 = new IotRuleSceneTriggerConditionParameter();
  173 + IotRuleSceneDO.TriggerConditionParameter parameter019 = new IotRuleSceneDO.TriggerConditionParameter();
175 174 parameter019.setIdentifier("width");
176 175 parameter019.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN.getOperator());
177 176 parameter019.setValue("1,3");
178 177 condition01.getParameters().add(parameter019);
179   - IotRuleSceneTriggerConditionParameter parameter020 = new IotRuleSceneTriggerConditionParameter();
  178 + IotRuleSceneDO.TriggerConditionParameter parameter020 = new IotRuleSceneDO.TriggerConditionParameter();
180 179 parameter020.setIdentifier("width");
181 180 parameter020.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN.getOperator());
182 181 parameter020.setValue("2,3");
183 182 condition01.getParameters().add(parameter020);
184 183 trigger01.getConditions().add(condition01);
185 184 // 状态
186   - IotRuleSceneTriggerCondition condition02 = new IotRuleSceneTriggerCondition();
  185 + IotRuleSceneDO.TriggerCondition condition02 = new IotRuleSceneDO.TriggerCondition();
187 186 condition02.setType(IotDeviceMessageTypeEnum.STATE.getType());
188 187 condition02.setIdentifier(IotDeviceMessageIdentifierEnum.STATE_ONLINE.getIdentifier());
189 188 condition02.setParameters(CollUtil.newArrayList());
190 189 trigger01.getConditions().add(condition02);
191 190 // 事件
192   - IotRuleSceneTriggerCondition condition03 = new IotRuleSceneTriggerCondition();
  191 + IotRuleSceneDO.TriggerCondition condition03 = new IotRuleSceneDO.TriggerCondition();
193 192 condition03.setType(IotDeviceMessageTypeEnum.EVENT.getType());
194 193 condition03.setIdentifier("xxx");
195 194 condition03.setParameters(CollUtil.newArrayList());
196   - IotRuleSceneTriggerConditionParameter parameter030 = new IotRuleSceneTriggerConditionParameter();
  195 + IotRuleSceneDO.TriggerConditionParameter parameter030 = new IotRuleSceneDO.TriggerConditionParameter();
197 196 parameter030.setIdentifier("width");
198 197 parameter030.setOperator(IotRuleSceneTriggerConditionParameterOperatorEnum.EQUALS.getOperator());
199 198 parameter030.setValue("1");
... ... @@ -202,21 +201,21 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
202 201 // 动作
203 202 ruleScene01.setActions(CollUtil.newArrayList());
204 203 // 设备控制
205   - IotRuleSceneActionConfig action01 = new IotRuleSceneActionConfig();
  204 + IotRuleSceneDO.ActionConfig action01 = new IotRuleSceneDO.ActionConfig();
206 205 action01.setType(IotRuleSceneActionTypeEnum.DEVICE_CONTROL.getType());
207   - IotRuleSceneActionDeviceControl iotRuleSceneActionDeviceControl01 = new IotRuleSceneActionDeviceControl();
208   - iotRuleSceneActionDeviceControl01.setProductKey("4aymZgOTOOCrDKRT");
209   - iotRuleSceneActionDeviceControl01.setDeviceNames(ListUtil.of("small"));
210   - iotRuleSceneActionDeviceControl01.setType(IotDeviceMessageTypeEnum.PROPERTY.getType());
211   - iotRuleSceneActionDeviceControl01.setIdentifier(IotDeviceMessageIdentifierEnum.PROPERTY_SET.getIdentifier());
212   - iotRuleSceneActionDeviceControl01.setData(MapUtil.<String, Object>builder()
  206 + IotRuleSceneDO.ActionDeviceControl actionDeviceControl01 = new IotRuleSceneDO.ActionDeviceControl();
  207 + actionDeviceControl01.setProductKey("4aymZgOTOOCrDKRT");
  208 + actionDeviceControl01.setDeviceNames(ListUtil.of("small"));
  209 + actionDeviceControl01.setType(IotDeviceMessageTypeEnum.PROPERTY.getType());
  210 + actionDeviceControl01.setIdentifier(IotDeviceMessageIdentifierEnum.PROPERTY_SET.getIdentifier());
  211 + actionDeviceControl01.setData(MapUtil.<String, Object>builder()
213 212 .put("power", 1)
214 213 .put("color", "red")
215 214 .build());
216   - action01.setDeviceControl(iotRuleSceneActionDeviceControl01);
  215 + action01.setDeviceControl(actionDeviceControl01);
217 216 // ruleScene01.getActions().add(action01); // TODO 芋艿:先不测试了
218 217 // 数据桥接(http)
219   - IotRuleSceneActionConfig action02 = new IotRuleSceneActionConfig();
  218 + IotRuleSceneDO.ActionConfig action02 = new IotRuleSceneDO.ActionConfig();
220 219 action02.setType(IotRuleSceneActionTypeEnum.DATA_BRIDGE.getType());
221 220 action02.setDataBridgeId(1L);
222 221 ruleScene01.getActions().add(action02);
... ... @@ -226,7 +225,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
226 225 List<IotRuleSceneDO> list = ruleSceneMapper.selectList();
227 226 // TODO @芋艿:需要考虑开启状态
228 227 return filterList(list, ruleScene -> {
229   - for (IotRuleSceneTriggerConfig trigger : ruleScene.getTriggers()) {
  228 + for (IotRuleSceneDO.TriggerConfig trigger : ruleScene.getTriggers()) {
230 229 if (ObjUtil.notEqual(trigger.getProductKey(), productKey)) {
231 230 continue;
232 231 }
... ... @@ -261,13 +260,13 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
261 260 IotRuleSceneDO scene = new IotRuleSceneDO().setStatus(CommonStatusEnum.ENABLE.getStatus());
262 261 if (true) {
263 262 scene.setTenantId(1L);
264   - IotRuleSceneTriggerConfig iotRuleSceneTriggerConfig = new IotRuleSceneTriggerConfig();
265   - iotRuleSceneTriggerConfig.setType(IotRuleSceneTriggerTypeEnum.TIMER.getType());
266   - scene.setTriggers(ListUtil.toList(iotRuleSceneTriggerConfig));
  263 + IotRuleSceneDO.TriggerConfig triggerConfig = new IotRuleSceneDO.TriggerConfig();
  264 + triggerConfig.setType(IotRuleSceneTriggerTypeEnum.TIMER.getType());
  265 + scene.setTriggers(ListUtil.toList(triggerConfig));
267 266 // 动作
268   - IotRuleSceneActionConfig action01 = new IotRuleSceneActionConfig();
  267 + IotRuleSceneDO.ActionConfig action01 = new IotRuleSceneDO.ActionConfig();
269 268 action01.setType(IotRuleSceneActionTypeEnum.DEVICE_CONTROL.getType());
270   - IotRuleSceneActionDeviceControl iotRuleSceneActionDeviceControl01 = new IotRuleSceneActionDeviceControl();
  269 + IotRuleSceneDO.ActionDeviceControl iotRuleSceneActionDeviceControl01 = new IotRuleSceneDO.ActionDeviceControl();
271 270 iotRuleSceneActionDeviceControl01.setProductKey("4aymZgOTOOCrDKRT");
272 271 iotRuleSceneActionDeviceControl01.setDeviceNames(ListUtil.of("small"));
273 272 iotRuleSceneActionDeviceControl01.setType(IotDeviceMessageTypeEnum.PROPERTY.getType());
... ... @@ -288,7 +287,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
288 287 return;
289 288 }
290 289 // 1.2 判断是否有定时触发器,避免脏数据
291   - IotRuleSceneTriggerConfig config = CollUtil.findOne(scene.getTriggers(),
  290 + IotRuleSceneDO.TriggerConfig config = CollUtil.findOne(scene.getTriggers(),
292 291 trigger -> ObjUtil.equals(trigger.getType(), IotRuleSceneTriggerTypeEnum.TIMER.getType()));
293 292 if (config == null) {
294 293 log.error("[executeRuleSceneByTimer][规则场景({}) 不存在定时触发器]", scene);
... ... @@ -317,7 +316,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
317 316  
318 317 // 2. 匹配 trigger 触发器的条件
319 318 return filterList(ruleScenes, ruleScene -> {
320   - for (IotRuleSceneTriggerConfig trigger : ruleScene.getTriggers()) {
  319 + for (IotRuleSceneDO.TriggerConfig trigger : ruleScene.getTriggers()) {
321 320 // 2.1 非设备触发,不匹配
322 321 if (ObjUtil.notEqual(trigger.getType(), IotRuleSceneTriggerTypeEnum.DEVICE.getType())) {
323 322 return false;
... ... @@ -328,13 +327,13 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
328 327 return false;
329 328 }
330 329 // 2.3 多个条件,只需要满足一个即可
331   - IotRuleSceneTriggerCondition matchedCondition = CollUtil.findOne(trigger.getConditions(), condition -> {
  330 + IotRuleSceneDO.TriggerCondition matchedCondition = CollUtil.findOne(trigger.getConditions(), condition -> {
332 331 if (ObjUtil.notEqual(message.getType(), condition.getType())
333 332 || ObjUtil.notEqual(message.getIdentifier(), condition.getIdentifier())) {
334 333 return false;
335 334 }
336 335 // 多个条件参数,必须全部满足。所以,下面的逻辑就是找到一个不满足的条件参数
337   - IotRuleSceneTriggerConditionParameter notMatchedParameter = CollUtil.findOne(condition.getParameters(),
  336 + IotRuleSceneDO.TriggerConditionParameter notMatchedParameter = CollUtil.findOne(condition.getParameters(),
338 337 parameter -> !isTriggerConditionParameterMatched(message, parameter, ruleScene, trigger));
339 338 return notMatchedParameter == null;
340 339 });
... ... @@ -360,8 +359,8 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
360 359 * @return 是否匹配
361 360 */
362 361 @SuppressWarnings({"unchecked", "DataFlowIssue"})
363   - private boolean isTriggerConditionParameterMatched(IotDeviceMessage message, IotRuleSceneTriggerConditionParameter parameter,
364   - IotRuleSceneDO ruleScene, IotRuleSceneTriggerConfig trigger) {
  362 + private boolean isTriggerConditionParameterMatched(IotDeviceMessage message, IotRuleSceneDO.TriggerConditionParameter parameter,
  363 + IotRuleSceneDO ruleScene, IotRuleSceneDO.TriggerConfig trigger) {
365 364 // 1.1 校验操作符是否合法
366 365 IotRuleSceneTriggerConditionParameterOperatorEnum operator =
367 366 IotRuleSceneTriggerConditionParameterOperatorEnum.operatorOf(parameter.getOperator());
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/IotRuleSceneAction.java
1 1 package cn.iocoder.yudao.module.iot.service.rule.action;
2 2  
3   -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config.IotRuleSceneActionConfig;
  3 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
4 4 import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum;
5 5 import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage;
6 6  
... ... @@ -23,7 +23,7 @@ public interface IotRuleSceneAction {
23 23 * 2. 非空的情况:设备触发
24 24 * @param config 配置
25 25 */
26   - void execute(@Nullable IotDeviceMessage message, IotRuleSceneActionConfig config) throws Exception;
  26 + void execute(@Nullable IotDeviceMessage message, IotRuleSceneDO.ActionConfig config) throws Exception;
27 27  
28 28 /**
29 29 * 获得类型
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/IotRuleSceneAlertAction.java
1 1 package cn.iocoder.yudao.module.iot.service.rule.action;
2 2  
3   -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config.IotRuleSceneActionConfig;
  3 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
4 4 import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum;
5 5 import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage;
6 6 import org.springframework.stereotype.Component;
... ... @@ -16,7 +16,7 @@ import javax.annotation.Nullable;
16 16 public class IotRuleSceneAlertAction implements IotRuleSceneAction {
17 17  
18 18 @Override
19   - public void execute(@Nullable IotDeviceMessage message, IotRuleSceneActionConfig config) {
  19 + public void execute(@Nullable IotDeviceMessage message, IotRuleSceneDO.ActionConfig config) {
20 20 // TODO @芋艿:待实现
21 21 }
22 22  
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/IotRuleSceneDataBridgeAction.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.iot.service.rule.action;
2 2  
3 3 import cn.hutool.core.lang.Assert;
4 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5   -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config.IotRuleSceneActionConfig;
6 5 import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataBridgeDO;
  6 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
7 7 import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum;
8 8 import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage;
9 9 import cn.iocoder.yudao.module.iot.service.rule.IotDataBridgeService;
... ... @@ -29,7 +29,7 @@ public class IotRuleSceneDataBridgeAction implements IotRuleSceneAction {
29 29 private List<IotDataBridgeExecute<?>> dataBridgeExecutes;
30 30  
31 31 @Override
32   - public void execute(IotDeviceMessage message, IotRuleSceneActionConfig config) throws Exception {
  32 + public void execute(IotDeviceMessage message, IotRuleSceneDO.ActionConfig config) throws Exception {
33 33 // 1.1 如果消息为空,直接返回
34 34 if (message == null) {
35 35 return;
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/action/IotRuleSceneDeviceControlAction.java
... ... @@ -2,9 +2,8 @@ package cn.iocoder.yudao.module.iot.service.rule.action;
2 2  
3 3 import cn.hutool.core.lang.Assert;
4 4 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceDownstreamReqVO;
5   -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config.IotRuleSceneActionConfig;
6   -import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.config.IotRuleSceneActionDeviceControl;
7 5 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
  6 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
8 7 import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneActionTypeEnum;
9 8 import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage;
10 9 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
... ... @@ -28,8 +27,8 @@ public class IotRuleSceneDeviceControlAction implements IotRuleSceneAction {
28 27 private IotDeviceService deviceService;
29 28  
30 29 @Override
31   - public void execute(IotDeviceMessage message, IotRuleSceneActionConfig config) {
32   - IotRuleSceneActionDeviceControl control = config.getDeviceControl();
  30 + public void execute(IotDeviceMessage message, IotRuleSceneDO.ActionConfig config) {
  31 + IotRuleSceneDO.ActionDeviceControl control = config.getDeviceControl();
33 32 Assert.notNull(control, "设备控制配置不能为空");
34 33 // 遍历每个设备,下发消息
35 34 control.getDeviceNames().forEach(deviceName -> {
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thingmodel/IotThingModelService.java
... ... @@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.IotThingModelListReqVO;
5 5 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.IotThingModelPageReqVO;
6 6 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.IotThingModelSaveReqVO;
7   -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.IotThingModelTSLRespVO;
8 7 import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO;
9 8 import jakarta.validation.Valid;
10 9  
... ... @@ -91,12 +90,4 @@ public interface IotThingModelService {
91 90 */
92 91 Long getThingModelCount(LocalDateTime createTime);
93 92  
94   - /**
95   - * 通过产品 ID 获取产品物模型 TSL
96   - *
97   - * @param productId 产品 ID
98   - * @return 产品物模型 TSL
99   - */
100   - IotThingModelTSLRespVO getThingModelTslByProductId(Long productId);
101   -
102 93 }
103 94 \ No newline at end of file
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thingmodel/IotThingModelServiceImpl.java
1 1 package cn.iocoder.yudao.module.iot.service.thingmodel;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.hutool.core.util.ObjUtil;
5 4 import cn.hutool.core.util.ObjectUtil;
6 5 import cn.hutool.core.util.StrUtil;
7 6 import cn.hutool.extra.spring.SpringUtil;
... ... @@ -14,7 +13,6 @@ import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.ThingModelS
14 13 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.IotThingModelListReqVO;
15 14 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.IotThingModelPageReqVO;
16 15 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.IotThingModelSaveReqVO;
17   -import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.vo.IotThingModelTSLRespVO;
18 16 import cn.iocoder.yudao.module.iot.convert.thingmodel.IotThingModelConvert;
19 17 import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
20 18 import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO;
... ... @@ -151,31 +149,6 @@ public class IotThingModelServiceImpl implements IotThingModelService {
151 149 return thingModelMapper.selectList(reqVO);
152 150 }
153 151  
154   - // TODO @puhui999:这个转换,放在 controller 貌似也行?
155   - @Override
156   - public IotThingModelTSLRespVO getThingModelTslByProductId(Long productId) {
157   - IotThingModelTSLRespVO tslRespVO = new IotThingModelTSLRespVO();
158   - // 1. 获得产品所有物模型定义
159   - List<IotThingModelDO> thingModels = thingModelMapper.selectListByProductId(productId);
160   - if (CollUtil.isEmpty(thingModels)) {
161   - return tslRespVO;
162   - }
163   -
164   - // 2.1 设置公共部分参数
165   - IotThingModelDO thingModel = thingModels.get(0);
166   - tslRespVO.setProductId(thingModel.getProductId()).setProductKey(thingModel.getProductKey());
167   - // 2.2 处理属性列表
168   - tslRespVO.setProperties(convertList(filterList(thingModels, item ->
169   - ObjUtil.equal(IotThingModelTypeEnum.PROPERTY.getType(), item.getType())), IotThingModelDO::getProperty));
170   - // 2.3 处理服务列表
171   - tslRespVO.setServices(convertList(filterList(thingModels, item ->
172   - ObjUtil.equal(IotThingModelTypeEnum.SERVICE.getType(), item.getType())), IotThingModelDO::getService));
173   - // 2.4 处理事件列表
174   - tslRespVO.setEvents(convertList(filterList(thingModels, item ->
175   - ObjUtil.equal(IotThingModelTypeEnum.EVENT.getType(), item.getType())), IotThingModelDO::getEvent));
176   - return tslRespVO;
177   - }
178   -
179 152 /**
180 153 * 校验功能是否存在
181 154 *
... ...