diff --git a/jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/service/terms/DeviceAlarmTermBuilder.java b/jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/service/terms/DeviceAlarmTermBuilder.java new file mode 100644 index 00000000..7c0cd4e7 --- /dev/null +++ b/jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/service/terms/DeviceAlarmTermBuilder.java @@ -0,0 +1,105 @@ +package org.jetlinks.community.rule.engine.service.terms; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +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.hswebframework.web.api.crud.entity.TermExpressionParser; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 根据告警记录查询设备相关数据,可以使用 {@link org.jetlinks.community.rule.engine.entity.DeviceAlarmHistoryEntity}的属性作为关联条件 + *

+ * where id dev-alarm 'state not xxx' + * + * @author zhouhao + * @see org.jetlinks.community.rule.engine.entity.DeviceAlarmHistoryEntity + * @since 1.12 + */ +@Component +public class DeviceAlarmTermBuilder extends AbstractTermFragmentBuilder { + + public DeviceAlarmTermBuilder() { + super("dev-alarm", "根据告警查询设备相关数据"); + } + + @SuppressWarnings("all") + public static List convertTerms(Object value) { + if (value instanceof String) { + String strVal = String.valueOf(value); + //json字符串 + if (strVal.startsWith("[")) { + value = JSON.parseArray(strVal); + } else { + //表达式 + return TermExpressionParser.parse(strVal); + } + } + if (value instanceof List) { + return new JSONArray(((List) value)).toJavaList(Term.class); + } else { + throw new UnsupportedOperationException("unsupported term value:" + value); + } + } + + @Override + public SqlFragments createFragments(String columnFullName, RDBColumnMetadata column, Term term) { + List terms = convertTerms(term.getValue()); + PrepareSqlFragments fragments = PrepareSqlFragments.of(); + + if(term.getOptions().contains("not")){ + fragments.addSql("not"); + } + fragments.addSql("exists( select 1 from rule_dev_alarm_history _his where", columnFullName) + .addSql("= _his.device_id"); + + + RDBTableMetadata metadata = column + .getOwner() + .getSchema() + .getTable("rule_dev_alarm_history") + .orElseThrow(() -> new UnsupportedOperationException("unsupported dev-alarm")); + + SqlFragments where = builder.createTermFragments(metadata, terms); + + if (!where.isEmpty()) { + fragments.addSql("and") + .addFragments(where); + + } + fragments.addSql(")"); + return fragments; + } + + static AlarmTermBuilder builder = new AlarmTermBuilder(); + + static class AlarmTermBuilder extends AbstractTermsFragmentBuilder { + + @Override + protected SqlFragments createTermFragments(TableOrViewMetadata parameter, List 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("_his"), column, term))) + .orElse(EmptySqlFragments.INSTANCE); + } + } + + +}