Commit 25ac41fe935f08ff986c80ed07b59bc009117604
1 parent
ee947d16
fix: 数据转换BUG,增加originator fields跟script
Showing
2 changed files
with
123 additions
and
7 deletions
@@ -2,6 +2,7 @@ package org.thingsboard.server.dao.yunteng.impl; | @@ -2,6 +2,7 @@ package org.thingsboard.server.dao.yunteng.impl; | ||
2 | 2 | ||
3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
4 | import com.baomidou.mybatisplus.core.metadata.IPage; | 4 | import com.baomidou.mybatisplus.core.metadata.IPage; |
5 | +import com.fasterxml.jackson.databind.JsonNode; | ||
5 | import com.fasterxml.jackson.databind.node.ObjectNode; | 6 | import com.fasterxml.jackson.databind.node.ObjectNode; |
6 | import lombok.RequiredArgsConstructor; | 7 | import lombok.RequiredArgsConstructor; |
7 | import lombok.extern.slf4j.Slf4j; | 8 | import lombok.extern.slf4j.Slf4j; |
@@ -23,10 +24,7 @@ import org.thingsboard.server.dao.yunteng.mapper.ConvertConfigMapper; | @@ -23,10 +24,7 @@ import org.thingsboard.server.dao.yunteng.mapper.ConvertConfigMapper; | ||
23 | import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; | 24 | import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; |
24 | import org.thingsboard.server.dao.yunteng.service.ConvertConfigService; | 25 | import org.thingsboard.server.dao.yunteng.service.ConvertConfigService; |
25 | 26 | ||
26 | -import java.util.ArrayList; | ||
27 | -import java.util.List; | ||
28 | -import java.util.Map; | ||
29 | -import java.util.Random; | 27 | +import java.util.*; |
30 | import java.util.concurrent.atomic.AtomicInteger; | 28 | import java.util.concurrent.atomic.AtomicInteger; |
31 | 29 | ||
32 | @Slf4j | 30 | @Slf4j |
@@ -36,6 +34,9 @@ public class ConvertConfigServiceImpl | @@ -36,6 +34,9 @@ public class ConvertConfigServiceImpl | ||
36 | extends AbstractBaseService<ConvertConfigMapper, ConvertConfig> | 34 | extends AbstractBaseService<ConvertConfigMapper, ConvertConfig> |
37 | implements ConvertConfigService { | 35 | implements ConvertConfigService { |
38 | private final String connectionType = "Success"; | 36 | private final String connectionType = "Success"; |
37 | + private final String originatorType = | ||
38 | + "org.thingsboard.rule.engine.metadata.TbGetOriginatorFieldsNode"; | ||
39 | + private final String scriptType = "org.thingsboard.rule.engine.transform.TbTransformMsgNode"; | ||
39 | 40 | ||
40 | @Override | 41 | @Override |
41 | public YtPageData<ConvertConfigDTO> page(String tenantId, Map<String, Object> queryMap) { | 42 | public YtPageData<ConvertConfigDTO> page(String tenantId, Map<String, Object> queryMap) { |
@@ -292,6 +293,8 @@ public class ConvertConfigServiceImpl | @@ -292,6 +293,8 @@ public class ConvertConfigServiceImpl | ||
292 | }); | 293 | }); |
293 | if (matchNode.get() == 0) { | 294 | if (matchNode.get() == 0) { |
294 | needDelete = false; | 295 | needDelete = false; |
296 | + } else { | ||
297 | + needDeleteOriginatorFieldsAndScript(ruleChainMetaData); | ||
295 | } | 298 | } |
296 | return needDelete; | 299 | return needDelete; |
297 | } | 300 | } |
@@ -342,15 +345,43 @@ public class ConvertConfigServiceImpl | @@ -342,15 +345,43 @@ public class ConvertConfigServiceImpl | ||
342 | } | 345 | } |
343 | seriesIndex++; | 346 | seriesIndex++; |
344 | } | 347 | } |
348 | + | ||
349 | + int scriptIndex = 0; | ||
350 | + boolean hadScript = false; | ||
351 | + for (RuleNode ruleNode : ruleChainMetaData.getNodes()) { | ||
352 | + if (ruleNode.getType().equals(scriptType)) { | ||
353 | + hadScript = true; | ||
354 | + break; | ||
355 | + } | ||
356 | + scriptIndex++; | ||
357 | + } | ||
358 | + if (!hadScript) { | ||
359 | + // 2. add originator fields and script | ||
360 | + Map<String, String> types = new HashMap<>(); | ||
361 | + // originator fields start | ||
362 | + Map<String, Map<String, String>> originator = new HashMap<>(); | ||
363 | + Map<String, String> fields = new HashMap<>(); | ||
364 | + fields.put("id", "deviceId"); | ||
365 | + originator.put("fieldsMapping", fields); | ||
366 | + types.put(originatorType, JacksonUtil.toString(originator)); | ||
367 | + | ||
368 | + // script start | ||
369 | + Map<String, String> scriptMap = new HashMap<>(); | ||
370 | + scriptMap.put( | ||
371 | + "jsScript", | ||
372 | + "msg.deviceId = metadata.deviceId;\nmsg.deviceName = metadata.deviceName;\nmsg.deviceType = metadata.deviceType;\nmsg.ts = metadata.ts;\nreturn {msg: msg, metadata: metadata, msgType: msgType};"); | ||
373 | + types.put(scriptType, JacksonUtil.toString(scriptMap)); | ||
374 | + scriptIndex = addOriginatorFieldsAndScript(types, ruleChainMetaData, seriesIndex); | ||
375 | + } | ||
345 | // 2. SETUP CONNECTION | 376 | // 2. SETUP CONNECTION |
346 | // 3. ADD RULE NODE | 377 | // 3. ADD RULE NODE |
347 | - int finalSeriesIndex = seriesIndex; | ||
348 | int layoutX = 1140; | 378 | int layoutX = 1140; |
349 | int layoutY = 170; | 379 | int layoutY = 170; |
380 | + int finalScriptIndex = scriptIndex; | ||
350 | nodes.forEach( | 381 | nodes.forEach( |
351 | ruleNode -> { | 382 | ruleNode -> { |
352 | NodeConnectionInfo nodeConnectionInfo = new NodeConnectionInfo(); | 383 | NodeConnectionInfo nodeConnectionInfo = new NodeConnectionInfo(); |
353 | - nodeConnectionInfo.setFromIndex(finalSeriesIndex); | 384 | + nodeConnectionInfo.setFromIndex(finalScriptIndex); |
354 | nodeConnectionInfo.setType(connectionType); | 385 | nodeConnectionInfo.setType(connectionType); |
355 | nodeConnectionInfo.setToIndex(ruleChainMetaData.getNodes().size()); | 386 | nodeConnectionInfo.setToIndex(ruleChainMetaData.getNodes().size()); |
356 | ObjectNode objectNode = setAdditionalInfo(layoutX, layoutY); | 387 | ObjectNode objectNode = setAdditionalInfo(layoutX, layoutY); |
@@ -360,6 +391,90 @@ public class ConvertConfigServiceImpl | @@ -360,6 +391,90 @@ public class ConvertConfigServiceImpl | ||
360 | }); | 391 | }); |
361 | } | 392 | } |
362 | 393 | ||
394 | + private void needDeleteOriginatorFieldsAndScript(RuleChainMetaData ruleChainMetaData) { | ||
395 | + // 如果script下面节点全部删除完了,就删除originator fields 和 script | ||
396 | + int findOriginatorIndex = 0; | ||
397 | + for (RuleNode ruleNode : ruleChainMetaData.getNodes()) { | ||
398 | + // 先找originator fields | ||
399 | + if (ruleNode.getType().equals(originatorType)) { | ||
400 | + break; | ||
401 | + } | ||
402 | + findOriginatorIndex++; | ||
403 | + } | ||
404 | + int findScriptIndex = 0; | ||
405 | + for (NodeConnectionInfo nodeConnectionInfo : ruleChainMetaData.getConnections()) { | ||
406 | + if (nodeConnectionInfo.getFromIndex() == findOriginatorIndex) { | ||
407 | + findScriptIndex = nodeConnectionInfo.getToIndex(); | ||
408 | + break; | ||
409 | + } | ||
410 | + } | ||
411 | + int findSons = 0; | ||
412 | + for (NodeConnectionInfo nodeConnectionInfo : ruleChainMetaData.getConnections()) { | ||
413 | + if (nodeConnectionInfo.getFromIndex() == findScriptIndex) { | ||
414 | + findSons++; | ||
415 | + } | ||
416 | + } | ||
417 | + if (findSons == 0) { | ||
418 | + deleteOriginatorFieldsAndScript(findOriginatorIndex, findScriptIndex, ruleChainMetaData); | ||
419 | + } | ||
420 | + } | ||
421 | + | ||
422 | + private void deleteOriginatorFieldsAndScript( | ||
423 | + int deleteOriginatorIndex, int deleteScriptIndex, RuleChainMetaData ruleChainMetaData) { | ||
424 | + ruleChainMetaData.getNodes().remove(deleteScriptIndex); | ||
425 | + ruleChainMetaData.getNodes().remove(deleteOriginatorIndex); | ||
426 | + ruleChainMetaData.setFirstNodeIndex( | ||
427 | + ruleChainMetaData.getFirstNodeIndex() - 2 < 0 | ||
428 | + ? 0 | ||
429 | + : ruleChainMetaData.getFirstNodeIndex() - 2); | ||
430 | + List<NodeConnectionInfo> newNodeConnectionInfo = new ArrayList<>(); | ||
431 | + for (NodeConnectionInfo nodeConnectionInfo : ruleChainMetaData.getConnections()) { | ||
432 | + if (nodeConnectionInfo.getFromIndex() != deleteOriginatorIndex | ||
433 | + && nodeConnectionInfo.getToIndex() != deleteOriginatorIndex) { | ||
434 | + nodeConnectionInfo.setFromIndex( | ||
435 | + nodeConnectionInfo.getFromIndex() - 2 < 0 ? 0 : nodeConnectionInfo.getFromIndex() - 2); | ||
436 | + nodeConnectionInfo.setToIndex( | ||
437 | + nodeConnectionInfo.getToIndex() - 2 < 0 ? 0 : nodeConnectionInfo.getToIndex() - 2); | ||
438 | + newNodeConnectionInfo.add(nodeConnectionInfo); | ||
439 | + } | ||
440 | + } | ||
441 | + ruleChainMetaData.setConnections(newNodeConnectionInfo); | ||
442 | + } | ||
443 | + | ||
444 | + private int addOriginatorFieldsAndScript( | ||
445 | + Map<String, String> types, RuleChainMetaData ruleChainMetaData, int timeSeriesIndex) { | ||
446 | + AtomicInteger scriptIndex = new AtomicInteger(); | ||
447 | + types | ||
448 | + .keySet() | ||
449 | + .forEach( | ||
450 | + type -> { | ||
451 | + NodeConnectionInfo nodeConnectionInfo = new NodeConnectionInfo(); | ||
452 | + int fromIndex; | ||
453 | + int toIndex = ruleChainMetaData.getNodes().size(); | ||
454 | + if (type.equals(originatorType)) { | ||
455 | + fromIndex = timeSeriesIndex; | ||
456 | + } else { | ||
457 | + scriptIndex.set(toIndex); | ||
458 | + fromIndex = ruleChainMetaData.getNodes().size() - 1; | ||
459 | + } | ||
460 | + int layoutX = 1240; | ||
461 | + int layoutY = 160; | ||
462 | + nodeConnectionInfo.setFromIndex(fromIndex); | ||
463 | + nodeConnectionInfo.setType(connectionType); | ||
464 | + nodeConnectionInfo.setToIndex(toIndex); | ||
465 | + ruleChainMetaData.getConnections().add(nodeConnectionInfo); | ||
466 | + RuleNode ruleNode = new RuleNode(); | ||
467 | + ruleNode.setName("dataConvert"); | ||
468 | + ruleNode.setType(type); | ||
469 | + JsonNode jsonNode = JacksonUtil.toJsonNode(types.get(type)); | ||
470 | + ruleNode.setConfiguration(jsonNode); | ||
471 | + ObjectNode objectNode = setAdditionalInfo(layoutX, layoutY); | ||
472 | + ruleNode.setAdditionalInfo(objectNode); | ||
473 | + ruleChainMetaData.getNodes().add(ruleNode); | ||
474 | + }); | ||
475 | + return scriptIndex.get(); | ||
476 | + } | ||
477 | + | ||
363 | private void addConvertJSRuleNode(List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData) { | 478 | private void addConvertJSRuleNode(List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData) { |
364 | // 1. Get Device Profile nodeIndex | 479 | // 1. Get Device Profile nodeIndex |
365 | int firstNodeIndex = ruleChainMetaData.getFirstNodeIndex(); | 480 | int firstNodeIndex = ruleChainMetaData.getFirstNodeIndex(); |
@@ -198,7 +198,8 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> | @@ -198,7 +198,8 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> | ||
198 | if (StringUtils.isEmpty(id)) { | 198 | if (StringUtils.isEmpty(id)) { |
199 | throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); | 199 | throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); |
200 | } | 200 | } |
201 | - return baseMapper.selectById(id).getDTO(UserDTO.class); | 201 | + User user = baseMapper.selectById(id); |
202 | + return null !=user?user.getDTO(UserDTO.class):null; | ||
202 | } | 203 | } |
203 | 204 | ||
204 | @Override | 205 | @Override |