From 0459faca6f1e477388053cd48f94e497349874c4 Mon Sep 17 00:00:00 2001 From: 6WFG46AF <202176039@qq.com> Date: Fri, 18 Aug 2023 11:51:17 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=9C=BA=E6=99=AF=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdk/model/scene/DeviceOperation.java | 58 ++++++ .../sdk/model/scene/DeviceSelectorSpec.java | 37 ++++ .../jetlinks/sdk/model/scene/Generators.java | 12 ++ .../sdk/model/scene/PropertyMetric.java | 35 ++++ .../jetlinks/sdk/model/scene/SceneAction.java | 48 +++++ .../sdk/model/scene/SceneActions.java | 22 +++ .../sdk/model/scene/SceneConditionAction.java | 26 +++ .../jetlinks/sdk/model/scene/SceneRule.java | 62 ++++++ .../sdk/model/scene/SelectorValue.java | 26 +++ .../jetlinks/sdk/model/scene/ShakeLimit.java | 30 +++ .../jetlinks/sdk/model/scene/TermColumn.java | 50 +++++ .../jetlinks/sdk/model/scene/TimerSpec.java | 93 +++++++++ .../org/jetlinks/sdk/model/scene/Trigger.java | 49 +++++ .../jetlinks/sdk/model/scene/TriggerType.java | 31 +++ .../jetlinks/sdk/model/scene/Variable.java | 52 ++++++ .../sdk/model/scene/VariableObjectSpec.java | 15 ++ .../sdk/model/scene/VariableSource.java | 52 ++++++ .../sdk/model/scene/enums/AlarmMode.java | 12 ++ .../sdk/model/scene/info/SceneInfo.java | 92 +++++++++ .../scene/internal/actions/AlarmAction.java | 14 ++ .../scene/internal/actions/DelayAction.java | 36 ++++ .../scene/internal/actions/DeviceAction.java | 22 +++ .../scene/internal/actions/NotifyAction.java | 37 ++++ .../internal/actions/configs/Config.java | 21 +++ .../internal/triggers/DeviceTrigger.java | 34 ++++ .../triggers/SceneTriggerProvider.java | 45 +++++ .../scene/internal/triggers/TimerTrigger.java | 10 + .../scene/request/SceneExecuteRequest.java | 22 +++ .../sdk/model/scene/request/SceneRequest.java | 176 ++++++++++++++++++ .../client/model/scene/request/TestScene.java | 147 +++++++++++++++ 30 files changed, 1366 insertions(+) create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/DeviceOperation.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/DeviceSelectorSpec.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/Generators.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/PropertyMetric.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/SceneAction.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/SceneActions.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/SceneConditionAction.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/SceneRule.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/SelectorValue.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/ShakeLimit.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/TermColumn.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/TimerSpec.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/Trigger.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/TriggerType.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/Variable.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/VariableObjectSpec.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/VariableSource.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/enums/AlarmMode.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/info/SceneInfo.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/internal/actions/AlarmAction.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/internal/actions/DelayAction.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/internal/actions/DeviceAction.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/internal/actions/NotifyAction.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/internal/actions/configs/Config.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/internal/triggers/DeviceTrigger.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/internal/triggers/SceneTriggerProvider.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/internal/triggers/TimerTrigger.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/request/SceneExecuteRequest.java create mode 100644 src/main/java/org/jetlinks/sdk/model/scene/request/SceneRequest.java create mode 100644 src/test/java/org/jetlinks/sdk/client/model/scene/request/TestScene.java diff --git a/src/main/java/org/jetlinks/sdk/model/scene/DeviceOperation.java b/src/main/java/org/jetlinks/sdk/model/scene/DeviceOperation.java new file mode 100644 index 0000000..b227828 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/DeviceOperation.java @@ -0,0 +1,58 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.core.message.function.FunctionParameter; + +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Map; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class DeviceOperation { + //当前值 + public static final String property_value_type_current = "current"; + + @NotNull(message = "error.scene_rule_trigger_device_operation_cannot_be_null") + private Operator operator; + + @Schema(description = "[operator]为[readProperty,writeProperty,invokeFunction]时不能为空") + private TimerSpec timer; + + @Schema(description = "[operator]为[reportEvent]时不能为空") + private String eventId; + + @Schema(description = "[operator]为[readProperty]时不能为空") + private List readProperties; + + @Schema(description = "[operator]为[writeProperty]时不能为空") + private Map writeProperties; + + @Schema(description = "[operator]为[invokeFunction]时不能为空") + private String functionId; + + @Schema(description = "[operator]为[invokeFunction]时不能为空") + private List functionParameters; + + public enum Operator { + online, + offline, + //事件上报 + reportEvent, + //属性上报 + reportProperty, + //读取属性 + readProperty, + //修改属性 + writeProperty, + //调用功能 + invokeFunction; + + } +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/DeviceSelectorSpec.java b/src/main/java/org/jetlinks/sdk/model/scene/DeviceSelectorSpec.java new file mode 100644 index 0000000..f0f0715 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/DeviceSelectorSpec.java @@ -0,0 +1,37 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class DeviceSelectorSpec extends VariableSource{ + @Schema(description = "选择器标识") + @NotBlank + private String selector; + + @Schema(description = "选择器的值,如选择的部门ID,标签信息等") + private List selectorValues; + + @Schema(description = "固定设备ID") + @Override + public Object getValue() { + return super.getValue(); + } + + public DeviceSelectorSpec() { + } + + private DeviceSelectorSpec(String selector, List selectorValue) { + this.selector = selector; + super.setValue(selectorValue); + } +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/Generators.java b/src/main/java/org/jetlinks/sdk/model/scene/Generators.java new file mode 100644 index 0000000..5cbad00 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/Generators.java @@ -0,0 +1,12 @@ +package org.jetlinks.sdk.model.scene; + +/** + * @author zyl + * @date 3/8/2023 + */ +public interface Generators { + String DEFAULT_ID_GENERATOR = "default_id"; + String MD5 = "md5"; + String SNOW_FLAKE = "snow_flake"; + String CURRENT_TIME = "current_time"; +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/PropertyMetric.java b/src/main/java/org/jetlinks/sdk/model/scene/PropertyMetric.java new file mode 100644 index 0000000..2a34c5b --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/PropertyMetric.java @@ -0,0 +1,35 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotBlank; +import java.util.Map; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PropertyMetric { + @Schema(description = "指标ID") + @NotBlank + private String id; + + @Schema(description = "名称") + @NotBlank + private String name; + + @Schema(description = "值,范围值使用逗号分隔") + private Object value; + + @Schema(description = "是否为范围值") + private boolean range; + + @Schema(description = "其他拓展配置") + private Map expands; +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/SceneAction.java b/src/main/java/org/jetlinks/sdk/model/scene/SceneAction.java new file mode 100644 index 0000000..2bbde82 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/SceneAction.java @@ -0,0 +1,48 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.hswebframework.ezorm.core.param.Term; +import org.jetlinks.sdk.model.scene.internal.actions.AlarmAction; +import org.jetlinks.sdk.model.scene.internal.actions.DelayAction; +import org.jetlinks.sdk.model.scene.internal.actions.DeviceAction; +import org.jetlinks.sdk.model.scene.internal.actions.NotifyAction; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class SceneAction implements Serializable { + @Schema(description = "执行器类型") + @NotNull + private String executor; + + @Schema(description = "执行器类型为[notify]时不能为空") + private NotifyAction notify; + + @Schema(description = "执行器类型为[delay]时不能为空") + private DelayAction delay; + + @Schema(description = "执行器类型为[device]时不能为空") + private DeviceAction device; + + @Schema(description = "执行器类型为[alarm]时不能为空") + private AlarmAction alarm; + + @Schema(description = "输出过滤条件,串行执行动作时,满足条件才会进入下一个节点") + private List terms; + + @Schema(description = "其他执行器配置") + private Map configuration; + + @Schema(description = "拓展信息") + private Map options; +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/SceneActions.java b/src/main/java/org/jetlinks/sdk/model/scene/SceneActions.java new file mode 100644 index 0000000..64e3587 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/SceneActions.java @@ -0,0 +1,22 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.List; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class SceneActions implements Serializable { + @Schema(description = "是否并行执行动作") + private boolean parallel; + + @Schema(description = "执行动作") + private List actions; +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/SceneConditionAction.java b/src/main/java/org/jetlinks/sdk/model/scene/SceneConditionAction.java new file mode 100644 index 0000000..ba9c61b --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/SceneConditionAction.java @@ -0,0 +1,26 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.hswebframework.ezorm.core.param.Term; + +import java.io.Serializable; +import java.util.List; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class SceneConditionAction implements Serializable { + @Schema(description = "条件") + private List when; + + @Schema(description = "防抖配置") + private ShakeLimit shakeLimit; + + @Schema(description = "满足条件时执行的动作") + private List then; +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/SceneRule.java b/src/main/java/org/jetlinks/sdk/model/scene/SceneRule.java new file mode 100644 index 0000000..dcefb03 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/SceneRule.java @@ -0,0 +1,62 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.hswebframework.ezorm.core.param.Term; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author zyl + * @date 4/8/2023 + */ +@Getter +@Setter +public class SceneRule implements Serializable { + public static final String ACTION_KEY_BRANCH_INDEX = "_branchIndex"; + public static final String ACTION_KEY_GROUP_INDEX = "_groupIndex"; + public static final String ACTION_KEY_ACTION_INDEX = "_actionIndex"; + + public static final String CONTEXT_KEY_SCENE_OUTPUT = "scene"; + + public static final String SOURCE_TYPE_KEY = "sourceType"; + public static final String SOURCE_ID_KEY = "sourceId"; + public static final String SOURCE_NAME_KEY = "sourceName"; + + + @Schema(description = "告警ID") + @NotBlank(message = "error.scene_rule_id_cannot_be_blank") + private String id; + + @Schema(description = "告警名称") + @NotBlank(message = "error.scene_rule_name_cannot_be_blank") + private String name; + + @Schema(description = "触发器") + @NotNull(message = "error.scene_rule_trigger_cannot_be_null") + private Trigger trigger; + + + @Schema(description = "触发条件") + private List terms; + + @Schema(description = "是否并行执行动作") + private boolean parallel; + + @Schema(description = "执行动作") + private List actions; + + @Schema(description = "动作分支") + private List branches; + + @Schema(description = "扩展配置") + private Map options; + + @Schema(description = "说明") + private String description; +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/SelectorValue.java b/src/main/java/org/jetlinks/sdk/model/scene/SelectorValue.java new file mode 100644 index 0000000..f659c23 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/SelectorValue.java @@ -0,0 +1,26 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor +public class SelectorValue { + + @Schema(description = "值") + private Object value; + + @Schema(description = "名称") + private String name; + + +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/ShakeLimit.java b/src/main/java/org/jetlinks/sdk/model/scene/ShakeLimit.java new file mode 100644 index 0000000..fd948b2 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/ShakeLimit.java @@ -0,0 +1,30 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class ShakeLimit implements Serializable { + @Schema(description = "是否开启防抖") + private boolean enabled; + + //时间限制,单位时间内发生多次告警时,只算一次。单位:秒 + @Schema(description = "时间间隔(秒)") + private int time; + + //触发阈值,单位时间内发生n次告警,只算一次。 + @Schema(description = "触发阈值(次)") + private int threshold; + + //当发生第一次告警时就触发,为false时表示最后一次才触发(告警有延迟,但是可以统计出次数) + @Schema(description = "是否第一次满足条件就触发") + private boolean alarmFirst; +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/TermColumn.java b/src/main/java/org/jetlinks/sdk/model/scene/TermColumn.java new file mode 100644 index 0000000..d2f7722 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/TermColumn.java @@ -0,0 +1,50 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.hswebframework.ezorm.core.param.Term; +import org.hswebframework.ezorm.core.param.TermType; + +import java.util.List; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class TermColumn { + @Schema(description = "条件列") + private String column; + + @Schema(description = "名称") + private String name; + + @Schema(description = "全名") + private String fullName; + + @Schema(description = "说明") + private String description; + + @Schema(description = "数据类型") + private String dataType; + + @Schema(description = "是否为物模型列") + private boolean metadata; + + /** + * @see Term#getTermType() + */ + @Schema(description = "支持的条件类型") + private List termTypes; + + @Schema(description = "支持的指标") + private List metrics; + + @Schema(description = "可选内容") + private List options; + + @Schema(description = "子列,在类型为object时有值") + private List children; +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/TimerSpec.java b/src/main/java/org/jetlinks/sdk/model/scene/TimerSpec.java new file mode 100644 index 0000000..5212ecb --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/TimerSpec.java @@ -0,0 +1,93 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalUnit; +import java.util.Set; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class TimerSpec implements Serializable { + @Schema(description = "触发方式") + @NotNull + private Trigger trigger; + + //Cron表达式 + @Schema(description = "触发方式为[cron]时不能为空") + private String cron; + + @Schema(description = "执行的时间.为空则表示每天,触发方式为[week]则为1-7,触发方式为[month]时则为1-31") + private Set when; + + @Schema(description = "执行模式,一次还是周期执行") + private ExecuteMod mod; + + @Schema(description = "执行模式为[period]时不能为空") + private Period period; + + @Schema(description = "执行模式为[once]时不能为空") + private Once once; + + public enum ExecuteMod { + period, + once + } + + @Getter + @Setter + public static class Period implements Serializable { + private static final long serialVersionUID = 1L; + //周期执行的时间区间 + @Schema(description = "执行时间范围从.格式:[hh:mm],或者[hh:mm:ss]") + private String from; + @Schema(description = "执行时间范围止.格式:[hh:mm],或者[hh:mm:ss]") + private String to; + + @Schema(description = "周期值,如:每[every][unit]执行一次") + private int every; + + @Schema(description = "周期执行单位") + private PeriodUnit unit; + + } + + @AllArgsConstructor + public enum PeriodUnit { + seconds(ChronoUnit.SECONDS), + minutes(ChronoUnit.MINUTES), + hours(ChronoUnit.HOURS); + private final TemporalUnit temporal; + + } + + @Getter + @Setter + @AllArgsConstructor(staticName = "of") + @NoArgsConstructor + public static class Once implements Serializable { + private static final long serialVersionUID = 1L; + //时间点 + @Schema(description = "时间点.格式:[hh:mm],或者[hh:mm:ss]") + @NotBlank + private String time; + + } + + public enum Trigger { + week, + month, + cron + } +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/Trigger.java b/src/main/java/org/jetlinks/sdk/model/scene/Trigger.java new file mode 100644 index 0000000..9c434ce --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/Trigger.java @@ -0,0 +1,49 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.sdk.model.scene.internal.triggers.DeviceTrigger; +import org.jetlinks.sdk.model.scene.internal.triggers.TimerTrigger; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Map; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class Trigger implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "触发方式") + @NotNull(message = "error.scene_rule_trigger_cannot_be_null") + private String type; + + @Schema(description = "防抖配置") + private GroupShakeLimit shakeLimit; + + @Schema(description = "[type]为[device]时不能为空") + private DeviceTrigger device; + + @Schema(description = "[type]为[timer]时不能为空") + private TimerTrigger timer; + + @Schema(description = "[type]不为[device,timer,collector]时不能为控") + private Map configuration; + + @Getter + @Setter + public static class GroupShakeLimit extends ShakeLimit { + + //暂时没有实现其他方式 + @Schema(description = "分组类型:device,product,org...") + @Hidden + private String groupType; + + } +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/TriggerType.java b/src/main/java/org/jetlinks/sdk/model/scene/TriggerType.java new file mode 100644 index 0000000..04a0efa --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/TriggerType.java @@ -0,0 +1,31 @@ +package org.jetlinks.sdk.model.scene; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.hswebframework.web.dict.EnumDict; + +/** + * @author zyl + * @date 7/8/2023 + */ +@Getter +@AllArgsConstructor +@Deprecated +public enum TriggerType implements EnumDict { + manual("手动触发"), + timer("定时触发"), + device("设备触发"); + + private final String text; + + @Override + public String getValue() { + return name(); + } + + + @Override + public boolean isWriteJSONObjectEnabled() { + return false; + } +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/Variable.java b/src/main/java/org/jetlinks/sdk/model/scene/Variable.java new file mode 100644 index 0000000..9220ccb --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/Variable.java @@ -0,0 +1,52 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.hswebframework.ezorm.core.param.Term; +import org.hswebframework.ezorm.core.param.TermType; + +import java.util.List; +import java.util.Map; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class Variable { + public static final String OPTION_PRODUCT_ID = "productId"; + @Schema(description = "变量ID") + private String id; + + @Schema(description = "变量名") + private String name; + + @Schema(description = "变量全名") + private String fullName; + + @Schema(description = "列") + private String column; + + @Schema(description = "说明") + private String description; + + @Schema(description = "类型") + private String type; + + /** + * @see Term#getTermType() + */ + @Schema(description = "支持的条件类型") + private List termTypes; + + @Schema(description = "子级变量") + private List children; + + @Schema(description = "是否为物模型变量") + private boolean metadata; + + @Schema(description = "其他配置") + private Map options; +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/VariableObjectSpec.java b/src/main/java/org/jetlinks/sdk/model/scene/VariableObjectSpec.java new file mode 100644 index 0000000..d4358ec --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/VariableObjectSpec.java @@ -0,0 +1,15 @@ +package org.jetlinks.sdk.model.scene; + +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.core.things.relation.ObjectSpec; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class VariableObjectSpec extends ObjectSpec { + +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/VariableSource.java b/src/main/java/org/jetlinks/sdk/model/scene/VariableSource.java new file mode 100644 index 0000000..ffc39a2 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/VariableSource.java @@ -0,0 +1,52 @@ +package org.jetlinks.sdk.model.scene; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Map; +import java.util.Optional; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class VariableSource implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "来源") + private Source source; + + @Schema(description = "固定值,[source]为[fixed]时不能为空") + private Object value; + + @Schema(description = "上游key,[source]为[upper]时不能为空") + private String upperKey; + + @Schema(description = "关系,[source]为[relation]时不能为空") + private VariableObjectSpec relation; + + @Schema(description = "拓展信息") + private Map options; + + public enum Source { + //固定值 + fixed, + //来自上游 + upper, + //通过关系选择 + relation; + + public static Optional of(String source) { + for (Source value : values()) { + if (value.name().equals(source)) { + return Optional.of(value); + } + } + return Optional.empty(); + } + } +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/enums/AlarmMode.java b/src/main/java/org/jetlinks/sdk/model/scene/enums/AlarmMode.java new file mode 100644 index 0000000..ab421b7 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/enums/AlarmMode.java @@ -0,0 +1,12 @@ +package org.jetlinks.sdk.model.scene.enums; + +/** + * @author zyl + * @date 3/8/2023 + */ +public enum AlarmMode { + //触发告警 + trigger, + //解除告警 + relieve +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/info/SceneInfo.java b/src/main/java/org/jetlinks/sdk/model/scene/info/SceneInfo.java new file mode 100644 index 0000000..37ab088 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/info/SceneInfo.java @@ -0,0 +1,92 @@ +package org.jetlinks.sdk.model.scene.info; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.hswebframework.ezorm.core.param.Term; +import org.hswebframework.ezorm.rdb.mapping.annotation.ColumnType; +import org.hswebframework.ezorm.rdb.mapping.annotation.DefaultValue; +import org.hswebframework.ezorm.rdb.mapping.annotation.EnumCodec; +import org.hswebframework.ezorm.rdb.mapping.annotation.JsonCodec; +import org.jetlinks.sdk.model.EnumInfo; +import org.jetlinks.sdk.model.scene.Generators; +import org.jetlinks.sdk.model.scene.SceneAction; +import org.jetlinks.sdk.model.scene.SceneConditionAction; +import org.jetlinks.sdk.model.scene.Trigger; + +import javax.persistence.Column; +import java.sql.JDBCType; +import java.util.List; +import java.util.Map; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class SceneInfo { + + @Schema(description = "告警名称") + private String name; + + @Schema(description = "触发器类型") + private String triggerType; + + @JsonCodec + @ColumnType(javaType = String.class, jdbcType = JDBCType.LONGVARCHAR) + @Schema(description = "触发器") + private Trigger trigger; + + @JsonCodec + @ColumnType(javaType = String.class, jdbcType = JDBCType.LONGVARCHAR) + @Schema(description = "触发条件") + private List terms; + + @Schema(description = "是否并行执行动作") + @DefaultValue("false") + private Boolean parallel; + + @JsonCodec + @ColumnType(javaType = String.class, jdbcType = JDBCType.LONGVARCHAR) + @Schema(description = "执行动作") + private List actions; + + @JsonCodec + @ColumnType(javaType = String.class, jdbcType = JDBCType.LONGVARCHAR) + @Schema(description = "动作分支") + private List branches; + + @Schema(description = "创建人") + private String creatorId; + + @Schema(description = "创建时间") + @DefaultValue(generator = Generators.CURRENT_TIME) + private Long createTime; + + @Schema(description = "修改人") + private String modifierId; + + @Schema(description = "修改时间") + @DefaultValue(generator = Generators.CURRENT_TIME) + private Long modifyTime; + + @Schema(description = "启动时间") + private Long startTime; + + @Schema(description = "状态") + @EnumCodec + @ColumnType(javaType = String.class) + @DefaultValue("disable") + private EnumInfo state; + + @Schema(description = "扩展配置") + @JsonCodec + @ColumnType(jdbcType = JDBCType.LONGVARCHAR) + private Map options; + + @Column + @Schema(description = "说明") + private String description; + +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/AlarmAction.java b/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/AlarmAction.java new file mode 100644 index 0000000..3d7413f --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/AlarmAction.java @@ -0,0 +1,14 @@ +package org.jetlinks.sdk.model.scene.internal.actions; + +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.sdk.model.scene.internal.actions.configs.Config; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class AlarmAction extends Config { +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/DelayAction.java b/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/DelayAction.java new file mode 100644 index 0000000..9acfc26 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/DelayAction.java @@ -0,0 +1,36 @@ +package org.jetlinks.sdk.model.scene.internal.actions; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.io.Serializable; +import java.time.temporal.ChronoUnit; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class DelayAction implements Serializable { + @Schema(description = "延迟时间") + private int time; + + @Schema(description = "时间单位") + private DelayUnit unit; + + @Getter + @AllArgsConstructor + public enum DelayUnit { + seconds(ChronoUnit.SECONDS), + minutes(ChronoUnit.MINUTES), + hours(ChronoUnit.HOURS); + final ChronoUnit chronoUnit; + + } +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/DeviceAction.java b/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/DeviceAction.java new file mode 100644 index 0000000..2bce256 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/DeviceAction.java @@ -0,0 +1,22 @@ +package org.jetlinks.sdk.model.scene.internal.actions; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.sdk.model.scene.DeviceSelectorSpec; + +import java.util.Map; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class DeviceAction extends DeviceSelectorSpec { + @Schema(description = "产品ID") + private String productId; + + @Schema(description = "设备指令") + private Map message; +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/NotifyAction.java b/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/NotifyAction.java new file mode 100644 index 0000000..3adbe99 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/NotifyAction.java @@ -0,0 +1,37 @@ +package org.jetlinks.sdk.model.scene.internal.actions; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.sdk.model.scene.VariableSource; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Map; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class NotifyAction implements Serializable { + @Schema(description = "通知类型") + @NotBlank(message = "error.scene_rule_actions_notify_type_cannot_be_empty") + private String notifyType; + + @Schema(description = "通知配置ID") + @NotBlank(message = "error.scene_rule_actions_notify_id_cannot_be_empty") + private String notifierId; + + @Schema(description = "通知模版ID") + @NotBlank(message = "error.scene_rule_actions_notify_template_cannot_be_blank") + private String templateId; + + /** + * 变量值的格式可以为{@link VariableSource} + */ + @Schema(description = "通知变量") + @NotBlank(message = "error.scene_rule_actions_notify_variables_cannot_be_blank") + private Map variables; +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/configs/Config.java b/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/configs/Config.java new file mode 100644 index 0000000..c1527e0 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/internal/actions/configs/Config.java @@ -0,0 +1,21 @@ +package org.jetlinks.sdk.model.scene.internal.actions.configs; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.sdk.model.scene.enums.AlarmMode; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class Config implements Serializable { + @NotNull + @Schema(description = "告警方式") + private AlarmMode mode; +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/internal/triggers/DeviceTrigger.java b/src/main/java/org/jetlinks/sdk/model/scene/internal/triggers/DeviceTrigger.java new file mode 100644 index 0000000..d262eb3 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/internal/triggers/DeviceTrigger.java @@ -0,0 +1,34 @@ +package org.jetlinks.sdk.model.scene.internal.triggers; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.sdk.model.scene.DeviceOperation; +import org.jetlinks.sdk.model.scene.DeviceSelectorSpec; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author zyl + * @date 3/8/2023 + */ +@Getter +@Setter +public class DeviceTrigger extends DeviceSelectorSpec implements SceneTriggerProvider.TriggerConfig, Serializable { + private static final long serialVersionUID = 1L; + + @NotBlank(message = "error.scene_rule_trigger_device_product_cannot_be_null") + @Schema(description = "产品ID") + private String productId; + + @Schema(description = "操作方式") + @NotNull(message = "error.scene_rule_trigger_device_operation_cannot_be_null") + private DeviceOperation operation; + + @Override + public void validate() { + + } +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/internal/triggers/SceneTriggerProvider.java b/src/main/java/org/jetlinks/sdk/model/scene/internal/triggers/SceneTriggerProvider.java new file mode 100644 index 0000000..ef16193 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/internal/triggers/SceneTriggerProvider.java @@ -0,0 +1,45 @@ +package org.jetlinks.sdk.model.scene.internal.triggers; + +import org.hswebframework.ezorm.core.param.Term; +import org.hswebframework.ezorm.rdb.executor.SqlRequest; +import org.hswebframework.ezorm.rdb.operator.builder.fragments.SqlFragments; +import org.hswebframework.web.bean.FastBeanCopier; +import org.jetlinks.rule.engine.api.model.RuleModel; +import org.jetlinks.rule.engine.api.model.RuleNodeModel; +import org.jetlinks.sdk.model.scene.TermColumn; +import org.jetlinks.sdk.model.scene.Variable; +import reactor.core.publisher.Flux; + +import java.util.List; +import java.util.Map; + +/** + * @author zyl + * @date 3/8/2023 + */ +public interface SceneTriggerProvider { + String getProvider(); + + String getName(); + + E newConfig(); + + SqlRequest createSql(E config, List terms, boolean hasWhere); + + SqlFragments createFilter(E config, List terms); + + List createDefaultVariable(E config); + + void applyRuleNode(E config, RuleModel model, RuleNodeModel sceneNode); + + Flux parseTermColumns(E config); + + + interface TriggerConfig { + void validate(); + + default void with(Map config) { + FastBeanCopier.copy(config, this); + } + } +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/internal/triggers/TimerTrigger.java b/src/main/java/org/jetlinks/sdk/model/scene/internal/triggers/TimerTrigger.java new file mode 100644 index 0000000..00b19cf --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/internal/triggers/TimerTrigger.java @@ -0,0 +1,10 @@ +package org.jetlinks.sdk.model.scene.internal.triggers; + +import org.jetlinks.sdk.model.scene.TimerSpec; + +/** + * @author zyl + * @date 3/8/2023 + */ +public class TimerTrigger extends TimerSpec { +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/request/SceneExecuteRequest.java b/src/main/java/org/jetlinks/sdk/model/scene/request/SceneExecuteRequest.java new file mode 100644 index 0000000..9e5fe44 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/request/SceneExecuteRequest.java @@ -0,0 +1,22 @@ +package org.jetlinks.sdk.model.scene.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +/** + * @author zyl + * @date 8/8/2023 + */ +@Getter +@Setter +public class SceneExecuteRequest { + @Schema(description = "场景ID") + private String id; + + @Schema(description = "数据") + private Map context; + +} diff --git a/src/main/java/org/jetlinks/sdk/model/scene/request/SceneRequest.java b/src/main/java/org/jetlinks/sdk/model/scene/request/SceneRequest.java new file mode 100644 index 0000000..f8d94cf --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/scene/request/SceneRequest.java @@ -0,0 +1,176 @@ +package org.jetlinks.sdk.model.scene.request; + +import org.hswebframework.web.api.crud.entity.QueryParamEntity; +import org.jetlinks.sdk.model.PagerResult; +import org.jetlinks.sdk.model.SimpleApiRequest; +import org.jetlinks.sdk.model.scene.SceneRule; +import org.jetlinks.sdk.model.scene.info.SceneInfo; +import org.springframework.core.ResolvableType; + +import java.util.ArrayList; +import java.util.Map; + +/** + * 场景管理 + * + * @author zyl + * @date 31/7/2023 + */ +public class SceneRequest { + + /** + * 分页查询场景联动 + * + * @param query + * @return + */ + public static SimpleApiRequest> queryScene(QueryParamEntity query) { + return SimpleApiRequest + .>builder() + .post() + .body(query) + .uri("/rule-engine/instance/") + .responseType(ResolvableType + .forClassWithGenerics( + PagerResult.class, + SceneInfo.class + )) + .build(); + } + + /** + * 新增场景联动 + * + * @param sceneRule + * @return + */ + public static SimpleApiRequest createScene(SceneRule sceneRule) { + return SimpleApiRequest + .builder() + .post() + .body(sceneRule) + .uri("/scene") + .responseType(SceneInfo.class) + .build(); + } + + + /** + * 更新场景 + * + * @param id + * @param sceneRule + * @return + */ + public static SimpleApiRequest updateScene(String id, SceneRule sceneRule) { + return SimpleApiRequest + .builder() + .put() + .parameter(id, "id") + .body(sceneRule) + .uri("/scene/" + id) + .responseType(SceneInfo.class) + .build(); + } + + /** + * 删除场景 + * + * @param id + * @return + */ + public static SimpleApiRequest deleteScene(String id) { + return SimpleApiRequest + .builder() + .delete() + .parameter(id, "id") + .uri("/scene/" + id) + .responseType(SceneInfo.class) + .build(); + } + + /** + * 根据id查询场景 + * + * @param id + * @return + */ + public static SimpleApiRequest getSceneById(String id) { + return SimpleApiRequest + .builder() + .get() + .parameter(id, "id") + .uri("/scene/" + id) + .responseType(SceneInfo.class) + .build(); + } + + + /** + * 启用场景 + * + * @param id + * @return + */ + public static SimpleApiRequest enableScene(String id) { + return SimpleApiRequest + .builder() + .put() + .parameter(id, "id") + .uri("/scene/" + id + "/_enable") + .responseType(SceneInfo.class) + .build(); + } + + /** + * 禁用场景 + * + * @param id + * @return + */ + public static SimpleApiRequest disableScene(String id) { + return SimpleApiRequest + .builder() + .put() + .parameter(id, "id") + .uri("/scene/" + id + "/_disable") + .responseType(SceneInfo.class) + .build(); + } + + /** + * 手动触发场景 + * + * @param id + * @return + */ + public static SimpleApiRequest executeScene(String id, Map data) { + return SimpleApiRequest + .builder() + .post() + .parameter(id, "id") + .body(data) + .uri("/scene/" + id + "/_execute") + .responseType(SceneInfo.class) + .build(); + } + + + /** + * 批量手动执行场景 + * @param request + * @return + */ + public static SimpleApiRequest batchExecute(ArrayList request) { + return SimpleApiRequest + .builder() + .post() + .body(request) + .uri("/scene/batch/_execute") + .responseType(Object.class) + .build(); + } + +} + + diff --git a/src/test/java/org/jetlinks/sdk/client/model/scene/request/TestScene.java b/src/test/java/org/jetlinks/sdk/client/model/scene/request/TestScene.java new file mode 100644 index 0000000..62fab25 --- /dev/null +++ b/src/test/java/org/jetlinks/sdk/client/model/scene/request/TestScene.java @@ -0,0 +1,147 @@ +package org.jetlinks.sdk.client.model.scene.request; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import org.hswebframework.web.api.crud.entity.QueryParamEntity; +import org.jetlinks.sdk.client.ApiClient; +import org.jetlinks.sdk.client.ClientConfig; +import org.jetlinks.sdk.client.WebApiClient; +import org.jetlinks.sdk.model.ApiResponse; +import org.jetlinks.sdk.model.PagerResult; +import org.jetlinks.sdk.model.scene.SceneRule; +import org.jetlinks.sdk.model.scene.Trigger; +import org.jetlinks.sdk.model.scene.info.SceneInfo; +import org.jetlinks.sdk.model.scene.request.SceneExecuteRequest; +import org.jetlinks.sdk.model.scene.request.SceneRequest; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * @author zyl + * @date 3/8/2023 + */ +public class TestScene { + + ClientConfig clientConfig = new ClientConfig( + "http://192.168.33.46:8844", + "w23y8dADCwPkRGnB", + "dH7eNKTNmca33YstE88HdYRz8x7RZiFt" + ); + ApiClient client = new WebApiClient(clientConfig); + + @Test + public void testQueryScene() { + QueryParamEntity queryParamEntity = new QueryParamEntity(); + queryParamEntity + .toQuery() + .doPaging(0, 12); + ApiResponse> response = client + .request(SceneRequest + .queryScene(queryParamEntity)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testCreateScene() { + SceneRule sceneRule = new SceneRule(); + sceneRule.setName("zyl-sdk测试"); + Trigger trigger = new Trigger(); + trigger.setType("device"); + sceneRule.setTrigger(trigger); + ApiResponse response = client + .request(SceneRequest.createScene(sceneRule)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testUpdateScene() { + SceneRule sceneRule = new SceneRule(); + sceneRule.setId("1687358937564729344"); + String id = "1687358937564729344"; + sceneRule.setName("zyl-99-sdk"); + Trigger trigger = new Trigger(); + trigger.setType("device"); + sceneRule.setTrigger(trigger); + ApiResponse response = client + .request(SceneRequest.updateScene(id, sceneRule)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testDeleteScene() { + String id = "1687358937564729344"; + ApiResponse response = client + .request(SceneRequest.deleteScene(id)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + + @Test + public void testGetSceneById() { + String id = "1665666998354030592"; + ApiResponse response = client + .request(SceneRequest.getSceneById(id)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testEnableScene() { + String id = "1687398810707316736"; + ApiResponse response = client + .request(SceneRequest.enableScene(id)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testDisableScene() { + String id = "1687398810707316736"; + ApiResponse response = client + .request(SceneRequest.disableScene(id)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testExecuteScene() { + long t = System.currentTimeMillis(); + Map data = new HashMap<>(); + data.put("_now", t); + data.put("_timestamp", t); + String id = "1688372205322260480"; + ApiResponse response = client + .request(SceneRequest.executeScene(id, data)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testBatchExecute() { + long t = System.currentTimeMillis(); + ArrayList requests = new ArrayList<>(); + + SceneExecuteRequest request1 = new SceneExecuteRequest(); + request1.setId("1688747848681672704"); + Map data1 = new HashMap<>(); + data1.put("_now", t); + data1.put("_timestamp", t); + request1.setContext(data1); + + + SceneExecuteRequest request2 = new SceneExecuteRequest(); + request2.setId("1688747457109839872"); + Map data2 = new HashMap<>(); + data2.put("_now", t); + data2.put("_timestamp", t); + request2.setContext(data2); + + requests.add(request1); + requests.add(request2); + + ApiResponse response = client + .request(SceneRequest.batchExecute(requests)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + +} From c5d2254d35b91581ae474a4bad2678b638df2029 Mon Sep 17 00:00:00 2001 From: 6WFG46AF <202176039@qq.com> Date: Fri, 18 Aug 2023 13:42:05 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/alarm/info/AlarmHistoryInfo.java | 64 +++++++++++++++++++ .../alarm/request/AlarmHistoryRequest.java | 32 ++++++++++ .../model/alarm/request/TestAlarmHistory.java | 41 ++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmHistoryInfo.java create mode 100644 src/main/java/org/jetlinks/sdk/model/alarm/request/AlarmHistoryRequest.java create mode 100644 src/test/java/org/jetlinks/sdk/client/model/alarm/request/TestAlarmHistory.java diff --git a/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmHistoryInfo.java b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmHistoryInfo.java new file mode 100644 index 0000000..a288fee --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmHistoryInfo.java @@ -0,0 +1,64 @@ +package org.jetlinks.sdk.model.alarm.info; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author zyl + * @date 7/8/2023 + */ +@Getter +@Setter +public class AlarmHistoryInfo implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "告警数据ID") + private String id; + + @Schema(description = "告警配置ID") + private String alarmConfigId; + + @Schema(description = "告警配置名称") + private String alarmConfigName; + + @Schema(description = "告警记录ID") + private String alarmRecordId; + + @Schema(description = "告警级别") + private int level; + + @Schema(description = "说明") + private String description; + + @Schema(description = "告警时间") + private long alarmTime; + + @Schema(description = "告警目标类型") + private String targetType; + + @Schema(description = "告警目标名称") + private String targetName; + + @Schema(description = "告警目标Id") + private String targetId; + + @Schema(description = "告警源类型") + private String sourceType; + + @Schema(description = "告警源Id") + private String sourceId; + + @Schema(description = "告警源名称") + private String sourceName; + + @Schema(description = "告警信息") + private String alarmInfo; + + @Schema(description = "绑定信息") + private List> bindings; +} diff --git a/src/main/java/org/jetlinks/sdk/model/alarm/request/AlarmHistoryRequest.java b/src/main/java/org/jetlinks/sdk/model/alarm/request/AlarmHistoryRequest.java new file mode 100644 index 0000000..0c795c2 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/alarm/request/AlarmHistoryRequest.java @@ -0,0 +1,32 @@ +package org.jetlinks.sdk.model.alarm.request; + +import org.hswebframework.web.api.crud.entity.QueryParamEntity; +import org.jetlinks.sdk.model.PagerResult; +import org.jetlinks.sdk.model.SimpleApiRequest; +import org.jetlinks.sdk.model.alarm.info.AlarmHistoryInfo; +import org.springframework.core.ResolvableType; + +/** + * @author zyl + * @date 8/8/2023 + */ +public class AlarmHistoryRequest { + + /** + * 告警历史查询 + * @param queryParam + * @return + */ + public static SimpleApiRequest> queryHistory(QueryParamEntity queryParam) { + return SimpleApiRequest + .>builder() + .post() + .body(queryParam) + .uri("/alarm/history/_query") + .responseType(ResolvableType.forClassWithGenerics( + PagerResult.class, + AlarmHistoryInfo.class + )) + .build(); + } +} diff --git a/src/test/java/org/jetlinks/sdk/client/model/alarm/request/TestAlarmHistory.java b/src/test/java/org/jetlinks/sdk/client/model/alarm/request/TestAlarmHistory.java new file mode 100644 index 0000000..c6aa7cf --- /dev/null +++ b/src/test/java/org/jetlinks/sdk/client/model/alarm/request/TestAlarmHistory.java @@ -0,0 +1,41 @@ +package org.jetlinks.sdk.client.model.alarm.request; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import org.hswebframework.web.api.crud.entity.QueryParamEntity; +import org.jetlinks.sdk.client.ApiClient; +import org.jetlinks.sdk.client.ClientConfig; +import org.jetlinks.sdk.client.WebApiClient; +import org.jetlinks.sdk.model.ApiResponse; +import org.jetlinks.sdk.model.PagerResult; +import org.jetlinks.sdk.model.alarm.info.AlarmHistoryInfo; +import org.jetlinks.sdk.model.alarm.request.AlarmHistoryRequest; +import org.junit.jupiter.api.Test; + +/** + * @author zyl + * @date 8/8/2023 + */ +public class TestAlarmHistory { + + + ClientConfig clientConfig = new ClientConfig( + "http://192.168.33.46:8844", + "w23y8dADCwPkRGnB", + "dH7eNKTNmca33YstE88HdYRz8x7RZiFt" + ); + + ApiClient client = new WebApiClient(clientConfig); + + @Test + public void testGetHistory() { + QueryParamEntity queryParam = new QueryParamEntity(); + queryParam + .toQuery() + .doPaging(0, 12); + ApiResponse> response = client + .request(AlarmHistoryRequest + .queryHistory(queryParam)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } +} From 5395ef20e1ab2afa165896d897912c9791feb21d Mon Sep 17 00:00:00 2001 From: 6WFG46AF <202176039@qq.com> Date: Fri, 18 Aug 2023 13:48:01 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdk/model/alarm/AlarmLevelInfo.java | 19 ++ .../model/alarm/info/AlarmConfigDetail.java | 82 +++++++ .../model/alarm/info/AlarmConfigEntity.java | 75 ++++++ .../model/alarm/info/AlarmLevelEntity.java | 33 +++ .../model/alarm/info/AlarmTargetTypeInfo.java | 16 ++ .../alarm/request/AlarmConfigRequest.java | 222 ++++++++++++++++++ .../model/alarm/request/TestAlarmConfig.java | 178 ++++++++++++++ 7 files changed, 625 insertions(+) create mode 100644 src/main/java/org/jetlinks/sdk/model/alarm/AlarmLevelInfo.java create mode 100644 src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmConfigDetail.java create mode 100644 src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmConfigEntity.java create mode 100644 src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmLevelEntity.java create mode 100644 src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmTargetTypeInfo.java create mode 100644 src/main/java/org/jetlinks/sdk/model/alarm/request/AlarmConfigRequest.java create mode 100644 src/test/java/org/jetlinks/sdk/client/model/alarm/request/TestAlarmConfig.java diff --git a/src/main/java/org/jetlinks/sdk/model/alarm/AlarmLevelInfo.java b/src/main/java/org/jetlinks/sdk/model/alarm/AlarmLevelInfo.java new file mode 100644 index 0000000..b0e365f --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/alarm/AlarmLevelInfo.java @@ -0,0 +1,19 @@ +package org.jetlinks.sdk.model.alarm; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +/** + * @author zyl + * @date 7/8/2023 + */ +@Getter +@Setter +public class AlarmLevelInfo { + @Schema(description = "级别") + private Integer level; + + @Schema(description = "名称") + private String title; +} diff --git a/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmConfigDetail.java b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmConfigDetail.java new file mode 100644 index 0000000..99f1266 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmConfigDetail.java @@ -0,0 +1,82 @@ +package org.jetlinks.sdk.model.alarm.info; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.sdk.model.EnumInfo; + +import javax.persistence.Column; +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @author zyl + * @date 7/8/2023 + */ +@Getter +@Setter +public class AlarmConfigDetail { + @Schema(description = "告警配置ID") + private String id; + + @Schema(description = "名称") + private String name; + + @Schema(description = "告警目标类型") + private String targetType; + + @Schema(description = "告警级别") + private Integer level; + + @Schema(description = "关联场景") + private List scene; + + @Schema(description = "状态") + private EnumInfo state; + + @Schema(description = "场景触发类型") + private String sceneTriggerType; + + @Schema(description = "说明") + private String description; + + @Schema( + description = "创建者ID(只读)" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private String creatorId; + + @Schema( + description = "创建时间(只读)" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private Long createTime; + + @Schema(description = "更新者ID", accessMode = Schema.AccessMode.READ_ONLY) + private String modifierId; + + @Schema(description = "更新时间") + private Long modifyTime; + + /** + * 场景联动信息 + */ + @Getter + @Setter + public static class SceneInfo { + @Schema(description = "场景联动ID") + private String id; + + @Column(nullable = false) + @Schema(description = "场景联动名称") + @NotBlank + private String name; + + @Schema(description = "触发器类型") + private String triggerType; + + @Schema(description = "状态") + private EnumInfo state; + } +} + diff --git a/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmConfigEntity.java b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmConfigEntity.java new file mode 100644 index 0000000..21f5d0e --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmConfigEntity.java @@ -0,0 +1,75 @@ +package org.jetlinks.sdk.model.alarm.info; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.hswebframework.ezorm.rdb.mapping.annotation.ColumnType; +import org.hswebframework.ezorm.rdb.mapping.annotation.Comment; +import org.hswebframework.ezorm.rdb.mapping.annotation.DefaultValue; +import org.hswebframework.ezorm.rdb.mapping.annotation.EnumCodec; +import org.jetlinks.sdk.model.EnumInfo; +import org.jetlinks.sdk.model.scene.Generators; + +import javax.persistence.Column; + +/** + * @author zyl + * @date 7/8/2023 + */ +@Getter +@Setter +@Comment("告警配置表") +public class AlarmConfigEntity { + @Schema(description = "名称") + private String name; + + @Schema(description = "告警目标类型") + private String targetType; + + @Schema(description = "告警级别") + private Integer level; + + @Schema(description = "关联场景名称") + @Deprecated + private String sceneName; + + @Schema(description = "关联场景Id") + @Deprecated + private String sceneId; + + @EnumCodec + @ColumnType(javaType = String.class) + @DefaultValue("enabled") + @Schema(description = "状态") + private EnumInfo state; + + @EnumCodec + @ColumnType(javaType = String.class) + @Schema(description = "场景触发类型") + @Deprecated + private EnumInfo sceneTriggerType; + + @Schema(description = "说明") + private String description; + + @Schema( + description = "创建者ID(只读)" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private String creatorId; + + @DefaultValue(generator = Generators.CURRENT_TIME) + @Schema( + description = "创建时间(只读)" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private Long createTime; + + @Schema(description = "更新者ID", accessMode = Schema.AccessMode.READ_ONLY) + private String modifierId; + + @Column + @DefaultValue(generator = Generators.CURRENT_TIME) + @Schema(description = "更新时间") + private Long modifyTime; +} diff --git a/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmLevelEntity.java b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmLevelEntity.java new file mode 100644 index 0000000..a5b91ae --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmLevelEntity.java @@ -0,0 +1,33 @@ +package org.jetlinks.sdk.model.alarm.info; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.hswebframework.ezorm.rdb.mapping.annotation.ColumnType; +import org.hswebframework.ezorm.rdb.mapping.annotation.Comment; +import org.hswebframework.ezorm.rdb.mapping.annotation.JsonCodec; +import org.jetlinks.sdk.model.alarm.AlarmLevelInfo; + +import java.sql.JDBCType; +import java.util.List; + +/** + * @author zyl + * @date 7/8/2023 + */ +@Getter +@Setter +@Comment("告警级别") +public class AlarmLevelEntity { + + @Schema(description = "名称") + private String name; + + @ColumnType(jdbcType = JDBCType.LONGVARCHAR) + @JsonCodec + @Schema(description = "配置信息") + private List levels; + + @Schema(description = "说明") + private String description; +} diff --git a/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmTargetTypeInfo.java b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmTargetTypeInfo.java new file mode 100644 index 0000000..7fe9b33 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmTargetTypeInfo.java @@ -0,0 +1,16 @@ +package org.jetlinks.sdk.model.alarm.info; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author zyl + * @date 8/8/2023 + */ +@Getter +@Setter +public class AlarmTargetTypeInfo { + private String id; + + private String name; +} diff --git a/src/main/java/org/jetlinks/sdk/model/alarm/request/AlarmConfigRequest.java b/src/main/java/org/jetlinks/sdk/model/alarm/request/AlarmConfigRequest.java new file mode 100644 index 0000000..e098ab1 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/alarm/request/AlarmConfigRequest.java @@ -0,0 +1,222 @@ +package org.jetlinks.sdk.model.alarm.request; + +import org.hswebframework.web.api.crud.entity.QueryParamEntity; +import org.jetlinks.sdk.model.PagerResult; +import org.jetlinks.sdk.model.SimpleApiRequest; +import org.jetlinks.sdk.model.alarm.AlarmLevelInfo; +import org.jetlinks.sdk.model.alarm.info.AlarmConfigDetail; +import org.jetlinks.sdk.model.alarm.info.AlarmConfigEntity; +import org.jetlinks.sdk.model.alarm.info.AlarmLevelEntity; +import org.jetlinks.sdk.model.alarm.info.AlarmTargetTypeInfo; +import org.springframework.core.ResolvableType; + +import java.util.ArrayList; + +/** + * @author zyl + * @date 7/8/2023 + */ +public class AlarmConfigRequest { + + /** + * 根据ID查询 + * + * @param id + * @return + */ + public static SimpleApiRequest getConfigById(String id) { + return SimpleApiRequest + .builder() + .get() + .parameter(id, "id") + .uri("/alarm/config/" + id) + .responseType(AlarmConfigEntity.class) + .build(); + } + + /** + * 启用告警配置 + * + * @param id + * @return + */ + public static SimpleApiRequest enable(String id) { + return SimpleApiRequest + .builder() + .post() + .parameter(id, "id") + .uri("/alarm/config/" + id + "/_enable") + .responseType(AlarmConfigEntity.class) + .build(); + } + + /** + * 禁用告警配置 + * + * @param id + * @return + */ + public static SimpleApiRequest disable(String id) { + return SimpleApiRequest + .builder() + .post() + .parameter(id, "id") + .uri("/alarm/config/" + id + "/_disable") + .responseType(AlarmConfigEntity.class) + .build(); + } + + /** + * 查询告警配置详情 + * + * @param query + * @return + */ + public static SimpleApiRequest> queryDetail(QueryParamEntity query) { + return SimpleApiRequest + .>builder() + .post() + .body(query) + .uri("/alarm/config/detail/_query") + .responseType(ResolvableType.forClassWithGenerics( + PagerResult.class, + AlarmConfigDetail.class + )) + .build(); + } + + /** + * 使用GET方式分页动态查询 + * + * @param query + * @return + */ + public static SimpleApiRequest> queryByGet(QueryParamEntity query) { + return SimpleApiRequest + .>builder() + .get() + .body(query) + .uri("/alarm/config/_query") + .responseType(ResolvableType.forClassWithGenerics( + PagerResult.class, + AlarmConfigEntity.class + )) + .build(); + } + + /** + * 使用POST方式分页动态查询 + * + * @param query + * @return + */ + public static SimpleApiRequest> queryByPost(QueryParamEntity query) { + return SimpleApiRequest + .>builder() + .post() + .body(query) + .uri("/alarm/config/_query") + .responseType(ResolvableType.forClassWithGenerics( + PagerResult.class, + AlarmConfigEntity.class + )) + .build(); + } + + /** + * 使用GET方式分页动态查询(不返回总数) + * + * @return + */ + public static SimpleApiRequest> getConfigNoPaging() { + return SimpleApiRequest + .>builder() + .get() + .uri("/alarm/config/_query/no-paging") + .responseType(ResolvableType.forClassWithGenerics( + ArrayList.class, + AlarmConfigEntity.class + )) + .build(); + } + + /** + * 使用POST方式分页动态查询(不返回总数) + * + * @return + */ + public static SimpleApiRequest> postConfigNoPaging(QueryParamEntity queryParamEntity) { + return SimpleApiRequest + .>builder() + .post() + .body(queryParamEntity) + .uri("/alarm/config/_query/no-paging") + .responseType(ResolvableType.forClassWithGenerics( + ArrayList.class, + AlarmConfigEntity.class + )) + .build(); + } + + /** + * 获取默认告警级别 + * @return + */ + public static SimpleApiRequest getLevel() { + return SimpleApiRequest + .builder() + .get() + .uri("/alarm/config/default/level") + .responseType(AlarmLevelEntity.class) + .build(); + } + + /** + * 保存默认告警级别 + * + * @param infos + * @return + */ + public static SimpleApiRequest saveDefaultLevel(ArrayList infos) { + return SimpleApiRequest + .builder() + .patch() + .body(infos) + .uri("/alarm/config/default/level") + .responseType(AlarmLevelEntity.class) + .build(); + } + + /** + * 使用POST方式查询总数 + * + * @param query + * @return + */ + public static SimpleApiRequest queryCountByPost(QueryParamEntity query) { + return SimpleApiRequest + .builder() + .post() + .body(query) + .uri("/alarm/config/_count") + .responseType(Integer.class) + .build(); + } + + /** + * 获取支持的告警目标类型 + * @return + */ + public static SimpleApiRequest> getTypeSupports() { + return SimpleApiRequest + .>builder() + .get() + .uri("/alarm/config/target-type/supports") + .responseType(ResolvableType.forClassWithGenerics( + ArrayList.class, + AlarmTargetTypeInfo.class + )) + .build(); + } + +} diff --git a/src/test/java/org/jetlinks/sdk/client/model/alarm/request/TestAlarmConfig.java b/src/test/java/org/jetlinks/sdk/client/model/alarm/request/TestAlarmConfig.java new file mode 100644 index 0000000..2e420f2 --- /dev/null +++ b/src/test/java/org/jetlinks/sdk/client/model/alarm/request/TestAlarmConfig.java @@ -0,0 +1,178 @@ +package org.jetlinks.sdk.client.model.alarm.request; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import org.hswebframework.web.api.crud.entity.QueryParamEntity; +import org.jetlinks.sdk.client.ApiClient; +import org.jetlinks.sdk.client.ClientConfig; +import org.jetlinks.sdk.client.WebApiClient; +import org.jetlinks.sdk.model.ApiResponse; +import org.jetlinks.sdk.model.PagerResult; +import org.jetlinks.sdk.model.alarm.AlarmLevelInfo; +import org.jetlinks.sdk.model.alarm.info.AlarmConfigDetail; +import org.jetlinks.sdk.model.alarm.info.AlarmConfigEntity; +import org.jetlinks.sdk.model.alarm.info.AlarmLevelEntity; +import org.jetlinks.sdk.model.alarm.info.AlarmTargetTypeInfo; +import org.jetlinks.sdk.model.alarm.request.AlarmConfigRequest; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +/** + * @author zyl + * @date 7/8/2023 + */ +public class TestAlarmConfig { + + ClientConfig clientConfig = new ClientConfig( + "http://192.168.33.46:8844", + "w23y8dADCwPkRGnB", + "dH7eNKTNmca33YstE88HdYRz8x7RZiFt" + ); + + ApiClient client = new WebApiClient(clientConfig); + + @Test + public void testGetConfigById() { + String id = "1688434323304239104"; + ApiResponse response = client + .request(AlarmConfigRequest.getConfigById(id)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testEnableAlarmConfig() { + String id = "1688434323304239104"; + ApiResponse response = client + .request(AlarmConfigRequest.enable(id)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testDisableAlarmConfig() { + String id = "1688434323304239104"; + ApiResponse response = client + .request(AlarmConfigRequest.disable(id)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void queryDetail() { + QueryParamEntity queryParamEntity = new QueryParamEntity(); + queryParamEntity + .toQuery() + .doPaging(0, 12); + ApiResponse> response = client + .request(AlarmConfigRequest + .queryDetail(queryParamEntity)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void queryByGet() { + QueryParamEntity queryParamEntity = new QueryParamEntity(); + queryParamEntity + .toQuery() + .doPaging(0, 12); + ApiResponse> response = client + .request(AlarmConfigRequest + .queryByGet(queryParamEntity)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void queryByPost() { + QueryParamEntity queryParamEntity = new QueryParamEntity(); + queryParamEntity + .toQuery() + .doPaging(0, 12); + ApiResponse> response = client + .request(AlarmConfigRequest + .queryByPost(queryParamEntity)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testGetNoPaging() { + ApiResponse> response = client + .request(AlarmConfigRequest + .getConfigNoPaging()); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testPostNoPaging() { + QueryParamEntity queryParamEntity = new QueryParamEntity(); + queryParamEntity + .toQuery() + .doPaging(0, 12); + ApiResponse> response = client + .request(AlarmConfigRequest + .postConfigNoPaging(queryParamEntity)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testGetLevel() { + ApiResponse response = client + .request(AlarmConfigRequest + .getLevel()); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testSaveDefaultLevel() { + ArrayList infos = new ArrayList<>(); + + AlarmLevelInfo info1 = new AlarmLevelInfo(); + info1.setLevel(1); + info1.setTitle("紧急报警"); + + AlarmLevelInfo info2 = new AlarmLevelInfo(); + info2.setLevel(2); + info2.setTitle("紧急"); + + AlarmLevelInfo info3 = new AlarmLevelInfo(); + info3.setLevel(3); + info3.setTitle("严重"); + + AlarmLevelInfo info4 = new AlarmLevelInfo(); + info4.setLevel(4); + info4.setTitle("正常"); + + AlarmLevelInfo info5 = new AlarmLevelInfo(); + info5.setLevel(5); + info5.setTitle("正常"); + + infos.add(info1); + infos.add(info2); + infos.add(info3); + infos.add(info4); + infos.add(info5); + + ApiResponse response = client + .request(AlarmConfigRequest + .saveDefaultLevel(infos)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testQueryCountByPost() { + QueryParamEntity queryParamEntity = new QueryParamEntity(); + queryParamEntity + .toQuery() + .doPaging(0, 12); + ApiResponse response = client + .request(AlarmConfigRequest + .queryCountByPost(queryParamEntity)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testGetTypeSupports() { + ApiResponse> response = client + .request(AlarmConfigRequest + .getTypeSupports()); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } +} From 18817d7a9530091ce0ece35cec26c15e73f7fc3e Mon Sep 17 00:00:00 2001 From: 6WFG46AF <202176039@qq.com> Date: Fri, 18 Aug 2023 13:49:17 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdk/model/alarm/AlarmHandleInfo.java | 42 ++++++ .../alarm/info/AlarmHandleHistoryEntity.java | 54 ++++++++ .../model/alarm/info/AlarmRecordEntity.java | 68 ++++++++++ .../alarm/request/AlarmRecordRequest.java | 123 ++++++++++++++++++ .../alarm/request/TestAlarmRecordRequest.java | 108 +++++++++++++++ 5 files changed, 395 insertions(+) create mode 100644 src/main/java/org/jetlinks/sdk/model/alarm/AlarmHandleInfo.java create mode 100644 src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmHandleHistoryEntity.java create mode 100644 src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmRecordEntity.java create mode 100644 src/main/java/org/jetlinks/sdk/model/alarm/request/AlarmRecordRequest.java create mode 100644 src/test/java/org/jetlinks/sdk/client/model/alarm/request/TestAlarmRecordRequest.java diff --git a/src/main/java/org/jetlinks/sdk/model/alarm/AlarmHandleInfo.java b/src/main/java/org/jetlinks/sdk/model/alarm/AlarmHandleInfo.java new file mode 100644 index 0000000..e9ca621 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/alarm/AlarmHandleInfo.java @@ -0,0 +1,42 @@ +package org.jetlinks.sdk.model.alarm; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.jetlinks.sdk.model.EnumInfo; + +import javax.validation.constraints.NotBlank; + +/** + * @author zyl + * @date 7/8/2023 + */ +@Getter +@Setter +public class AlarmHandleInfo { + @Schema(description = "告警记录ID") + @NotBlank + private String alarmRecordId; + + @Schema(description = "告警ID") + @NotBlank + private String alarmConfigId; + + @Schema(description = "告警时间") + @NotBlank + private Long alarmTime; + + @Schema(description = "处理说明") + private String describe; + + @Schema(description = "处理时间") + private Long handleTime; + + @NotBlank + @Schema(description = "处理类型") + private EnumInfo type; + + @Schema(description = "处理后的状态") + @NotBlank + private EnumInfo state; +} diff --git a/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmHandleHistoryEntity.java b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmHandleHistoryEntity.java new file mode 100644 index 0000000..78f8240 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmHandleHistoryEntity.java @@ -0,0 +1,54 @@ +package org.jetlinks.sdk.model.alarm.info; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.hswebframework.ezorm.rdb.mapping.annotation.ColumnType; +import org.hswebframework.ezorm.rdb.mapping.annotation.Comment; +import org.hswebframework.ezorm.rdb.mapping.annotation.DefaultValue; +import org.hswebframework.ezorm.rdb.mapping.annotation.EnumCodec; +import org.jetlinks.sdk.model.EnumInfo; +import org.jetlinks.sdk.model.scene.Generators; + +/** + * @author zyl + * @date 7/8/2023 + */ +@Getter +@Setter +@Comment("告警处理记录") +public class AlarmHandleHistoryEntity { + + @Schema(description = "告警配置ID") + private String alarmId; + + @Schema(description = "告警记录Id") + private String alarmRecordId; + + @Schema(description = "告警处理类型") + @EnumCodec + @ColumnType(javaType = String.class) + private EnumInfo handleType; + + @Schema(description = "说明") + private String description; + + @Schema(description = "处理时间") + private Long handleTime; + + @Schema(description = "告警时间") + private Long alarmTime; + + @Schema( + description = "创建者ID(只读)" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private String creatorId; + + @DefaultValue(generator = Generators.CURRENT_TIME) + @Schema( + description = "创建时间(只读)" + , accessMode = Schema.AccessMode.READ_ONLY + ) + private Long createTime; +} diff --git a/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmRecordEntity.java b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmRecordEntity.java new file mode 100644 index 0000000..6b53918 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/alarm/info/AlarmRecordEntity.java @@ -0,0 +1,68 @@ +package org.jetlinks.sdk.model.alarm.info; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import org.hswebframework.ezorm.rdb.mapping.annotation.ColumnType; +import org.hswebframework.ezorm.rdb.mapping.annotation.Comment; +import org.hswebframework.ezorm.rdb.mapping.annotation.DefaultValue; +import org.hswebframework.ezorm.rdb.mapping.annotation.EnumCodec; +import org.jetlinks.sdk.model.EnumInfo; + +import javax.persistence.Column; + +/** + * @author zyl + * @date 7/8/2023 + */ +@Getter +@Setter +@Comment("告警记录") +public class AlarmRecordEntity { + + @Schema(description = "告警配置ID") + private String alarmConfigId; + + @Schema(description = "告警配置名称") + private String alarmName; + + @Schema(description = "告警目标类型") + private String targetType; + + @Schema(description = "告警目标Id") + private String targetId; + + @Schema(description = "告警目标Key") + private String targetKey; + + @Schema(description = "告警目标名称") + private String targetName; + + @Schema(description = "告警源类型") + private String sourceType; + + @Schema(description = "告警源Id") + private String sourceId; + + @Schema(description = "告警源名称") + private String sourceName; + + @Schema(description = "最近一次告警时间") + private Long alarmTime; + + @Schema(description = "处理时间") + private Long handleTime; + + @Schema(description = "告警级别") + private Integer level; + + @Schema(description = "告警记录状态") + @EnumCodec + @ColumnType(javaType = String.class) + @DefaultValue("normal") + private EnumInfo state; + + @Column + @Schema(description = "说明") + private String description; +} diff --git a/src/main/java/org/jetlinks/sdk/model/alarm/request/AlarmRecordRequest.java b/src/main/java/org/jetlinks/sdk/model/alarm/request/AlarmRecordRequest.java new file mode 100644 index 0000000..409bea6 --- /dev/null +++ b/src/main/java/org/jetlinks/sdk/model/alarm/request/AlarmRecordRequest.java @@ -0,0 +1,123 @@ +package org.jetlinks.sdk.model.alarm.request; + +import org.hswebframework.web.api.crud.entity.QueryParamEntity; +import org.jetlinks.sdk.model.PagerResult; +import org.jetlinks.sdk.model.SimpleApiRequest; +import org.jetlinks.sdk.model.alarm.AlarmHandleInfo; +import org.jetlinks.sdk.model.alarm.info.AlarmHandleHistoryEntity; +import org.jetlinks.sdk.model.alarm.info.AlarmRecordEntity; +import org.springframework.core.ResolvableType; + +import java.util.ArrayList; + +/** + * @author zyl + * @date 7/8/2023 + */ +public class AlarmRecordRequest { + + /** + * 根据ID查询 + * + * @param id + * @return + */ + public static SimpleApiRequest getConfigById(String id) { + return SimpleApiRequest + .builder() + .get() + .parameter(id, "id") + .uri("/alarm/record/" + id) + .responseType(AlarmRecordEntity.class) + .build(); + } + + /** + * 告警处理历史查询 + * + * @param queryParamEntity + * @return + */ + public static SimpleApiRequest> PostHandleHistory(QueryParamEntity queryParamEntity) { + return SimpleApiRequest + .>builder() + .post() + .body(queryParamEntity) + .uri("/alarm/record/handle-history/_query") + .responseType(ResolvableType.forClassWithGenerics( + PagerResult.class, + AlarmHandleHistoryEntity.class + )) + .build(); + } + + /** + * 使用GET方式分页动态查询告警记录 + * + * @return + */ + public static SimpleApiRequest> queryHandleHistoryByGet() { + return SimpleApiRequest + .>builder() + .get() + .uri("/alarm/record/_query") + .responseType(ResolvableType.forClassWithGenerics( + PagerResult.class, + AlarmRecordEntity.class + )) + .build(); + } + + /** + * 使用POST方式分页动态查询告警记录 + * + * @param queryParamEntity + * @return + */ + public static SimpleApiRequest> queryHandleHistoryByPost(QueryParamEntity queryParamEntity) { + return SimpleApiRequest + .>builder() + .post() + .body(queryParamEntity) + .uri("/alarm/record/_query") + .responseType(ResolvableType.forClassWithGenerics( + PagerResult.class, + AlarmRecordEntity.class + )) + .build(); + } + + /** + * 使用GET方式分页动态查询(不返回总数) + * + * @return + */ + public static SimpleApiRequest> queryHandleHistoryByGetNoPaging() { + return SimpleApiRequest + .>builder() + .get() + .uri("/alarm/record/_query/no-paging") + .responseType(ResolvableType.forClassWithGenerics( + ArrayList.class, + AlarmRecordEntity.class + )) + .build(); + } + + + /** + * 处理告警 + * + * @param alarmHandleInfo + * @return + */ + public static SimpleApiRequest handleAlarm(AlarmHandleInfo alarmHandleInfo) { + return SimpleApiRequest + .builder() + .post() + .body(alarmHandleInfo) + .uri("/alarm/record/_handle") + .responseType(Object.class) + .build(); + } +} diff --git a/src/test/java/org/jetlinks/sdk/client/model/alarm/request/TestAlarmRecordRequest.java b/src/test/java/org/jetlinks/sdk/client/model/alarm/request/TestAlarmRecordRequest.java new file mode 100644 index 0000000..c5c07e8 --- /dev/null +++ b/src/test/java/org/jetlinks/sdk/client/model/alarm/request/TestAlarmRecordRequest.java @@ -0,0 +1,108 @@ +package org.jetlinks.sdk.client.model.alarm.request; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import org.hswebframework.web.api.crud.entity.QueryParamEntity; +import org.jetlinks.sdk.client.ApiClient; +import org.jetlinks.sdk.client.ClientConfig; +import org.jetlinks.sdk.client.WebApiClient; +import org.jetlinks.sdk.model.ApiResponse; +import org.jetlinks.sdk.model.EnumInfo; +import org.jetlinks.sdk.model.PagerResult; +import org.jetlinks.sdk.model.alarm.AlarmHandleInfo; +import org.jetlinks.sdk.model.alarm.info.AlarmHandleHistoryEntity; +import org.jetlinks.sdk.model.alarm.info.AlarmRecordEntity; +import org.jetlinks.sdk.model.alarm.request.AlarmRecordRequest; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +/** + * @author zyl + * @date 7/8/2023 + */ +public class TestAlarmRecordRequest { + + + ClientConfig clientConfig = new ClientConfig( + "http://192.168.33.46:8844", + "w23y8dADCwPkRGnB", + "dH7eNKTNmca33YstE88HdYRz8x7RZiFt" + ); + + ApiClient client = new WebApiClient(clientConfig); + + @Test + public void testGetConfigById() { + String id = "a3f9fe9c15505703ef657c2be4245371"; + ApiResponse response = client + .request(AlarmRecordRequest.getConfigById(id)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testPostHandleHistory() { + QueryParamEntity queryParamEntity = new QueryParamEntity(); + queryParamEntity + .toQuery() + .doPaging(0, 12); + ApiResponse> response = client + .request(AlarmRecordRequest + .PostHandleHistory(queryParamEntity)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testQueryHandleHistoryByGet() { + ApiResponse> response = client + .request(AlarmRecordRequest + .queryHandleHistoryByGet()); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testQueryHandleHistoryByPost() { + QueryParamEntity queryParamEntity = new QueryParamEntity(); + queryParamEntity + .toQuery() + .doPaging(0, 12); + ApiResponse> response = client + .request(AlarmRecordRequest + .queryHandleHistoryByPost(queryParamEntity)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + @Test + public void testQueryHandleHistoryByGetNoPaging() { + ApiResponse> response = client + .request(AlarmRecordRequest + .queryHandleHistoryByGetNoPaging()); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + + + @Test + public void testHandleAlarm() { + AlarmHandleInfo info = new AlarmHandleInfo(); + info.setAlarmRecordId("a3f9fe9c15505703ef657c2be4245371"); + info.setAlarmConfigId("1688434323304239104"); + + long t = System.currentTimeMillis(); + info.setAlarmTime(t); + + EnumInfo enumInfo1 = new EnumInfo<>(); + enumInfo1.setValue("user"); + info.setType(enumInfo1); + + EnumInfo enumInfo2 = new EnumInfo<>(); + enumInfo2.setValue("normal"); + info.setState(enumInfo2); + + info.setDescribe("test-zyl1"); + + ApiResponse response = client + .request(AlarmRecordRequest.handleAlarm(info)); + System.out.println(JSON.toJSONString(response, SerializerFeature.PrettyFormat)); + } + +} From 308b7db395205d4d66a8336e975a1de5e2a600c2 Mon Sep 17 00:00:00 2001 From: 6WFG46AF <202176039@qq.com> Date: Fri, 18 Aug 2023 13:54:02 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0put=E5=92=8Cdelete?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jetlinks/sdk/model/SimpleApiRequest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/org/jetlinks/sdk/model/SimpleApiRequest.java b/src/main/java/org/jetlinks/sdk/model/SimpleApiRequest.java index dcc6932..0669ac4 100644 --- a/src/main/java/org/jetlinks/sdk/model/SimpleApiRequest.java +++ b/src/main/java/org/jetlinks/sdk/model/SimpleApiRequest.java @@ -81,6 +81,14 @@ public DefaultApiRequestBuilder patch() { return method(HttpMethod.PATCH); } + public DefaultApiRequestBuilder put() { + return method(HttpMethod.PUT); + } + + public DefaultApiRequestBuilder delete() { + return method(HttpMethod.DELETE); + } + public DefaultApiRequestBuilder method(HttpMethod method) { this.method = method; return this;