zhubaomin
2025-04-07 e67870fff62635cd14beb0d5988f08aeef4b22fa
添加远程关阀式终止灌溉计划,未测试
7个文件已修改
1个文件已添加
590 ■■■■ 已修改文件
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmCommandHistoryMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoIntakeVc.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmCommandHistoryMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/CommandSv.java 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java 266 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/ValveOpen.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/irrigatePlan/IrrigatePlanCtrl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/irrigatePlan/IrrigatePlanSv.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmCommandHistoryMapper.java
@@ -2,10 +2,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
import com.dy.pipIrrGlobal.voRm.VoCommand;
import com.dy.pipIrrGlobal.voRm.VoRtuAndVc;
import com.dy.pipIrrGlobal.voRm.VoUnclosedParam;
import com.dy.pipIrrGlobal.voRm.VoUnclosedValve;
import com.dy.pipIrrGlobal.voRm.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -84,4 +81,11 @@
     * @return
     */
    String getTimeByCommId(Long commId);
    /**
     * 根据命令日志ID获取取水口及虚拟卡信息,终止灌溉计划时使用,用来执行远程关阀
     * @param commandId
     * @return
     */
    VoIntakeVc getIntakeVc(Long commandId);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoIntakeVc.java
New file
@@ -0,0 +1,27 @@
package com.dy.pipIrrGlobal.voRm;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.Data;
/**
 * @author ZhuBaoMin
 * @date 2025-04-07 21:08
 * @LastEditTime 2025-04-07 21:08
 * @Description 取水口、虚拟卡视图对象,终止灌溉计划时使用,用来执行远程关阀
 */
@Data
@JsonPropertyOrder({"intakeId", "vcId"})
public class VoIntakeVc {
    public static final long serialVersionUID = 202411281712001L;
    /**
     * 取水口ID
     */
    private Long intakeId;
    /**
     * 虚拟卡ID
     */
    private Long vcId;
}
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmCommandHistoryMapper.xml
@@ -393,4 +393,13 @@
        FROM rm_command_history
        WHERE com_id = #{commId}
    </select>
    <!--根据命令日志ID获取取水口及虚拟卡信息,终止灌溉计划时使用,用来执行远程关阀-->
    <select id="getIntakeVc" resultType="com.dy.pipIrrGlobal.voRm.VoIntakeVc">
        SELECT
            intake_id AS intakeId,
            (SELECT id FROM se_virtual_card WHERE vc_num = param ->> '$.icCardNo') AS vcId
        FROM rm_command_history WHERE com_id = #{commandId}
            LIMIT 0, 1
    </select>
</mapper>
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/CommandSv.java
@@ -7,11 +7,15 @@
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V1.CodeV1;
import com.dy.common.mw.protocol.p206V1.ProtocolConstantV206V1;
import com.dy.common.mw.protocol.p206V1.downVos.Com97Vo;
import com.dy.common.mw.protocol.p206V1.downVos.ComA1Vo;
import com.dy.common.mw.protocol.p206V2.ProtocolConstantV206V2;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ProtocolConstantV206V202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd92_A2Vo;
import com.dy.common.util.IDLongGenerator;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.common.webUtil.QueryResultVo;
import com.dy.pipIrrGlobal.command.ComSupport;
import com.dy.pipIrrGlobal.command.dto.Param;
@@ -32,6 +36,7 @@
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.ValveOpen;
import com.dy.pipIrrWechat.result.WechatResultCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -423,4 +428,233 @@
            return map;
        }
    }
    public Map openWx(ValveOpen valve, Long planId, Byte operatetype) {
        Long intakeId = valve.getIntakeId();
        String intakeName = valve.getIntakeName();
        Long vcId = valve.getVcId();
        Boolean forceOpen = valve.getForceOpen();
        Long operator = valve.getOperator();
        Byte openType = valve.getOpenType();
        Long comId = new IDLongGenerator().generate();
        // 如果是轮灌
        if(openType != null && openType == 1) {
            IrIntakeOperate irIntakeOperate = new IrIntakeOperate();
            irIntakeOperate.setPlanId(planId);
            irIntakeOperate.setOperateType(operatetype);
            irIntakeOperate.setCommandId(comId);
            irIntakeOperate.setIntakeId(intakeId);
            Long id = addIntakeOperate(irIntakeOperate);
            if(id == null) {
                Map map = new HashMap<>();
                map.put("success", false);
                map.put("msg", "添加取水口操作记录失败");
                map.put("content", null);
                return map;
            }
        }
        if(intakeId == null && intakeName == null) {
            irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage() + "(" + intakeId + ")");
            Map map = new HashMap<>();
            map.put("success", false);
            map.put("msg", WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage() + "(" + intakeId + ")");
            map.put("content", null);
            return map;
            //return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage());
        }
        // intakeName换intakeId
        if(intakeId == null) {
            intakeId = getIntakeIdByName(intakeName);
            if(intakeId == null) {
                irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage() + "(" + intakeId + ")");
                Map map = new HashMap<>();
                map.put("success", false);
                map.put("msg", WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage() + "(" + intakeId + ")");
                map.put("content", null);
                return map;
                //return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage());
            }
        }
        /**
         * 如果农户选择了虚拟卡,则使用该虚拟卡
         * 如果农户未选择虚拟卡,则根据取水口ID获取与之绑定的虚拟卡
         * 如果取水口没有与之绑定的虚拟卡,则提示农户选择一张虚拟卡
         */
        if (vcId == null) {
            vcId = getVcIdByIntakeId(intakeId);
            if (vcId == null) {
                irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.PLEASE_SELECT_A_VC.getMessage() + "(" + intakeId + ")");
                Map map = new HashMap<>();
                map.put("success", false);
                map.put("msg", WechatResultCode.PLEASE_SELECT_A_VC.getMessage() + "(" + intakeId + ")");
                map.put("content", null);
                return map;
                //return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage());
            }
        }
        // 虚拟卡ID换虚拟卡对象
        VoVirtualCard vc = getVcById(vcId);
        if (vc == null) {
            irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.PLEASE_SELECT_A_VC.getMessage() + "(" + intakeId + ")");
            Map map = new HashMap<>();
            map.put("success", false);
            map.put("msg", WechatResultCode.PLEASE_SELECT_A_VC.getMessage() + "(" + intakeId + ")");
            map.put("content", null);
            return map;
            //return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage());
        }
        // 虚拟卡状态为使用中,且不是强制开阀时提示
        if (vc.getInUse() && !forceOpen) {
            irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getMessage() + "(" + intakeId + ")");
            Map map = new HashMap<>();
            map.put("success", false);
            map.put("msg", WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getMessage() + "(" + intakeId + ")");
            map.put("content", null);
            return map;
            //return BaseResponseUtils.buildCodeMsg(WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getCode(), WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getMessage());
        }
        // 获取水价
        Double waterPrice = getPrice();
        if(waterPrice == null) {
            irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.NO_WATER_PRICE.getMessage() + "(" + intakeId + ")");
            Map map = new HashMap<>();
            map.put("success", false);
            map.put("msg", WechatResultCode.NO_WATER_PRICE.getMessage() + "(" + intakeId + ")");
            map.put("content", null);
            return map;
            //return BaseResponseUtils.buildErrorMsg(WechatResultCode.NO_WATER_PRICE.getMessage());
        }
        // 取水口ID换阀控器地址及通讯协议
        JSONObject job_rtu = getRtu(intakeId, null);
        if (job_rtu == null) {
            irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.RTU_NOT_EXIST.getMessage() + "(" + intakeId + ")");
            Map map = new HashMap<>();
            map.put("success", false);
            map.put("msg", WechatResultCode.RTU_NOT_EXIST.getMessage() + "(" + intakeId + ")");
            map.put("content", null);
            return map;
            //return BaseResponseUtils.buildErrorMsg(WechatResultCode.RTU_NOT_EXIST.getMessage());
        }
        String rtuAddr = job_rtu.getString("rtuAddr");
        String protocol = job_rtu.getString("protocol");
        comSendUrl = env.getProperty(pro_mw + "." + DataSourceContext.get() + "." + key_mw);
        // 生成订单号
        String orderNo = generateOrderNo();
        if(orderNo == null) {
            irIntakeOperateMapper.updateByCommandId(comId, (byte)2, WechatResultCode.NO_ORDER_NUMBER.getMessage() + "(" + intakeId + ")");
            Map map = new HashMap<>();
            map.put("success", false);
            map.put("msg", WechatResultCode.NO_ORDER_NUMBER.getMessage() + "(" + intakeId + ")");
            map.put("content", null);
            return map;
            //return BaseResponseUtils.buildErrorMsg(WechatResultCode.NO_ORDER_NUMBER.getMessage());
        }
        String commandCode = null;
        if (protocol.equals(ProtocolConstantV206V202404.protocolName)) {
            // 获取功能码
            commandCode = CodeV202404.cd_A2;
            // 创建视图
            ComCd92_A2Vo param = new ComCd92_A2Vo();
            param.controllerType = controllerType;
            param.projectNo = projectNo;
            param.icCardNo = vc.getVcNum().toString();
            param.waterRemain = 0.0;
            param.moneyRemain = vc.getMoney();
            param.waterPrice = waterPrice;
            param.elePrice = 0.0;
            param.orderNo = orderNo;
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)1);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV202404.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setVcId(vcId);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx);
            myParam.setOperator(operator);
            BaseResponse<Boolean> result = dealWithCommandResult(myParam);
            Map map = new HashMap<>();
            map.put("success", result.isSuccess());
            map.put("msg", result.getMsg());
            map.put("content", result.getContent());
            return map;
        } else if (protocol.equals(ProtocolConstantV206V1.protocolName) || protocol.equals(ProtocolConstantV206V2.protocolName)) {
            // 获取功能码
            commandCode = CodeV1.cd_97;
            // 创建视图
            Com97Vo param = new Com97Vo();
            param.icCardNo = vc.getVcNum().toString();
            param.moneyRemain = vc.getMoney();
            param.waterPrice = waterPrice;
            param.orderNo = orderNo;
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)1);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV1.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setVcId(vcId);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx);
            myParam.setOperator(operator);
            //return dealWithCommandResult(myParam);
            BaseResponse<Boolean> result = dealWithCommandResult(myParam);
            Map map = new HashMap<>();
            map.put("success", result.isSuccess());
            map.put("msg", result.getMsg());
            map.put("content", result.getContent());
            return map;
        } else {
            //return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议");
            irIntakeOperateMapper.updateByCommandId(comId, (byte)2, "系统暂不支持该协议" + "(" + intakeId + ")");
            Map map = new HashMap<>();
            map.put("success", false);
            map.put("msg", "系统暂不支持该协议");
            map.put("content", null);
            return map;
        }
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java
@@ -85,141 +85,143 @@
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Long intakeId = valve.getIntakeId();
        String intakeName = valve.getIntakeName();
        Long vcId = valve.getVcId();
        Boolean forceOpen = valve.getForceOpen();
        Long operator = valve.getOperator();
        Long comId = new IDLongGenerator().generate();
        if(intakeId == null && intakeName == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage());
        Map map_result = commandSv.openWx(valve, null, null);
        if(map_result.get("success").equals(false)) {
            return BaseResponseUtils.buildErrorMsg(map_result.get("msg").toString());
        }
        return BaseResponseUtils.buildSuccess(map_result.get("content")) ;
        // intakeName换intakeId
        if(intakeId == null) {
            intakeId = commandSv.getIntakeIdByName(intakeName);
            if(intakeId == null) {
                return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage());
            }
        }
        /**
         * 如果农户选择了虚拟卡,则使用该虚拟卡
         * 如果农户未选择虚拟卡,则根据取水口ID获取与之绑定的虚拟卡
         * 如果取水口没有与之绑定的虚拟卡,则提示农户选择一张虚拟卡
         */
        if (vcId == null) {
            vcId = commandSv.getVcIdByIntakeId(intakeId);
            if (vcId == null) {
                return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage());
            }
        }
        // 虚拟卡ID换虚拟卡对象
        VoVirtualCard vc = commandSv.getVcById(vcId);
        if (vc == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage());
        }
        // 虚拟卡状态为使用中,且不是强制开阀时提示
        if (vc.getInUse() && !forceOpen) {
            return BaseResponseUtils.buildCodeMsg(WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getCode(), WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getMessage());
        }
        // 获取水价
        Double waterPrice = commandSv.getPrice();
        if(waterPrice == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.NO_WATER_PRICE.getMessage());
        }
        // 取水口ID换阀控器地址及通讯协议
        JSONObject job_rtu = getRtu(intakeId, null);
        if (job_rtu == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.RTU_NOT_EXIST.getMessage());
        }
        String rtuAddr = job_rtu.getString("rtuAddr");
        String protocol = job_rtu.getString("protocol");
        //String orgTag = job_rtu.getString("orgTag");
        //if(orgTag == null) {
        //    return BaseResponseUtils.buildErrorMsg(WechatResultCode.RTU_NOT_SET_DATA_SOURCE.getMessage());
        //Long intakeId = valve.getIntakeId();
        //String intakeName = valve.getIntakeName();
        //Long vcId = valve.getVcId();
        //Boolean forceOpen = valve.getForceOpen();
        //Long operator = valve.getOperator();
        //Long comId = new IDLongGenerator().generate();
        //
        //if(intakeId == null && intakeName == null) {
        //    return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage());
        //}
        //comSendUrl = env.getProperty(pro_mw + "." + orgTag + "." + key_mw);
        comSendUrl = env.getProperty(pro_mw + "." + DataSourceContext.get() + "." + key_mw);
        // 生成订单号
        String orderNo = generateOrderNo();
        if(orderNo == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.NO_ORDER_NUMBER.getMessage());
        }
        String commandCode = null;
        if (protocol.equals(ProtocolConstantV206V202404.protocolName)) {
            // 获取功能码
            commandCode = CodeV202404.cd_A2;
            // 创建视图
            ComCd92_A2Vo param = new ComCd92_A2Vo();
            param.controllerType = controllerType;
            param.projectNo = projectNo;
            param.icCardNo = vc.getVcNum().toString();
            param.waterRemain = 0.0;
            param.moneyRemain = vc.getMoney();
            param.waterPrice = waterPrice;
            param.elePrice = 0.0;
            param.orderNo = orderNo;
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)1);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV202404.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setVcId(vcId);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else if (protocol.equals(ProtocolConstantV206V1.protocolName) || protocol.equals(ProtocolConstantV206V2.protocolName)) {
            // 获取功能码
            commandCode = CodeV1.cd_97;
            // 创建视图
            Com97Vo param = new Com97Vo();
            param.icCardNo = vc.getVcNum().toString();
            param.moneyRemain = vc.getMoney();
            param.waterPrice = waterPrice;
            param.orderNo = orderNo;
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)1);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV1.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setVcId(vcId);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else {
            return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议");
        }
        //
        //// intakeName换intakeId
        //if(intakeId == null) {
        //    intakeId = commandSv.getIntakeIdByName(intakeName);
        //    if(intakeId == null) {
        //        return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_INTAKE.getMessage());
        //    }
        //}
        //
        ///**
        // * 如果农户选择了虚拟卡,则使用该虚拟卡
        // * 如果农户未选择虚拟卡,则根据取水口ID获取与之绑定的虚拟卡
        // * 如果取水口没有与之绑定的虚拟卡,则提示农户选择一张虚拟卡
        // */
        //if (vcId == null) {
        //    vcId = commandSv.getVcIdByIntakeId(intakeId);
        //    if (vcId == null) {
        //        return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage());
        //    }
        //}
        //
        //// 虚拟卡ID换虚拟卡对象
        //VoVirtualCard vc = commandSv.getVcById(vcId);
        //if (vc == null) {
        //    return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage());
        //}
        //
        //// 虚拟卡状态为使用中,且不是强制开阀时提示
        //if (vc.getInUse() && !forceOpen) {
        //    return BaseResponseUtils.buildCodeMsg(WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getCode(), WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getMessage());
        //}
        //
        //// 获取水价
        //Double waterPrice = commandSv.getPrice();
        //if(waterPrice == null) {
        //    return BaseResponseUtils.buildErrorMsg(WechatResultCode.NO_WATER_PRICE.getMessage());
        //}
        //
        //// 取水口ID换阀控器地址及通讯协议
        //JSONObject job_rtu = getRtu(intakeId, null);
        //if (job_rtu == null) {
        //    return BaseResponseUtils.buildErrorMsg(WechatResultCode.RTU_NOT_EXIST.getMessage());
        //}
        //String rtuAddr = job_rtu.getString("rtuAddr");
        //String protocol = job_rtu.getString("protocol");
        //
        //comSendUrl = env.getProperty(pro_mw + "." + DataSourceContext.get() + "." + key_mw);
        //
        //// 生成订单号
        //String orderNo = generateOrderNo();
        //if(orderNo == null) {
        //    return BaseResponseUtils.buildErrorMsg(WechatResultCode.NO_ORDER_NUMBER.getMessage());
        //}
        //
        //String commandCode = null;
        //if (protocol.equals(ProtocolConstantV206V202404.protocolName)) {
        //    // 获取功能码
        //    commandCode = CodeV202404.cd_A2;
        //
        //    // 创建视图
        //    ComCd92_A2Vo param = new ComCd92_A2Vo();
        //    param.controllerType = controllerType;
        //    param.projectNo = projectNo;
        //    param.icCardNo = vc.getVcNum().toString();
        //    param.waterRemain = 0.0;
        //    param.moneyRemain = vc.getMoney();
        //    param.waterPrice = waterPrice;
        //    param.elePrice = 0.0;
        //    param.orderNo = orderNo;
        //
        //    /**
        //     * 构造命令、发送命令并处理请求结果及执行结果
        //     * 1 准备参数
        //     * 2 调用公共方法
        //     */
        //    Param myParam = new Param();
        //    myParam.setComId(comId);
        //    myParam.setComType((byte)1);
        //    myParam.setCommandCode(commandCode);
        //    myParam.setCommandName(CodeV202404.getCodeName(commandCode));
        //    myParam.setIntakeId(intakeId);
        //    myParam.setRtuAddr(rtuAddr);
        //    myParam.setProtocol(protocol);
        //    myParam.setVcId(vcId);
        //    myParam.setParam(param);
        //    myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx);
        //    myParam.setOperator(operator);
        //    return dealWithCommandResult(myParam);
        //
        //} else if (protocol.equals(ProtocolConstantV206V1.protocolName) || protocol.equals(ProtocolConstantV206V2.protocolName)) {
        //    // 获取功能码
        //    commandCode = CodeV1.cd_97;
        //
        //    // 创建视图
        //    Com97Vo param = new Com97Vo();
        //    param.icCardNo = vc.getVcNum().toString();
        //    param.moneyRemain = vc.getMoney();
        //    param.waterPrice = waterPrice;
        //    param.orderNo = orderNo;
        //
        //    /**
        //     * 构造命令、发送命令并处理请求结果及执行结果
        //     * 1 准备参数
        //     * 2 调用公共方法
        //     */
        //    Param myParam = new Param();
        //    myParam.setComId(comId);
        //    myParam.setComType((byte)1);
        //    myParam.setCommandCode(commandCode);
        //    myParam.setCommandName(CodeV1.getCodeName(commandCode));
        //    myParam.setIntakeId(intakeId);
        //    myParam.setRtuAddr(rtuAddr);
        //    myParam.setProtocol(protocol);
        //    myParam.setVcId(vcId);
        //    myParam.setParam(param);
        //    myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx);
        //    myParam.setOperator(operator);
        //    return dealWithCommandResult(myParam);
        //} else {
        //    return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议");
        //}
    }
    /**
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/ValveOpen.java
@@ -25,4 +25,9 @@
     */
    private Boolean forceOpen = false;
    /**
     * 开阀类型;1-轮灌
     */
    private Byte openType;
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/irrigatePlan/IrrigatePlanCtrl.java
@@ -6,11 +6,14 @@
import com.dy.pipIrrGlobal.pojoIr.IrIrrigateSchedule;
import com.dy.pipIrrGlobal.pojoIr.IrPlanOperate;
import com.dy.pipIrrGlobal.pojoIr.IrPlanSchedule;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
import com.dy.pipIrrGlobal.voIr.VoIrrigateSchedule;
import com.dy.pipIrrGlobal.voIr.VoPlanSimple;
import com.dy.pipIrrGlobal.voIr.VoPlans;
import com.dy.pipIrrGlobal.voRm.VoIntakeVc;
import com.dy.pipIrrWechat.command.CommandSv;
import com.dy.pipIrrWechat.command.dto.AutomaticClose;
import com.dy.pipIrrWechat.command.dto.ValveOpen;
import com.dy.pipIrrWechat.irrigatePlan.dto.IrrigatePlan;
import com.dy.pipIrrWechat.irrigatePlan.dto.IrrigateSchedule;
import com.dy.pipIrrWechat.irrigatePlan.dto.PlanSimple;
@@ -308,7 +311,7 @@
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String terminateStartTimeStr = "2000-01-01 00:00:00";
        Date terminateStartTime = Date.from(LocalDateTime.parse(terminateStartTimeStr, formatter).atZone(ZoneId.systemDefault()).toInstant());
        Integer terminateDuration = 100000;
        Integer terminateDuration = 9999;
        // 获取可终止操作计划的灌溉开始时间
        Date planStartTime = irrigatePlanSv.getToTerminatePlan(planId);
@@ -355,6 +358,22 @@
            }
        } else {
            // 执行远程关阀
            List<Long> commandIds = irrigatePlanSv.getTerminateCommandIds(planId);
            for(Long commandId : commandIds) {
                VoIntakeVc intakeVc = irrigatePlanSv.getIntakeVc(commandId);
                Long intakeId = intakeVc.getIntakeId();
                Long vdId = intakeVc.getVcId();
                ValveOpen valve = new ValveOpen();
                valve.setIntakeId(intakeId);
                valve.setVcId(vdId);
                valve.setForceOpen(true);
                valve.setOperator(operatorId);
                valve.setOpenType(Byte.valueOf("1"));
                commandSv.openWx(valve, planId, operateType);
            }
        }
        return BaseResponseUtils.buildSuccess();
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/irrigatePlan/IrrigatePlanSv.java
@@ -1,6 +1,7 @@
package com.dy.pipIrrWechat.irrigatePlan;
import com.dy.pipIrrGlobal.daoIr.*;
import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper;
import com.dy.pipIrrGlobal.pojoIr.IrIrrigatePlan;
import com.dy.pipIrrGlobal.pojoIr.IrIrrigateSchedule;
import com.dy.pipIrrGlobal.pojoIr.IrPlanOperate;
@@ -8,6 +9,7 @@
import com.dy.pipIrrGlobal.voIr.VoIrrigateSchedule;
import com.dy.pipIrrGlobal.voIr.VoPlanSimple;
import com.dy.pipIrrGlobal.voIr.VoPlans;
import com.dy.pipIrrGlobal.voRm.VoIntakeVc;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -52,6 +54,9 @@
    @Autowired
    private IrIntakeOperateMapper irIntakeOperateMapper;
    @Autowired
    private RmCommandHistoryMapper rmdCommandHistoryMapper;
    /**
     * 添加灌溉计划
     * @param po
@@ -81,7 +86,7 @@
    }
    /**
     * 根据计划ID获取待终止的命令ID
     * 根据计划ID获取待终止的命令ID列表
     * @param planId
     * @return
     */
@@ -90,6 +95,15 @@
    }
    /**
     * 根据命令日志ID获取取水口及虚拟卡信息,终止灌溉计划时使用,用来执行远程关阀
     * @param commandId
     * @return
     */
    public VoIntakeVc getIntakeVc(Long commandId) {
        return rmdCommandHistoryMapper.getIntakeVc(commandId);
    }
    /**
     * 修改灌溉计划
     * @param po
     * @return