Commit 8bbb65330a99496e541d8cb6ac4fe7b61bcdcae6

Authored by 黄 x
1 parent e844ba73

convert config add filter by products devices

@@ -245,9 +245,9 @@ public class TkConvertDataToController extends BaseController { @@ -245,9 +245,9 @@ public class TkConvertDataToController extends BaseController {
245 ruleChainService.loadRuleChainMetaData(getTenantId(), ruleChain.getId()); 245 ruleChainService.loadRuleChainMetaData(getTenantId(), ruleChain.getId());
246 // 3. SETUP CONNECTION AND ADD OR DELETE RULE NODE 246 // 3. SETUP CONNECTION AND ADD OR DELETE RULE NODE
247 if (status == FastIotConstants.MagicNumber.ZERO) { 247 if (status == FastIotConstants.MagicNumber.ZERO) {
248 - needSaveRuleNode = convertConfigService.deleteRuleNode(nodes, ruleChainMetaData, nodeType); 248 + needSaveRuleNode = convertConfigService.deleteRuleNode(nodes, ruleChainMetaData, nodeType,getCurrentUser().getCurrentTenantId());
249 } else { 249 } else {
250 - convertConfigService.addRuleNode(nodes, ruleChainMetaData, nodeType); 250 + convertConfigService.addRuleNode(nodes, ruleChainMetaData, nodeType,getCurrentUser().getCurrentTenantId());
251 needSaveRuleNode = true; 251 needSaveRuleNode = true;
252 } 252 }
253 // 4. SAVE METADATA 253 // 4. SAVE METADATA
@@ -33,7 +33,8 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant. @@ -33,7 +33,8 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.
33 public class TkDeviceStateLogController extends BaseController { 33 public class TkDeviceStateLogController extends BaseController {
34 private final TkDeviceStateLogService tkDeviceStateLogService; 34 private final TkDeviceStateLogService tkDeviceStateLogService;
35 35
36 - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:device:state:log:view'})") 36 + @PreAuthorize(
  37 + "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:device:state:log:view'})")
37 @GetMapping(params = {PAGE_SIZE, PAGE}) 38 @GetMapping(params = {PAGE_SIZE, PAGE})
38 @ApiOperation("查询") 39 @ApiOperation("查询")
39 public TkPageData<TkDeviceStateLogDTO> page( 40 public TkPageData<TkDeviceStateLogDTO> page(
@@ -66,11 +67,16 @@ public class TkDeviceStateLogController extends BaseController { @@ -66,11 +67,16 @@ public class TkDeviceStateLogController extends BaseController {
66 queryMap.put(ORDER_FILED, orderBy); 67 queryMap.put(ORDER_FILED, orderBy);
67 queryMap.put(ORDER_TYPE, orderType); 68 queryMap.put(ORDER_TYPE, orderType);
68 queryMap.put(TENANT_ID, getCurrentUser().getCurrentTenantId()); 69 queryMap.put(TENANT_ID, getCurrentUser().getCurrentTenantId());
69 - return tkDeviceStateLogService.page(getCurrentUser().getCurrentTenantId(), queryMap); 70 + if(getCurrentUser().isCustomerUser()){
  71 + queryMap.put(CUSTOMER_ID, getCurrentUser().getCustomerId().getId().toString());
  72 + }
  73 + return tkDeviceStateLogService.page(
  74 + getCurrentUser().isCustomerUser(), getCurrentUser().getCurrentTenantId(), queryMap);
70 } 75 }
71 76
72 @DeleteMapping 77 @DeleteMapping
73 - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:device:state:log::delete'})") 78 + @PreAuthorize(
  79 + "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:device:state:log::delete'})")
74 public ResponseEntity<Boolean> deleteDeviceStateLog( 80 public ResponseEntity<Boolean> deleteDeviceStateLog(
75 @Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) 81 @Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO)
76 throws ThingsboardException { 82 throws ThingsboardException {
@@ -79,10 +85,11 @@ public class TkDeviceStateLogController extends BaseController { @@ -79,10 +85,11 @@ public class TkDeviceStateLogController extends BaseController {
79 } 85 }
80 86
81 @PostMapping 87 @PostMapping
82 - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:device:state:log::post'})") 88 + @PreAuthorize(
  89 + "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:device:state:log::post'})")
83 public ResponseEntity<TkDeviceStateLogDTO> updateDeviceStateLogInfo( 90 public ResponseEntity<TkDeviceStateLogDTO> updateDeviceStateLogInfo(
84 @RequestBody TkDeviceStateLogDTO tkDeviceStateLogDTO) throws ThingsboardException { 91 @RequestBody TkDeviceStateLogDTO tkDeviceStateLogDTO) throws ThingsboardException {
85 - if(StringUtils.isEmpty(tkDeviceStateLogDTO.getId())){ 92 + if (StringUtils.isEmpty(tkDeviceStateLogDTO.getId())) {
86 throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); 93 throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
87 } 94 }
88 tkDeviceStateLogDTO.setTenantId(getCurrentUser().getCurrentTenantId()); 95 tkDeviceStateLogDTO.setTenantId(getCurrentUser().getCurrentTenantId());
@@ -91,7 +98,8 @@ public class TkDeviceStateLogController extends BaseController { @@ -91,7 +98,8 @@ public class TkDeviceStateLogController extends BaseController {
91 } 98 }
92 99
93 @GetMapping("{id}") 100 @GetMapping("{id}")
94 - @PreAuthorize("@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:device:state:log::detail'})") 101 + @PreAuthorize(
  102 + "@check.checkPermissions({'TENANT_ADMIN','CUSTOMER_USER'},{'api:yt:device:state:log::detail'})")
95 public ResponseEntity<TkDeviceStateLogDTO> getDeviceStateLogInfo(@PathVariable("id") String id) 103 public ResponseEntity<TkDeviceStateLogDTO> getDeviceStateLogInfo(@PathVariable("id") String id)
96 throws ThingsboardException { 104 throws ThingsboardException {
97 return ResponseEntity.ok( 105 return ResponseEntity.ok(
@@ -3,6 +3,7 @@ package org.thingsboard.server.dao.yunteng.impl; @@ -3,6 +3,7 @@ package org.thingsboard.server.dao.yunteng.impl;
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.JsonNode;
  6 +import com.fasterxml.jackson.databind.node.ArrayNode;
6 import com.fasterxml.jackson.databind.node.ObjectNode; 7 import com.fasterxml.jackson.databind.node.ObjectNode;
7 import lombok.RequiredArgsConstructor; 8 import lombok.RequiredArgsConstructor;
8 import lombok.extern.slf4j.Slf4j; 9 import lombok.extern.slf4j.Slf4j;
@@ -19,6 +20,7 @@ import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidatio @@ -19,6 +20,7 @@ import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidatio
19 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; 20 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
20 import org.thingsboard.server.common.data.yunteng.dto.convert.ConvertConfigDTO; 21 import org.thingsboard.server.common.data.yunteng.dto.convert.ConvertConfigDTO;
21 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; 22 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
  23 +import org.thingsboard.server.common.data.yunteng.enums.DatasourceTypeEnum;
22 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; 24 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData;
23 import org.thingsboard.server.dao.yunteng.ConvertConfig; 25 import org.thingsboard.server.dao.yunteng.ConvertConfig;
24 import org.thingsboard.server.dao.yunteng.mapper.ConvertConfigMapper; 26 import org.thingsboard.server.dao.yunteng.mapper.ConvertConfigMapper;
@@ -26,6 +28,7 @@ import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; @@ -26,6 +28,7 @@ import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
26 import org.thingsboard.server.dao.yunteng.service.ConvertConfigService; 28 import org.thingsboard.server.dao.yunteng.service.ConvertConfigService;
27 29
28 import java.util.*; 30 import java.util.*;
  31 +import java.util.concurrent.ConcurrentHashMap;
29 import java.util.concurrent.atomic.AtomicInteger; 32 import java.util.concurrent.atomic.AtomicInteger;
30 33
31 @Slf4j 34 @Slf4j
@@ -38,6 +41,7 @@ public class TkConvertConfigServiceImpl @@ -38,6 +41,7 @@ public class TkConvertConfigServiceImpl
38 private final String originatorType = 41 private final String originatorType =
39 "org.thingsboard.rule.engine.metadata.TbGetOriginatorFieldsNode"; 42 "org.thingsboard.rule.engine.metadata.TbGetOriginatorFieldsNode";
40 private final String scriptType = "org.thingsboard.rule.engine.transform.TbTransformMsgNode"; 43 private final String scriptType = "org.thingsboard.rule.engine.transform.TbTransformMsgNode";
  44 + private final String filterScriptType = "org.thingsboard.rule.engine.filter.TbJsFilterNode";
41 private final String convertNodeName = "dataConvert@thingskit"; 45 private final String convertNodeName = "dataConvert@thingskit";
42 46
43 @Override 47 @Override
@@ -108,7 +112,7 @@ public class TkConvertConfigServiceImpl @@ -108,7 +112,7 @@ public class TkConvertConfigServiceImpl
108 if (null != convertConfig && !Objects.equals(convertConfig.getTenantId(), tenantId)) { 112 if (null != convertConfig && !Objects.equals(convertConfig.getTenantId(), tenantId)) {
109 throw new TkDataValidationException(ErrorMessage.NOT_BELONG_CURRENT_TENANT.getMessage()); 113 throw new TkDataValidationException(ErrorMessage.NOT_BELONG_CURRENT_TENANT.getMessage());
110 } 114 }
111 - return null !=convertConfig?convertConfig.getDTO(ConvertConfigDTO.class):null; 115 + return null != convertConfig ? convertConfig.getDTO(ConvertConfigDTO.class) : null;
112 } 116 }
113 117
114 @Override 118 @Override
@@ -128,6 +132,18 @@ public class TkConvertConfigServiceImpl @@ -128,6 +132,18 @@ public class TkConvertConfigServiceImpl
128 } 132 }
129 133
130 @Override 134 @Override
  135 + public ConvertConfigDTO findConvertConfigDTOByName(
  136 + String tenantId, String name, Integer nodeType) {
  137 + ConvertConfig convertConfig =
  138 + baseMapper.selectOne(
  139 + new LambdaQueryWrapper<ConvertConfig>()
  140 + .eq(ConvertConfig::getTenantId, tenantId)
  141 + .eq(ConvertConfig::getName, name)
  142 + .eq(ConvertConfig::getNodeType, nodeType));
  143 + return null != convertConfig ? convertConfig.getDTO(ConvertConfigDTO.class) : null;
  144 + }
  145 +
  146 + @Override
131 public List<RuleNode> getRuleNodesByConvertConfigIds( 147 public List<RuleNode> getRuleNodesByConvertConfigIds(
132 List<String> ids, Integer status, Integer nodeType) { 148 List<String> ids, Integer status, Integer nodeType) {
133 if (null == ids || ids.isEmpty()) { 149 if (null == ids || ids.isEmpty()) {
@@ -196,10 +212,13 @@ public class TkConvertConfigServiceImpl @@ -196,10 +212,13 @@ public class TkConvertConfigServiceImpl
196 */ 212 */
197 @Override 213 @Override
198 public boolean deleteRuleNode( 214 public boolean deleteRuleNode(
199 - List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData, Integer nodeType) { 215 + List<RuleNode> nodes,
  216 + RuleChainMetaData ruleChainMetaData,
  217 + Integer nodeType,
  218 + String tenantId) {
200 boolean needDelete; 219 boolean needDelete;
201 if (nodeType.intValue() == FastIotConstants.CONVERT_DATA.intValue()) { 220 if (nodeType.intValue() == FastIotConstants.CONVERT_DATA.intValue()) {
202 - needDelete = deleteConvertConfig(nodes, ruleChainMetaData); 221 + needDelete = deleteConvertConfig(nodes, ruleChainMetaData, tenantId);
203 } else if (nodeType.intValue() == FastIotConstants.JAVA_SCRIPT.intValue()) { 222 } else if (nodeType.intValue() == FastIotConstants.JAVA_SCRIPT.intValue()) {
204 needDelete = deleteConvertJS(nodes, ruleChainMetaData); 223 needDelete = deleteConvertJS(nodes, ruleChainMetaData);
205 } else { 224 } else {
@@ -210,9 +229,12 @@ public class TkConvertConfigServiceImpl @@ -210,9 +229,12 @@ public class TkConvertConfigServiceImpl
210 229
211 @Override 230 @Override
212 public void addRuleNode( 231 public void addRuleNode(
213 - List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData, Integer nodeType) { 232 + List<RuleNode> nodes,
  233 + RuleChainMetaData ruleChainMetaData,
  234 + Integer nodeType,
  235 + String tenantId) {
214 if (nodeType.intValue() == FastIotConstants.CONVERT_DATA.intValue()) { 236 if (nodeType.intValue() == FastIotConstants.CONVERT_DATA.intValue()) {
215 - addConvertConfigRuleNode(nodes, ruleChainMetaData); 237 + addConvertConfigRuleNode(nodes, ruleChainMetaData, tenantId);
216 } else if (nodeType.intValue() == FastIotConstants.JAVA_SCRIPT.intValue()) { 238 } else if (nodeType.intValue() == FastIotConstants.JAVA_SCRIPT.intValue()) {
217 addConvertJSRuleNode(nodes, ruleChainMetaData); 239 addConvertJSRuleNode(nodes, ruleChainMetaData);
218 } else { 240 } else {
@@ -272,14 +294,15 @@ public class TkConvertConfigServiceImpl @@ -272,14 +294,15 @@ public class TkConvertConfigServiceImpl
272 return needDelete; 294 return needDelete;
273 } 295 }
274 296
275 - private boolean deleteConvertConfig(List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData) { 297 + private boolean deleteConvertConfig(
  298 + List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData, String tenantId) {
276 299
277 // refactoring RuleChainMetaData 300 // refactoring RuleChainMetaData
278 AtomicInteger matchNode = new AtomicInteger(0); 301 AtomicInteger matchNode = new AtomicInteger(0);
279 nodes.forEach( 302 nodes.forEach(
280 deleteRuleNode -> { 303 deleteRuleNode -> {
281 - int deleteIndex = 0;  
282 boolean needDelete = false; 304 boolean needDelete = false;
  305 + int deleteIndex = 0;
283 for (RuleNode ruleNode : ruleChainMetaData.getNodes()) { 306 for (RuleNode ruleNode : ruleChainMetaData.getNodes()) {
284 /** 被删除节点右侧节点的下标左偏移1个量 */ 307 /** 被删除节点右侧节点的下标左偏移1个量 */
285 if (deleteRuleNode.getName().equals(ruleNode.getName()) 308 if (deleteRuleNode.getName().equals(ruleNode.getName())
@@ -291,9 +314,46 @@ public class TkConvertConfigServiceImpl @@ -291,9 +314,46 @@ public class TkConvertConfigServiceImpl
291 deleteIndex++; 314 deleteIndex++;
292 } 315 }
293 316
  317 + // 判断数据源是产品、设备、全部
  318 + ConvertConfigDTO convertConfigDTO =
  319 + findConvertConfigDTOByName(
  320 + tenantId, deleteRuleNode.getName(), FastIotConstants.CONVERT_DATA.intValue());
  321 + boolean haveFilterNode = false;
  322 + String filterNodeName = null;
  323 + String filterType = null;
  324 + if (null != convertConfigDTO
  325 + && null != convertConfigDTO.getDatasourceType()
  326 + && !Objects.equals(convertConfigDTO.getDatasourceType(), DatasourceTypeEnum.ALL)) {
  327 + haveFilterNode = true;
  328 + for (NodeConnectionInfo nodeConnection : ruleChainMetaData.getConnections()) {
  329 + if (nodeConnection.getToIndex() == deleteIndex) {
  330 + int fromIndex = nodeConnection.getFromIndex();
  331 + RuleNode ruleNode = ruleChainMetaData.getNodes().get(fromIndex);
  332 + filterNodeName = ruleNode.getName();
  333 + filterType = ruleNode.getType();
  334 + break;
  335 + }
  336 + }
  337 + }
  338 +
294 if (needDelete) { 339 if (needDelete) {
295 // Delete Rule Node 340 // Delete Rule Node
296 freshRuleChainMetaData(ruleChainMetaData, deleteIndex); 341 freshRuleChainMetaData(ruleChainMetaData, deleteIndex);
  342 + if (haveFilterNode) {
  343 + int deleteFilterNode = 0;
  344 + for (RuleNode ruleNode : ruleChainMetaData.getNodes()) {
  345 + if (filterNodeName.equals(ruleNode.getName())
  346 + && filterType.equals(ruleNode.getType())) {
  347 + needDelete = true;
  348 + matchNode.getAndIncrement();
  349 + break;
  350 + }
  351 + deleteFilterNode++;
  352 + }
  353 + if (needDelete) {
  354 + freshRuleChainMetaData(ruleChainMetaData, deleteFilterNode);
  355 + }
  356 + }
297 } 357 }
298 }); 358 });
299 359
@@ -331,9 +391,9 @@ public class TkConvertConfigServiceImpl @@ -331,9 +391,9 @@ public class TkConvertConfigServiceImpl
331 private void freshRuleChainMetaData(RuleChainMetaData ruleChainMetaData, int removeNodeIndex) { 391 private void freshRuleChainMetaData(RuleChainMetaData ruleChainMetaData, int removeNodeIndex) {
332 ruleChainMetaData.getNodes().remove(removeNodeIndex); 392 ruleChainMetaData.getNodes().remove(removeNodeIndex);
333 393
334 - int firestIndex = ruleChainMetaData.getFirstNodeIndex(); 394 + int firstIndex = ruleChainMetaData.getFirstNodeIndex();
335 ruleChainMetaData.setFirstNodeIndex( 395 ruleChainMetaData.setFirstNodeIndex(
336 - Math.max(firestIndex < removeNodeIndex ? firestIndex : firestIndex - 1, 0)); 396 + Math.max(firstIndex < removeNodeIndex ? firstIndex : firstIndex - 1, 0));
337 397
338 ruleChainMetaData.setConnections( 398 ruleChainMetaData.setConnections(
339 freshRelation(ruleChainMetaData.getConnections(), removeNodeIndex)); 399 freshRelation(ruleChainMetaData.getConnections(), removeNodeIndex));
@@ -365,7 +425,8 @@ public class TkConvertConfigServiceImpl @@ -365,7 +425,8 @@ public class TkConvertConfigServiceImpl
365 return newConnections; 425 return newConnections;
366 } 426 }
367 427
368 - private void addConvertConfigRuleNode(List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData) { 428 + private void addConvertConfigRuleNode(
  429 + List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData, String tenantId) {
369 // 1. GET SAVE TIMESERIES‘S NODE INDEX 430 // 1. GET SAVE TIMESERIES‘S NODE INDEX
370 int seriesIndex = 0; 431 int seriesIndex = 0;
371 for (RuleNode ruleNode : ruleChainMetaData.getNodes()) { 432 for (RuleNode ruleNode : ruleChainMetaData.getNodes()) {
@@ -397,6 +458,7 @@ public class TkConvertConfigServiceImpl @@ -397,6 +458,7 @@ public class TkConvertConfigServiceImpl
397 Map<String, Map<String, String>> originator = new HashMap<>(); 458 Map<String, Map<String, String>> originator = new HashMap<>();
398 Map<String, String> fields = new HashMap<>(); 459 Map<String, String> fields = new HashMap<>();
399 fields.put("id", "deviceId"); 460 fields.put("id", "deviceId");
  461 + fields.put("deviceProfileId", "deviceProfileId");
400 originator.put("fieldsMapping", fields); 462 originator.put("fieldsMapping", fields);
401 types.put(originatorType, JacksonUtil.toString(originator)); 463 types.put(originatorType, JacksonUtil.toString(originator));
402 464
@@ -405,6 +467,7 @@ public class TkConvertConfigServiceImpl @@ -405,6 +467,7 @@ public class TkConvertConfigServiceImpl
405 scriptMap.put( 467 scriptMap.put(
406 "jsScript", 468 "jsScript",
407 "msg.deviceId = metadata.deviceId;\n" 469 "msg.deviceId = metadata.deviceId;\n"
  470 + + "msg.deviceProfileId = metadata.deviceProfileId;\n"
408 + "msg.deviceName = metadata.deviceName;\n" 471 + "msg.deviceName = metadata.deviceName;\n"
409 + "msg.deviceType = metadata.deviceType;\n" 472 + "msg.deviceType = metadata.deviceType;\n"
410 + "if(msg.ts !=null){\n" 473 + "if(msg.ts !=null){\n"
@@ -420,16 +483,151 @@ public class TkConvertConfigServiceImpl @@ -420,16 +483,151 @@ public class TkConvertConfigServiceImpl
420 int layoutY = 170; 483 int layoutY = 170;
421 int finalScriptIndex = scriptIndex; 484 int finalScriptIndex = scriptIndex;
422 nodes.forEach( 485 nodes.forEach(
423 - ruleNode -> {  
424 - NodeConnectionInfo nodeConnectionInfo = new NodeConnectionInfo();  
425 - nodeConnectionInfo.setFromIndex(finalScriptIndex);  
426 - nodeConnectionInfo.setType(connectionType);  
427 - nodeConnectionInfo.setToIndex(ruleChainMetaData.getNodes().size());  
428 - ObjectNode objectNode = setAdditionalInfo(layoutX, layoutY, ruleNode);  
429 - ruleNode.setAdditionalInfo(objectNode);  
430 - ruleChainMetaData.getConnections().add(nodeConnectionInfo);  
431 - ruleChainMetaData.getNodes().add(ruleNode);  
432 - }); 486 + ruleNode ->
  487 + estimateDatasourceGenerateNode(
  488 + tenantId, layoutX, layoutY, finalScriptIndex, ruleNode, ruleChainMetaData));
  489 + }
  490 +
  491 + private void estimateDatasourceGenerateNode(
  492 + String tenantId,
  493 + int layoutX,
  494 + int layoutY,
  495 + int finalScriptIndex,
  496 + RuleNode ruleNode,
  497 + RuleChainMetaData ruleChainMetaData) {
  498 +
  499 + // estimate datasource type
  500 + ConvertConfigDTO convertConfigDTO =
  501 + findConvertConfigDTOByName(
  502 + tenantId, ruleNode.getName(), FastIotConstants.CONVERT_DATA.intValue());
  503 + if (null != convertConfigDTO
  504 + && null != convertConfigDTO.getDatasourceType()
  505 + && !Objects.equals(convertConfigDTO.getDatasourceType(), DatasourceTypeEnum.ALL)) {
  506 + int nodeSize = ruleChainMetaData.getNodes().size();
  507 + NodeConnectionInfo filterNodeConnectionInfo = new NodeConnectionInfo();
  508 + filterNodeConnectionInfo.setFromIndex(finalScriptIndex);
  509 + filterNodeConnectionInfo.setType(connectionType);
  510 + filterNodeConnectionInfo.setToIndex(nodeSize);
  511 +
  512 + RuleNode filterRuleNode = new RuleNode();
  513 + filterRuleNode.setType(filterScriptType);
  514 + filterRuleNode.setName(nodeSize + "filter");
  515 + JsonNode configuration = convertConfigDTO.getDatasourceContent();
  516 + String productObjectNode;
  517 + List<JsonNode> devices = new ArrayList<>();
  518 + String dataSourceType = null;
  519 + ArrayNode arrayNode = (ArrayNode) configuration.get("convertProducts");
  520 + productObjectNode = null != arrayNode ? arrayNode.toString() : "";
  521 + if (Objects.equals(convertConfigDTO.getDatasourceType(), DatasourceTypeEnum.PRODUCTS)) {
  522 + dataSourceType = DatasourceTypeEnum.PRODUCTS.name();
  523 + } else if (Objects.equals(convertConfigDTO.getDatasourceType(), DatasourceTypeEnum.DEVICES)) {
  524 + ArrayNode deviceObjectNode = (ArrayNode) configuration.get("convertDevices");
  525 + if (null != deviceObjectNode) {
  526 + Map<String, Object> device = new ConcurrentHashMap<>();
  527 + deviceObjectNode.forEach(
  528 + item -> {
  529 + device.put(item.get("product").asText(), item.get("devices"));
  530 + devices.add(JacksonUtil.convertValue(device, JsonNode.class));
  531 + });
  532 + dataSourceType = DatasourceTypeEnum.DEVICES.name();
  533 + }
  534 + }
  535 + Map<String, String> scriptMap = new HashMap<>();
  536 + scriptMap.put(
  537 + "jsScript",
  538 + "var deviceProfileIds = "
  539 + + productObjectNode
  540 + + ";\n"
  541 + + "var deviceIds = "
  542 + + devices
  543 + + ";\n"
  544 + + "var dataSourceType = \""
  545 + + dataSourceType
  546 + + "\";\n"
  547 + + "var result = false;\n"
  548 + + "switch (dataSourceType) {\n"
  549 + + " case 'PRODUCTS':\n"
  550 + + " result = productsFilter();\n"
  551 + + " break;\n"
  552 + + " case 'DEVICES':\n"
  553 + + " result = devicesFilter();\n"
  554 + + " break;\n"
  555 + + " default:\n"
  556 + + " result = true;\n"
  557 + + " break;\n"
  558 + + "}\n"
  559 + + "\n"
  560 + + "function productsFilter() {\n"
  561 + + " var productsResult = false;\n"
  562 + + " if (null != deviceProfileIds && deviceProfileIds.length != 0) {\n"
  563 + + " for (var i = 0; i < deviceProfileIds.length; i++) {\n"
  564 + + " if (deviceProfileIds[i] == metadata.deviceProfileId) {\n"
  565 + + " productsResult = true;\n"
  566 + + " break;\n"
  567 + + " }\n"
  568 + + " }\n"
  569 + + " }\n"
  570 + + " return productsResult;\n"
  571 + + "}\n"
  572 + + "\n"
  573 + + "function devicesFilter() {\n"
  574 + + " var devicesResult = false;\n"
  575 + + " if (null != deviceProfileIds && deviceProfileIds.length != 0) {\n"
  576 + + " for (var i = 0; i < deviceIds.length; i++) {\n"
  577 + + " var obj = deviceIds[i];\n"
  578 + + " var key = Object.keys(obj)[0];\n"
  579 + + " var value = obj[key];\n"
  580 + + " if (key == metadata.deviceProfileId) {\n"
  581 + + " for (var j = 0; j < value.length; j++) {\n"
  582 + + " if (value[j] == metadata\n"
  583 + + " .deviceId) {\n"
  584 + + " devicesResult = true;\n"
  585 + + " break;\n"
  586 + + " }\n"
  587 + + " }\n"
  588 + + " }\n"
  589 + + " if (devicesResult) {\n"
  590 + + " break;\n"
  591 + + " }\n"
  592 + + " }\n"
  593 + + " }\n"
  594 + + " return devicesResult;\n"
  595 + + "}\n"
  596 + + "return result;");
  597 + filterRuleNode.setConfiguration(JacksonUtil.convertValue(scriptMap, JsonNode.class));
  598 +
  599 + ObjectNode objectNode = setAdditionalInfo(layoutX, layoutY, filterRuleNode);
  600 + filterRuleNode.setAdditionalInfo(objectNode);
  601 + ruleChainMetaData.getConnections().add(filterNodeConnectionInfo);
  602 + ruleChainMetaData.getNodes().add(filterRuleNode);
  603 + addConvertEndNode(
  604 + ruleChainMetaData.getNodes().size() - 1,
  605 + ruleChainMetaData,
  606 + layoutX,
  607 + layoutY,
  608 + ruleNode,
  609 + "true");
  610 + } else {
  611 + addConvertEndNode(
  612 + finalScriptIndex, ruleChainMetaData, layoutX, layoutY, ruleNode, connectionType);
  613 + }
  614 + }
  615 +
  616 + private void addConvertEndNode(
  617 + int finalScriptIndex,
  618 + RuleChainMetaData ruleChainMetaData,
  619 + int layoutX,
  620 + int layoutY,
  621 + RuleNode ruleNode,
  622 + String connectionType) {
  623 + NodeConnectionInfo nodeConnectionInfo = new NodeConnectionInfo();
  624 + nodeConnectionInfo.setFromIndex(finalScriptIndex);
  625 + nodeConnectionInfo.setType(connectionType);
  626 + nodeConnectionInfo.setToIndex(ruleChainMetaData.getNodes().size());
  627 + ObjectNode objectNode = setAdditionalInfo(layoutX, layoutY, ruleNode);
  628 + ruleNode.setAdditionalInfo(objectNode);
  629 + ruleChainMetaData.getConnections().add(nodeConnectionInfo);
  630 + ruleChainMetaData.getNodes().add(ruleNode);
433 } 631 }
434 632
435 private void needDeleteOriginatorFieldsAndScript(RuleChainMetaData ruleChainMetaData) { 633 private void needDeleteOriginatorFieldsAndScript(RuleChainMetaData ruleChainMetaData) {
@@ -7,17 +7,20 @@ import org.apache.commons.lang3.StringUtils; @@ -7,17 +7,20 @@ import org.apache.commons.lang3.StringUtils;
7 import org.springframework.stereotype.Service; 7 import org.springframework.stereotype.Service;
8 import org.springframework.transaction.annotation.Transactional; 8 import org.springframework.transaction.annotation.Transactional;
9 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; 9 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
  10 +import org.thingsboard.server.common.data.yunteng.constant.QueryConstant;
10 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; 11 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException;
11 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; 12 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
12 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; 13 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
13 import org.thingsboard.server.common.data.yunteng.dto.TkDeviceStateLogDTO; 14 import org.thingsboard.server.common.data.yunteng.dto.TkDeviceStateLogDTO;
14 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; 15 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData;
15 import org.thingsboard.server.dao.yunteng.entities.TkDeviceStateLogEntity; 16 import org.thingsboard.server.dao.yunteng.entities.TkDeviceStateLogEntity;
  17 +import org.thingsboard.server.dao.yunteng.mapper.DeviceMapper;
16 import org.thingsboard.server.dao.yunteng.mapper.TkDeviceStateLogMapper; 18 import org.thingsboard.server.dao.yunteng.mapper.TkDeviceStateLogMapper;
17 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; 19 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
18 import org.thingsboard.server.dao.yunteng.service.TkDeviceStateLogService; 20 import org.thingsboard.server.dao.yunteng.service.TkDeviceStateLogService;
19 21
20 import java.time.LocalDateTime; 22 import java.time.LocalDateTime;
  23 +import java.util.List;
21 import java.util.Map; 24 import java.util.Map;
22 import java.util.Objects; 25 import java.util.Objects;
23 import java.util.Optional; 26 import java.util.Optional;
@@ -27,8 +30,11 @@ import java.util.Optional; @@ -27,8 +30,11 @@ import java.util.Optional;
27 public class TkDeviceStateLogServiceImpl 30 public class TkDeviceStateLogServiceImpl
28 extends AbstractBaseService<TkDeviceStateLogMapper, TkDeviceStateLogEntity> 31 extends AbstractBaseService<TkDeviceStateLogMapper, TkDeviceStateLogEntity>
29 implements TkDeviceStateLogService { 32 implements TkDeviceStateLogService {
  33 + private final DeviceMapper deviceMapper;
  34 +
30 @Override 35 @Override
31 - public TkPageData<TkDeviceStateLogDTO> page(String tenantId, Map<String, Object> queryMap) { 36 + public TkPageData<TkDeviceStateLogDTO> page(
  37 + boolean isCustomer, String tenantId, Map<String, Object> queryMap) {
32 String deviceName = 38 String deviceName =
33 Optional.ofNullable(queryMap.get("deviceName")).map(Object::toString).orElse(null); 39 Optional.ofNullable(queryMap.get("deviceName")).map(Object::toString).orElse(null);
34 String organizationName = 40 String organizationName =
@@ -45,10 +51,19 @@ public class TkDeviceStateLogServiceImpl @@ -45,10 +51,19 @@ public class TkDeviceStateLogServiceImpl
45 (LocalDateTime) Optional.ofNullable(queryMap.get("endTime")).orElse(null); 51 (LocalDateTime) Optional.ofNullable(queryMap.get("endTime")).orElse(null);
46 IPage<TkDeviceStateLogEntity> currentPage = 52 IPage<TkDeviceStateLogEntity> currentPage =
47 getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false); 53 getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);
  54 + List<String> deviceIds = null;
  55 + if (isCustomer) {
  56 + String customerId =
  57 + null != queryMap.get(QueryConstant.CUSTOMER_ID)
  58 + ? (String) queryMap.get(QueryConstant.CUSTOMER_ID)
  59 + : null;
  60 + deviceIds = deviceMapper.findDeviceIdsByCustomerId(customerId);
  61 + }
48 LambdaQueryWrapper<TkDeviceStateLogEntity> queryWrapper = 62 LambdaQueryWrapper<TkDeviceStateLogEntity> queryWrapper =
49 new LambdaQueryWrapper<TkDeviceStateLogEntity>() 63 new LambdaQueryWrapper<TkDeviceStateLogEntity>()
50 .eq(TkDeviceStateLogEntity::getTenantId, tenantId) 64 .eq(TkDeviceStateLogEntity::getTenantId, tenantId)
51 .eq(null != status, TkDeviceStateLogEntity::getStatus, status) 65 .eq(null != status, TkDeviceStateLogEntity::getStatus, status)
  66 + .in(isCustomer, TkDeviceStateLogEntity::getTbDeviceId, deviceIds)
52 .like( 67 .like(
53 StringUtils.isNotEmpty(deviceName), 68 StringUtils.isNotEmpty(deviceName),
54 TkDeviceStateLogEntity::getDeviceName, 69 TkDeviceStateLogEntity::getDeviceName,
@@ -21,6 +21,7 @@ public interface ConvertConfigService extends BaseService<ConvertConfig> { @@ -21,6 +21,7 @@ public interface ConvertConfigService extends BaseService<ConvertConfig> {
21 21
22 boolean deleteConvertConfig(DeleteDTO deleteDTO, Integer nodeType); 22 boolean deleteConvertConfig(DeleteDTO deleteDTO, Integer nodeType);
23 23
  24 + ConvertConfigDTO findConvertConfigDTOByName(String tenantId,String name,Integer nodeType);
24 /** 25 /**
25 * 通过数据转换的IDS获取需要组装的节点 26 * 通过数据转换的IDS获取需要组装的节点
26 * 27 *
@@ -61,7 +62,7 @@ public interface ConvertConfigService extends BaseService<ConvertConfig> { @@ -61,7 +62,7 @@ public interface ConvertConfigService extends BaseService<ConvertConfig> {
61 boolean checkConvertJSStatusEnable(String tenantId); 62 boolean checkConvertJSStatusEnable(String tenantId);
62 63
63 boolean deleteRuleNode( 64 boolean deleteRuleNode(
64 - List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData, Integer nodeType); 65 + List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData, Integer nodeType,String tenantId);
65 66
66 - void addRuleNode(List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData, Integer nodeType); 67 + void addRuleNode(List<RuleNode> nodes, RuleChainMetaData ruleChainMetaData, Integer nodeType,String tenantId);
67 } 68 }
@@ -8,7 +8,7 @@ import org.thingsboard.server.dao.yunteng.entities.TkDeviceStateLogEntity; @@ -8,7 +8,7 @@ import org.thingsboard.server.dao.yunteng.entities.TkDeviceStateLogEntity;
8 import java.util.Map; 8 import java.util.Map;
9 9
10 public interface TkDeviceStateLogService extends BaseService<TkDeviceStateLogEntity> { 10 public interface TkDeviceStateLogService extends BaseService<TkDeviceStateLogEntity> {
11 - TkPageData<TkDeviceStateLogDTO> page(String tenantId,Map<String, Object> queryMap); 11 + TkPageData<TkDeviceStateLogDTO> page(boolean isCustomer,String tenantId,Map<String, Object> queryMap);
12 12
13 boolean deleteTkDeviceStateLog(DeleteDTO deleteDTO); 13 boolean deleteTkDeviceStateLog(DeleteDTO deleteDTO);
14 14