浏览代码

优化配置定义

zhou-hao 4 年之前
父节点
当前提交
2774ab8d9c

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

@@ -2,8 +2,10 @@ 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.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 import reactor.core.publisher.Flux;
 
 import javax.annotation.Nonnull;
@@ -20,10 +22,21 @@ public class DefaultDeviceConfigMetadataManager implements DeviceConfigMetadataM
         suppliers.add(supplier);
     }
 
+    @Override
+    public Flux<ConfigMetadata> getDeviceConfigMetadataByProductId(String productId) {
+        return Flux.fromIterable(suppliers)
+                   .flatMap(supplier -> supplier.getDeviceConfigMetadataByProductId(productId))
+                   .map(config -> config.copy(DeviceConfigScope.device))
+                   .filter(config-> !CollectionUtils.isEmpty(config.getProperties()))
+                   .sort(Comparator.comparing(ConfigMetadata::getName));
+    }
+
     @Override
     public Flux<ConfigMetadata> getDeviceConfigMetadata(String deviceId) {
         return Flux.fromIterable(suppliers)
                    .flatMap(supplier -> supplier.getDeviceConfigMetadata(deviceId))
+                   .map(config -> config.copy(DeviceConfigScope.device))
+                   .filter(config-> !CollectionUtils.isEmpty(config.getProperties()))
                    .sort(Comparator.comparing(ConfigMetadata::getName));
     }
 
@@ -31,6 +44,8 @@ public class DefaultDeviceConfigMetadataManager implements DeviceConfigMetadataM
     public Flux<ConfigMetadata> getProductConfigMetadata(String productId) {
         return Flux.fromIterable(suppliers)
                    .flatMap(supplier -> supplier.getProductConfigMetadata(productId))
+                   .map(config -> config.copy(DeviceConfigScope.product))
+                   .filter(config-> !CollectionUtils.isEmpty(config.getProperties()))
                    .sort(Comparator.comparing(ConfigMetadata::getName));
     }
 

+ 21 - 2
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DefaultDeviceConfigMetadataSupplier.java

@@ -8,6 +8,7 @@ import org.jetlinks.core.metadata.DeviceConfigScope;
 import org.jetlinks.community.device.entity.DeviceInstanceEntity;
 import org.jetlinks.community.device.spi.DeviceConfigMetadataSupplier;
 import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
 import reactor.core.publisher.Flux;
 
 @Component
@@ -21,17 +22,35 @@ public class DefaultDeviceConfigMetadataSupplier implements DeviceConfigMetadata
     private final ProtocolSupports protocolSupports;
 
     @Override
+    @SuppressWarnings("all")
     public Flux<ConfigMetadata> getDeviceConfigMetadata(String deviceId) {
-
+        if(StringUtils.isEmpty(deviceId)){
+            return Flux.empty();
+        }
         return instanceService
-            .findById(deviceId)
+            .createQuery()
+            .select(DeviceInstanceEntity::getProductId)
+            .where(DeviceInstanceEntity::getId,deviceId)
+            .fetchOne()
             .map(DeviceInstanceEntity::getProductId)
             .flatMapMany(this::getProductConfigMetadata0)
             .filter(metadata -> metadata.hasScope(DeviceConfigScope.device));
     }
 
+    @Override
+    public Flux<ConfigMetadata> getDeviceConfigMetadataByProductId(String productId) {
+        if(StringUtils.isEmpty(productId)){
+            return Flux.empty();
+        }
+        return getProductConfigMetadata0(productId)
+            .filter(metadata -> metadata.hasScope(DeviceConfigScope.device));
+    }
+
     @Override
     public Flux<ConfigMetadata> getProductConfigMetadata(String productId) {
+        if(StringUtils.isEmpty(productId)){
+            return Flux.empty();
+        }
         return getProductConfigMetadata0(productId)
             .filter(metadata -> metadata.hasScope(DeviceConfigScope.product));
     }

+ 37 - 2
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DeviceConfigMetadataManager.java

@@ -1,12 +1,38 @@
 package org.jetlinks.community.device.service;
 
+import org.jetlinks.community.device.entity.DeviceInstanceEntity;
+import org.jetlinks.community.device.entity.DeviceProductEntity;
+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 reactor.core.publisher.Flux;
 
+
 /**
- * 设备配置信息管理
+ * 设备配置信息管理器,用于获取产品或者设备在运行过程中所需要的配置信息。
+ * <p>
+ * 这些配置可以在协议包中{@link org.jetlinks.core.defaults.CompositeProtocolSupport#addConfigMetadata(Transport, ConfigMetadata)}进行定义
+ * 或者通过实现接口{@link DeviceConfigMetadataSupplier}来定义
+ * <p>
+ * 在定义配置时,可以通过指定{@link ConfigPropertyMetadata#getScopes()}来定义配置的作用域返回。
+ * <p>
+ * 比如:
+ * <pre>
+ *
+ *  new DefaultConfigMetadata()
+ *      .add("apiUrl","API地址",StringType.GLOBAL,DeviceConfigScope.product) //只作用于产品配置
+ *      .add("password","密码",StringType.GLOBAL,DeviceConfigScope.device); //只作用于设备配置
+ *
+ * </pre>
+ * <p>
+ * 注意:所有的配置都是保存在一起的,在定义字段时,要注意配置名冲突。
  *
  * @author zhouhao
+ * @see DeviceConfigMetadataSupplier
+ * @see DeviceInstanceEntity#getConfiguration()
+ * @see DeviceProductEntity#getConfiguration()
+ * @see org.jetlinks.core.device.DeviceOperator#getConfig(String)
  * @since 1.6
  */
 public interface DeviceConfigMetadataManager {
@@ -16,11 +42,20 @@ public interface DeviceConfigMetadataManager {
      *
      * @param deviceId 产品ID
      * @return 配置信息
+     * @see org.jetlinks.core.metadata.DeviceConfigScope#device
      */
     Flux<ConfigMetadata> getDeviceConfigMetadata(String deviceId);
 
     /**
-     * 根据产品ID获取配置信息
+     * 根据产品ID获取设备需要的配置定义信息
+     *
+     * @param productId 产品ID
+     * @return 配置信息
+     */
+    Flux<ConfigMetadata> getDeviceConfigMetadataByProductId(String productId);
+
+    /**
+     * 根据产品ID获取产品所需配置信息
      *
      * @param productId 产品ID
      * @return 配置信息

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

@@ -3,10 +3,29 @@ package org.jetlinks.community.device.spi;
 import org.jetlinks.core.metadata.ConfigMetadata;
 import reactor.core.publisher.Flux;
 
+/**
+ * 设备配置定义提供者,通常用于第三方平台接入时,告诉系统对应的产品或者设备所需要的配置,如:第三方平台需要的密钥等信息
+ * 系统在导入设备或者编辑设备时,会根据配置定义进行不同的操作,如选择前端界面,生成导出模版等
+ *
+ * @author zhouhao
+ * @see org.jetlinks.community.device.service.DeviceConfigMetadataManager
+ * @since 1.7.0
+ */
 public interface DeviceConfigMetadataSupplier {
 
+    /**
+     * @see org.jetlinks.community.device.service.DeviceConfigMetadataManager#getDeviceConfigMetadata(String)
+     */
     Flux<ConfigMetadata> getDeviceConfigMetadata(String deviceId);
 
+    /**
+     * @see org.jetlinks.community.device.service.DeviceConfigMetadataManager#getDeviceConfigMetadataByProductId(String)
+     */
+    Flux<ConfigMetadata> getDeviceConfigMetadataByProductId(String productId);
+
+    /**
+     * @see org.jetlinks.community.device.service.DeviceConfigMetadataManager#getProductConfigMetadata(String)
+     */
     Flux<ConfigMetadata> getProductConfigMetadata(String productId);
 
 }

+ 13 - 23
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/DeviceInstanceController.java

@@ -395,30 +395,20 @@ public class DeviceInstanceController implements
     DataBufferFactory bufferFactory = new DefaultDataBufferFactory();
 
     private Mono<Tuple4<DeviceProductEntity, DeviceProductOperator, DeviceMetadata, List<ConfigPropertyMetadata>>> getDeviceProductDetail(String productId) {
-        return registry
-            .getProduct(productId)
-            .switchIfEmpty(Mono.error(() -> new BusinessException("型号[{" + productId + "]不存在或未发布")))
-            .flatMap(product -> Mono.zip(
-                product.getMetadata(),
-                product.getProtocol(),
-                productService.findById(productId))
-                                    .flatMap(tp3 -> {
-                                        DeviceMetadata metadata = tp3.getT1();
-                                        ProtocolSupport protocol = tp3.getT2();
-                                        DeviceProductEntity entity = tp3.getT3();
-
-                                        return protocol.getSupportedTransport()
-                                                       .collectList()
-                                                       .map(entity::getTransportEnum)
-                                                       .flatMap(Mono::justOrEmpty)
-                                                       .flatMap(protocol::getConfigMetadata)
-                                                       .map(ConfigMetadata::getProperties)
-                                                       .defaultIfEmpty(Collections.emptyList())
-                                                       .map(configs -> Tuples.of(entity, product, metadata, configs));
-
-                                    })
-            );
 
+        return Mono.zip(
+            //产品
+            productService.findById(productId),
+            //操作接口
+            registry.getProduct(productId),
+            //物模型
+            registry.getProduct(productId).flatMap(DeviceProductOperator::getMetadata),
+            //配置
+            metadataManager.getDeviceConfigMetadataByProductId(productId)
+                           .flatMapIterable(ConfigMetadata::getProperties)
+                           .collectList()
+                           .defaultIfEmpty(Collections.emptyList())
+        );
     }
 
     //按产品导入数据