wuzeyu
2024-10-19 819758b787fbe86fae05635ae10561468639446c
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV
10个文件已修改
2个文件已添加
279 ■■■■ 已修改文件
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmOpenCloseValveLastMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoUnclosedValve.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmCommandHistoryMapper.xml 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmOpenCloseValveLastMapper.xml 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/inspect/InspectCtrl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/inspect/InspectSv.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/dto/deleteUnclosedParam.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/CommandSv.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/deleteUnclosedParam.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmOpenCloseValveLastMapper.java
@@ -4,6 +4,7 @@
import com.dy.pipIrrGlobal.pojoRm.RmOpenCloseValveLast;
import com.dy.pipIrrGlobal.voRm.VoOpenCloseValve;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
@@ -98,4 +99,12 @@
     * @return
     */
    Integer getCountByCloseType(Map<?, ?> params);
    /**
     * 为指定(阀控器地址、水卡编号、无关阀记录)开关阀最新记录添加关阀时间,使之不在未关阀记录中显示
     * @param rtuAddr
     * @param icCardNo
     * @return
     */
    Integer addCloseTime(@Param("rtuAddr") String rtuAddr, @Param("icCardNo")String icCardNo);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoUnclosedValve.java
@@ -1,6 +1,7 @@
package com.dy.pipIrrGlobal.voRm;
import com.dy.common.po.BaseEntity;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.Data;
/**
@@ -11,22 +12,46 @@
 */
@Data
@JsonPropertyOrder({"intakeNum", "isOnLine", "rtuAddr", "vcNum", "orderNo", "state", "planned"})
public class VoUnclosedValve implements BaseEntity {
    private static final long serialVersionUID = 202405241634001L;
    //private String commandCode;
    /**
     * 取水口编号
     */
    private String intakeNum;
    /**
     * 是否在线
     */
    private Boolean isOnLine;
    /**
     * 阀控器地址
     */
    private String rtuAddr;
    /**
     * 虚拟卡编号
     */
    private String vcNum;
    /**
     * 订单号
     */
    private String orderNo;
    /**
     * 状态
     */
    private String state;
    /**
     * 是否计划性开阀
     */
    private Boolean planned;
    //private Date openTime;
}
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmCommandHistoryMapper.xml
@@ -197,55 +197,29 @@
    <!--根据操作员ID获取未关阀记录(包含在线情况)-->
    <select id="getUnclosedValves" resultType="com.dy.pipIrrGlobal.voRm.VoUnclosedValve">
        SELECT inta.name                  AS intakeNum,
               rtus.isOnLine,
               com.rtu_addr               AS rtuAddr,
               com.param ->> '$.icCardNo' AS vcNum,
               (SELECT param ->> '$.orderNo' AS orderNo
        SELECT
            inta.name AS intakeNum,
            rtus.isOnLine,
            com.rtu_addr AS rtuAddr,
            com.param ->> '$.icCardNo' AS vcNum,
            (
                SELECT param ->> '$.orderNo' AS orderNo
                FROM rm_command_history
                WHERE rtu_addr = com.rtu_addr
                ORDER BY send_time desc
                LIMIT 0,1)                AS orderNo,
               'toClose'                  AS state
                LIMIT 0,1
            ) AS orderNo,
            'toClose'                  AS state,
            CASE
                WHEN com.command_code = 'A1' OR com.command_code = 'A2' THEN 0
                ELSE 0
            END AS planned,
            com.send_time AS sendTime
        FROM rm_command_history com
            INNER JOIN pr_controller con ON com.rtu_addr = con.rtuAddr
            INNER JOIN pr_intake inta ON con.intakeId = inta.id
            INNER JOIN JSON_TABLE(
        <!--'[{"rtuAddr":"37142501020100215","isOnLine":true},{"rtuAddr":"4000004","isOnLine":true},{"rtuAddr":"dy20240325","isOnLine":false}]',-->
        #{onLineMap},
        '$[*]' COLUMNS (
            rtuAddr VARCHAR(20) PATH '$.rtuAddr',
            isOnLine BOOLEAN PATH '$.isOnLine'
            )
            ) rtus ON com.rtu_addr = rtus.rtuAddr
        <where>
            AND (com.command_code = '92' OR com.command_code = 'A2' OR com.command_code = '97')
                  AND com.operator = #{operator}
                  AND NOT EXISTS(
                    SELECT *
                    FROM rm_command_history
                    WHERE (result IS NULL OR result = 1)
                      AND (command_code = '93' OR command_code = 'A3' OR command_code = '98')
                      AND param ->> '$.orderNo' = com.param ->> '$.orderNo'
                )
        </where>
        GROUP BY inta.name, rtus.isOnLine, com.rtu_addr, com.param ->> '$.icCardNo'
        UNION ALL
        SELECT inta.name                  AS intakeNum,
               rtus.isOnLine,
               com.rtu_addr               AS rtuAddr,
               com.param ->> '$.icCardNo' AS vcNum,
               (SELECT param ->> '$.orderNo' AS orderNo
                FROM rm_command_history
                WHERE rtu_addr = com.rtu_addr
                ORDER BY send_time desc
                LIMIT 0,1)                AS orderNo,
               'toCancel'                 AS state
        FROM rm_command_history com
                 INNER JOIN pr_intake inta ON inta.id = com.intake_id
                 INNER JOIN JSON_TABLE(
            LEFT JOIN JSON_TABLE(
<!--                '[{"rtuAddr":"620201000030","isOnLine":true}]',-->
                #{onLineMap},
                '$[*]' COLUMNS (
                    rtuAddr VARCHAR(20) PATH '$.rtuAddr',
@@ -253,14 +227,18 @@
                    )
            ) rtus ON com.rtu_addr = rtus.rtuAddr
        <where>
            AND (command_code = 'A1' OR command_code = 'A2')
            AND com.operator = #{operator}
                  AND DATE_FORMAT(
                              CONCAT(com.param ->> '$.year', '-', com.param ->> '$.month', '-', com.param ->> '$.day',
                                     ' ',
                                     com.param ->> '$.hour', ':', com.param ->> '$.minute', ':', '0'),
                              '%Y-%m-%d %H:%i:%S') > NOW()
            AND (com.protocol = 'p206V1_0_1' AND (com.command_code = '92' OR com.command_code = '97' OR com.command_code = '99' OR com.command_code = 'A0' OR com.command_code = 'A1' OR com.command_code = 'A2'))
            AND (
                SELECT cl_dt FROM rm_open_close_valve_last
                WHERE rtu_addr = com.rtu_addr AND op_ic_card_no = com.param ->> '$.icCardNo'
                ORDER BY op_dt DESC
                LIMIT 1
            ) IS NULL
        </where>
        GROUP BY inta.name, rtus.isOnLine, com.rtu_addr, com.param ->> '$.icCardNo', com.command_code, com.send_time
        ORDER BY com.send_time DESC
        LIMIT 1
    </select>
    <!--根据取水口ID获取该取水口未关阀参数-->
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmOpenCloseValveLastMapper.xml
@@ -473,10 +473,10 @@
                AND oh.rtu_addr LIKE CONCAT('%', #{rtuAddr}, '%')
            </if>
            <if test="timeStart_open != null and timeStart_open != '' and timeStop_open != null and timeStop_open != ''">
                AND oh.op_dt BETWEEN #{timeStart_open} AND #{timeStop_open}
                AND oh.open_dt BETWEEN #{timeStart_open} AND #{timeStop_open}
            </if>
            <if test="timeStart_close != null and timeStart_close != '' and timeStop_close != null and timeStop_close != ''">
                AND oh.cl_dt BETWEEN #{timeStart_close} AND #{timeStop_close}
                AND oh.close_dt BETWEEN #{timeStart_close} AND #{timeStop_close}
            </if>
        </where>
    </select>
@@ -540,10 +540,10 @@
                AND oh.rtu_addr LIKE CONCAT('%', #{rtuAddr}, '%')
            </if>
            <if test="timeStart_open != null and timeStart_open != '' and timeStop_open != null and timeStop_open != ''">
                AND oh.op_dt BETWEEN #{timeStart_open} AND #{timeStop_open}
                AND oh.open_dt BETWEEN #{timeStart_open} AND #{timeStop_open}
            </if>
            <if test="timeStart_close != null and timeStart_close != '' and timeStop_close != null and timeStop_close != ''">
                AND oh.cl_dt BETWEEN #{timeStart_close} AND #{timeStop_close}
                AND oh.close_dt BETWEEN #{timeStart_close} AND #{timeStop_close}
            </if>
        </where>
        ORDER BY oh.op_dt DESC
@@ -581,4 +581,11 @@
            </if>
        </where>
    </select>
    <!--为指定(阀控器地址、水卡编号、无关阀记录)开关阀最新记录添加关阀时间,使之不在未关阀记录中显示-->
    <update id="addCloseTime">
        UPDATE rm_open_close_valve_last
        SET cl_dt = NOW()
        WHERE rtu_addr = #{rtuAddr} AND op_ic_card_no = #{icCardNo} AND cl_dt IS NULL
    </update>
</mapper>
pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/inspect/InspectCtrl.java
@@ -75,7 +75,7 @@
                    // 添加巡检记录
                    OpeInspect opeInspect = new OpeInspect();
                    opeInspect.setInspectorId(inspects.getInspectorId());
                    opeInspect.setInspectorId(inspectorId);
                    if(startTime != null) {
                        opeInspect.setStartTime(startTime);
                    }
@@ -97,7 +97,23 @@
                    }
                }else {
                    // 该巡检已上传过记录,续传
                    if(stopTime != null) {
                        OpeInspect inspect = new OpeInspect();
                        inspect.setId(inspectId);
                        inspect.setStopTime(stopTime);
                        inspectSv.updateInspect(inspect);
                    }
                    if(tracks != null && tracks.size() > 0) {
                        for (int j = 0; j < tracks.size(); j++) {
                            tracks.get(j).setId(idLongGenerator.generate());
                            tracks.get(j).setInspectId(inspectId);
                        }
                        Integer rec = inspectSv.insertTracks(tracks);
                        if(rec == null || rec == 0) {
                            return BaseResponseUtils.buildErrorMsg("巡检轨迹添加失败");
                        }
                    }
                }
            }
            return BaseResponseUtils.buildSuccess() ;
pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/inspect/InspectSv.java
@@ -37,6 +37,15 @@
    }
    /**
     * 修改巡检记录
     * @param po
     * @return
     */
    public Integer updateInspect(OpeInspect po) {
        return opeInspectMapper.updateByPrimaryKeySelective(po);
    }
    /**
     * 批量添加巡检轨迹
     * @param list
     * @return
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java
@@ -11,6 +11,7 @@
import com.dy.pipIrrGlobal.daoPr.PrIntakeVcMapper;
import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper;
import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper;
import com.dy.pipIrrGlobal.daoRm.RmOpenCloseValveLastMapper;
import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper;
import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
@@ -50,6 +51,7 @@
    private final PrWaterPriceMapper prWaterPriceMapper;
    private final PrIntakeVcMapper prIntakeVcMapper;
    private final SeClientCardMapper seClientCardMapper;
    private RmOpenCloseValveLastMapper rmOpenCloseValveLastMapper;
    /**
     * pro_mw:属性
@@ -60,8 +62,9 @@
    private String pro_mw = "mw";
    private String key_mw = "comSendUrl";
    @Autowired
    public CommandSv(RmCommandHistoryMapper rmCommandHistoryMapper, SeVirtualCardMapper seVirtualCardMapper, PrIntakeMapper prIntakeMapper, PrWaterPriceMapper prWaterPriceMapper, PrIntakeVcMapper prIntakeVcMapper, SeClientCardMapper seClientCardMapper, Environment env) {
    public CommandSv(RmCommandHistoryMapper rmCommandHistoryMapper,RmOpenCloseValveLastMapper rmOpenCloseValveLastMapper, SeVirtualCardMapper seVirtualCardMapper, PrIntakeMapper prIntakeMapper, PrWaterPriceMapper prWaterPriceMapper, PrIntakeVcMapper prIntakeVcMapper, SeClientCardMapper seClientCardMapper, Environment env) {
        this.rmCommandHistoryMapper = rmCommandHistoryMapper;
        this.rmOpenCloseValveLastMapper = rmOpenCloseValveLastMapper;
        this.seVirtualCardMapper = seVirtualCardMapper;
        this.prIntakeMapper = prIntakeMapper;
        this.prWaterPriceMapper = prWaterPriceMapper;
@@ -145,6 +148,16 @@
    }
    /**
     * 为指定(阀控器地址、水卡编号、无关阀记录)开关阀最新记录添加关阀时间,使之不在未关阀记录中显示
     * @param rtuAddr
     * @param icCardNo
     * @return
     */
    public Integer addClostTime(String rtuAddr, String icCardNo) {
        return rmOpenCloseValveLastMapper.addCloseTime(rtuAddr, icCardNo);
    }
    /**
     * 修改命令日志记录,回调报错时将命令记录的执行结果改为失败
     * @param po
     * @return
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java
@@ -23,6 +23,7 @@
import com.dy.pipIrrRemote.common.CommandSv;
import com.dy.pipIrrRemote.common.dto.*;
import com.dy.pipIrrRemote.result.RemoteResultCode;
import com.dy.pipIrrRemote.valve.dto.deleteUnclosedParam;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
@@ -1010,6 +1011,24 @@
    }
    /**
     * 强制因此未关阀记录:为指定(阀控器地址、水卡编号、无关阀记录)开关阀最新记录添加关阀时间,使之不在未关阀记录中显示
     * @param po
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "deleteUnclosed", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    @SsoAop()
    public BaseResponse<Boolean> deleteUnclosed(@RequestBody @Valid deleteUnclosedParam po, BindingResult bindingResult) {
        if(bindingResult != null && bindingResult.hasErrors()){
            return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        commandSv.addClostTime(po.getRtuAddr(), po.getVcNum());
        return BaseResponseUtils.buildSuccess();
    }
    /**
     * 平台远程充值
     * @param po
     * @param bindingResult
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/dto/deleteUnclosedParam.java
New file
@@ -0,0 +1,28 @@
package com.dy.pipIrrRemote.valve.dto;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
 * @author ZhuBaoMin
 * @date 2024-10-19 10:48
 * @LastEditTime 2024-10-19 10:48
 * @Description 删除未关阀记录传入参数
 */
@Data
public class deleteUnclosedParam {
    public static final long serialVersionUID = 202410191049001L;
    /**
     * 阀控器地址
     */
    @NotBlank(message = "阀控器地址不能为空")
    private String rtuAddr;
    /**
     * 虚拟卡编号
     */
    @NotBlank(message = "虚拟卡编号不能为空")
    private String vcNum;
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/CommandSv.java
@@ -12,6 +12,7 @@
import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper;
import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper;
import com.dy.pipIrrGlobal.daoRm.RmIrrigateProfileMapper;
import com.dy.pipIrrGlobal.daoRm.RmOpenCloseValveLastMapper;
import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper;
import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
@@ -49,6 +50,7 @@
    private final PrIntakeVcMapper prIntakeVcMapper;
    private final SeClientCardMapper seClientCardMapper;
    private final RmIrrigateProfileMapper rmIrrigateProfileMapper;
    private RmOpenCloseValveLastMapper rmOpenCloseValveLastMapper;
    /**
     * pro_mw:属性
@@ -59,8 +61,9 @@
    private String pro_mw = "mw";
    private String key_mw = "comSendUrl";
    @Autowired
    public CommandSv(RmCommandHistoryMapper rmCommandHistoryMapper, SeVirtualCardMapper seVirtualCardMapper, PrIntakeMapper prIntakeMapper, PrWaterPriceMapper prWaterPriceMapper, PrIntakeVcMapper prIntakeVcMapper, SeClientCardMapper seClientCardMapper, RmIrrigateProfileMapper rmIrrigateProfileMapper, Environment env) {
    public CommandSv(RmCommandHistoryMapper rmCommandHistoryMapper,RmOpenCloseValveLastMapper rmOpenCloseValveLastMapper, SeVirtualCardMapper seVirtualCardMapper, PrIntakeMapper prIntakeMapper, PrWaterPriceMapper prWaterPriceMapper, PrIntakeVcMapper prIntakeVcMapper, SeClientCardMapper seClientCardMapper, RmIrrigateProfileMapper rmIrrigateProfileMapper, Environment env) {
        this.rmCommandHistoryMapper = rmCommandHistoryMapper;
        this.rmOpenCloseValveLastMapper = rmOpenCloseValveLastMapper;
        this.seVirtualCardMapper = seVirtualCardMapper;
        this.prIntakeMapper = prIntakeMapper;
        this.prWaterPriceMapper = prWaterPriceMapper;
@@ -111,7 +114,7 @@
                jsonArray.add(jsonObject);
            }
            System.out.println(jsonArray);
            System.out.println(jsonArray.toJSONString());
            List<VoUnclosedValve> res = rmCommandHistoryMapper.getUnclosedValves(jsonArray.toJSONString(), operator);
            if(res != null) {
                return res;
@@ -125,6 +128,16 @@
    }
    /**
     * 为指定(阀控器地址、水卡编号、无关阀记录)开关阀最新记录添加关阀时间,使之不在未关阀记录中显示
     * @param rtuAddr
     * @param icCardNo
     * @return
     */
    public Integer addClostTime(String rtuAddr, String icCardNo) {
        return rmOpenCloseValveLastMapper.addCloseTime(rtuAddr, icCardNo);
    }
    /**
     * 根据取水口ID获取与之绑定虚拟卡ID
     * @param intakeId
     * @return
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java
@@ -19,10 +19,7 @@
import com.dy.pipIrrGlobal.voRm.VoIrrigaterProfile;
import com.dy.pipIrrGlobal.voRm.VoUnclosedValve;
import com.dy.pipIrrGlobal.voSe.VoVirtualCard;
import com.dy.pipIrrWechat.command.dto.AutomaticClose;
import com.dy.pipIrrWechat.command.dto.Recharge;
import com.dy.pipIrrWechat.command.dto.ValveClose;
import com.dy.pipIrrWechat.command.dto.ValveOpen;
import com.dy.pipIrrWechat.command.dto.*;
import com.dy.pipIrrWechat.result.WechatResultCode;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
@@ -778,6 +775,22 @@
    }
    /**
     * 强制因此未关阀记录:为指定(阀控器地址、水卡编号、无关阀记录)开关阀最新记录添加关阀时间,使之不在未关阀记录中显示
     * @param po
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "deleteUnclosed", consumes = MediaType.APPLICATION_JSON_VALUE)
    public BaseResponse<Boolean> deleteUnclosed(@RequestBody @Valid deleteUnclosedParam po, BindingResult bindingResult) {
        if(bindingResult != null && bindingResult.hasErrors()){
            return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        commandSv.addClostTime(po.getRtuAddr(), po.getVcNum());
        return BaseResponseUtils.buildSuccess();
    }
    /**
     * 小程序远程充值
     * @param po
     * @param bindingResult
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/deleteUnclosedParam.java
New file
@@ -0,0 +1,27 @@
package com.dy.pipIrrWechat.command.dto;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
 * @author ZhuBaoMin
 * @date 2024-10-19 11:07
 * @LastEditTime 2024-10-19 11:07
 * @Description 删除未关阀记录传入参数
 */
@Data
public class deleteUnclosedParam {
    public static final long serialVersionUID = 202410191108001L;
    /**
     * 阀控器地址
     */
    @NotBlank(message = "阀控器地址不能为空")
    private String rtuAddr;
    /**
     * 虚拟卡编号
     */
    @NotBlank(message = "虚拟卡编号不能为空")
    private String vcNum;
}