浏览代码

优化物模型拓展配置

zhou-hao 4 年之前
父节点
当前提交
83b5cab87e

+ 11 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DefaultDeviceConfigMetadataManager.java

@@ -3,6 +3,7 @@ package org.jetlinks.community.device.service;
 import org.jetlinks.community.device.spi.DeviceConfigMetadataSupplier;
 import org.jetlinks.core.metadata.ConfigMetadata;
 import org.jetlinks.core.metadata.DeviceConfigScope;
+import org.jetlinks.core.metadata.DeviceMetadataType;
 import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
@@ -49,6 +50,16 @@ public class DefaultDeviceConfigMetadataManager implements DeviceConfigMetadataM
                    .sort(Comparator.comparing(ConfigMetadata::getName));
     }
 
+    @Override
+    public Flux<ConfigMetadata> getMetadataExpandsConfig(String productId,
+                                                         DeviceMetadataType metadataType,
+                                                         String metadataId,
+                                                         String typeId) {
+        return Flux.fromIterable(suppliers)
+                   .flatMap(supplier -> supplier.getMetadataExpandsConfig(productId, metadataType, metadataId, typeId))
+                   .sort(Comparator.comparing(ConfigMetadata::getName));
+    }
+
     @Override
     public Object postProcessAfterInitialization(@Nonnull Object bean, @Nonnull String beanName) {
         if (bean instanceof DeviceConfigMetadataSupplier) {

+ 36 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DefaultDeviceConfigMetadataSupplier.java

@@ -1,15 +1,22 @@
 package org.jetlinks.community.device.service;
 
 import lombok.AllArgsConstructor;
+import org.jetlinks.community.device.entity.DeviceProductEntity;
 import org.jetlinks.core.ProtocolSupports;
 import org.jetlinks.core.message.codec.DefaultTransport;
 import org.jetlinks.core.metadata.ConfigMetadata;
 import org.jetlinks.core.metadata.DeviceConfigScope;
 import org.jetlinks.community.device.entity.DeviceInstanceEntity;
 import org.jetlinks.community.device.spi.DeviceConfigMetadataSupplier;
+import org.jetlinks.core.metadata.DeviceMetadataType;
 import org.springframework.stereotype.Component;
+import org.springframework.util.Assert;
 import org.springframework.util.StringUtils;
 import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.util.Arrays;
+import java.util.function.Function;
 
 @Component
 @AllArgsConstructor
@@ -55,6 +62,35 @@ public class DefaultDeviceConfigMetadataSupplier implements DeviceConfigMetadata
             .filter(metadata -> metadata.hasScope(DeviceConfigScope.product));
     }
 
+    @Override
+    @SuppressWarnings("all")
+    public Flux<ConfigMetadata> getMetadataExpandsConfig(String productId,
+                                                         DeviceMetadataType metadataType,
+                                                         String metadataId,
+                                                         String typeId) {
+        Assert.hasText(productId, "productId can not be empty");
+        Assert.notNull(metadataType, "metadataType can not be empty");
+
+        return productService
+            .createQuery()
+            .select(DeviceProductEntity::getMessageProtocol, DeviceProductEntity::getTransportProtocol)
+            .where(DeviceInstanceEntity::getId, productId)
+            .fetchOne()
+            .flatMap(product -> {
+                return Mono
+                    .zip(
+                        //消息协议
+                        protocolSupports.getProtocol(product.getMessageProtocol()),
+                        //传输协议
+                        Mono.justOrEmpty(product.getTransportEnum(Arrays.asList(DefaultTransport.values()))),
+                        (protocol, transport) -> {
+                            return protocol.getMetadataExpandsConfig(transport, metadataType, metadataId, typeId);
+                        }
+                    );
+            })
+            .flatMapMany(Function.identity());
+    }
+
     private Flux<ConfigMetadata> getProductConfigMetadata0(String productId) {
         return productService
             .findById(productId)

+ 13 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DeviceConfigMetadataManager.java

@@ -6,6 +6,7 @@ import org.jetlinks.community.device.spi.DeviceConfigMetadataSupplier;
 import org.jetlinks.core.message.codec.Transport;
 import org.jetlinks.core.metadata.ConfigMetadata;
 import org.jetlinks.core.metadata.ConfigPropertyMetadata;
+import org.jetlinks.core.metadata.DeviceMetadataType;
 import reactor.core.publisher.Flux;
 
 
@@ -62,5 +63,17 @@ public interface DeviceConfigMetadataManager {
      */
     Flux<ConfigMetadata> getProductConfigMetadata(String productId);
 
+    /**
+     * 获取物模型拓展配置定义
+     * @param productId 产品ID
+     * @param metadataType 物模型类型
+     * @param metadataId 物模型ID
+     * @param typeId 类型
+     * @return 配置定义信息
+     */
+    Flux<ConfigMetadata> getMetadataExpandsConfig(String productId,
+                                                  DeviceMetadataType metadataType,
+                                                  String metadataId,
+                                                  String typeId);
 
 }

+ 10 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/spi/DeviceConfigMetadataSupplier.java

@@ -1,6 +1,7 @@
 package org.jetlinks.community.device.spi;
 
 import org.jetlinks.core.metadata.ConfigMetadata;
+import org.jetlinks.core.metadata.DeviceMetadataType;
 import reactor.core.publisher.Flux;
 
 /**
@@ -28,4 +29,13 @@ public interface DeviceConfigMetadataSupplier {
      */
     Flux<ConfigMetadata> getProductConfigMetadata(String productId);
 
+    /**
+     * @see org.jetlinks.community.device.service.DeviceConfigMetadataManager#getMetadataExpandsConfig(String, DeviceMetadataType, String, String)
+     */
+    default Flux<ConfigMetadata> getMetadataExpandsConfig(String productId,
+                                                          DeviceMetadataType metadataType,
+                                                          String metadataId,
+                                                          String typeId) {
+        return Flux.empty();
+    }
 }

+ 11 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/DeviceProductController.java

@@ -20,6 +20,7 @@ import org.jetlinks.community.device.web.request.AggRequest;
 import org.jetlinks.community.timeseries.query.AggregationData;
 import org.jetlinks.core.metadata.ConfigMetadata;
 import org.jetlinks.core.metadata.DeviceMetadataCodec;
+import org.jetlinks.core.metadata.DeviceMetadataType;
 import org.jetlinks.supports.official.JetLinksDeviceMetadataCodec;
 import org.springframework.beans.factory.ObjectProvider;
 import org.springframework.web.bind.annotation.*;
@@ -72,6 +73,16 @@ public class DeviceProductController implements ReactiveServiceCrudController<De
         return configMetadataManager.getProductConfigMetadata(id);
     }
 
+    @GetMapping("/{id:.+}/config-metadata/{metadataType}/{metadataId}/{typeId}")
+    @QueryAction
+    @Operation(summary = "获取产品物模型的拓展配置定义")
+    public Flux<ConfigMetadata> getExpandsConfigMetadata(@PathVariable @Parameter(description = "产品ID") String id,
+                                                         @PathVariable @Parameter(description = "物模型类型") DeviceMetadataType metadataType,
+                                                         @PathVariable @Parameter(description = "物模型ID") String metadataId,
+                                                         @PathVariable @Parameter(description = "类型ID") String typeId) {
+        return configMetadataManager.getMetadataExpandsConfig(id, metadataType, metadataId, typeId);
+    }
+
     @GetMapping("/metadata/codecs")
     @QueryAction
     @Operation(summary = "获取支持的物模型格式")