Commit 579c7bf6f7e860f0185215562ebb29eb758811bc

Authored by 云中非
1 parent ac16dc21

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

1、全部设备添加过滤字段产品
2、场景联动RPC逻辑调整。
... ... @@ -5,12 +5,16 @@ 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.DoActionDTO;
  8 +import org.thingsboard.server.common.data.yunteng.enums.DeviceTypeEnum;
  9 +import org.thingsboard.server.dao.yunteng.entities.TkDeviceEntity;
8 10 import org.thingsboard.server.dao.yunteng.entities.TkDoActionEntity;
9 11 import org.thingsboard.server.dao.yunteng.entities.TenantBaseEntity;
  12 +import org.thingsboard.server.dao.yunteng.mapper.DeviceMapper;
10 13 import org.thingsboard.server.dao.yunteng.mapper.DoActionMapper;
11 14 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
12 15 import org.thingsboard.server.dao.yunteng.service.DoActionService;
13 16
  17 +import java.util.ArrayList;
14 18 import java.util.List;
15 19 import java.util.Set;
16 20 import java.util.stream.Collectors;
... ... @@ -20,13 +24,36 @@ import java.util.stream.Collectors;
20 24 @RequiredArgsConstructor
21 25 public class TkDoActionServiceImpl extends AbstractBaseService<DoActionMapper, TkDoActionEntity>
22 26 implements DoActionService {
  27 + private final DeviceMapper deviceMapper;
23 28 @Override
24   - public List<TkDoActionEntity> getActions(String sceneId) {
  29 + public List<TkDoActionEntity> getActionsByAll(String sceneId) {
25 30 LambdaQueryWrapper filter =
26 31 new QueryWrapper<TkDoActionEntity>().lambda().eq(TkDoActionEntity::getSceneLinkageId, sceneId);
27 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 57 @Override
31 58 public List<DoActionDTO> findDoActionByAlarmProfileIds(
32 59 String tenantId, Set<String> alarmProfileIds) {
... ...
... ... @@ -440,8 +440,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
440 440 String currentSceneId, String tenantId, String customerId, Integer state) {
441 441 List<TkSceneLinkageEntity> runningScenes =
442 442 baseMapper.selectList(
443   - new QueryWrapper<TkSceneLinkageEntity>()
444   - .lambda()
  443 + new LambdaQueryWrapper<TkSceneLinkageEntity>()
445 444 .eq(TkSceneLinkageEntity::getTenantId, tenantId)
446 445 .eq(TkSceneLinkageEntity::getStatus, FastIotConstants.StateValue.ENABLE));
447 446 Set<String> enableIds = new HashSet<>();
... ... @@ -468,17 +467,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
468 467
469 468 List<DeviceDTO> organizationDevices =
470 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 472 Map<String, List<String>> matchedDevices = new HashMap<>();
484 473
... ... @@ -495,6 +484,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
495 484 String scenId = trigger.getSceneLinkageId();
496 485 List<String> devices = trigger.getEntityId();
497 486 if(currentSceneId.equals(scenId)){
  487 + List<String> allDevices = filterDevice(organizationDevices,trigger.getDeviceProfileId(),false);
498 488 if (ScopeEnum.ALL.equals(trigger.getEntityType()) ) {
499 489 devices = allDevices;
500 490 }else{
... ... @@ -516,7 +506,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
516 506 Executors.newScheduledThreadPool(1)
517 507 .schedule(
518 508 () -> {
519   - freshEntityIds(currentSceneId, allDevices,rpcDevices, triggers);
  509 + freshEntityIds(currentSceneId, organizationDevices, triggers);
520 510 },
521 511 1,
522 512 TimeUnit.SECONDS);
... ... @@ -528,51 +518,65 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
528 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 540 * 异步刷新场景联动的设备ID
533 541 *
534 542 * @param sceneId
535   - * @param allDevices
  543 + * @param organizationDevices
536 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 547 triggers.forEach(
540 548 trigger -> {
541 549 if (ScopeEnum.ALL.equals(trigger.getEntityType())
542 550 && sceneId.equals(trigger.getSceneLinkageId())) {
543   - trigger.setEntityId(allDevices);
  551 + List<String> ids = filterDevice(organizationDevices,trigger.getDeviceProfileId(),false);
  552 + trigger.setEntityId(ids);
544 553 triggerMapper.updateById(trigger);
545 554 }
546 555 });
547 556
548 557 List<TkDoConditionEntity> conditions =
549 558 doConditionMapper.selectList(
550   - new QueryWrapper<TkDoConditionEntity>()
551   - .lambda()
  559 + new LambdaQueryWrapper<TkDoConditionEntity>()
552 560 .eq(TkDoConditionEntity::getSceneLinkageId, sceneId)
553 561 .eq(TkDoConditionEntity::getEntityType, ScopeEnum.ALL));
554 562 conditions.forEach(
555 563 item -> {
556 564 if (sceneId.equals(item.getSceneLinkageId())) {
557   - item.setEntityId(allDevices);
  565 + List<String> ids = filterDevice(organizationDevices,item.getDeviceProfileId(),false);
  566 + item.setEntityId(ids);
558 567 doConditionMapper.updateById(item);
559 568 }
560 569 });
561 570
562 571 List<TkDoActionEntity> actions =
563 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 575 actions.forEach(
569 576 item -> {
570 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 581 doActionMapper.updateById(item);
578 582 }
... ...
... ... @@ -13,7 +13,8 @@ import java.util.Set;
13 13 */
14 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 19 List<DoActionDTO> findDoActionByAlarmProfileIds(String tenantId, Set<String> alarmProfileIds);
19 20 }
... ...
... ... @@ -97,7 +97,8 @@ class ReactState {
97 97 DoConditionService conditionService = SpringBeanUtils.getBean(DoConditionService.class);
98 98 this.conditions = conditionService.getConditions(reactId);
99 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 102 for (TkDoActionEntity action : actions) {
102 103 /**动作中只有1个告警通知*/
103 104 if (ActionTypeEnum.MSG_NOTIFY.equals(action.getOutTarget())) {
... ...