Commit 9b39f0b566952e4e6d2f3dde9daca7b1d65e7466

Authored by 云中非
1 parent aa291d74

refactor: 场景联动

Showing 21 changed files with 286 additions and 101 deletions
... ... @@ -187,7 +187,7 @@ public class YtConvertDataToController extends BaseController {
187 187 String sceneId = convertReqDTO.getId();
188 188 String currentTenant = getCurrentUser().getCurrentTenantId();
189 189 Integer sceneStatus = convertReqDTO.getStatus();
190   - JsonNode configuration = sceneLinkageService.getRuleNodeConfig(sceneId,currentTenant,sceneStatus);
  190 + JsonNode configuration = sceneLinkageService.getRuleNodeConfig(sceneId,currentTenant,getCurrentUser().getCustomerId().getId().toString(),sceneStatus);
191 191 boolean noValue = configuration == null;
192 192 if (noValue && convertReqDTO.getStatus() == FastIotConstants.StateValue.DISABLE) {
193 193 status = FastIotConstants.StateValue.DISABLE;
... ...
... ... @@ -529,12 +529,12 @@ spring:
529 529 database-platform: "${SPRING_JPA_DATABASE_PLATFORM:org.hibernate.dialect.PostgreSQLDialect}"
530 530 datasource:
531 531 driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}"
532   - #url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://47.99.141.212:20638/thingsboard-3.3.2}"
533   - #username: "${SPRING_DATASOURCE_USERNAME:postgres}"
534   - #password: "${SPRING_DATASOURCE_PASSWORD:Vrr861!@waja}"
535   - url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://101.133.234.90:28776/thingsboard-3.3.2}"
  532 + url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://47.99.141.212:20638/thingsboard-3.3.2}"
536 533 username: "${SPRING_DATASOURCE_USERNAME:postgres}"
537   - password: "${SPRING_DATASOURCE_PASSWORD:Bua312!!iwcw}"
  534 + password: "${SPRING_DATASOURCE_PASSWORD:Vrr861!@waja}"
  535 +# url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://101.133.234.90:28776/thingsboard-3.3.2}"
  536 +# username: "${SPRING_DATASOURCE_USERNAME:postgres}"
  537 +# password: "${SPRING_DATASOURCE_PASSWORD:Bua312!!iwcw}"
538 538 hikari:
539 539 maximumPoolSize: "${SPRING_DATASOURCE_MAXIMUM_POOL_SIZE:16}"
540 540
... ... @@ -1126,8 +1126,8 @@ file:
1126 1126 randomFileName: ${file.storage.randomFileName}
1127 1127 account:
1128 1128 info:
1129   - emailSuffix: thingskit.com
  1129 + emailSuffix: yunteng.com
1130 1130 defaultPassword: 123456
1131 1131 logging:
1132 1132 level:
1133   - org.thingsboard.server.dao.yunteng.mapper: error
  1133 + org.thingsboard.server.dao.yunteng.mapper: debug
... ...
... ... @@ -55,6 +55,7 @@ public enum ErrorMessage {
55 55 FILE_NOT_FOUND(400036,"文件未找到"),
56 56 STORE_FILE_FAILED(400037,"文件存储失败"),
57 57 NOT_BELONG_CURRENT_TENANT(400038,"不属于当前租户"),
  58 + DEVICE_LOSED(400039,"设备相关参数丢失"),
58 59 HAVE_NO_PERMISSION(500002,"没有修改权限");
59 60 private final int code;
60 61 private String message;
... ...
  1 +package org.thingsboard.server.common.data.yunteng.dto;
  2 +
  3 +import com.fasterxml.jackson.databind.JsonNode;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import org.thingsboard.server.common.data.alarm.AlarmSeverity;
  8 +import org.thingsboard.server.common.data.device.profile.AlarmRule;
  9 +import org.thingsboard.server.common.data.yunteng.enums.ActionTypeEnum;
  10 +import org.thingsboard.server.common.data.yunteng.enums.ScopeEnum;
  11 +
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * @Description 场景联动动作告警通知
  16 + * @Author cxy
  17 + * @Date 2021/11/24 17:32
  18 + */
  19 +@Data
  20 +public class ActionAlarmDTO extends TenantDTO{
  21 +
  22 +
  23 + private List<ActionTypeEnum> noticeType;
  24 +
  25 + /**告警联系人*/
  26 + private List<String> noticeUser;
  27 +
  28 + private AlarmSeverity alarmLevel;
  29 +
  30 +
  31 + private AlarmRule clearRule;
  32 +
  33 +}
... ...
... ... @@ -5,25 +5,32 @@ import io.swagger.annotations.ApiModelProperty;
5 5 import lombok.Data;
6 6 import lombok.EqualsAndHashCode;
7 7 import org.thingsboard.server.common.data.yunteng.enums.ActionTypeEnum;
  8 +import org.thingsboard.server.common.data.yunteng.enums.ScopeEnum;
8 9
9 10 import java.util.List;
10 11
11   -/** @Description 场景联动执行动作数据传输表 @Author cxy @Date 2021/11/24 17:32 */
  12 +/**
  13 + * @Description 场景联动执行动作数据传输表
  14 + * @Author cxy
  15 + * @Date 2021/11/24 17:32
  16 + */
12 17 @Data
13 18 @EqualsAndHashCode(callSuper = true)
14   -public class DoActionDTO extends TenantDTO {
  19 +public class DoActionDTO extends TenantDTO{
15 20
16   - @ApiModelProperty(value = "所属设备id")
17   - private String deviceId;
  21 + @ApiModelProperty(value = "所属设备id")
  22 + private List<String> deviceId;
  23 + private ScopeEnum entityType;
18 24
19   - @ApiModelProperty(value = "场景联动内容")
20   - private JsonNode doContext;
  25 +
  26 + @ApiModelProperty(value = "场景联动内容")
  27 + private JsonNode doContext;
21 28
22 29 @ApiModelProperty(value = "输出目标:设备,告警,其他")
23 30 private ActionTypeEnum outTarget;
24 31
25   - @ApiModelProperty(value = "场景联动id")
26   - private String sceneLinkageId;
  32 + @ApiModelProperty(value = "场景联动id")
  33 + private String sceneLinkageId;
27 34
28 35 @ApiModelProperty(value = "输出目标为告警才进行配置")
29 36 private String alarmProfileId;
... ...
... ... @@ -4,8 +4,12 @@ import io.swagger.annotations.ApiModelProperty;
4 4 import lombok.Data;
5 5 import lombok.EqualsAndHashCode;
6 6 import org.thingsboard.server.common.data.device.profile.AlarmCondition;
  7 +import org.thingsboard.server.common.data.device.profile.AlarmRule;
  8 +import org.thingsboard.server.common.data.yunteng.enums.ScopeEnum;
7 9 import org.thingsboard.server.common.data.yunteng.enums.TriggerTypeEnum;
8 10
  11 +import java.util.List;
  12 +
9 13 /**
10 14 * @Description 场景联动执行条件数据传输表
11 15 * @Author cxy
... ... @@ -18,11 +22,13 @@ public class DoConditionDTO extends TenantDTO{
18 22 @ApiModelProperty(value = "触发器类型")
19 23 private TriggerTypeEnum triggerType;
20 24
  25 +
21 26 @ApiModelProperty(value = "触发器关联实体")
22   - private String entityId;
  27 + private ScopeEnum entityType;
  28 + private List<String> entityId;
23 29
24 30 @ApiModelProperty(value = "触发条件")
25   - private AlarmCondition triggerCondition;
  31 + private AlarmRule triggerCondition;
26 32
27 33 @ApiModelProperty(value = "场景联动id")
28 34 private String sceneLinkageId;
... ...
... ... @@ -4,8 +4,13 @@ import io.swagger.annotations.ApiModelProperty;
4 4 import lombok.Data;
5 5 import lombok.EqualsAndHashCode;
6 6 import org.thingsboard.server.common.data.device.profile.AlarmCondition;
  7 +import org.thingsboard.server.common.data.device.profile.AlarmRule;
  8 +import org.thingsboard.server.common.data.device.profile.AlarmSchedule;
  9 +import org.thingsboard.server.common.data.yunteng.enums.ScopeEnum;
7 10 import org.thingsboard.server.common.data.yunteng.enums.TriggerTypeEnum;
8 11
  12 +import java.util.List;
  13 +
9 14 /**
10 15 * @Description 场景联动触发器数据传输表
11 16 * @Author cxy
... ... @@ -19,10 +24,13 @@ public class TriggerDTO extends TenantDTO{
19 24 private TriggerTypeEnum triggerType;
20 25
21 26 @ApiModelProperty(value = "触发器关联实体,例如:设备ID、场景联动ID、定时任务CRON表达式")
22   - private String entityId;
  27 + private ScopeEnum entityType;
  28 + private List<String> entityId;
23 29
24 30 @ApiModelProperty(value = "触发条件")
25   - private AlarmCondition triggerCondition;
  31 + private AlarmRule triggerCondition;
  32 +
  33 +
26 34
27 35 @ApiModelProperty(value = "场景联动id")
28 36 private String sceneLinkageId;
... ...
  1 +package org.thingsboard.server.common.data.yunteng.enums;
  2 +
  3 +/** 取值范围枚举值 */
  4 +public enum ScopeEnum {
  5 + ALL,
  6 + PART
  7 +}
... ...
... ... @@ -3,31 +3,47 @@ package org.thingsboard.server.dao.yunteng.entities;
3 3 import com.baomidou.mybatisplus.annotation.TableField;
4 4 import com.baomidou.mybatisplus.annotation.TableName;
5 5 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
  6 +import com.fasterxml.jackson.annotation.JsonIgnore;
6 7 import com.fasterxml.jackson.databind.JsonNode;
7 8 import lombok.Data;
8 9 import lombok.EqualsAndHashCode;
9 10 import org.apache.ibatis.type.EnumTypeHandler;
10 11 import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
11 12 import org.thingsboard.server.common.data.yunteng.enums.ActionTypeEnum;
  13 +import org.thingsboard.server.common.data.yunteng.enums.ScopeEnum;
  14 +import org.thingsboard.server.dao.yunteng.mapper.ListStringTypeHandler;
12 15
13   -/** @Description 执行动作 @Author cxy @Date 2021/11/24 17:24 */
  16 +import java.util.Arrays;
  17 +import java.util.List;
  18 +
  19 +/**
  20 + * @Description 执行动作 @Author cxy @Date 2021/11/24 17:24
  21 + */
14 22 @Data
15 23 @TableName(value = ModelConstants.Table.IOTFS_DO_ACTION_TABLE_NAME, autoResultMap = true)
16 24 @EqualsAndHashCode(callSuper = true)
17 25 public class DoAction extends TenantBaseEntity {
18 26
19   - private static final long serialVersionUID = -5459834451418047957L;
  27 + private static final long serialVersionUID = -5459834451418047957L;
  28 +
20 29
21   - private String deviceId;
  30 + @TableField(typeHandler = ListStringTypeHandler.class)
  31 + private List<String> deviceId;
22 32
23   - @TableField(typeHandler = EnumTypeHandler.class)
24   - private ActionTypeEnum outTarget;
25   - /** 场景联动内容 */
26   - @TableField(typeHandler = JacksonTypeHandler.class)
27   - private JsonNode doContext;
  33 + @TableField(typeHandler = EnumTypeHandler.class)
  34 + private ScopeEnum entityType;
  35 + @TableField(typeHandler = EnumTypeHandler.class)
  36 + private ActionTypeEnum outTarget;
  37 + /**
  38 + * 场景联动内容
  39 + */
  40 + @TableField(typeHandler = JacksonTypeHandler.class)
  41 + private JsonNode doContext;
28 42
29   - /** 场景联动id */
30   - private String sceneLinkageId;
  43 + /**
  44 + * 场景联动id
  45 + */
  46 + private String sceneLinkageId;
31 47
32   - private String alarmProfileId;
  48 + private String alarmProfileId;
33 49 }
... ...
... ... @@ -7,20 +7,36 @@ import lombok.Data;
7 7 import lombok.EqualsAndHashCode;
8 8 import org.apache.ibatis.type.EnumTypeHandler;
9 9 import org.thingsboard.server.common.data.device.profile.AlarmCondition;
  10 +import org.thingsboard.server.common.data.device.profile.AlarmRule;
10 11 import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
  12 +import org.thingsboard.server.common.data.yunteng.enums.ScopeEnum;
11 13 import org.thingsboard.server.common.data.yunteng.enums.TriggerTypeEnum;
  14 +import org.thingsboard.server.dao.yunteng.mapper.ListStringTypeHandler;
12 15
13   -/** @Description 执行条件实体表 @Author cxy @Date 2021/11/24 17:16 */
  16 +import java.util.Arrays;
  17 +import java.util.List;
  18 +
  19 +/**
  20 + * @Description 执行条件实体表 @Author cxy @Date 2021/11/24 17:16
  21 + */
14 22 @Data
15   -@TableName(value = ModelConstants.Table.IOTFS_DO_CONDITION_TABLE_NAME,autoResultMap=true)
  23 +@TableName(value = ModelConstants.Table.IOTFS_DO_CONDITION_TABLE_NAME, autoResultMap = true)
16 24 @EqualsAndHashCode(callSuper = true)
17 25 public class DoCondition extends TenantBaseEntity {
18   - private static final long serialVersionUID = 2827674377416477646L;
19   - /** 设备 */
20   - private String entityId;
21   - @TableField(typeHandler = EnumTypeHandler.class)
22   - private TriggerTypeEnum triggerType;
23   - @TableField(typeHandler = JacksonTypeHandler.class)
24   - private AlarmCondition triggerCondition;
25   - private String sceneLinkageId;
  26 + private static final long serialVersionUID = 2827674377416477646L;
  27 + /**
  28 + * 设备
  29 + */
  30 + @TableField(typeHandler = ListStringTypeHandler.class)
  31 + private List<String> entityId;
  32 +
  33 + @TableField(typeHandler = EnumTypeHandler.class)
  34 + private ScopeEnum entityType;
  35 + @TableField(typeHandler = EnumTypeHandler.class)
  36 + private TriggerTypeEnum triggerType;
  37 + @TableField(typeHandler = JacksonTypeHandler.class)
  38 + private AlarmRule triggerCondition;
  39 + private String sceneLinkageId;
  40 +
  41 +
26 42 }
... ...
1 1 package org.thingsboard.server.dao.yunteng.entities;
  2 +
2 3 import com.baomidou.mybatisplus.annotation.TableField;
3 4 import com.baomidou.mybatisplus.annotation.TableName;
4 5 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
... ... @@ -6,21 +7,37 @@ import lombok.Data;
6 7 import lombok.EqualsAndHashCode;
7 8 import org.apache.ibatis.type.EnumTypeHandler;
8 9 import org.thingsboard.server.common.data.device.profile.AlarmCondition;
  10 +import org.thingsboard.server.common.data.device.profile.AlarmRule;
9 11 import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
  12 +import org.thingsboard.server.common.data.yunteng.enums.ScopeEnum;
10 13 import org.thingsboard.server.common.data.yunteng.enums.TriggerTypeEnum;
  14 +import org.thingsboard.server.dao.yunteng.mapper.ListStringTypeHandler;
  15 +
  16 +import java.util.Arrays;
  17 +import java.util.List;
11 18
12   -/** @Description 触发器实体表 @Author cxy @Date 2021/11/24 17:06 */
  19 +/**
  20 + * @Description 触发器实体表 @Author cxy @Date 2021/11/24 17:06
  21 + */
13 22 @Data
14   -@TableName(value = ModelConstants.Table.IOTFS_TRIGGER_TABLE_NAME,autoResultMap=true)
  23 +@TableName(value = ModelConstants.Table.IOTFS_TRIGGER_TABLE_NAME, autoResultMap = true)
15 24 @EqualsAndHashCode(callSuper = true)
16 25 public class Trigger extends TenantBaseEntity {
17 26
18   - private static final long serialVersionUID = -1847061176808850967L;
19   - /** 设备 */
20   - private String entityId;
21   - @TableField(typeHandler = EnumTypeHandler.class)
22   - private TriggerTypeEnum triggerType;
23   - @TableField(typeHandler = JacksonTypeHandler.class)
24   - private AlarmCondition triggerCondition;
25   - private String sceneLinkageId;
  27 + private static final long serialVersionUID = -1847061176808850967L;
  28 + /**
  29 + * 设备
  30 + */
  31 + @TableField(typeHandler = ListStringTypeHandler.class)
  32 + private List<String> entityId;
  33 +
  34 + @TableField(typeHandler = EnumTypeHandler.class)
  35 + private ScopeEnum entityType;
  36 + @TableField(typeHandler = EnumTypeHandler.class)
  37 + private TriggerTypeEnum triggerType;
  38 + @TableField(typeHandler = JacksonTypeHandler.class)
  39 + private AlarmRule triggerCondition;
  40 + private String sceneLinkageId;
  41 +
  42 +
26 43 }
... ...
... ... @@ -268,7 +268,7 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap
268 268 List<DoConditionDTO> conditionDTOS = sceneLinkageDTO.getDoConditions();
269 269 if (conditionDTOS != null && !conditionDTOS.isEmpty()) {
270 270 for (DoConditionDTO condition : conditionDTOS) {
271   - if (!ActionTypeEnum.DEVICE_OUT.equals(condition.getTriggerType())) {
  271 + if (!TriggerTypeEnum.DEVICE_TRIGGER.equals(condition.getTriggerType())) {
272 272 continue;
273 273 }
274 274 List<String> deviceIds = condition.getEntityId();
... ...
... ... @@ -5,12 +5,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 5 import lombok.RequiredArgsConstructor;
6 6 import org.springframework.stereotype.Service;
7 7 import org.thingsboard.server.common.data.yunteng.dto.TriggerDTO;
  8 +import org.thingsboard.server.common.data.yunteng.enums.ScopeEnum;
8 9 import org.thingsboard.server.dao.yunteng.entities.Trigger;
9 10 import org.thingsboard.server.dao.yunteng.mapper.TriggerMapper;
10 11 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
11 12 import org.thingsboard.server.dao.yunteng.service.TriggerService;
12 13
  14 +import java.util.List;
13 15 import java.util.Optional;
  16 +import java.util.stream.Collectors;
14 17
15 18 /**
16 19 * @Description
... ... @@ -24,15 +27,16 @@ public class TriggerServiceImpl extends AbstractBaseService<TriggerMapper, Trigg
24 27 private final TriggerMapper triggerMapper;
25 28
26 29 @Override
27   - public TriggerDTO getTrigger(String sceneId, String deviceId) {
  30 + public List<TriggerDTO> getTrigger(String sceneId) {
28 31 LambdaQueryWrapper filter = new QueryWrapper<Trigger>().lambda()
29   - .eq(Trigger::getSceneLinkageId, sceneId)
30   - .eq(Trigger::getEntityId, deviceId);
31   - Trigger trigger = triggerMapper.selectOne(filter);
32   - if(trigger == null){
  32 + .eq(Trigger::getSceneLinkageId, sceneId);
  33 + List<Trigger> trigger = triggerMapper.selectList(filter);
  34 + if(trigger == null || trigger.isEmpty()){
33 35 return null;
34 36 }
35 37
36   - return trigger.getDTO(TriggerDTO.class);
  38 + return trigger.stream()
  39 + .map(item -> item.getDTO(TriggerDTO.class))
  40 + .collect(Collectors.toList());
37 41 }
38 42 }
... ...
  1 +package org.thingsboard.server.dao.yunteng.mapper;
  2 +
  3 +/**
  4 + * @version V1.0
  5 + * @Description :
  6 + * 1.其它地方抛出异常,交由控制层统一处理
  7 + * 2.服务层注意持久化的事务管理
  8 + * @Dependency: 依赖包
  9 + * @Author: junlianglee
  10 + * @Date Created in 2021/12/28$
  11 + * @Copyright 2016-2018 - Powered By 云腾五洲
  12 + */
  13 +
  14 +import org.apache.ibatis.type.BaseTypeHandler;
  15 +import org.apache.ibatis.type.JdbcType;
  16 +
  17 +import java.sql.CallableStatement;
  18 +import java.sql.PreparedStatement;
  19 +import java.sql.ResultSet;
  20 +import java.sql.SQLException;
  21 +import java.util.Arrays;
  22 +import java.util.List;
  23 +
  24 +public class ListStringTypeHandler extends BaseTypeHandler {
  25 +
  26 + @Override
  27 + public Object getNullableResult(ResultSet rs, String columnName)
  28 + throws SQLException {
  29 + return Arrays.asList(rs.getString(columnName).split(","));
  30 + }
  31 +
  32 + @Override
  33 + public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {
  34 + return Arrays.asList(resultSet.getString(i).split(","));
  35 + }
  36 +
  37 + @Override
  38 + public Object getNullableResult(CallableStatement cs, int columnIndex)
  39 + throws SQLException {
  40 + return Arrays.asList(cs.getString(columnIndex).split(","));
  41 + }
  42 +
  43 + @Override
  44 + public void setNonNullParameter(PreparedStatement ps, int i,
  45 + Object parameter, JdbcType jdbcType) throws SQLException {
  46 + ps.setString(i, ((List) parameter).toString());
  47 + }
  48 +}
... ...
... ... @@ -5,6 +5,7 @@ import org.thingsboard.server.common.data.yunteng.dto.MenuDTO;
5 5 import org.thingsboard.server.common.data.yunteng.dto.TriggerDTO;
6 6 import org.thingsboard.server.dao.yunteng.entities.Trigger;
7 7
  8 +import java.util.List;
8 9 import java.util.Optional;
9 10
10 11 /**
... ... @@ -13,5 +14,5 @@ import java.util.Optional;
13 14 * @Date 2021/12/6 19:52
14 15 */
15 16 public interface TriggerService extends BaseService<Trigger>{
16   - TriggerDTO getTrigger(String sceneId, String deviceId);
  17 + List<TriggerDTO> getTrigger(String sceneId);
17 18 }
... ...
... ... @@ -4,7 +4,8 @@
4 4 <mapper namespace="org.thingsboard.server.dao.yunteng.mapper.DoActionMapper">
5 5 <resultMap id="actionDTO" type="org.thingsboard.server.common.data.yunteng.dto.DoActionDTO">
6 6 <result property="id" column="id"/>
7   - <result property="deviceId" column="device_id"/>
  7 + <result property="deviceId" column="device_id" typeHandler="org.thingsboard.server.dao.yunteng.mapper.ListStringTypeHandler"/>
  8 + <result property="entityType" column="entity_type" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
8 9 <result property="doContext" column="do_context" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
9 10 <result property="outTarget" column="out_target" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
10 11 <result property="sceneLinkageId" column="scene_linkage_id"/>
... ...
... ... @@ -4,7 +4,8 @@
4 4 <mapper namespace="org.thingsboard.server.dao.yunteng.mapper.DoConditionMapper">
5 5 <resultMap id="conditionDTO" type="org.thingsboard.server.common.data.yunteng.dto.DoConditionDTO">
6 6 <result property="id" column="id"/>
7   - <result property="entityId" column="entity_id"/>
  7 + <result property="entityId" column="entity_id" typeHandler="org.thingsboard.server.dao.yunteng.mapper.ListStringTypeHandler"/>
  8 + <result property="entityType" column="entity_type" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
8 9 <result property="triggerCondition" column="trigger_condition" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
9 10 <result property="triggerType" column="trigger_type" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
10 11 <result property="sceneLinkageId" column="scene_linkage_id"/>
... ...
... ... @@ -4,7 +4,8 @@
4 4 <mapper namespace="org.thingsboard.server.dao.yunteng.mapper.TriggerMapper">
5 5 <resultMap id="triggerDTO" type="org.thingsboard.server.common.data.yunteng.dto.TriggerDTO">
6 6 <result property="id" column="id"/>
7   - <result property="entityId" column="entity_id"/>
  7 + <result property="entityId" column="entity_id" typeHandler="org.thingsboard.server.dao.yunteng.mapper.ListStringTypeHandler"/>
  8 + <result property="entityType" column="entity_type" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
8 9 <result property="triggerCondition" column="trigger_condition" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
9 10 <result property="triggerType" column="trigger_type" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
10 11 <result property="sceneLinkageId" column="scene_linkage_id"/>
... ...
... ... @@ -5,12 +5,14 @@ package org.thingsboard.rule.engine.yunteng.scene;
5 5
6 6 import com.fasterxml.jackson.databind.JsonNode;
7 7 import lombok.extern.slf4j.Slf4j;
  8 +import org.apache.commons.lang3.StringUtils;
8 9 import org.jetbrains.annotations.NotNull;
9 10 import org.thingsboard.rule.engine.api.TbContext;
10 11 import org.thingsboard.server.common.data.DataConstants;
11 12 import org.thingsboard.server.common.data.device.profile.AlarmCondition;
12 13 import org.thingsboard.server.common.data.device.profile.AlarmConditionFilter;
13 14 import org.thingsboard.server.common.data.device.profile.AlarmConditionFilterKey;
  15 +import org.thingsboard.server.common.data.device.profile.AlarmRule;
14 16 import org.thingsboard.server.common.data.rule.RuleNodeState;
15 17 import org.thingsboard.server.common.data.yunteng.dto.TriggerDTO;
16 18 import org.thingsboard.server.common.data.yunteng.utils.JacksonUtil;
... ... @@ -38,7 +40,9 @@ class ReactState {
38 40 * 键:设备主键
39 41 * 值:设备指标参与的触发器
40 42 */
41   - private ConcurrentHashMap<String, TriggerState> triggerState = new ConcurrentHashMap<>();
  43 + private ConcurrentHashMap<String, TriggerState > triggerState = new ConcurrentHashMap<>();
  44 +
  45 + private ConcurrentHashMap<String, TriggerState> clearState = new ConcurrentHashMap<>();
42 46
43 47 /**场景联动的执行条件状态
44 48 * 键:设备主键
... ... @@ -50,6 +54,7 @@ class ReactState {
50 54
51 55
52 56
  57 + private final List<TriggerDTO> triggers;
53 58 /**【场景联动的执行条件】懒加载*/
54 59 private final List<DoCondition> conditions;
55 60 /**【场景联动的执行集合】懒加载*/
... ... @@ -64,6 +69,8 @@ class ReactState {
64 69
65 70 ReactState(String reactId,TbContext ctx, TbSceneReactNodeConfig config) {
66 71 this.reactId = reactId;
  72 + TriggerService triggerService = SpringBeanUtils.getBean(TriggerService.class);
  73 + this.triggers = triggerService.getTrigger(reactId);
67 74 DoConditionService conditionService = SpringBeanUtils.getBean(DoConditionService.class);
68 75 this.conditions = conditionService.getConditions(reactId);
69 76 DoActionService actionService = SpringBeanUtils.getBean(DoActionService.class);
... ... @@ -74,29 +81,48 @@ class ReactState {
74 81
75 82
76 83 public void process(TbContext ctx, TbMsg msg,String deviceId) throws ExecutionException, InterruptedException {
77   - TriggerState triggerState = getOrCreateTriggerState(deviceId);
78   - boolean matched = false;
79   - if( actions != null){
  84 +
  85 +
  86 +
  87 +
  88 + if( actions == null){
80 89 ctx.tellSuccess(msg);
81 90 }
82 91
83   - if(triggerState != null){
84   - matched = triggerState.process(ctx,msg);
  92 + boolean matched;
  93 + if(triggers == null || triggers.isEmpty()){
  94 + matched = true;
  95 + }else{
  96 + matched = false;
  97 + for(TriggerDTO trigger: triggers){
  98 + TriggerState triggerState = getOrCreateTriggerState(trigger,deviceId);
  99 + matched = triggerState.process(ctx,msg);
  100 + if(matched){
  101 + break;
  102 + }
  103 + }
85 104 }
86 105
87 106
88 107 if(matched && conditions.size() >0 ){
89 108 matched = false;
90 109 for(DoCondition item:conditions){
91   - TriggerState conditionState = getOrCreateConditionState(item.getEntityId(),item.getTriggerCondition());
92   - boolean result = false;
93   - if( conditionState != null){
94   - result =conditionState.process(ctx,msg);
95   - }
96   - if( result){
  110 + List<String> entityIds = item.getEntityId();
  111 + if(entityIds == null || entityIds.isEmpty()){
97 112 matched = true;
98 113 break;
99 114 }
  115 + for(String id:entityIds){
  116 + TriggerState conditionState = getOrCreateConditionState(item.getId(),id,item.getTriggerCondition());
  117 + if( conditionState == null
  118 + || conditionState.process(ctx,msg)){
  119 + matched = true;
  120 + break;
  121 + }
  122 + }
  123 + if(matched){
  124 + break;
  125 + }
100 126 }
101 127 }
102 128
... ... @@ -115,38 +141,40 @@ class ReactState {
115 141
116 142
117 143
118   - protected TriggerState getOrCreateTriggerState(String deviceId) {
119   - if(triggerState.containsKey(deviceId)){
120   - return triggerState.get(deviceId);
  144 + protected TriggerState getOrCreateTriggerState(TriggerDTO trigger,String deviceId) {
  145 + String triggerId = trigger.getId();
  146 + String cacheKey =triggerId+deviceId;
  147 + if(triggerState.containsKey(cacheKey)){
  148 + return triggerState.get(cacheKey);
121 149 }
122   - TriggerService triggerService = SpringBeanUtils.getBean(TriggerService.class);
123   - TriggerDTO trigger =triggerService.getTrigger(reactId,deviceId);
124   - if(trigger != null){
  150 + if(trigger.getEntityId().contains(deviceId)){
125 151 TriggerState state = createTriggerState(deviceId, trigger.getTriggerCondition());
126   - triggerState.put(deviceId, state);
  152 + triggerState.put(cacheKey, state);
127 153 return state;
128 154 }
129 155 return null;
  156 +
130 157 }
131 158
132   - protected TriggerState getOrCreateConditionState(String deviceId,AlarmCondition condition) {
133   - if(conditionState.containsKey(deviceId)){
134   - return conditionState.get(deviceId);
  159 + protected TriggerState getOrCreateConditionState(String conditionId, String deviceId, AlarmRule condition) {
  160 + String cacheKey =conditionId+deviceId;
  161 + if(conditionState.containsKey(cacheKey)){
  162 + return conditionState.get(cacheKey);
135 163 }else{
136 164 TriggerState state = createTriggerState(deviceId, condition);
137   - conditionState.put(deviceId, state);
  165 + conditionState.put(cacheKey, state);
138 166 return state;
139 167 }
140 168
141 169 }
142 170
143 171 @NotNull
144   - private TriggerState createTriggerState(String deviceId, AlarmCondition condition) {
  172 + private TriggerState createTriggerState(String deviceId, AlarmRule rule) {
145 173 Set<AlarmConditionFilterKey> filterKeys = new HashSet<>();
146   - for(AlarmConditionFilter filter :condition.getCondition()){
  174 + for(AlarmConditionFilter filter :rule.getCondition().getCondition()){
147 175 filterKeys.add(filter.getKey());
148 176 }
149   - TriggerState state = new TriggerState(deviceId,condition, filterKeys,null);
  177 + TriggerState state = new TriggerState(deviceId,rule, filterKeys,null);
150 178
151 179 return state;
152 180 }
... ...
... ... @@ -73,11 +73,11 @@ class TriggerState {
73 73
74 74 private final Set<AlarmConditionFilterKey> entityKeys;
75 75
76   - TriggerState( String originator, AlarmCondition condition,Set<AlarmConditionFilterKey> filterKeys,DynamicPredicateValueCtx dynamicPredicateValueCtx) {
  76 + TriggerState( String originator, AlarmRule rule,Set<AlarmConditionFilterKey> filterKeys,DynamicPredicateValueCtx dynamicPredicateValueCtx) {
77 77
78 78 this.originator = originator;
79 79 this.dynamicPredicateValueCtx = dynamicPredicateValueCtx;
80   - ruleState = new TriggerRuleState(condition, filterKeys, new PersistedAlarmRuleState());
  80 + ruleState = new TriggerRuleState(rule.getCondition(), filterKeys, new PersistedAlarmRuleState(),rule.getSchedule());
81 81 this.entityKeys = filterKeys;
82 82 }
83 83
... ...
... ... @@ -34,17 +34,7 @@ public class TriggerRuleState {
34 34
35 35
36 36
37   - public TriggerRuleState(AlarmCondition condition, Set<AlarmConditionFilterKey> entityKeys, PersistedAlarmRuleState state) {
38   - this.condition = condition;
39   - this.schedule = new AnyTimeSchedule();
40   - this.entityKeys = entityKeys;
41   - if (state != null) {
42   - this.state = state;
43   - } else {
44   - this.state = new PersistedAlarmRuleState(0L, 0L, 0L);
45   - }
46   - this.spec = getSpec(condition);
47   - }
  37 +
48 38
49 39 public TriggerRuleState(AlarmCondition condition, Set<AlarmConditionFilterKey> entityKeys, PersistedAlarmRuleState state, AlarmSchedule schedule) {
50 40 this.condition = condition;
... ...