Commit 579c7bf6f7e860f0185215562ebb29eb758811bc

Authored by 云中非
1 parent ac16dc21

refactor: 场景联动设备过滤条件添加产品

1、全部设备添加过滤字段产品
2、场景联动RPC逻辑调整。
@@ -5,12 +5,16 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -5,12 +5,16 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 import lombok.RequiredArgsConstructor; 5 import lombok.RequiredArgsConstructor;
6 import org.springframework.stereotype.Service; 6 import org.springframework.stereotype.Service;
7 import org.thingsboard.server.common.data.yunteng.dto.DoActionDTO; 7 import org.thingsboard.server.common.data.yunteng.dto.DoActionDTO;
  8 +import org.thingsboard.server.common.data.yunteng.enums.DeviceTypeEnum;
  9 +import org.thingsboard.server.dao.yunteng.entities.TkDeviceEntity;
8 import org.thingsboard.server.dao.yunteng.entities.TkDoActionEntity; 10 import org.thingsboard.server.dao.yunteng.entities.TkDoActionEntity;
9 import org.thingsboard.server.dao.yunteng.entities.TenantBaseEntity; 11 import org.thingsboard.server.dao.yunteng.entities.TenantBaseEntity;
  12 +import org.thingsboard.server.dao.yunteng.mapper.DeviceMapper;
10 import org.thingsboard.server.dao.yunteng.mapper.DoActionMapper; 13 import org.thingsboard.server.dao.yunteng.mapper.DoActionMapper;
11 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; 14 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
12 import org.thingsboard.server.dao.yunteng.service.DoActionService; 15 import org.thingsboard.server.dao.yunteng.service.DoActionService;
13 16
  17 +import java.util.ArrayList;
14 import java.util.List; 18 import java.util.List;
15 import java.util.Set; 19 import java.util.Set;
16 import java.util.stream.Collectors; 20 import java.util.stream.Collectors;
@@ -20,13 +24,36 @@ import java.util.stream.Collectors; @@ -20,13 +24,36 @@ import java.util.stream.Collectors;
20 @RequiredArgsConstructor 24 @RequiredArgsConstructor
21 public class TkDoActionServiceImpl extends AbstractBaseService<DoActionMapper, TkDoActionEntity> 25 public class TkDoActionServiceImpl extends AbstractBaseService<DoActionMapper, TkDoActionEntity>
22 implements DoActionService { 26 implements DoActionService {
  27 + private final DeviceMapper deviceMapper;
23 @Override 28 @Override
24 - public List<TkDoActionEntity> getActions(String sceneId) { 29 + public List<TkDoActionEntity> getActionsByAll(String sceneId) {
25 LambdaQueryWrapper filter = 30 LambdaQueryWrapper filter =
26 new QueryWrapper<TkDoActionEntity>().lambda().eq(TkDoActionEntity::getSceneLinkageId, sceneId); 31 new QueryWrapper<TkDoActionEntity>().lambda().eq(TkDoActionEntity::getSceneLinkageId, sceneId);
27 return baseMapper.selectList(filter); 32 return baseMapper.selectList(filter);
28 } 33 }
29 34
  35 +
  36 + @Override
  37 + public List<TkDoActionEntity> getActionsByPart(String sceneId) {
  38 + LambdaQueryWrapper filter =
  39 + new QueryWrapper<TkDoActionEntity>().lambda().eq(TkDoActionEntity::getSceneLinkageId, sceneId);
  40 + List<TkDoActionEntity> source = baseMapper.selectList(filter);
  41 + return source.stream().map(t ->{
  42 + List<TkDeviceEntity> partDevices = deviceMapper.selectList(new LambdaQueryWrapper<TkDeviceEntity>().in(TkDeviceEntity::getId,t.getDeviceId()));
  43 + List<String> deviceId = new ArrayList<>();
  44 + for(TkDeviceEntity item : partDevices){
  45 + if(!DeviceTypeEnum.SENSOR.equals(item.getDeviceType())){
  46 + //网关子设备才需要重写deviceId字段
  47 + break;
  48 + }
  49 + deviceId.add(item.getGatewayId());
  50 + }
  51 + t.setDeviceId(deviceId);
  52 + return t;
  53 + }).collect(Collectors.toList());
  54 +
  55 + }
  56 +
30 @Override 57 @Override
31 public List<DoActionDTO> findDoActionByAlarmProfileIds( 58 public List<DoActionDTO> findDoActionByAlarmProfileIds(
32 String tenantId, Set<String> alarmProfileIds) { 59 String tenantId, Set<String> alarmProfileIds) {
@@ -440,8 +440,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -440,8 +440,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
440 String currentSceneId, String tenantId, String customerId, Integer state) { 440 String currentSceneId, String tenantId, String customerId, Integer state) {
441 List<TkSceneLinkageEntity> runningScenes = 441 List<TkSceneLinkageEntity> runningScenes =
442 baseMapper.selectList( 442 baseMapper.selectList(
443 - new QueryWrapper<TkSceneLinkageEntity>()  
444 - .lambda() 443 + new LambdaQueryWrapper<TkSceneLinkageEntity>()
445 .eq(TkSceneLinkageEntity::getTenantId, tenantId) 444 .eq(TkSceneLinkageEntity::getTenantId, tenantId)
446 .eq(TkSceneLinkageEntity::getStatus, FastIotConstants.StateValue.ENABLE)); 445 .eq(TkSceneLinkageEntity::getStatus, FastIotConstants.StateValue.ENABLE));
447 Set<String> enableIds = new HashSet<>(); 446 Set<String> enableIds = new HashSet<>();
@@ -468,17 +467,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -468,17 +467,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
468 467
469 List<DeviceDTO> organizationDevices = 468 List<DeviceDTO> organizationDevices =
470 findDeviceList(self.getOrganizationId(), tenantId, customerId,new ArrayList<>()); 469 findDeviceList(self.getOrganizationId(), tenantId, customerId,new ArrayList<>());
471 - List<String> allDevices = new ArrayList<>();  
472 - List<String> rpcDevices = new ArrayList<>();  
473 - if(organizationDevices != null && !organizationDevices.isEmpty()){  
474 - for (DeviceDTO item : organizationDevices) {  
475 - allDevices.add(item.getTbDeviceId());  
476 - DeviceTypeEnum deviceType = item.getDeviceType();  
477 - if(!DeviceTypeEnum.SENSOR.equals(deviceType)){  
478 - rpcDevices.add(item.getTbDeviceId());  
479 - }  
480 - }  
481 - } 470 +
482 471
483 Map<String, List<String>> matchedDevices = new HashMap<>(); 472 Map<String, List<String>> matchedDevices = new HashMap<>();
484 473
@@ -495,6 +484,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -495,6 +484,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
495 String scenId = trigger.getSceneLinkageId(); 484 String scenId = trigger.getSceneLinkageId();
496 List<String> devices = trigger.getEntityId(); 485 List<String> devices = trigger.getEntityId();
497 if(currentSceneId.equals(scenId)){ 486 if(currentSceneId.equals(scenId)){
  487 + List<String> allDevices = filterDevice(organizationDevices,trigger.getDeviceProfileId(),false);
498 if (ScopeEnum.ALL.equals(trigger.getEntityType()) ) { 488 if (ScopeEnum.ALL.equals(trigger.getEntityType()) ) {
499 devices = allDevices; 489 devices = allDevices;
500 }else{ 490 }else{
@@ -516,7 +506,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -516,7 +506,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
516 Executors.newScheduledThreadPool(1) 506 Executors.newScheduledThreadPool(1)
517 .schedule( 507 .schedule(
518 () -> { 508 () -> {
519 - freshEntityIds(currentSceneId, allDevices,rpcDevices, triggers); 509 + freshEntityIds(currentSceneId, organizationDevices, triggers);
520 }, 510 },
521 1, 511 1,
522 TimeUnit.SECONDS); 512 TimeUnit.SECONDS);
@@ -528,51 +518,65 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -528,51 +518,65 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
528 return JacksonUtil.convertValue(engineConfig, JsonNode.class); 518 return JacksonUtil.convertValue(engineConfig, JsonNode.class);
529 } 519 }
530 520
  521 + private List<String> filterDevice(List<DeviceDTO> organizationDevices,String profileId,boolean rpc){
  522 + List<String> allDevices = new ArrayList<>();
  523 + if(organizationDevices != null && !organizationDevices.isEmpty()){
  524 + for (DeviceDTO item : organizationDevices) {
  525 + if(!item.getDeviceProfileId().equals(profileId)){
  526 + continue;
  527 + }
  528 + DeviceTypeEnum deviceType = item.getDeviceType();
  529 + if(rpc && DeviceTypeEnum.SENSOR.equals(deviceType)){
  530 + allDevices.add(item.getGatewayId());
  531 + continue;
  532 + }
  533 + allDevices.add(item.getTbDeviceId());
  534 + }
  535 + }
  536 + return allDevices;
  537 + }
  538 +
531 /** 539 /**
532 * 异步刷新场景联动的设备ID 540 * 异步刷新场景联动的设备ID
533 * 541 *
534 * @param sceneId 542 * @param sceneId
535 - * @param allDevices 543 + * @param organizationDevices
536 * @param triggers 544 * @param triggers
537 */ 545 */
538 - public void freshEntityIds(String sceneId, List<String> allDevices,List<String> rpcDevices, List<TkTriggerEntity> triggers) { 546 + public void freshEntityIds(String sceneId, List<DeviceDTO> organizationDevices,List<TkTriggerEntity> triggers) {
539 triggers.forEach( 547 triggers.forEach(
540 trigger -> { 548 trigger -> {
541 if (ScopeEnum.ALL.equals(trigger.getEntityType()) 549 if (ScopeEnum.ALL.equals(trigger.getEntityType())
542 && sceneId.equals(trigger.getSceneLinkageId())) { 550 && sceneId.equals(trigger.getSceneLinkageId())) {
543 - trigger.setEntityId(allDevices); 551 + List<String> ids = filterDevice(organizationDevices,trigger.getDeviceProfileId(),false);
  552 + trigger.setEntityId(ids);
544 triggerMapper.updateById(trigger); 553 triggerMapper.updateById(trigger);
545 } 554 }
546 }); 555 });
547 556
548 List<TkDoConditionEntity> conditions = 557 List<TkDoConditionEntity> conditions =
549 doConditionMapper.selectList( 558 doConditionMapper.selectList(
550 - new QueryWrapper<TkDoConditionEntity>()  
551 - .lambda() 559 + new LambdaQueryWrapper<TkDoConditionEntity>()
552 .eq(TkDoConditionEntity::getSceneLinkageId, sceneId) 560 .eq(TkDoConditionEntity::getSceneLinkageId, sceneId)
553 .eq(TkDoConditionEntity::getEntityType, ScopeEnum.ALL)); 561 .eq(TkDoConditionEntity::getEntityType, ScopeEnum.ALL));
554 conditions.forEach( 562 conditions.forEach(
555 item -> { 563 item -> {
556 if (sceneId.equals(item.getSceneLinkageId())) { 564 if (sceneId.equals(item.getSceneLinkageId())) {
557 - item.setEntityId(allDevices); 565 + List<String> ids = filterDevice(organizationDevices,item.getDeviceProfileId(),false);
  566 + item.setEntityId(ids);
558 doConditionMapper.updateById(item); 567 doConditionMapper.updateById(item);
559 } 568 }
560 }); 569 });
561 570
562 List<TkDoActionEntity> actions = 571 List<TkDoActionEntity> actions =
563 doActionMapper.selectList( 572 doActionMapper.selectList(
564 - new QueryWrapper<TkDoActionEntity>()  
565 - .lambda()  
566 - .eq(TkDoActionEntity::getSceneLinkageId, sceneId)  
567 - .eq(TkDoActionEntity::getEntityType, ScopeEnum.ALL)); 573 + new LambdaQueryWrapper<TkDoActionEntity>()
  574 + .eq(TkDoActionEntity::getSceneLinkageId, sceneId));
568 actions.forEach( 575 actions.forEach(
569 item -> { 576 item -> {
570 if (sceneId.equals(item.getSceneLinkageId())) { 577 if (sceneId.equals(item.getSceneLinkageId())) {
571 - if(ActionTypeEnum.DEVICE_OUT.equals(item.getOutTarget())){  
572 - item.setDeviceId(rpcDevices);  
573 - }else{  
574 - item.setDeviceId(allDevices);  
575 - } 578 + List<String> ids = filterDevice(organizationDevices,item.getDeviceProfileId(),ActionTypeEnum.DEVICE_OUT.equals(item.getOutTarget())?true:false);
  579 + item.setDeviceId(ids);
576 580
577 doActionMapper.updateById(item); 581 doActionMapper.updateById(item);
578 } 582 }
@@ -13,7 +13,8 @@ import java.util.Set; @@ -13,7 +13,8 @@ import java.util.Set;
13 */ 13 */
14 public interface DoActionService extends BaseService<TkDoActionEntity>{ 14 public interface DoActionService extends BaseService<TkDoActionEntity>{
15 15
16 - List<TkDoActionEntity> getActions(String sceneId); 16 + List<TkDoActionEntity> getActionsByAll(String sceneId);
  17 + List<TkDoActionEntity> getActionsByPart(String sceneId);
17 18
18 List<DoActionDTO> findDoActionByAlarmProfileIds(String tenantId, Set<String> alarmProfileIds); 19 List<DoActionDTO> findDoActionByAlarmProfileIds(String tenantId, Set<String> alarmProfileIds);
19 } 20 }
@@ -97,7 +97,8 @@ class ReactState { @@ -97,7 +97,8 @@ class ReactState {
97 DoConditionService conditionService = SpringBeanUtils.getBean(DoConditionService.class); 97 DoConditionService conditionService = SpringBeanUtils.getBean(DoConditionService.class);
98 this.conditions = conditionService.getConditions(reactId); 98 this.conditions = conditionService.getConditions(reactId);
99 DoActionService actionService = SpringBeanUtils.getBean(DoActionService.class); 99 DoActionService actionService = SpringBeanUtils.getBean(DoActionService.class);
100 - this.actions = actionService.getActions(reactId); 100 + this.actions = actionService.getActionsByAll(reactId);
  101 + this.actions.addAll(actionService.getActionsByPart(reactId));
101 for (TkDoActionEntity action : actions) { 102 for (TkDoActionEntity action : actions) {
102 /**动作中只有1个告警通知*/ 103 /**动作中只有1个告警通知*/
103 if (ActionTypeEnum.MSG_NOTIFY.equals(action.getOutTarget())) { 104 if (ActionTypeEnum.MSG_NOTIFY.equals(action.getOutTarget())) {