Commit 6d6547be392e6e22a345476775775d83f8660a72

Authored by puhui999
1 parent 638976da

【功能新增】IoT: 规则场景基础 CRUD

yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java
@@ -72,4 +72,7 @@ public interface ErrorCodeConstants { @@ -72,4 +72,7 @@ public interface ErrorCodeConstants {
72 // ========== IoT 数据桥梁 1-050-010-000 ========== 72 // ========== IoT 数据桥梁 1-050-010-000 ==========
73 ErrorCode DATA_BRIDGE_NOT_EXISTS = new ErrorCode(1_050_010_000, "IoT 数据桥梁不存在"); 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 规则场景(场景联动)不存在");
  77 +
75 } 78 }
76 \ No newline at end of file 79 \ No newline at end of file
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/rule/IotRuleSceneTriggerConditionParameterOperatorEnum.java
@@ -50,7 +50,7 @@ public enum IotRuleSceneTriggerConditionParameterOperatorEnum implements ArrayVa @@ -50,7 +50,7 @@ public enum IotRuleSceneTriggerConditionParameterOperatorEnum implements ArrayVa
50 /** 50 /**
51 * Spring 表达式 - 目标值数组 51 * Spring 表达式 - 目标值数组
52 */ 52 */
53 - public static final String SPRING_EXPRESSION_VALUE_List = "values"; 53 + public static final String SPRING_EXPRESSION_VALUE_LIST = "values";
54 54
55 public static IotRuleSceneTriggerConditionParameterOperatorEnum operatorOf(String operator) { 55 public static IotRuleSceneTriggerConditionParameterOperatorEnum operatorOf(String operator) {
56 return ArrayUtil.firstMatch(item -> item.getOperator().equals(operator), values()); 56 return ArrayUtil.firstMatch(item -> item.getOperator().equals(operator), values());
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.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.scene.IotRuleScenePageReqVO;
  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.IotRuleSceneSaveReqVO;
  9 +import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
3 import cn.iocoder.yudao.module.iot.service.rule.IotRuleSceneService; 10 import cn.iocoder.yudao.module.iot.service.rule.IotRuleSceneService;
  11 +import io.swagger.v3.oas.annotations.Operation;
  12 +import io.swagger.v3.oas.annotations.Parameter;
4 import io.swagger.v3.oas.annotations.tags.Tag; 13 import io.swagger.v3.oas.annotations.tags.Tag;
5 import jakarta.annotation.Resource; 14 import jakarta.annotation.Resource;
6 import jakarta.annotation.security.PermitAll; 15 import jakarta.annotation.security.PermitAll;
  16 +import jakarta.validation.Valid;
  17 +import org.springframework.security.access.prepost.PreAuthorize;
7 import org.springframework.validation.annotation.Validated; 18 import org.springframework.validation.annotation.Validated;
8 -import org.springframework.web.bind.annotation.GetMapping;  
9 -import org.springframework.web.bind.annotation.RequestMapping;  
10 -import org.springframework.web.bind.annotation.RestController; 19 +import org.springframework.web.bind.annotation.*;
  20 +
  21 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
11 22
12 @Tag(name = "管理后台 - IoT 规则场景") 23 @Tag(name = "管理后台 - IoT 规则场景")
13 @RestController 24 @RestController
@@ -18,6 +29,47 @@ public class IotRuleSceneController { @@ -18,6 +29,47 @@ public class IotRuleSceneController {
18 @Resource 29 @Resource
19 private IotRuleSceneService ruleSceneService; 30 private IotRuleSceneService ruleSceneService;
20 31
  32 + @PostMapping("/create")
  33 + @Operation(summary = "创建规则场景(场景联动)")
  34 + @PreAuthorize("@ss.hasPermission('iot:rule-scene:create')")
  35 + public CommonResult<Long> createRuleScene(@Valid @RequestBody IotRuleSceneSaveReqVO createReqVO) {
  36 + return success(ruleSceneService.createRuleScene(createReqVO));
  37 + }
  38 +
  39 + @PutMapping("/update")
  40 + @Operation(summary = "更新规则场景(场景联动)")
  41 + @PreAuthorize("@ss.hasPermission('iot:rule-scene:update')")
  42 + public CommonResult<Boolean> updateRuleScene(@Valid @RequestBody IotRuleSceneSaveReqVO updateReqVO) {
  43 + ruleSceneService.updateRuleScene(updateReqVO);
  44 + return success(true);
  45 + }
  46 +
  47 + @DeleteMapping("/delete")
  48 + @Operation(summary = "删除规则场景(场景联动)")
  49 + @Parameter(name = "id", description = "编号", required = true)
  50 + @PreAuthorize("@ss.hasPermission('iot:rule-scene:delete')")
  51 + public CommonResult<Boolean> deleteRuleScene(@RequestParam("id") Long id) {
  52 + ruleSceneService.deleteRuleScene(id);
  53 + return success(true);
  54 + }
  55 +
  56 + @GetMapping("/get")
  57 + @Operation(summary = "获得规则场景(场景联动)")
  58 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  59 + @PreAuthorize("@ss.hasPermission('iot:rule-scene:query')")
  60 + public CommonResult<IotRuleSceneRespVO> getRuleScene(@RequestParam("id") Long id) {
  61 + IotRuleSceneDO ruleScene = ruleSceneService.getRuleScene(id);
  62 + return success(BeanUtils.toBean(ruleScene, IotRuleSceneRespVO.class));
  63 + }
  64 +
  65 + @GetMapping("/page")
  66 + @Operation(summary = "获得规则场景(场景联动)分页")
  67 + @PreAuthorize("@ss.hasPermission('iot:rule-scene:query')")
  68 + public CommonResult<PageResult<IotRuleSceneRespVO>> getRuleScenePage(@Valid IotRuleScenePageReqVO pageReqVO) {
  69 + PageResult<IotRuleSceneDO> pageResult = ruleSceneService.getRuleScenePage(pageReqVO);
  70 + return success(BeanUtils.toBean(pageResult, IotRuleSceneRespVO.class));
  71 + }
  72 +
21 @GetMapping("/test") 73 @GetMapping("/test")
22 @PermitAll 74 @PermitAll
23 public void test() { 75 public void test() {
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/vo/scene/IotRuleScenePageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene;
  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 lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +@Schema(description = "管理后台 - IoT 规则场景(场景联动)分页 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +public class IotRuleScenePageReqVO extends PageParam {
  19 +
  20 + @Schema(description = "场景名称", example = "赵六")
  21 + private String name;
  22 +
  23 + @Schema(description = "场景描述", example = "你猜")
  24 + private String description;
  25 +
  26 + @Schema(description = "场景状态", example = "1")
  27 + private Integer status;
  28 +
  29 + @Schema(description = "创建时间")
  30 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  31 + private LocalDateTime[] createTime;
  32 +
  33 +}
0 \ No newline at end of file 34 \ 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/IotRuleSceneRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import java.time.LocalDateTime;
  7 +
  8 +@Schema(description = "管理后台 - IoT 规则场景(场景联动) Response VO")
  9 +@Data
  10 +public class IotRuleSceneRespVO {
  11 +
  12 + @Schema(description = "场景编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15865")
  13 + private Long id;
  14 +
  15 + @Schema(description = "场景名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
  16 + private String name;
  17 +
  18 + @Schema(description = "场景描述", example = "你猜")
  19 + private String description;
  20 +
  21 + @Schema(description = "场景状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  22 + private Integer status;
  23 +
  24 + @Schema(description = "触发器数组", requiredMode = Schema.RequiredMode.REQUIRED)
  25 + private String triggers;
  26 +
  27 + @Schema(description = "执行器数组", requiredMode = Schema.RequiredMode.REQUIRED)
  28 + private String actions;
  29 +
  30 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  31 + private LocalDateTime createTime;
  32 +
  33 +}
0 \ No newline at end of file 34 \ 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/IotRuleSceneSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene;
  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 +@Schema(description = "管理后台 - IoT 规则场景(场景联动)新增/修改 Request VO")
  11 +@Data
  12 +public class IotRuleSceneSaveReqVO {
  13 +
  14 + @Schema(description = "场景编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15865")
  15 + private Long id;
  16 +
  17 + @Schema(description = "场景名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
  18 + @NotEmpty(message = "场景名称不能为空")
  19 + private String name;
  20 +
  21 + @Schema(description = "场景描述", example = "你猜")
  22 + private String description;
  23 +
  24 + @Schema(description = "场景状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
  25 + @NotNull(message = "场景状态不能为空")
  26 + @InEnum(CommonStatusEnum.class)
  27 + private Integer status;
  28 +
  29 + @Schema(description = "触发器数组", requiredMode = Schema.RequiredMode.REQUIRED)
  30 + @NotEmpty(message = "触发器数组不能为空")
  31 + private String triggers;
  32 +
  33 + @Schema(description = "执行器数组", requiredMode = Schema.RequiredMode.REQUIRED)
  34 + @NotEmpty(message = "执行器数组不能为空")
  35 + private String actions;
  36 +
  37 +}
0 \ No newline at end of file 38 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodelfunction/IotThinkModelFunctionController.http deleted
1 -### 请求 /iot/think-model-function/create 接口 => 成功  
2 -POST {{baseUrl}}/iot/think-model-function/create  
3 -Content-Type: application/json  
4 -tenant-id: {{adminTenantId}}  
5 -Authorization: Bearer {{token}}  
6 -  
7 -{  
8 - "productId": 1001,  
9 - "productKey": "smart-sensor-001",  
10 - "identifier": "Temperature",  
11 - "name": "温度",  
12 - "description": "当前温度值",  
13 - "type": 1,  
14 - "property": {  
15 - "identifier": "Temperature",  
16 - "name": "温度",  
17 - "accessMode": "r",  
18 - "required": true,  
19 - "dataType": {  
20 - "type": "float",  
21 - "specs": {  
22 - "min": -10.0,  
23 - "max": 100.0,  
24 - "step": 0.1,  
25 - "unit": "℃"  
26 - }  
27 - },  
28 - "description": "当前温度值"  
29 - }  
30 -}  
31 -  
32 -### 请求 /iot/think-model-function/create 接口 => 成功  
33 -POST {{baseUrl}}/iot/think-model-function/create  
34 -Content-Type: application/json  
35 -tenant-id: {{adminTenantId}}  
36 -Authorization: Bearer {{token}}  
37 -  
38 -{  
39 - "productId": 1001,  
40 - "productKey": "smart-sensor-001",  
41 - "identifier": "Humidity",  
42 - "name": "湿度",  
43 - "description": "当前湿度值",  
44 - "type": 1,  
45 - "property": {  
46 - "identifier": "Humidity",  
47 - "name": "湿度",  
48 - "accessMode": "r",  
49 - "required": true,  
50 - "dataType": {  
51 - "type": "float",  
52 - "specs": {  
53 - "min": 0.0,  
54 - "max": 100.0,  
55 - "step": 0.1,  
56 - "unit": "%"  
57 - }  
58 - },  
59 - "description": "当前湿度值"  
60 - }  
61 -}  
62 -  
63 -  
64 -  
65 -  
66 -### 请求 /iot/think-model-function/update 接口 => 成功  
67 -PUT {{baseUrl}}/iot/think-model-function/update  
68 -Content-Type: application/json  
69 -tenant-id: {{adminTenantId}}  
70 -Authorization: Bearer {{token}}  
71 -  
72 -{  
73 - "id": 11,  
74 - "productId": 1001,  
75 - "productKey": "smart-sensor-001",  
76 - "identifier": "Temperature",  
77 - "name": "温度",  
78 - "description": "当前温度值",  
79 - "type": 1,  
80 - "property": {  
81 - "identifier": "Temperature",  
82 - "name": "温度",  
83 - "accessMode": "r",  
84 - "required": true,  
85 - "dataType": {  
86 - "type": "float",  
87 - "specs": {  
88 - "min": -111.0,  
89 - "max": 222.0,  
90 - "step": 0.1,  
91 - "unit": "℃"  
92 - }  
93 - },  
94 - "description": "当前温度值"  
95 - }  
96 -}  
97 -  
98 -### 请求 /iot/think-model-function/delete 接口 => 成功  
99 -DELETE {{baseUrl}}/iot/think-model-function/delete?id=7  
100 -tenant-id: {{adminTenantId}}  
101 -Authorization: Bearer {{token}}  
102 -  
103 -### 请求 /iot/think-model-function/get 接口 => 成功  
104 -GET {{baseUrl}}/iot/think-model-function/get?id=10  
105 -tenant-id: {{adminTenantId}}  
106 -Authorization: Bearer {{token}}  
107 -  
108 -  
109 -### 请求 /iot/think-model-function/list-by-product-id 接口 => 成功  
110 -GET {{baseUrl}}/iot/think-model-function/list-by-product-id?productId=1001  
111 -tenant-id: {{adminTenantId}}  
112 -Authorization: Bearer {{token}}  
113 \ 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/dal/mysql/rule/IotRuleSceneMapper.java
1 package cn.iocoder.yudao.module.iot.dal.mysql.rule; 1 package cn.iocoder.yudao.module.iot.dal.mysql.rule;
2 2
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
3 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;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleScenePageReqVO;
4 import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO; 7 import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
5 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
6 9
  10 +/**
  11 + * IoT 规则场景(场景联动) Mapper
  12 + *
  13 + * @author HUIHUI
  14 + */
7 @Mapper 15 @Mapper
8 public interface IotRuleSceneMapper extends BaseMapperX<IotRuleSceneDO> { 16 public interface IotRuleSceneMapper extends BaseMapperX<IotRuleSceneDO> {
9 17
  18 + default PageResult<IotRuleSceneDO> selectPage(IotRuleScenePageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<IotRuleSceneDO>()
  20 + .likeIfPresent(IotRuleSceneDO::getName, reqVO.getName())
  21 + .likeIfPresent(IotRuleSceneDO::getDescription, reqVO.getDescription())
  22 + .eqIfPresent(IotRuleSceneDO::getStatus, reqVO.getStatus())
  23 + .betweenIfPresent(IotRuleSceneDO::getCreateTime, reqVO.getCreateTime())
  24 + .orderByDesc(IotRuleSceneDO::getId));
  25 + }
  26 +
10 } 27 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/IotRuleSceneService.java
1 package cn.iocoder.yudao.module.iot.service.rule; 1 package cn.iocoder.yudao.module.iot.service.rule;
2 2
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleScenePageReqVO;
  5 +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleSceneSaveReqVO;
3 import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO; 6 import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
4 import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum; 7 import cn.iocoder.yudao.module.iot.enums.rule.IotRuleSceneTriggerTypeEnum;
5 import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage; 8 import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage;
  9 +import jakarta.validation.Valid;
6 10
7 import java.util.List; 11 import java.util.List;
8 12
@@ -14,6 +18,44 @@ import java.util.List; @@ -14,6 +18,44 @@ import java.util.List;
14 public interface IotRuleSceneService { 18 public interface IotRuleSceneService {
15 19
16 /** 20 /**
  21 + * 创建规则场景(场景联动)
  22 + *
  23 + * @param createReqVO 创建信息
  24 + * @return 编号
  25 + */
  26 + Long createRuleScene(@Valid IotRuleSceneSaveReqVO createReqVO);
  27 +
  28 + /**
  29 + * 更新规则场景(场景联动)
  30 + *
  31 + * @param updateReqVO 更新信息
  32 + */
  33 + void updateRuleScene(@Valid IotRuleSceneSaveReqVO updateReqVO);
  34 +
  35 + /**
  36 + * 删除规则场景(场景联动)
  37 + *
  38 + * @param id 编号
  39 + */
  40 + void deleteRuleScene(Long id);
  41 +
  42 + /**
  43 + * 获得规则场景(场景联动)
  44 + *
  45 + * @param id 编号
  46 + * @return 规则场景(场景联动)
  47 + */
  48 + IotRuleSceneDO getRuleScene(Long id);
  49 +
  50 + /**
  51 + * 获得规则场景(场景联动)分页
  52 + *
  53 + * @param pageReqVO 分页查询
  54 + * @return 规则场景(场景联动)分页
  55 + */
  56 + PageResult<IotRuleSceneDO> getRuleScenePage(IotRuleScenePageReqVO pageReqVO);
  57 +
  58 + /**
17 * 【缓存】获得指定设备的场景列表 59 * 【缓存】获得指定设备的场景列表
18 * 60 *
19 * @param productKey 产品 Key 61 * @param productKey 产品 Key
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/IotRuleSceneServiceImpl.java
@@ -8,11 +8,15 @@ import cn.hutool.core.util.NumberUtil; @@ -8,11 +8,15 @@ import cn.hutool.core.util.NumberUtil;
8 import cn.hutool.core.util.ObjUtil; 8 import cn.hutool.core.util.ObjUtil;
9 import cn.hutool.core.util.StrUtil; 9 import cn.hutool.core.util.StrUtil;
10 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 10 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  11 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
11 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 12 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
  13 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
12 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; 14 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
13 import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; 15 import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils;
14 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; 16 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
15 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; 17 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
  18 +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleScenePageReqVO;
  19 +import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.scene.IotRuleSceneSaveReqVO;
16 import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO; 20 import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotRuleSceneDO;
17 import cn.iocoder.yudao.module.iot.dal.mysql.rule.IotRuleSceneMapper; 21 import cn.iocoder.yudao.module.iot.dal.mysql.rule.IotRuleSceneMapper;
18 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum; 22 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum;
@@ -39,8 +43,10 @@ import java.util.HashMap; @@ -39,8 +43,10 @@ import java.util.HashMap;
39 import java.util.List; 43 import java.util.List;
40 import java.util.Map; 44 import java.util.Map;
41 45
  46 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
42 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; 47 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
43 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; 48 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
  49 +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.RULE_SCENE_NOT_EXISTS;
44 50
45 /** 51 /**
46 * IoT 规则场景 Service 实现类 52 * IoT 规则场景 Service 实现类
@@ -61,6 +67,49 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { @@ -61,6 +67,49 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
61 @Resource(name = "iotSchedulerManager") 67 @Resource(name = "iotSchedulerManager")
62 private IotSchedulerManager schedulerManager; 68 private IotSchedulerManager schedulerManager;
63 69
  70 + @Override
  71 + public Long createRuleScene(IotRuleSceneSaveReqVO createReqVO) {
  72 + // 插入
  73 + IotRuleSceneDO ruleScene = BeanUtils.toBean(createReqVO, IotRuleSceneDO.class);
  74 + ruleSceneMapper.insert(ruleScene);
  75 + // 返回
  76 + return ruleScene.getId();
  77 + }
  78 +
  79 + @Override
  80 + public void updateRuleScene(IotRuleSceneSaveReqVO updateReqVO) {
  81 + // 校验存在
  82 + validateRuleSceneExists(updateReqVO.getId());
  83 + // 更新
  84 + IotRuleSceneDO updateObj = BeanUtils.toBean(updateReqVO, IotRuleSceneDO.class);
  85 + ruleSceneMapper.updateById(updateObj);
  86 + }
  87 +
  88 + @Override
  89 + public void deleteRuleScene(Long id) {
  90 + // 校验存在
  91 + validateRuleSceneExists(id);
  92 + // 删除
  93 + ruleSceneMapper.deleteById(id);
  94 + }
  95 +
  96 + private void validateRuleSceneExists(Long id) {
  97 + if (ruleSceneMapper.selectById(id) == null) {
  98 + throw exception(RULE_SCENE_NOT_EXISTS);
  99 + }
  100 + }
  101 +
  102 + @Override
  103 + public IotRuleSceneDO getRuleScene(Long id) {
  104 + return ruleSceneMapper.selectById(id);
  105 + }
  106 +
  107 + @Override
  108 + public PageResult<IotRuleSceneDO> getRuleScenePage(IotRuleScenePageReqVO pageReqVO) {
  109 + return ruleSceneMapper.selectPage(pageReqVO);
  110 + }
  111 +
  112 +
64 // TODO 芋艿,缓存待实现 113 // TODO 芋艿,缓存待实现
65 @Override 114 @Override
66 @TenantIgnore // 忽略租户隔离:因为 IotRuleSceneMessageHandler 调用时,一般未传递租户,所以需要忽略 115 @TenantIgnore // 忽略租户隔离:因为 IotRuleSceneMessageHandler 调用时,一般未传递租户,所以需要忽略
@@ -331,7 +380,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { @@ -331,7 +380,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
331 springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE, messageValue); 380 springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_SOURCE, messageValue);
332 springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE, parameter.getValue()); 381 springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE, parameter.getValue());
333 List<String> parameterValues = StrUtil.splitTrim(parameter.getValue(), CharPool.COMMA); 382 List<String> parameterValues = StrUtil.splitTrim(parameter.getValue(), CharPool.COMMA);
334 - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_List, parameterValues); 383 + springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_LIST, parameterValues);
335 // 特殊:解决数字的比较。因为 Spring 是基于它的 compareTo 方法,对数字的比较存在问题! 384 // 特殊:解决数字的比较。因为 Spring 是基于它的 compareTo 方法,对数字的比较存在问题!
336 if (ObjectUtils.equalsAny(operator, IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN, 385 if (ObjectUtils.equalsAny(operator, IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN,
337 IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN, 386 IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN,
@@ -345,7 +394,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService { @@ -345,7 +394,7 @@ public class IotRuleSceneServiceImpl implements IotRuleSceneService {
345 NumberUtil.parseDouble(messageValue)); 394 NumberUtil.parseDouble(messageValue));
346 springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE, 395 springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE,
347 NumberUtil.parseDouble(parameter.getValue())); 396 NumberUtil.parseDouble(parameter.getValue()));
348 - springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_List, 397 + springExpressionVariables.put(IotRuleSceneTriggerConditionParameterOperatorEnum.SPRING_EXPRESSION_VALUE_LIST,
349 convertList(parameterValues, NumberUtil::parseDouble)); 398 convertList(parameterValues, NumberUtil::parseDouble));
350 } 399 }
351 // 2.2 计算 Spring 表达式 400 // 2.2 计算 Spring 表达式