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.*;
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.math.BigDecimal;
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 = CasingMode.class, name = Command.SCSS_CASING_MODE),
@JsonSubTypes.Type(value = SamplingInterval.class, name = Command.SCSS_SAMPLING_INTERVAL_MODE),
@JsonSubTypes.Type(value = TimeMode.class, name = Command.SCSS_TIME_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";
/* 时间模式 */
public static final String SCSS_TIME_MODE = "SCSS.TIME_MODE";
/* 套压模式 */
public static final String SCSS_CASING_MODE = "SCSS.CASING_MODE";
/* 采样间隔 */
public static final String SCSS_SAMPLING_INTERVAL_MODE = "SCSS.SAMPLING_INTERVAL";
/* 点表类型: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 */
public static final BigDecimal ONE_HUNDRED = BigDecimal.valueOf(100);
public static final BigDecimal ONE_THOUSAND = BigDecimal.valueOf(1000);
@NotBlank(message = "指令编码不能为空")
private String code;
@NotNull(message = "下发设备标识不能为空")
private Long deviceId;
public final 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();
}