Compare commits

...

2 Commits
2.11 ... 2.0

6 changed files with 357 additions and 9 deletions

View File

@ -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,49 @@ 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();
});
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}