Commit 25ac41fe935f08ff986c80ed07b59bc009117604

Authored by 黄 x
1 parent ee947d16

fix: 数据转换BUG,增加originator fields跟script

... ... @@ -2,6 +2,7 @@ package org.thingsboard.server.dao.yunteng.impl;
2 2
3 3 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4 4 import com.baomidou.mybatisplus.core.metadata.IPage;
  5 +import com.fasterxml.jackson.databind.JsonNode;
5 6 import com.fasterxml.jackson.databind.node.ObjectNode;
6 7 import lombok.RequiredArgsConstructor;
7 8 import lombok.extern.slf4j.Slf4j;
... ... @@ -23,10 +24,7 @@ import org.thingsboard.server.dao.yunteng.mapper.ConvertConfigMapper;
23 24 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
24 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 28 import java.util.concurrent.atomic.AtomicInteger;
31 29
32 30 @Slf4j
... ... @@ -36,6 +34,9 @@ public class ConvertConfigServiceImpl
36 34 extends AbstractBaseService<ConvertConfigMapper, ConvertConfig>
37 35 implements ConvertConfigService {
38 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 41 @Override
41 42 public YtPageData<ConvertConfigDTO> page(String tenantId, Map<String, Object> queryMap) {
... ... @@ -292,6 +293,8 @@ public class ConvertConfigServiceImpl
292 293 });
293 294 if (matchNode.get() == 0) {
294 295 needDelete = false;
  296 + } else {
  297 + needDeleteOriginatorFieldsAndScript(ruleChainMetaData);
295 298 }
296 299 return needDelete;
297 300 }
... ... @@ -342,15 +345,43 @@ public class ConvertConfigServiceImpl
342 345 }
343 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 376 // 2. SETUP CONNECTION
346 377 // 3. ADD RULE NODE
347   - int finalSeriesIndex = seriesIndex;
348 378 int layoutX = 1140;
349 379 int layoutY = 170;
  380 + int finalScriptIndex = scriptIndex;
350 381 nodes.forEach(
351 382 ruleNode -> {
352 383 NodeConnectionInfo nodeConnectionInfo = new NodeConnectionInfo();
353   - nodeConnectionInfo.setFromIndex(finalSeriesIndex);
  384 + nodeConnectionInfo.setFromIndex(finalScriptIndex);
354 385 nodeConnectionInfo.setType(connectionType);
355 386 nodeConnectionInfo.setToIndex(ruleChainMetaData.getNodes().size());
356 387 ObjectNode objectNode = setAdditionalInfo(layoutX, layoutY);
... ... @@ -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 478 private void addConvertJSRuleNode(List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData) {
364 479 // 1. Get Device Profile nodeIndex
365 480 int firstNodeIndex = ruleChainMetaData.getFirstNodeIndex();
... ...
... ... @@ -198,7 +198,8 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
198 198 if (StringUtils.isEmpty(id)) {
199 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 205 @Override
... ...