Ver código fonte

Merge remote-tracking branch 'origin/master'

zhouhao 2 anos atrás
pai
commit
cf52a6ce68

+ 36 - 6
jetlinks-components/notify-component/notify-sms/src/main/java/org/jetlinks/community/notify/sms/aliyun/AliyunSmsNotifier.java

@@ -32,7 +32,10 @@ import reactor.core.publisher.Mono;
 import reactor.core.scheduler.Schedulers;
 
 import javax.annotation.Nonnull;
+import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -164,24 +167,51 @@ public class AliyunSmsNotifier extends AbstractNotifier<AliyunSmsTemplate> {
      * @return 短信签名集合
      */
     public Flux<SmsSign> getSmsSigns() {
-        return Mono
-            .fromCallable(() -> client.getAcsResponse(new QuerySmsSignListRequest()))
-            .flatMapIterable(QuerySmsSignListResponse::getSmsSignList)
+        return doQuerySmsSigns(new AtomicInteger(0), 50)
+            .flatMapIterable(Function.identity())
             .map(SmsSign::of)
             .as(FluxTracer.create("/aliyun/sms/sign"))
             .onErrorResume(err -> Mono.empty());
     }
 
+
     /**
      * @return 短信模板集合
      */
     public Flux<SmsTemplate> getSmsTemplates() {
-        return Mono
-            .fromCallable(() -> client.getAcsResponse(new QuerySmsTemplateListRequest()))
-            .flatMapIterable(QuerySmsTemplateListResponse::getSmsTemplateList)
+        return doQuerySmsTemplates(new AtomicInteger(0), 50)
+            .flatMapIterable(Function.identity())
             .map(SmsTemplate::of)
             .as(FluxTracer.create("/aliyun/sms/template"))
             .onErrorResume(err -> Mono.empty());
+    }
+
 
+    public Flux<List<QuerySmsSignListResponse.QuerySmsSignDTO>> doQuerySmsSigns(AtomicInteger pageIndex, int pageSize) {
+        QuerySmsSignListRequest request = new QuerySmsSignListRequest();
+        request.setPageSize(pageSize);
+        request.setPageIndex(pageIndex.incrementAndGet());
+        return Mono
+            .fromCallable(() -> client.getAcsResponse(request).getSmsSignList())
+            .expand(dtos -> {
+                if (dtos.size() == pageSize){
+                    return doQuerySmsSigns(pageIndex, pageSize);
+                }
+                return Flux.empty();
+            });
+    }
+
+    public Flux<List<QuerySmsTemplateListResponse.SmsStatsResultDTO>> doQuerySmsTemplates(AtomicInteger pageIndex, int pageSize) {
+        QuerySmsTemplateListRequest request = new QuerySmsTemplateListRequest();
+        request.setPageSize(pageSize);
+        request.setPageIndex(pageIndex.incrementAndGet());
+        return Mono
+            .fromCallable(() -> client.getAcsResponse(request).getSmsTemplateList())
+            .expand(dtos -> {
+                if (dtos.size() == pageSize){
+                    return doQuerySmsTemplates(pageIndex, pageSize);
+                }
+                return Flux.empty();
+            });
     }
 }

+ 1 - 1
jetlinks-components/notify-component/notify-sms/src/main/java/org/jetlinks/community/notify/sms/aliyun/web/AliyunSmsController.java

@@ -41,7 +41,7 @@ public class AliyunSmsController {
 
     @GetMapping("/{configId}/templates")
     @QueryAction
-    @Operation(summary = "获取短信标签列表")
+    @Operation(summary = "获取短信模板列表")
     public Flux<SmsTemplate> getAliyunSmsTemplates(@PathVariable String configId) {
         return notifierManager
             .getNotifier(DefaultNotifyType.sms, configId)

+ 65 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/term/DeviceCategoryTerm.java

@@ -0,0 +1,65 @@
+package org.jetlinks.community.device.service.term;
+
+import org.hswebframework.ezorm.core.param.Term;
+import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.PrepareSqlFragments;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.SqlFragments;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTermFragmentBuilder;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 根据产品分类查询与产品关联的数据,如: 查询某个分类下的产品列表.
+ * <p>
+ * <b>
+ * 注意: 查询时指定列名是和产品ID关联的列或者实体类属性名.
+ * 如: 查询设备列表时则使用productId.
+ * 此条件仅支持关系型数据库中的查询.
+ * </b>
+ * <p>
+ * 在通用查询接口中可以使用动态查询参数中的<code>term.termType</code>来使用此功能.
+ * <a href="https://doc.jetlinks.cn/interface-guide/query-param.html">查看动态查询参数说明</a>
+ * <p>
+ * 在内部通用条件中,可以使用DSL方式创建条件,例如:
+ * <pre>
+ *     createQuery()
+ *     .where()
+ *     .and("productId","dev-prod-cat",cateId)
+ *     .fetch()
+ * </pre>
+ *
+ * @author zhouhao
+ * @since 1.3
+ */
+@Component
+public class DeviceCategoryTerm extends AbstractTermFragmentBuilder {
+
+    public DeviceCategoryTerm() {
+        super("dev-prod-cat", "按产品品类查询");
+    }
+
+    @Override
+    public SqlFragments createFragments(String columnFullName, RDBColumnMetadata column, Term term) {
+
+        PrepareSqlFragments sqlFragments = PrepareSqlFragments.of();
+
+        List<Object> idList = convertList(column, term);
+
+        sqlFragments.addSql("exists(select 1 from dev_product prod where prod.id =", columnFullName);
+
+        sqlFragments.addSql("and exists(select 1 from dev_product_category g where g.id = prod.classified_id and ");
+        sqlFragments.addSql(
+            idList
+                .stream()
+                .map(r -> "path like (select concat(path,'%') from dev_product_category g2 where g2.id = ?)")
+                .collect(Collectors.joining(" or ", "(", ")"))
+            , ")")
+                    .addParameter(idList);
+
+        sqlFragments.addSql(")");
+
+        return sqlFragments;
+    }
+}

+ 99 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/term/DeviceInstanceTerm.java

@@ -0,0 +1,99 @@
+package org.jetlinks.community.device.service.term;
+
+import org.hswebframework.ezorm.core.param.Term;
+import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
+import org.hswebframework.ezorm.rdb.metadata.RDBTableMetadata;
+import org.hswebframework.ezorm.rdb.metadata.TableOrViewMetadata;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.*;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTermFragmentBuilder;
+import org.jetlinks.community.utils.ConverterUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+
+/**
+ * 根据设备查询.
+ * <p>
+ * 将设备信息的条件嵌套到此条件中
+ * <p>
+ * <pre>
+ * "terms": [
+ *      {
+ *          "column": "device_id$dev-instance",
+ *          "value": [
+ *              {
+ *                  "column": "product_id",
+ *                  "termType": "eq",
+ *                  "value": "1"
+ *              }
+ *          ]
+ *      }
+ * ],
+ * </pre>
+ *
+ * @author zhouhao
+ * @since 1.6
+ */
+@Component
+public class DeviceInstanceTerm extends AbstractTermFragmentBuilder {
+
+    public static final String termType = "dev-instance";
+
+    public DeviceInstanceTerm() {
+        super(termType, "根据设备信息查询");
+    }
+
+    @Override
+    public SqlFragments createFragments(String columnFullName,
+                                        RDBColumnMetadata column,
+                                        Term term) {
+        List<Term> terms = ConverterUtils.convertTerms(term.getValue());
+        PrepareSqlFragments sqlFragments = PrepareSqlFragments.of();
+        if (term.getOptions().contains("not")) {
+            sqlFragments.addSql("not");
+        }
+        sqlFragments.addSql("exists(select 1 from ", getTableName("dev_device_instance", column), " _dev where _dev.id = ", columnFullName);
+
+        RDBTableMetadata metadata = column
+            .getOwner()
+            .getSchema()
+            .getTable("dev_device_instance")
+            .orElseThrow(() -> new UnsupportedOperationException("unsupported dev_device_instance"));
+
+        SqlFragments where = builder.createTermFragments(metadata, terms);
+        if (!where.isEmpty()) {
+            sqlFragments.addSql("and")
+                .addFragments(where);
+        }
+        sqlFragments.addSql(")");
+        return sqlFragments;
+    }
+
+
+    static DeviceTermsBuilder builder = new DeviceTermsBuilder();
+
+    static class DeviceTermsBuilder extends AbstractTermsFragmentBuilder<TableOrViewMetadata> {
+
+        @Override
+        protected SqlFragments createTermFragments(TableOrViewMetadata parameter,
+                                                   List<Term> terms) {
+            return super.createTermFragments(parameter, terms);
+        }
+
+        @Override
+        protected SqlFragments createTermFragments(TableOrViewMetadata table,
+                                                   Term term) {
+            if (term.getValue() instanceof NativeSql) {
+                NativeSql sql = ((NativeSql) term.getValue());
+                return PrepareSqlFragments.of(sql.getSql(), sql.getParameters());
+            }
+            return table
+                .getColumn(term.getColumn())
+                .flatMap(column -> table
+                    .findFeature(TermFragmentBuilder.createFeatureId(term.getTermType()))
+                    .map(termFragment -> termFragment.createFragments(column.getFullName("_dev"), column, term)))
+                .orElse(EmptySqlFragments.INSTANCE);
+        }
+    }
+}

+ 85 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/term/DeviceProductInfoTermBuilder.java

@@ -0,0 +1,85 @@
+package org.jetlinks.community.device.service.term;
+
+import org.hswebframework.ezorm.core.param.Term;
+import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
+import org.hswebframework.ezorm.rdb.metadata.RDBTableMetadata;
+import org.hswebframework.ezorm.rdb.metadata.TableOrViewMetadata;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.*;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTermFragmentBuilder;
+import org.jetlinks.community.utils.ConverterUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 根据设备产品信息查询设备数据
+ *
+ * @author bestfeng
+ * @since 2.0
+ */
+@Component
+public class DeviceProductInfoTermBuilder extends AbstractTermFragmentBuilder {
+
+    public static final String termType = "product-info";
+
+    public DeviceProductInfoTermBuilder() {
+        super(termType, "根据产品信息查询设备数据");
+    }
+
+
+    @SuppressWarnings("all")
+    public static List<Term> convertTerms(Object value) {
+        return ConverterUtils.convertTerms(value);
+    }
+
+
+    @Override
+    public SqlFragments createFragments(String columnFullName, RDBColumnMetadata column, Term term) {
+        List<Term> terms = convertTerms(term.getValue());
+        PrepareSqlFragments sqlFragments = PrepareSqlFragments.of();
+        if(term.getOptions().contains("not")){
+            sqlFragments.addSql("not");
+        }
+        sqlFragments
+            .addSql("exists(select 1 from ",getTableName("dev_product",column)," _product where _product.id = ", columnFullName);
+
+        RDBTableMetadata metadata = column
+            .getOwner()
+            .getSchema()
+            .getTable("dev_product")
+            .orElseThrow(() -> new UnsupportedOperationException("unsupported dev_product"));
+
+        SqlFragments where = builder.createTermFragments(metadata, terms);
+        if (!where.isEmpty()) {
+            sqlFragments.addSql("and")
+                     .addFragments(where);
+        }
+        sqlFragments.addSql(")");
+        return sqlFragments;
+    }
+
+
+    static ProductTermBuilder builder = new ProductTermBuilder();
+
+    static class ProductTermBuilder extends AbstractTermsFragmentBuilder<TableOrViewMetadata> {
+
+        @Override
+        protected SqlFragments createTermFragments(TableOrViewMetadata parameter, List<Term> terms) {
+            return super.createTermFragments(parameter, terms);
+        }
+
+        @Override
+        protected SqlFragments createTermFragments(TableOrViewMetadata table, Term term) {
+            if (term.getValue() instanceof NativeSql) {
+                NativeSql sql = ((NativeSql) term.getValue());
+                return PrepareSqlFragments.of(sql.getSql(), sql.getParameters());
+            }
+            return table
+                .getColumn(term.getColumn())
+                .flatMap(column -> table
+                    .findFeature(TermFragmentBuilder.createFeatureId(term.getTermType()))
+                    .map(termFragment -> termFragment.createFragments(column.getFullName("_product"), column, term)))
+                .orElse(EmptySqlFragments.INSTANCE);
+        }
+    }
+}

+ 34 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/term/DeviceProtocolTerm.java

@@ -0,0 +1,34 @@
+package org.jetlinks.community.device.service.term;
+
+import org.hswebframework.ezorm.core.param.Term;
+import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.PrepareSqlFragments;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.SqlFragments;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTermFragmentBuilder;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+
+@Component
+public class DeviceProtocolTerm extends AbstractTermFragmentBuilder {
+    public DeviceProtocolTerm() {
+        super("dev-protocol", "按协议查询设备");
+    }
+
+    @Override
+    public SqlFragments createFragments(String columnFullName, RDBColumnMetadata column, Term term) {
+        PrepareSqlFragments sqlFragments = PrepareSqlFragments.of();
+        List<Object> idList = convertList(column, term);
+        if (term.getOptions().contains("not")) {
+            sqlFragments.addSql("not");
+        }
+        sqlFragments
+            .addSql("exists(select 1 from ",getTableName("dev_product",column)," _product where _product.id = " + columnFullName);
+        sqlFragments
+            .addSql(" and _product.message_protocol = ?");
+        sqlFragments.addSql(")").addParameter(idList);
+
+        return sqlFragments;
+    }
+}

+ 37 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/term/DeviceTypeTerm.java

@@ -0,0 +1,37 @@
+package org.jetlinks.community.device.service.term;
+
+import org.hswebframework.ezorm.core.param.Term;
+import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.PrepareSqlFragments;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.SqlFragments;
+import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.AbstractTermFragmentBuilder;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+@Component
+public class DeviceTypeTerm extends AbstractTermFragmentBuilder {
+    public DeviceTypeTerm() {
+        super("dev-device-type", "按设备类型查询设备");
+    }
+
+    @Override
+    public SqlFragments createFragments(String columnFullName, RDBColumnMetadata column, Term term) {
+        PrepareSqlFragments sqlFragments = PrepareSqlFragments.of();
+        List<Object> idList = convertList(column, term);
+        if (term.getOptions().contains("not")) {
+            sqlFragments.addSql("not");
+        }
+        sqlFragments
+            .addSql("exists(select 1 from ",getTableName("dev_product",column)," _product where _product.id = " + columnFullName);
+        sqlFragments
+            .addSql(" and _product.device_type in(");
+        sqlFragments.addSql(idList.stream().map(str -> "?").collect(Collectors.joining(",")))
+                    .addParameter(idList)
+                    .addSql("))");
+
+        return sqlFragments;
+    }
+}