Commit 7955e3b824b12d0b40358b2bb6ffc584aed54b30

Authored by xp.Huang
2 parents c811d677 401d6587

Merge branch 'master_dev' of git.yunteng.com:yunteng/thingskit into master_dev

@@ -161,4 +161,11 @@ public interface FastIotConstants { @@ -161,4 +161,11 @@ public interface FastIotConstants {
161 /** 租户下的用户 */ 161 /** 租户下的用户 */
162 public static final int IS_CUSTOMER_USER = 3; 162 public static final int IS_CUSTOMER_USER = 3;
163 } 163 }
  164 + class Rpc{
  165 +
  166 + /**RPC方法名*/
  167 + public static String METHOD_NAME = "method";
  168 + /**RPC参数*/
  169 + public static String PARAMS_NAME = "params";
  170 + }
164 } 171 }
@@ -28,8 +28,6 @@ import org.thingsboard.server.dao.yunteng.mapper.*; @@ -28,8 +28,6 @@ import org.thingsboard.server.dao.yunteng.mapper.*;
28 import org.thingsboard.server.dao.yunteng.service.*; 28 import org.thingsboard.server.dao.yunteng.service.*;
29 29
30 import java.util.*; 30 import java.util.*;
31 -import java.util.concurrent.Executors;  
32 -import java.util.concurrent.TimeUnit;  
33 import java.util.stream.Collectors; 31 import java.util.stream.Collectors;
34 32
35 /** @Description 场景联动业务实现层 @Author cxy @Date 2021/11/25 11:22 */ 33 /** @Description 场景联动业务实现层 @Author cxy @Date 2021/11/25 11:22 */
@@ -69,6 +67,19 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -69,6 +67,19 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
69 sceneLinkage.copyToDTO(sceneLinkageDTO); 67 sceneLinkage.copyToDTO(sceneLinkageDTO);
70 } 68 }
71 69
  70 + updateScene(sceneLinkageDTO, tenantId, customerId, sceneLinkage);
  71 +
  72 + return sceneLinkageDTO;
  73 + }
  74 +
  75 + /**
  76 + * 更新场景联动附加信息,触发器、执行条件、动作
  77 + * @param sceneLinkageDTO 场景联动表单数据
  78 + * @param tenantId 租户ID
  79 + * @param customerId 客户ID
  80 + * @param sceneLinkage 场景联动主表实体
  81 + */
  82 + private void updateScene(SceneLinkageDTO sceneLinkageDTO, String tenantId, String customerId, TkSceneLinkageEntity sceneLinkage) {
72 String organizationId = sceneLinkage.getOrganizationId(); 83 String organizationId = sceneLinkage.getOrganizationId();
73 List<DeviceDTO> organizationDevices = findDeviceList(organizationId, tenantId, customerId,new ArrayList<>()); 84 List<DeviceDTO> organizationDevices = findDeviceList(organizationId, tenantId, customerId,new ArrayList<>());
74 85
@@ -80,8 +91,6 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -80,8 +91,6 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
80 updateTrigger(sceneLinkageDTO, tbDeviceIds); 91 updateTrigger(sceneLinkageDTO, tbDeviceIds);
81 updateDoCondition(sceneLinkageDTO, tbDeviceIds); 92 updateDoCondition(sceneLinkageDTO, tbDeviceIds);
82 updateDoAction(sceneLinkageDTO, tbDeviceIds); 93 updateDoAction(sceneLinkageDTO, tbDeviceIds);
83 -  
84 - return sceneLinkageDTO;  
85 } 94 }
86 95
87 /** 96 /**
@@ -135,17 +144,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -135,17 +144,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
135 if (!sceneLinkage.getCreator().equals(currentUserId)) { 144 if (!sceneLinkage.getCreator().equals(currentUserId)) {
136 throw new TkDataValidationException("你不是此场景的创建者"); 145 throw new TkDataValidationException("你不是此场景的创建者");
137 } 146 }
138 - String organizationId = sceneLinkage.getOrganizationId();  
139 - List<DeviceDTO> organizationDevices = findDeviceList(organizationId, tenantId, customerId,new ArrayList<>());  
140 -  
141 - List<String> tbDeviceIds = new ArrayList<>();  
142 - for (DeviceDTO item : organizationDevices) {  
143 - tbDeviceIds.add(item.getTbDeviceId());  
144 - }  
145 -  
146 - updateTrigger(sceneLinkageDTO, tbDeviceIds);  
147 - updateDoCondition(sceneLinkageDTO, tbDeviceIds);  
148 - updateDoAction(sceneLinkageDTO, tbDeviceIds); 147 + updateScene(sceneLinkageDTO, tenantId, customerId, sceneLinkage);
149 148
150 sceneLinkageDTO.copyToEntity(sceneLinkage); 149 sceneLinkageDTO.copyToEntity(sceneLinkage);
151 sceneLinkage.setTenantId(tenantId); 150 sceneLinkage.setTenantId(tenantId);
@@ -183,7 +182,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -183,7 +182,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
183 } 182 }
184 183
185 // 先删除触发器 184 // 先删除触发器
186 - int result = triggerMapper.delete( 185 + triggerMapper.delete(
187 new QueryWrapper<TkTriggerEntity>() 186 new QueryWrapper<TkTriggerEntity>()
188 .lambda() 187 .lambda()
189 .eq( 188 .eq(
@@ -220,18 +219,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -220,18 +219,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
220 continue; 219 continue;
221 } 220 }
222 List<String> deviceIds = action.getDeviceId(); 221 List<String> deviceIds = action.getDeviceId();
223 - if (ScopeEnum.PART.equals(action.getEntityType())) {  
224 - if (deviceIds == null || deviceIds.isEmpty()) {  
225 - throw new TkDataValidationException(ErrorMessage.DEVICE_LOSED.getMessage());  
226 - } else {  
227 - for (String item : deviceIds) {  
228 - if (!tbDeviceIds.contains(item)) {  
229 - throw new TkDataValidationException(  
230 - ErrorMessage.ORGANIZATION_DEVICE_NOT_MATCHED_IN_ACTION.getMessage());  
231 - }  
232 - }  
233 - }  
234 - } 222 + validateRpcDevice(tbDeviceIds, deviceIds, action.getEntityType());
235 } 223 }
236 } 224 }
237 225
@@ -251,13 +239,19 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -251,13 +239,19 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
251 doActionDTO.setTenantId(sceneLinkageDTO.getTenantId()); 239 doActionDTO.setTenantId(sceneLinkageDTO.getTenantId());
252 doActionDTO.setSceneLinkageId(sceneLinkageDTO.getId()); 240 doActionDTO.setSceneLinkageId(sceneLinkageDTO.getId());
253 if (ActionTypeEnum.DEVICE_OUT.equals(doActionDTO.getOutTarget())) { 241 if (ActionTypeEnum.DEVICE_OUT.equals(doActionDTO.getOutTarget())) {
254 - ObjectNode doContext = JacksonUtil.newObjectNode();  
255 - doContext.put("method", "methodThingskit");  
256 - doContext.put("params", doActionDTO.getDoContext()); 242 + JsonNode inputContext = doActionDTO.getDoContext().get(FastIotConstants.Rpc.PARAMS_NAME);
  243 + ObjectNode outputContext = JacksonUtil.newObjectNode();
  244 + outputContext.put(FastIotConstants.Rpc.METHOD_NAME, "methodThingskit");
  245 + if(inputContext.isTextual()){
  246 + outputContext.put(FastIotConstants.Rpc.PARAMS_NAME,inputContext.asText());
  247 + }else{
  248 + outputContext.set(FastIotConstants.Rpc.PARAMS_NAME, inputContext);
  249 + }
  250 +
257 ObjectNode addtionalInfo = JacksonUtil.newObjectNode(); 251 ObjectNode addtionalInfo = JacksonUtil.newObjectNode();
258 addtionalInfo.put(ModelConstants.TablePropertyMapping.COMMAND_TYPE, doActionDTO.getCommandType()); 252 addtionalInfo.put(ModelConstants.TablePropertyMapping.COMMAND_TYPE, doActionDTO.getCommandType());
259 - doContext.put(DataConstants.ADDITIONAL_INFO, addtionalInfo);  
260 - doActionDTO.setDoContext(doContext); 253 + outputContext.set(DataConstants.ADDITIONAL_INFO, addtionalInfo);
  254 + doActionDTO.setDoContext(outputContext);
261 } 255 }
262 return doActionDTO.getEntity(TkDoActionEntity.class); 256 return doActionDTO.getEntity(TkDoActionEntity.class);
263 }) 257 })
@@ -267,6 +261,27 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -267,6 +261,27 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
267 } 261 }
268 262
269 /** 263 /**
  264 + * 验证设备输出的目标设备是否合法有效
  265 + * @param tbDeviceIds 场景联动所属组织的全部设备ID
  266 + * @param deviceIds 场景联动选择的设备ID
  267 + * @param entityType 设备输出类型
  268 + */
  269 + private void validateRpcDevice(List<String> tbDeviceIds, List<String> deviceIds, ScopeEnum entityType) {
  270 + if (ScopeEnum.PART.equals(entityType)) {
  271 + if (deviceIds == null || deviceIds.isEmpty()) {
  272 + throw new TkDataValidationException(ErrorMessage.DEVICE_LOSED.getMessage());
  273 + } else {
  274 + for (String item : deviceIds) {
  275 + if (!tbDeviceIds.contains(item)) {
  276 + throw new TkDataValidationException(
  277 + ErrorMessage.ORGANIZATION_DEVICE_NOT_MATCHED_IN_ACTION.getMessage());
  278 + }
  279 + }
  280 + }
  281 + }
  282 + }
  283 +
  284 + /**
270 * 修改执行动作 285 * 修改执行动作
271 * 286 *
272 * @param sceneLinkageDTO 场景联动信息 287 * @param sceneLinkageDTO 场景联动信息
@@ -280,18 +295,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -280,18 +295,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
280 continue; 295 continue;
281 } 296 }
282 List<String> deviceIds = condition.getEntityId(); 297 List<String> deviceIds = condition.getEntityId();
283 - if (ScopeEnum.PART.equals(condition.getEntityType())) {  
284 - if (deviceIds == null || deviceIds.isEmpty()) {  
285 - throw new TkDataValidationException(ErrorMessage.DEVICE_LOSED.getMessage());  
286 - } else {  
287 - for (String item : deviceIds) {  
288 - if (!tbDeviceIds.contains(item)) {  
289 - throw new TkDataValidationException(  
290 - ErrorMessage.ORGANIZATION_DEVICE_NOT_MATCHED_IN_ACTION.getMessage());  
291 - }  
292 - }  
293 - }  
294 - } 298 + validateRpcDevice(tbDeviceIds, deviceIds, condition.getEntityType());
295 } 299 }
296 } 300 }
297 301
@@ -392,7 +396,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -392,7 +396,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
392 // 查询该组织的所有子类 396 // 查询该组织的所有子类
393 List<String> orgIds = 397 List<String> orgIds =
394 organizationMapper.findOrganizationTreeList(tenantId, organizationFilter).stream() 398 organizationMapper.findOrganizationTreeList(tenantId, organizationFilter).stream()
395 - .map(organization -> organization.getId()) 399 + .map(BaseDTO::getId)
396 .collect(Collectors.toList()); 400 .collect(Collectors.toList());
397 // 拿到当前组织ids所包含的设备集合 401 // 拿到当前组织ids所包含的设备集合
398 if (orgIds.isEmpty()) { 402 if (orgIds.isEmpty()) {
@@ -439,7 +443,6 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -439,7 +443,6 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
439 * @param tenantId 租户主键 443 * @param tenantId 租户主键
440 * @param customerId 客户主键 444 * @param customerId 客户主键
441 * @param state 是否禁用场景联动,true标识禁用,false标识启用。 445 * @param state 是否禁用场景联动,true标识禁用,false标识启用。
442 - * @return  
443 */ 446 */
444 @Override 447 @Override
445 public JsonNode getRuleNodeConfig( 448 public JsonNode getRuleNodeConfig(
@@ -471,7 +474,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -471,7 +474,7 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
471 sceneOrg.put(currentSceneId, self.getOrganizationId()); 474 sceneOrg.put(currentSceneId, self.getOrganizationId());
472 } 475 }
473 476
474 - if (enableIds.size() <= 0) { 477 + if (enableIds.size() == 0) {
475 return null; 478 return null;
476 } 479 }
477 480
@@ -507,13 +510,13 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM @@ -507,13 +510,13 @@ public class TkSceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageM
507 } 510 }
508 511
509 List<TkDeviceProfileEntity> profiles = profileMapper.selectList(new LambdaQueryWrapper<TkDeviceProfileEntity>().eq(TkDeviceProfileEntity::getTenantId,tenantId)); 512 List<TkDeviceProfileEntity> profiles = profileMapper.selectList(new LambdaQueryWrapper<TkDeviceProfileEntity>().eq(TkDeviceProfileEntity::getTenantId,tenantId));
510 - Map<String, String> projectes = new HashMap<>();  
511 - profiles.stream().forEach(f->projectes.put(f.getTbProfileId(),f.getId())); 513 + Map<String, String> projects = new HashMap<>();
  514 + profiles.forEach(f->projects.put(f.getTbProfileId(),f.getId()));
512 515
513 Map<String, Map> engineConfig = new HashMap<>(); 516 Map<String, Map> engineConfig = new HashMap<>();
514 engineConfig.put("scenes", matchedDevices); 517 engineConfig.put("scenes", matchedDevices);
515 engineConfig.put("project", matchedProjectes); 518 engineConfig.put("project", matchedProjectes);
516 - engineConfig.put("profile", projectes); 519 + engineConfig.put("profile", projects);
517 engineConfig.put("names", sceneInform); 520 engineConfig.put("names", sceneInform);
518 engineConfig.put("orgs", sceneOrg); 521 engineConfig.put("orgs", sceneOrg);
519 522
@@ -536,11 +539,7 @@ List<TkDeviceProfileEntity> profiles = profileMapper.selectList(new LambdaQueryW @@ -536,11 +539,7 @@ List<TkDeviceProfileEntity> profiles = profileMapper.selectList(new LambdaQueryW
536 if (!scenes.contains(scenId)) { 539 if (!scenes.contains(scenId)) {
537 scenes.add(scenId); 540 scenes.add(scenId);
538 } 541 }
539 - if (scenes.isEmpty()) {  
540 - resultMap.remove(deviceId);  
541 - } else {  
542 - resultMap.put(deviceId, scenes);  
543 - } 542 + resultMap.put(deviceId, scenes);
544 } 543 }
545 } 544 }
546 545
@@ -551,8 +550,7 @@ List<TkDeviceProfileEntity> profiles = profileMapper.selectList(new LambdaQueryW @@ -551,8 +550,7 @@ List<TkDeviceProfileEntity> profiles = profileMapper.selectList(new LambdaQueryW
551 // 遍历组织id 550 // 遍历组织id
552 List<String> queryOrganizationIds = new ArrayList<>(); 551 List<String> queryOrganizationIds = new ArrayList<>();
553 organizationDTOS.forEach(item -> queryOrganizationIds.add(item.getId())); 552 organizationDTOS.forEach(item -> queryOrganizationIds.add(item.getId()));
554 - Set<String> set = new HashSet<>();  
555 - set.addAll(queryOrganizationIds); 553 + Set<String> set = new HashSet<>(queryOrganizationIds);
556 return new ArrayList<>(set); 554 return new ArrayList<>(set);
557 } 555 }
558 } 556 }