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 | 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 | ... | ... |