Commit 14852ef3d9d03a138b3681ec38552c4eaea5a29f

Authored by xp.Huang
2 parents f1ba25ba 30880e57

Merge branch '20220913' into 'master_dev'

refactor: 调整组织结构下所有组织的接口实现

See merge request yunteng/thingskit!231
1 package org.thingsboard.server.controller.yunteng; 1 package org.thingsboard.server.controller.yunteng;
2 2
  3 +import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.*;
  4 +
3 import com.fasterxml.jackson.databind.JsonNode; 5 import com.fasterxml.jackson.databind.JsonNode;
4 import io.swagger.annotations.Api; 6 import io.swagger.annotations.Api;
5 import io.swagger.annotations.ApiOperation; 7 import io.swagger.annotations.ApiOperation;
6 import io.swagger.annotations.ApiParam; 8 import io.swagger.annotations.ApiParam;
  9 +import java.util.*;
  10 +import java.util.concurrent.ConcurrentMap;
7 import lombok.RequiredArgsConstructor; 11 import lombok.RequiredArgsConstructor;
8 import org.springframework.beans.factory.annotation.Autowired; 12 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.beans.factory.annotation.Value; 13 import org.springframework.beans.factory.annotation.Value;
@@ -25,10 +29,10 @@ import org.thingsboard.server.common.data.yunteng.common.UpdateGroup; @@ -25,10 +29,10 @@ import org.thingsboard.server.common.data.yunteng.common.UpdateGroup;
25 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; 29 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
26 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; 30 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException;
27 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; 31 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
  32 +import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
28 import org.thingsboard.server.common.data.yunteng.dto.convert.ConvertConfigDTO; 33 import org.thingsboard.server.common.data.yunteng.dto.convert.ConvertConfigDTO;
29 import org.thingsboard.server.common.data.yunteng.dto.convert.ConvertConfigReqDTO; 34 import org.thingsboard.server.common.data.yunteng.dto.convert.ConvertConfigReqDTO;
30 import org.thingsboard.server.common.data.yunteng.dto.convert.ConvertReqDTO; 35 import org.thingsboard.server.common.data.yunteng.dto.convert.ConvertReqDTO;
31 -import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;  
32 import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum; 36 import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum;
33 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; 37 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData;
34 import org.thingsboard.server.controller.BaseController; 38 import org.thingsboard.server.controller.BaseController;
@@ -38,11 +42,6 @@ import org.thingsboard.server.dao.yunteng.service.TkRuleChainService; @@ -38,11 +42,6 @@ import org.thingsboard.server.dao.yunteng.service.TkRuleChainService;
38 import org.thingsboard.server.service.rule.TbRuleChainService; 42 import org.thingsboard.server.service.rule.TbRuleChainService;
39 import org.thingsboard.server.service.security.permission.Operation; 43 import org.thingsboard.server.service.security.permission.Operation;
40 44
41 -import java.util.*;  
42 -import java.util.concurrent.ConcurrentMap;  
43 -  
44 -import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.*;  
45 -  
46 @RestController 45 @RestController
47 @RequiredArgsConstructor 46 @RequiredArgsConstructor
48 @RequestMapping("api/yt/convert") 47 @RequestMapping("api/yt/convert")
@@ -52,10 +51,13 @@ public class TkConvertDataToController extends BaseController { @@ -52,10 +51,13 @@ public class TkConvertDataToController extends BaseController {
52 private final TkRuleChainService tkRuleChainService; 51 private final TkRuleChainService tkRuleChainService;
53 private final ConvertConfigService convertConfigService; 52 private final ConvertConfigService convertConfigService;
54 private final SceneLinkageService sceneLinkageService; 53 private final SceneLinkageService sceneLinkageService;
  54 +
55 @Value("${actors.rule.chain.debug_mode_rate_limits_per_tenant.enabled}") 55 @Value("${actors.rule.chain.debug_mode_rate_limits_per_tenant.enabled}")
56 private boolean debugPerTenantEnabled; 56 private boolean debugPerTenantEnabled;
  57 +
57 @Autowired(required = false) 58 @Autowired(required = false)
58 private ActorSystemContext actorContext; 59 private ActorSystemContext actorContext;
  60 +
59 @Autowired private TbRuleChainService tbRuleChainService; 61 @Autowired private TbRuleChainService tbRuleChainService;
60 62
61 @GetMapping(params = {PAGE_SIZE, PAGE}) 63 @GetMapping(params = {PAGE_SIZE, PAGE})
@@ -79,7 +81,7 @@ public class TkConvertDataToController extends BaseController { @@ -79,7 +81,7 @@ public class TkConvertDataToController extends BaseController {
79 queryMap.put("nodeType", nodeType); 81 queryMap.put("nodeType", nodeType);
80 queryMap.put("name", name); 82 queryMap.put("name", name);
81 queryMap.put("status", status); 83 queryMap.put("status", status);
82 - checkTimeAndPut(queryMap,startTime,endTime); 84 + checkTimeAndPut(queryMap, startTime, endTime);
83 if (orderType != null) { 85 if (orderType != null) {
84 queryMap.put(ORDER_TYPE, orderType.name()); 86 queryMap.put(ORDER_TYPE, orderType.name());
85 } 87 }
@@ -90,7 +92,7 @@ public class TkConvertDataToController extends BaseController { @@ -90,7 +92,7 @@ public class TkConvertDataToController extends BaseController {
90 @ApiOperation("获取详情") 92 @ApiOperation("获取详情")
91 public ResponseEntity<ConvertConfigDTO> findConvertConfigDTOById(@PathVariable("id") String id) 93 public ResponseEntity<ConvertConfigDTO> findConvertConfigDTOById(@PathVariable("id") String id)
92 throws ThingsboardException { 94 throws ThingsboardException {
93 - if(StringUtils.isEmpty(id)){ 95 + if (StringUtils.isEmpty(id)) {
94 throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); 96 throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
95 } 97 }
96 return ResponseEntity.ok( 98 return ResponseEntity.ok(
@@ -230,6 +232,7 @@ public class TkConvertDataToController extends BaseController { @@ -230,6 +232,7 @@ public class TkConvertDataToController extends BaseController {
230 Map<String, Map<String, String>> origConfig = new HashMap<>(); 232 Map<String, Map<String, String>> origConfig = new HashMap<>();
231 Map<String, String> fields = new HashMap<>(); 233 Map<String, String> fields = new HashMap<>();
232 fields.put("deviceProfileId", "deviceProfileId"); 234 fields.put("deviceProfileId", "deviceProfileId");
  235 + fields.put("tenantId", "tenantId");
233 origConfig.put("fieldsMapping", fields); 236 origConfig.put("fieldsMapping", fields);
234 origNode.setConfiguration(JacksonUtil.valueToTree(origConfig)); 237 origNode.setConfiguration(JacksonUtil.valueToTree(origConfig));
235 ruleNodes.add(origNode); 238 ruleNodes.add(origNode);
@@ -261,9 +264,12 @@ public class TkConvertDataToController extends BaseController { @@ -261,9 +264,12 @@ public class TkConvertDataToController extends BaseController {
261 ruleChainService.loadRuleChainMetaData(getTenantId(), ruleChain.getId()); 264 ruleChainService.loadRuleChainMetaData(getTenantId(), ruleChain.getId());
262 // 3. SETUP CONNECTION AND ADD OR DELETE RULE NODE 265 // 3. SETUP CONNECTION AND ADD OR DELETE RULE NODE
263 if (status == FastIotConstants.MagicNumber.ZERO) { 266 if (status == FastIotConstants.MagicNumber.ZERO) {
264 - needSaveRuleNode = convertConfigService.deleteRuleNode(nodes, ruleChainMetaData, nodeType,getCurrentUser().getCurrentTenantId()); 267 + needSaveRuleNode =
  268 + convertConfigService.deleteRuleNode(
  269 + nodes, ruleChainMetaData, nodeType, getCurrentUser().getCurrentTenantId());
265 } else { 270 } else {
266 - convertConfigService.addRuleNode(nodes, ruleChainMetaData, nodeType,getCurrentUser().getCurrentTenantId()); 271 + convertConfigService.addRuleNode(
  272 + nodes, ruleChainMetaData, nodeType, getCurrentUser().getCurrentTenantId());
267 needSaveRuleNode = true; 273 needSaveRuleNode = true;
268 } 274 }
269 // 4. SAVE METADATA 275 // 4. SAVE METADATA
@@ -445,6 +445,12 @@ caffeine: @@ -445,6 +445,12 @@ caffeine:
445 taskCenterInfos: 445 taskCenterInfos:
446 timeToLiveInMinutes: "${CACHE_SPECS_TASK_CENTER_TTL:1440}" 446 timeToLiveInMinutes: "${CACHE_SPECS_TASK_CENTER_TTL:1440}"
447 maxSize: "${CACHE_SPECS_TASK_CENTER_MAX_SIZE:10000}" 447 maxSize: "${CACHE_SPECS_TASK_CENTER_MAX_SIZE:10000}"
  448 + organization:
  449 + timeToLiveInMinutes: "${CACHE_SPECS_ORG_TTL:1440}"
  450 + maxSize: "${CACHE_SPECS_ORG_MAX_SIZE:10000}"
  451 + sceneReact:
  452 + timeToLiveInMinutes: "${CACHE_SPECS_SCENE_TTL:1440}"
  453 + maxSize: "${CACHE_SPECS_SCENE_MAX_SIZE:10000}"
448 redis: 454 redis:
449 # standalone or cluster 455 # standalone or cluster
450 connection: 456 connection:
@@ -1217,4 +1223,4 @@ logging: @@ -1217,4 +1223,4 @@ logging:
1217 # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 1223 # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
1218 frp: 1224 frp:
1219 server: 1225 server:
1220 - address: ${FRP_SERVER_ADDRESS:http://127.0.0.1}  
  1226 + address: ${FRP_SERVER_ADDRESS:http://127.0.0.1}
@@ -30,6 +30,8 @@ public interface FastIotConstants { @@ -30,6 +30,8 @@ public interface FastIotConstants {
30 String TASK_CENTER_EXECUTE_TIME = "taskCenterExecuteTime"; 30 String TASK_CENTER_EXECUTE_TIME = "taskCenterExecuteTime";
31 String TASK_CENTER_DEVICE_EXECUTE_TIME = "taskCenterDeviceExecuteTime"; 31 String TASK_CENTER_DEVICE_EXECUTE_TIME = "taskCenterDeviceExecuteTime";
32 String TASK_IMMEDIATE_EXECUTE = "taskImmediateExecute"; 32 String TASK_IMMEDIATE_EXECUTE = "taskImmediateExecute";
  33 + String ORGANIZATION = "organization";
  34 + String SCENE_REACT = "sceneReact";
33 } 35 }
34 36
35 interface TBCacheConfig { 37 interface TBCacheConfig {
@@ -175,6 +177,13 @@ public interface FastIotConstants { @@ -175,6 +177,13 @@ public interface FastIotConstants {
175 /**RPC单项双向*/ 177 /**RPC单项双向*/
176 public static String ONEWAY = "oneway"; 178 public static String ONEWAY = "oneway";
177 } 179 }
  180 + class Scene{
  181 +
  182 + /**触发器*/
  183 + public static String CONDITION_TRIGGER = "trigger";
  184 + /**执行条件*/
  185 + public static String CONDITION_CONDITION = "condition";
  186 + }
178 class Alarm{ 187 class Alarm{
179 188
180 /**遥测指标标识符*/ 189 /**遥测指标标识符*/
@@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j; @@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
11 import org.apache.commons.lang3.StringUtils; 11 import org.apache.commons.lang3.StringUtils;
12 import org.jetbrains.annotations.NotNull; 12 import org.jetbrains.annotations.NotNull;
13 import org.jetbrains.annotations.Nullable; 13 import org.jetbrains.annotations.Nullable;
  14 +import org.springframework.cache.annotation.Cacheable;
14 import org.springframework.stereotype.Service; 15 import org.springframework.stereotype.Service;
15 import org.springframework.transaction.annotation.Transactional; 16 import org.springframework.transaction.annotation.Transactional;
16 import org.thingsboard.common.util.JacksonUtil; 17 import org.thingsboard.common.util.JacksonUtil;
@@ -32,10 +33,7 @@ import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; @@ -32,10 +33,7 @@ import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData;
32 import org.thingsboard.server.dao.device.DeviceProfileDao; 33 import org.thingsboard.server.dao.device.DeviceProfileDao;
33 import org.thingsboard.server.dao.yunteng.entities.*; 34 import org.thingsboard.server.dao.yunteng.entities.*;
34 import org.thingsboard.server.dao.yunteng.mapper.*; 35 import org.thingsboard.server.dao.yunteng.mapper.*;
35 -import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;  
36 -import org.thingsboard.server.dao.yunteng.service.ConvertConfigService;  
37 -import org.thingsboard.server.dao.yunteng.service.ThingsModelService;  
38 -import org.thingsboard.server.dao.yunteng.service.TkDeviceService; 36 +import org.thingsboard.server.dao.yunteng.service.*;
39 37
40 import java.time.LocalDateTime; 38 import java.time.LocalDateTime;
41 import java.util.*; 39 import java.util.*;
@@ -50,7 +48,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev @@ -50,7 +48,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev
50 private final DeviceProfileDao deviceProfileDao; 48 private final DeviceProfileDao deviceProfileDao;
51 private final TkDeviceProfileMapper tkProfileMapper; 49 private final TkDeviceProfileMapper tkProfileMapper;
52 50
53 - private final OrganizationMapper tkOrganizationMapper; 51 + private final TkOrganizationService organizationService;
54 private final SceneLinkageMapper sceneLinkageMapper; 52 private final SceneLinkageMapper sceneLinkageMapper;
55 private final TriggerMapper triggerMapper; 53 private final TriggerMapper triggerMapper;
56 private final DoConditionMapper conditionMapper; 54 private final DoConditionMapper conditionMapper;
@@ -133,8 +131,8 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev @@ -133,8 +131,8 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev
133 TenantId id = TenantId.fromUUID(UUID.fromString(deviceTenantId)); 131 TenantId id = TenantId.fromUUID(UUID.fromString(deviceTenantId));
134 DeviceProfile deviceProfile = 132 DeviceProfile deviceProfile =
135 deviceProfileDao.findById(id, UUID.fromString(deviceDTO.getProfileId())); 133 deviceProfileDao.findById(id, UUID.fromString(deviceDTO.getProfileId()));
136 - TkOrganizationEntity organization =  
137 - tkOrganizationMapper.selectById(deviceDTO.getOrganizationId()); 134 + OrganizationDTO organization =
  135 + organizationService.findOrganizationById(deviceTenantId,deviceDTO.getOrganizationId());
138 if (null == deviceProfile || null == organization) { 136 if (null == deviceProfile || null == organization) {
139 throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); 137 throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
140 } else if (!organization.getTenantId().equals(deviceTenantId)) { 138 } else if (!organization.getTenantId().equals(deviceTenantId)) {
@@ -274,7 +272,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev @@ -274,7 +272,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev
274 String organizationId, 272 String organizationId,
275 String deviceLabel, 273 String deviceLabel,
276 String deviceProfileId) { 274 String deviceProfileId) {
277 - List<String> orgIds = organizationAllIds(tenantId, organizationId); 275 + List<String> orgIds = organizationService.organizationAllIds(tenantId, organizationId);
278 if (orgIds.isEmpty()) { 276 if (orgIds.isEmpty()) {
279 throw new TkDataValidationException(ErrorMessage.ORGANIZATION_NOT_EXTIED.getMessage()); 277 throw new TkDataValidationException(ErrorMessage.ORGANIZATION_NOT_EXTIED.getMessage());
280 } 278 }
@@ -294,7 +292,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev @@ -294,7 +292,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev
294 @Override 292 @Override
295 public List<DeviceDTO> findDevicesByTransportTypeAndOrganizationId( 293 public List<DeviceDTO> findDevicesByTransportTypeAndOrganizationId(
296 String tenantId, String organizationId, DeviceTransportType transportType) { 294 String tenantId, String organizationId, DeviceTransportType transportType) {
297 - List<String> orgIds = organizationAllIds(tenantId, organizationId); 295 + List<String> orgIds = organizationService.organizationAllIds(tenantId, organizationId);
298 if (orgIds.isEmpty()) { 296 if (orgIds.isEmpty()) {
299 throw new TkDataValidationException(ErrorMessage.ORGANIZATION_NOT_EXTIED.getMessage()); 297 throw new TkDataValidationException(ErrorMessage.ORGANIZATION_NOT_EXTIED.getMessage());
300 } 298 }
@@ -380,7 +378,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev @@ -380,7 +378,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev
380 String convertConfigId = 378 String convertConfigId =
381 Optional.ofNullable(queryMap.get("convertConfigId")).map(Object::toString).orElse(null); 379 Optional.ofNullable(queryMap.get("convertConfigId")).map(Object::toString).orElse(null);
382 if (!StringUtils.isEmpty(organizationId)) { 380 if (!StringUtils.isEmpty(organizationId)) {
383 - List<String> queryOrganizationIds = organizationAllIds(tenantId, organizationId); 381 + List<String> queryOrganizationIds = organizationService.organizationAllIds(tenantId, organizationId);
384 queryMap.put("organizationIds", queryOrganizationIds); 382 queryMap.put("organizationIds", queryOrganizationIds);
385 } 383 }
386 // 用于数据流转已选,待选过滤============开始 384 // 用于数据流转已选,待选过滤============开始
@@ -415,28 +413,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev @@ -415,28 +413,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev
415 return new TkPageData<>(records, deviceIPage.getTotal()); 413 return new TkPageData<>(records, deviceIPage.getTotal());
416 } 414 }
417 415
418 - /**  
419 - * 组织结构下的所有组织ID  
420 - *  
421 - * @param tenantId 租户ID  
422 - * @param organizationId 组织ID  
423 - */  
424 - @NotNull  
425 - private List<String> organizationAllIds(String tenantId, String organizationId) {  
426 - List<String> organizationIds = new ArrayList<>();  
427 - if (StringUtils.isEmpty(organizationId)) {  
428 - return organizationIds;  
429 - }  
430 - if (!StringUtils.isEmpty(organizationId)) {  
431 - organizationIds.add(organizationId);  
432 - }  
433 - // 查询该组织的所有子类  
434 - List<OrganizationDTO> organizationDTOS =  
435 - tkOrganizationMapper.findOrganizationTreeList(tenantId, organizationIds);  
436 - List<String> queryOrganizationIds = new ArrayList<>();  
437 - organizationDTOS.forEach(item -> queryOrganizationIds.add(item.getId()));  
438 - return queryOrganizationIds;  
439 - } 416 +
440 417
441 @Override 418 @Override
442 public TkPageData<RelationDeviceDTO> pageRelation(Map<String, Object> queryMap) { 419 public TkPageData<RelationDeviceDTO> pageRelation(Map<String, Object> queryMap) {
@@ -555,14 +532,14 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev @@ -555,14 +532,14 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev
555 @Override 532 @Override
556 public List<SelectItemDTO> findMasterDevices( 533 public List<SelectItemDTO> findMasterDevices(
557 String tenantId, String customerId, String organizationId, String deviceProfileId) { 534 String tenantId, String customerId, String organizationId, String deviceProfileId) {
558 - List<String> orgIds = organizationAllIds(tenantId, organizationId); 535 + List<String> orgIds = organizationService.organizationAllIds(tenantId, organizationId);
559 return baseMapper.masterDevices(customerId, tenantId, orgIds, deviceProfileId); 536 return baseMapper.masterDevices(customerId, tenantId, orgIds, deviceProfileId);
560 } 537 }
561 538
562 @Override 539 @Override
563 public List<SelectItemDTO> findSlaveDevices( 540 public List<SelectItemDTO> findSlaveDevices(
564 String masterId, String tenantId, String customerId, String organizationId) { 541 String masterId, String tenantId, String customerId, String organizationId) {
565 - List<String> orgIds = organizationAllIds(tenantId, organizationId); 542 + List<String> orgIds = organizationService.organizationAllIds(tenantId, organizationId);
566 return baseMapper.slaveDevices(customerId, tenantId, orgIds, masterId); 543 return baseMapper.slaveDevices(customerId, tenantId, orgIds, masterId);
567 } 544 }
568 545
@@ -574,7 +551,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev @@ -574,7 +551,7 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev
574 @Override 551 @Override
575 public List<String> findDeviceKeys( 552 public List<String> findDeviceKeys(
576 String tenantId, String customerId, String organizationId, List<String> deviceIds) { 553 String tenantId, String customerId, String organizationId, List<String> deviceIds) {
577 - List<String> orgIds = organizationAllIds(tenantId, organizationId); 554 + List<String> orgIds = organizationService.organizationAllIds(tenantId, organizationId);
578 return baseMapper.findDeviceKeys(tenantId, customerId, orgIds, deviceIds); 555 return baseMapper.findDeviceKeys(tenantId, customerId, orgIds, deviceIds);
579 } 556 }
580 557
@@ -685,10 +662,10 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev @@ -685,10 +662,10 @@ public class TkDeviceServiceImpl extends AbstractBaseService<DeviceMapper, TkDev
685 } 662 }
686 return baseMapper.findDeviceInfo(tenantId, tbDeviceId); 663 return baseMapper.findDeviceInfo(tenantId, tbDeviceId);
687 } 664 }
688 - 665 + @Cacheable(cacheNames = FastIotConstants.CacheConfigKey.SCENE_REACT, key = "{#tenantId, #organizationId, #projectId}")
689 @Override 666 @Override
690 public List<String> rpcDevices(String tenantId, String organizationId, String projectId) { 667 public List<String> rpcDevices(String tenantId, String organizationId, String projectId) {
691 - List<String> orgIds = organizationAllIds(tenantId, organizationId); 668 + List<String> orgIds = organizationService.organizationAllIds(tenantId, organizationId);
692 669
693 List<TkDeviceEntity> organizationDevices = 670 List<TkDeviceEntity> organizationDevices =
694 baseMapper.selectList( 671 baseMapper.selectList(
@@ -6,15 +6,22 @@ import com.google.common.collect.Lists; @@ -6,15 +6,22 @@ import com.google.common.collect.Lists;
6 import com.google.common.collect.Sets; 6 import com.google.common.collect.Sets;
7 import lombok.RequiredArgsConstructor; 7 import lombok.RequiredArgsConstructor;
8 import org.apache.commons.lang3.StringUtils; 8 import org.apache.commons.lang3.StringUtils;
  9 +import org.jetbrains.annotations.NotNull;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.cache.annotation.CacheEvict;
  12 +import org.springframework.cache.annotation.Cacheable;
  13 +import org.springframework.cache.annotation.Caching;
9 import org.springframework.stereotype.Service; 14 import org.springframework.stereotype.Service;
10 import org.springframework.transaction.annotation.Transactional; 15 import org.springframework.transaction.annotation.Transactional;
11 import org.springframework.util.Assert; 16 import org.springframework.util.Assert;
  17 +import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
12 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; 18 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException;
13 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; 19 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
14 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; 20 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
15 import org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO; 21 import org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO;
16 import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils; 22 import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils;
17 import org.thingsboard.server.common.data.yunteng.utils.tree.TreeUtils; 23 import org.thingsboard.server.common.data.yunteng.utils.tree.TreeUtils;
  24 +import org.thingsboard.server.dao.cache.EntitiesCacheManager;
18 import org.thingsboard.server.dao.yunteng.entities.*; 25 import org.thingsboard.server.dao.yunteng.entities.*;
19 import org.thingsboard.server.dao.yunteng.mapper.*; 26 import org.thingsboard.server.dao.yunteng.mapper.*;
20 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; 27 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
@@ -23,6 +30,8 @@ import org.thingsboard.server.dao.yunteng.service.TkOrganizationService; @@ -23,6 +30,8 @@ import org.thingsboard.server.dao.yunteng.service.TkOrganizationService;
23 import java.util.*; 30 import java.util.*;
24 import java.util.stream.Collectors; 31 import java.util.stream.Collectors;
25 32
  33 +import static org.thingsboard.server.common.data.CacheConstants.DEVICE_CACHE;
  34 +
26 @Service 35 @Service
27 @RequiredArgsConstructor 36 @RequiredArgsConstructor
28 public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationMapper, TkOrganizationEntity> 37 public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationMapper, TkOrganizationEntity>
@@ -34,6 +43,9 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -34,6 +43,9 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
34 private final SceneLinkageMapper sceneMapper; 43 private final SceneLinkageMapper sceneMapper;
35 private final AlarmContactMapper contactMapper; 44 private final AlarmContactMapper contactMapper;
36 45
  46 + @Caching(evict= {
  47 + @CacheEvict(cacheNames = FastIotConstants.CacheConfigKey.ORGANIZATION, key = "{#tenantId, #organizationDTO.id}")
  48 + })
37 @Override 49 @Override
38 @Transactional 50 @Transactional
39 public OrganizationDTO saveOrganization( 51 public OrganizationDTO saveOrganization(
@@ -148,7 +160,9 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -148,7 +160,9 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
148 .lambda() 160 .lambda()
149 .in(TkUserOrganizationMappingEntity::getOrganizationId, organizationIds)); 161 .in(TkUserOrganizationMappingEntity::getOrganizationId, organizationIds));
150 } 162 }
151 - 163 + @Caching(evict= {
  164 + @CacheEvict(cacheNames = FastIotConstants.CacheConfigKey.ORGANIZATION, key = "{#tenantId, #organizationDTO.id}")
  165 + })
152 @Override 166 @Override
153 @Transactional 167 @Transactional
154 public OrganizationDTO updateOrganization( 168 public OrganizationDTO updateOrganization(
@@ -339,4 +353,30 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -339,4 +353,30 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
339 } 353 }
340 return organization.getDTO(OrganizationDTO.class); 354 return organization.getDTO(OrganizationDTO.class);
341 } 355 }
  356 +
  357 +
  358 + /**
  359 + * 组织结构下的所有组织ID
  360 + *
  361 + * @param tenantId 租户ID
  362 + * @param organizationId 组织ID
  363 + */
  364 + @Cacheable(cacheNames = FastIotConstants.CacheConfigKey.ORGANIZATION, key = "{#tenantId, #organizationId}")
  365 + @Override
  366 + public List<String> organizationAllIds(String tenantId, String organizationId) {
  367 + List<String> organizationIds = new ArrayList<>();
  368 + if (StringUtils.isEmpty(organizationId)) {
  369 + return organizationIds;
  370 + }
  371 + if (!StringUtils.isEmpty(organizationId)) {
  372 + organizationIds.add(organizationId);
  373 + }
  374 + // 查询该组织的所有子类
  375 + List<OrganizationDTO> organizationDTOS =
  376 + baseMapper.findOrganizationTreeList(tenantId, organizationIds);
  377 + List<String> queryOrganizationIds = new ArrayList<>();
  378 + organizationDTOS.forEach(item -> queryOrganizationIds.add(item.getId()));
  379 + return queryOrganizationIds;
  380 + }
  381 +
342 } 382 }
@@ -21,4 +21,12 @@ public interface TkOrganizationService extends BaseService<TkOrganizationEntity> @@ -21,4 +21,12 @@ public interface TkOrganizationService extends BaseService<TkOrganizationEntity>
21 void unBindUserToOrganization(Set<String> userIds); 21 void unBindUserToOrganization(Set<String> userIds);
22 22
23 OrganizationDTO findOrganizationById(String id,String tenantId); 23 OrganizationDTO findOrganizationById(String id,String tenantId);
  24 +
  25 + /**
  26 + * 组织结构下的所有组织ID
  27 + *
  28 + * @param tenantId 租户ID
  29 + * @param organizationId 组织ID
  30 + */
  31 + List<String> organizationAllIds(String tenantId, String organizationId);
24 } 32 }
@@ -16,6 +16,7 @@ package org.thingsboard.rule.engine.yunteng.scene; @@ -16,6 +16,7 @@ package org.thingsboard.rule.engine.yunteng.scene;
16 import com.fasterxml.jackson.databind.ObjectMapper; 16 import com.fasterxml.jackson.databind.ObjectMapper;
17 import java.util.List; 17 import java.util.List;
18 import java.util.Map; 18 import java.util.Map;
  19 +import java.util.Optional;
19 import java.util.concurrent.ConcurrentHashMap; 20 import java.util.concurrent.ConcurrentHashMap;
20 import lombok.extern.slf4j.Slf4j; 21 import lombok.extern.slf4j.Slf4j;
21 import org.thingsboard.rule.engine.api.*; 22 import org.thingsboard.rule.engine.api.*;
@@ -58,6 +59,7 @@ public class TbSceneReactNode implements TbNode { @@ -58,6 +59,7 @@ public class TbSceneReactNode implements TbNode {
58 public void onMsg(TbContext ctx, TbMsg msg) { 59 public void onMsg(TbContext ctx, TbMsg msg) {
59 String deviceId = msg.getOriginator().getId().toString(); 60 String deviceId = msg.getOriginator().getId().toString();
60 String tbProfileId = msg.getMetaData().getValue("deviceProfileId"); 61 String tbProfileId = msg.getMetaData().getValue("deviceProfileId");
  62 + String tenantId = msg.getMetaData().getValue("tenantId");
61 String projectId = config.getProfile().get(tbProfileId); 63 String projectId = config.getProfile().get(tbProfileId);
62 boolean deviceHas = config.getScenes().containsKey(deviceId); 64 boolean deviceHas = config.getScenes().containsKey(deviceId);
63 boolean profileHas = config.getProject().containsKey(projectId); 65 boolean profileHas = config.getProject().containsKey(projectId);
@@ -73,7 +75,7 @@ public class TbSceneReactNode implements TbNode { @@ -73,7 +75,7 @@ public class TbSceneReactNode implements TbNode {
73 ReactState react = getOrCreateReactState(ctx, config, t.getScenId()); 75 ReactState react = getOrCreateReactState(ctx, config, t.getScenId());
74 if (react != null) { 76 if (react != null) {
75 try { 77 try {
76 - react.process(ctx, msg,t.getRuleId(), deviceId); 78 + react.process(ctx, msg, t.getRuleId(), deviceId);
77 } catch (Exception e) { 79 } catch (Exception e) {
78 ctx.tellFailure(msg, e); 80 ctx.tellFailure(msg, e);
79 } 81 }
@@ -85,14 +87,24 @@ public class TbSceneReactNode implements TbNode { @@ -85,14 +87,24 @@ public class TbSceneReactNode implements TbNode {
85 projectScence.stream() 87 projectScence.stream()
86 .forEach( 88 .forEach(
87 t -> { 89 t -> {
88 - ReactState react = getOrCreateReactState(ctx, config, t.getScenId());  
89 - if (react != null) {  
90 - try {  
91 - react.process(ctx, msg,t.getRuleId(), deviceId);  
92 - } catch (Exception e) {  
93 - ctx.tellFailure(msg, e);  
94 - }  
95 - } 90 + String scenId = t.getScenId();
  91 + List<String> orgDevices =
  92 + ctx.getTkDeviceService()
  93 + .rpcDevices(tenantId, config.getOrgs().get(scenId), projectId);
  94 + Optional.ofNullable(orgDevices)
  95 + .ifPresent(
  96 + f -> {
  97 + if (f.contains(deviceId)) {
  98 + ReactState react = getOrCreateReactState(ctx, config, scenId);
  99 + if (react != null) {
  100 + try {
  101 + react.process(ctx, msg, t.getRuleId(), deviceId);
  102 + } catch (Exception e) {
  103 + ctx.tellFailure(msg, e);
  104 + }
  105 + }
  106 + }
  107 + });
96 }); 108 });
97 } 109 }
98 } 110 }
@@ -13,13 +13,17 @@ public class TbSceneReactNodeConfig implements NodeConfiguration<TbSceneReactNod @@ -13,13 +13,17 @@ public class TbSceneReactNodeConfig implements NodeConfiguration<TbSceneReactNod
13 13
14 /** 【TB设备配置ID,TK产品ID】产品信息 */ 14 /** 【TB设备配置ID,TK产品ID】产品信息 */
15 private Map<String, String> profile; 15 private Map<String, String> profile;
16 - /** 【TK产品ID,场景】哪些产品会触发场景联动 */ 16 +
  17 + /** 【TK产品ID,场景】哪些产品会触发场景联动,包含产品的每一个触发器 */
17 private Map<String, List<RuleFilterDTO>> project; 18 private Map<String, List<RuleFilterDTO>> project;
18 - /** 【TB设备ID,场景】哪些设备会触发场景联动 */ 19 +
  20 + /** 【TB设备ID,场景】哪些设备会触发场景联动,包含设备的每一个触发器 */
19 private Map<String, List<RuleFilterDTO>> scenes; 21 private Map<String, List<RuleFilterDTO>> scenes;
  22 +
20 /** 【TK场景ID,场景名称】场景联动信息 */ 23 /** 【TK场景ID,场景名称】场景联动信息 */
21 private Map<String, String> names; 24 private Map<String, String> names;
22 - /** 【TK场景ID,组织ID】场景联动所属组织信息 */ 25 +
  26 + /** 【TK场景ID,场景联动的根组织ID】场景联动所属组织信息 */
23 private Map<String, String> orgs; 27 private Map<String, String> orgs;
24 28
25 @Override 29 @Override