package com.isu.gaswellwatch.vo.command; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.isu.gaswellwatch.dto.modbus.ModbusCommandDto; import com.isu.gaswellwatch.vo.command.etc.PlungerTimer; import com.isu.gaswellwatch.vo.command.etc.SensorDelay; import com.isu.gaswellwatch.vo.command.knpcv1.mode.*; import com.isu.gaswellwatch.vo.command.scss.ControlMode; import com.isu.gaswellwatch.vo.command.scss.PlungerLogicMode; import com.isu.gaswellwatch.vo.command.scss.SimpleLogicMode; import com.isu.gaswellwatch.vo.command.scss.SystemInfo; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; import org.apache.commons.lang3.StringUtils; import java.io.Serial; import java.io.Serializable; import java.security.InvalidParameterException; import java.util.Collection; import java.util.Objects; /** * @author 王仕龙 * 2024/11/26 19:59 */ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "code") @JsonSubTypes(value = { @JsonSubTypes.Type(value = TimerMode.class, name = Command.KNPCV1_RUN_TIMER), @JsonSubTypes.Type(value = TimingMode.class, name = Command.KNPCV1_RUN_TIMING), @JsonSubTypes.Type(value = ManualMode.class, name = Command.KNPCV1_RUN_MANUAL), @JsonSubTypes.Type(value = PlungerMode.class, name = Command.KNPCV1_RUN_PLUNGER), @JsonSubTypes.Type(value = PressureMode.class, name = Command.KNPCV1_RUN_PRESSURE), @JsonSubTypes.Type(value = TimePressureMode.class, name = Command.KNPCV1_RUN_TIME_PRESSURE), @JsonSubTypes.Type(value = SensorDelay.class, name = Command.ETC_SENSOR_DELAY), @JsonSubTypes.Type(value = PlungerTimer.class, name = Command.ETC_PLUNGER_TIMER), @JsonSubTypes.Type(value = SystemInfo.class, name = Command.SCSS_SYSTEM_INFO), @JsonSubTypes.Type(value = ControlMode.class, name = Command.SCSS_CONTROL_MODE), @JsonSubTypes.Type(value = SimpleLogicMode.class, name = Command.SCSS_SIMPLE_LOGIC_MODE), @JsonSubTypes.Type(value = PlungerLogicMode.class, name = Command.SCSS_PLUNGER_LOGIC_MODE), @JsonSubTypes.Type(value = com.isu.gaswellwatch.vo.command.etc.TurnOn.class, name = Command.ETC_TURN_ON_THE_WELL), @JsonSubTypes.Type(value = com.isu.gaswellwatch.vo.command.etc.TurnOff.class, name = Command.ETC_TURN_OFF_THE_WELL), @JsonSubTypes.Type(value = com.isu.gaswellwatch.vo.command.scss.TurnOn.class, name = Command.SCSS_TURN_ON_THE_WELL), @JsonSubTypes.Type(value = com.isu.gaswellwatch.vo.command.scss.TurnOff.class, name = Command.SCSS_TURN_OFF_THE_WELL), @JsonSubTypes.Type(value = com.isu.gaswellwatch.vo.command.knpcv1.TurnOn.class, name = Command.KNPCV1_TURN_ON_THE_WELL), @JsonSubTypes.Type(value = com.isu.gaswellwatch.vo.command.knpcv1.TurnOff.class, name = Command.KNPCV1_TURN_OFF_THE_WELL), }) @Getter @Setter @SuperBuilder @NoArgsConstructor @AllArgsConstructor public abstract class Command implements Serializable { @Serial private static final long serialVersionUID = -2590497444442160271L; /* 点表类型:KNPCV1 start */ /* 开关井 */ public static final String KNPCV1_TURN_ON_THE_WELL = "KNPCV1.TURN_ON_THE_WELL"; public static final String KNPCV1_TURN_OFF_THE_WELL = "KNPCV1.TURN_OFF_THE_WELL"; /* 运行模式*/ public static final String KNPCV1_RUN_TIMER = "KNPCV1.RUN.TIMER"; public static final String KNPCV1_RUN_TIMING = "KNPCV1.RUN.TIMING"; public static final String KNPCV1_RUN_MANUAL = "KNPCV1.RUN.MANUAL"; public static final String KNPCV1_RUN_PLUNGER = "KNPCV1.RUN.PLUNGER"; public static final String KNPCV1_RUN_PRESSURE = "KNPCV1.RUN.PRESSURE"; public static final String KNPCV1_RUN_TIME_PRESSURE = "KNPCV1.RUN.TIME_PRESSURE"; /* 点表类型:KNPCV1 end */ /* 点表类型:SCSS start */ /* 系统基本信息 */ public static final String SCSS_SYSTEM_INFO = "SCSS.SYSTEM_INFO"; /* 开关井 */ public static final String SCSS_TURN_ON_THE_WELL = "SCSS.TURN_ON_THE_WELL"; public static final String SCSS_TURN_OFF_THE_WELL = "SCSS.TURN_OFF_THE_WELL"; /* 模式指令 */ public static final String SCSS_CONTROL_MODE = "SCSS.CONTROL_MODE"; public static final String SCSS_SIMPLE_LOGIC_MODE = "SCSS.SIMPLE_LOGIC_MODE"; public static final String SCSS_PLUNGER_LOGIC_MODE = "SCSS.PLUNGER_LOGIC_MODE"; /* 点表类型:SCSS end */ /* 点表类型:ETC start */ /* 开关井 */ public static final String ETC_TURN_ON_THE_WELL = "ETC.TURN_ON_THE_WELL"; public static final String ETC_TURN_OFF_THE_WELL = "ETC.TURN_OFF_THE_WELL"; /* 模式指令*/ public static final String ETC_SENSOR_DELAY = "ETC.SENSOR_DELAY"; public static final String ETC_PLUNGER_TIMER = "ETC.PLUNGER_TIMER"; /* 点表类型:ETC end */ @NotBlank(message = "指令编码不能为空") private String code; @NotNull(message = "下发设备标识不能为空") private Long deviceId; public Collection buildModbusCommand() { if (!this.validate()) { throw new InvalidParameterException("Invalid command"); } return this.builderModbusCommand(); } public boolean validate() { return Objects.nonNull(this.deviceId) && StringUtils.isNotBlank(this.code); } protected abstract Collection builderModbusCommand(); }