liurunyu
2024-06-26 e8d6c405c367e1bd501a6f6b4fa8cfa0dddbd806
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV
19个文件已修改
11个文件已添加
3151 ■■■■ 已修改文件
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/ComSupport.java 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/dto/Param.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/enums/LastOperateENUM.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmOpenCloseHistoryMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmOpenCloseLastMapper.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmOpenCloseHistory.java 217 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmOpenCloseLast.java 217 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmOpenCloseHistoryMapper.xml 375 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmOpenCloseLastMapper.xml 383 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/dbSv/DbSv.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealCloseValveReportV202404.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealOpenValveReportV202404.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-base/src/main/java/com/dy/pipIrrBase/district/DistrictSv.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/Recharge.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/result/RemoteResultCode.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtu/RtuCtrl.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java 669 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/ClientCtrl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/PayInfo.java 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/CommandSv.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java 481 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/Recharge.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/ValveClose.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/ValveOpen.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/qo/OnLineIntakesQO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/intake/qo/OnLineIntakesQO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/ComSupport.java
@@ -5,16 +5,18 @@
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.CommandType;
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrGlobal.command.dto.Param;
import com.dy.pipIrrGlobal.command.enums.LastOperateENUM;
import com.dy.pipIrrGlobal.command.result.CommandResultCode;
import com.dy.pipIrrGlobal.daoBa.BaSettingsMapper;
import com.dy.pipIrrGlobal.daoPr.PrControllerMapper;
import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper;
import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
import com.dy.pipIrrGlobal.pojoPr.PrController;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
@@ -42,8 +44,6 @@
 * @Description 命令支撑类
 */
//@Component
//@DependsOn({"baSettingsMapper", "prControllerMapper"})
public class ComSupport {
    protected static String mwUrlSendCom = "http://127.0.0.1:8070/rtuMw/com/send" ;
@@ -64,11 +64,11 @@
    @Autowired
    private PrControllerMapper prControllerMapper;
    //@Autowired
    //private CommandSv commandSv;
    @Autowired
    private RmCommandHistoryMapper rmCommandHistoryMapper;
    @Autowired
    private SeVirtualCardMapper seVirtualCardMapper;
    public static ComSupport comSupport;
@@ -225,16 +225,19 @@
    }
    /**
     * 发送命令并处理请求结果及执行结果
     * 构造命令、发送命令并处理请求结果及执行结果
     * @param po
     * @return
     */
    protected BaseResponse dealWithCommandResult(Param po) {
    protected BaseResponse<Boolean> dealWithCommandResult(Param po) {
        Long comId = po.getComId();
        Byte comType = po.getComType();
        String commandCode = po.getCommandCode();
        String commandName = po.getCommandName();
        Long intakeId = po.getIntakeId();
        String rtuAddr = po.getRtuAddr();
        String protocol = po.getProtocol();
        Long vcId = po.getVcId();
        Object param = po.getParam();
        String rtuResultSendWebUrl = po.getRtuResultSendWebUrl();
        Long operator = po.getOperator();
@@ -245,28 +248,38 @@
        // 发送命令
        JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
        if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
            //if(1 > 0) {
            // 请求成功
            // 创建命令日志对象并添加到数据库中
            String commandName = CodeV202404.getCodeName(commandCode);
            RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator);
            //commandSv.insert(rmCommandHistory);
            rmCommandHistoryMapper.insert(rmCommandHistory);
            // 处理回调
            BaseResponse response_CallBack = dealWithCallBack(comId);
            // 回调失败
            // 回调异常
            if(!response_CallBack.getCode().equals("0001")) {
                // 命令日志执行结果改为失败
                rmCommandHistory = new RmCommandHistory();
                rmCommandHistory.setId(comId);
                rmCommandHistory.setResult((byte)0);
                //commandSv.updateCommandResult(rmCommandHistory);
                rmCommandHistoryMapper.updateByPrimaryKeySelective(rmCommandHistory);
                return BaseResponseUtils.buildFail(response_CallBack.getMsg());
                //return BaseResponseUtils.buildFail(response_CallBack.getContent().toString());
                return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
            }
            // 回调超时
            if (response_CallBack.getContent().toString().equals(CommandResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage())) {
                /**
                 * 回调超时,暂时认为执行失败
                 * 命令置为失败
                 * 虚拟卡依旧保持使用中的状态
                 */
                rmCommandHistory = new RmCommandHistory();
                rmCommandHistory.setId(comId);
                rmCommandHistory.setResult((byte) 0);
                rmCommandHistoryMapper.updateByPrimaryKeySelective(rmCommandHistory);
                return BaseResponseUtils.buildErrorMsg(CommandResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage());
            }
            // 回调成功,再判断执行是否成功
@@ -276,18 +289,33 @@
            System.out.println(job_subData);
            Boolean dealResult = job_subData.getBoolean("success");
            if(!dealResult) {
                return BaseResponseUtils.buildFail(response_CallBack.getContent().toString());
                return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
            }
            /**
             * 执行成功,返回回调内容
             * 如果是开关阀:更改虚拟卡状态:是否使用中、最后操作、最后操作时间
             */
            if(comType != null) {
                SeVirtualCard virtualCard = new SeVirtualCard();
                virtualCard.setId(vcId);
                if(comType == 1) {
                    virtualCard.setInUse((byte) 1);
                }else {
                    virtualCard.setInUse((byte) 0);
                }
                virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
                virtualCard.setLastOperateTime(new Date());
                seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
            }
            // 回调返回的内容
            Data myData = (Data)response_CallBack.getContent();
            return BaseResponseUtils.buildSuccess(myData) ;
        } else {
            // 请求失败
            JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
            return BaseResponseUtils.buildFail(job_param.getString("message"));
            return BaseResponseUtils.buildErrorMsg(job_param.getString("message"));
        }
    }
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/dto/Param.java
@@ -6,7 +6,7 @@
 * @author ZhuBaoMin
 * @date 2024-06-04 11:25
 * @LastEditTime 2024-06-04 11:25
 * @Description
 * @Description 构造命令、发送命令并处理请求结果及执行结果所需参数对象
 */
@Data
@@ -15,7 +15,14 @@
    private Long comId;
    /**
     * 命令类型,1-开发,2-关阀
     */
    private Byte comType;
    private String commandCode;
    private String commandName;
    private Long intakeId;
@@ -23,6 +30,11 @@
    private String protocol;
    private Long vcId;
    /**
     * 视图对象
     */
    private Object param;
    private String rtuResultSendWebUrl;
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/enums/LastOperateENUM.java
New file
@@ -0,0 +1,27 @@
package com.dy.pipIrrGlobal.command.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * @author ZhuBaoMin
 * @date 2024-06-24 22:08
 * @LastEditTime 2024-06-24 22:08
 * @Description 虚拟卡操作枚举
 */
@Getter
@AllArgsConstructor
public enum LastOperateENUM {
    OPEN_ACCOUNT((byte)1, "开户"),
    RECHARGE((byte)2, "充值"),
    CONSUME((byte)3, "消费"),
    APPLY_REFUND((byte)4, "申请退款"),
    AUDIT_REFUND((byte)5, "退款审核"),
    REFUND((byte)6, "退款"),
    OPEN_VALVE((byte)7, "开阀"),
    CLOSE_VALVE((byte)8, "关阀");
    private final Byte code;
    private final String message;
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmOpenCloseHistoryMapper.java
New file
@@ -0,0 +1,27 @@
package com.dy.pipIrrGlobal.daoRm;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dy.pipIrrGlobal.pojoRm.RmOpenCloseHistory;
import org.apache.ibatis.annotations.Mapper;
/**
 * @author ZhuBaoMin
 * @date 2024-06-20 10:34
 * @LastEditTime 2024-06-20 10:34
 * @Description
 */
@Mapper
public interface RmOpenCloseHistoryMapper extends BaseMapper<RmOpenCloseHistory> {
    int deleteByPrimaryKey(Long id);
    int insert(RmOpenCloseHistory record);
    int insertSelective(RmOpenCloseHistory record);
    RmOpenCloseHistory selectByPrimaryKey(Long id);
    int updateByPrimaryKeySelective(RmOpenCloseHistory record);
    int updateByPrimaryKey(RmOpenCloseHistory record);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmOpenCloseLastMapper.java
New file
@@ -0,0 +1,36 @@
package com.dy.pipIrrGlobal.daoRm;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dy.pipIrrGlobal.pojoRm.RmOpenCloseLast;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
 * @author ZhuBaoMin
 * @date 2024-06-20 10:34
 * @LastEditTime 2024-06-20 10:34
 * @Description
 */
@Mapper
public interface RmOpenCloseLastMapper extends BaseMapper<RmOpenCloseLast> {
    int deleteByPrimaryKey(Long id);
    int insert(RmOpenCloseLast record);
    int insertSelective(RmOpenCloseLast record);
    RmOpenCloseLast selectByPrimaryKey(Long id);
    int updateByPrimaryKeySelective(RmOpenCloseLast record);
    int updateByPrimaryKey(RmOpenCloseLast record);
    /**
     * 根据阀控器地址获取开关阀上报最新数据
     * @param rtuAddr
     * @return
     */
    List<RmOpenCloseLast> getRmOpenCloseReportLast(String rtuAddr);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmOpenCloseHistory.java
New file
@@ -0,0 +1,217 @@
package com.dy.pipIrrGlobal.pojoRm;
import com.alibaba.fastjson2.annotation.JSONField;
import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.dy.common.mw.protocol.p206V202404.DataV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd84Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd85Vo;
import com.dy.common.po.BaseEntity;
import com.dy.common.util.DateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.Date;
/**
 * @author ZhuBaoMin
 * @date 2024-06-20 10:34
 * @LastEditTime 2024-06-20 10:34
 * @Description
 */
/**
 * 开关阀报历史数据表
 */
@TableName(value="rm_open_close_history", autoResultMap = true)
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "开关阀报历史数据表")
public class RmOpenCloseHistory implements BaseEntity {
    public static final long serialVersionUID = 202406201040001L;
    /**
     * 主键
     */
    @JSONField(serializeUsing= ObjectWriterImplToString.class)
    @TableId(type = IdType.INPUT)
    public Long id;
    /**
     * 控制器实体ID(外键)
     */
    @JSONField(serializeUsing= ObjectWriterImplToString.class)
    public Long controllerId;
    /**
     * 取水口实体ID(外键)
     */
    @JSONField(serializeUsing= ObjectWriterImplToString.class)
    public Long intakeId;
    /**
     * 控制器地址
     */
    public String rtuAddr;
    /**
     * 开阀数据接收日期时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date opDt;
    /**
     * 开阀控制器时钟
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date opRtuDt;
    /**
     * IC卡地址(远程关闭时为0)
     */
    public String opIcCardAddr;
    /**
     * IC卡编号(17位数字)
     */
    public String opIcCardNo;
    /**
     * 开阀订单号(16位数字)
     */
    public String opOrderNo;
    /**
     * 开泵/阀时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date openDt;
    /**
     * 开阀水表累计水量
     */
    public Double opWaterTotalAmount;
    /**
     * 开阀电表累计电量
     */
    public Double opEleTotalAmount;
    /**
     * 开阀用户剩余金额
     */
    public Double opMoneyRemainUser;
    /**
     * 开阀用户剩余水量
     */
    public Double opWaterRemainUser;
    /**
     * 关泵/阀方式
     */
    public Byte opType;
    /**
     * 关阀IC卡地址(远程关闭时为0)
     */
    public String clIcCardAddr;
    /**
     * 关阀IC卡编号(17位数字)
     */
    public String clIcCardNo;
    /**
     * 关阀订单号(16位数字)
     */
    public String clOrderNo;
    /**
     * 开始时间(分时日月)
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date startDt;
    /**
     * 结束时间(分时日月)
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date endDt;
    /**
     * 水表累计流量
     */
    public Double clWaterTotalAmount;
    /**
     * 电表累计电量
     */
    public Double clEleTotalAmount;
    /**
     * 用户剩余金额
     */
    public Double clMoneyRemainUser;
    /**
     * 用户剩余水量
     */
    public Double clWaterRemainUser;
    /**
     * 本次使用电量
     */
    public Double thisEle;
    /**
     * 本次使用水量
     */
    public Double thisWater;
    /**
     * 本次使用金额
     */
    public Double thisMoney;
    /**
     * 本次使用时间长
     */
    public Integer thisDuration;
    public void valueFrom84(DataV202404 dataV202404, DataCd84Vo cdData) throws Exception{
        this.opDt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataV202404.dt);
        this.openDt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.opDt);
        //this.opRtuDt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.opDt);
        this.opIcCardAddr = cdData.icCardAddr;
        this.opIcCardNo = cdData.icCardNo;
        this.opOrderNo = cdData.orderNo;
        this.opWaterTotalAmount = cdData.waterTotalAmount;
        this.opEleTotalAmount = cdData.eleTotalAmount;
        this.opMoneyRemainUser = cdData.moneyRemainUser;
        this.opWaterRemainUser = cdData.waterRemainUser;
    }
    public void valueFrom85(DataV202404 dataV202404, DataCd85Vo cdData) throws Exception{
        this.startDt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.startDt);
        this.endDt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.endDt);
        this.opType = cdData.opType;
        this.clIcCardAddr = cdData.icCardAddr;
        this.clIcCardNo = cdData.icCardNo;
        this.clOrderNo = cdData.orderNo;
        this.clWaterTotalAmount = cdData.waterTotalAmount;
        this.clEleTotalAmount = cdData.eleTotalAmount;
        this.clMoneyRemainUser = cdData.moneyRemain;
        this.clWaterRemainUser = cdData.waterRemain;
        this.thisEle = cdData.thisEle;
        this.thisWater = cdData.thisWater;
        this.thisMoney = cdData.thisMoney;
        this.thisDuration = cdData.thisDuration;
    }
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmOpenCloseLast.java
New file
@@ -0,0 +1,217 @@
package com.dy.pipIrrGlobal.pojoRm;
import com.alibaba.fastjson2.annotation.JSONField;
import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.dy.common.mw.protocol.p206V202404.DataV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd84Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd85Vo;
import com.dy.common.po.BaseEntity;
import com.dy.common.util.DateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.Date;
/**
 * @author ZhuBaoMin
 * @date 2024-06-20 10:34
 * @LastEditTime 2024-06-20 10:34
 * @Description
 */
/**
 * 开关阀报最新数据表
 */
@TableName(value="rm_open_close_last", autoResultMap = true)
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "开关阀报最新数据表")
public class RmOpenCloseLast implements BaseEntity {
    public static final long serialVersionUID = 202406201041001L;
    /**
     * 主键
     */
    @JSONField(serializeUsing= ObjectWriterImplToString.class)
    @TableId(type = IdType.INPUT)
    public Long id;
    /**
     * 控制器实体ID(外键)
     */
    @JSONField(serializeUsing= ObjectWriterImplToString.class)
    public Long controllerId;
    /**
     * 取水口实体ID(外键)
     */
    @JSONField(serializeUsing= ObjectWriterImplToString.class)
    public Long intakeId;
    /**
     * 控制器地址
     */
    public String rtuAddr;
    /**
     * 开阀数据接收日期时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date opDt;
    /**
     * 开阀控制器时钟
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date opRtuDt;
    /**
     * IC卡地址(远程关闭时为0)
     */
    public String opIcCardAddr;
    /**
     * IC卡编号(17位数字)
     */
    public String opIcCardNo;
    /**
     * 开阀订单号(16位数字)
     */
    public String opOrderNo;
    /**
     * 开泵/阀时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date openDt;
    /**
     * 开阀水表累计水量
     */
    public Double opWaterTotalAmount;
    /**
     * 开阀电表累计电量
     */
    public Double opEleTotalAmount;
    /**
     * 开阀用户剩余金额
     */
    public Double opMoneyRemainUser;
    /**
     * 开阀用户剩余水量
     */
    public Double opWaterRemainUser;
    /**
     * 关泵/阀方式
     */
    public Byte opType;
    /**
     * 关阀IC卡地址(远程关闭时为0)
     */
    public String clIcCardAddr;
    /**
     * 关阀IC卡编号(17位数字)
     */
    public String clIcCardNo;
    /**
     * 关阀订单号(16位数字)
     */
    public String clOrderNo;
    /**
     * 开始时间(分时日月)
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date startDt;
    /**
     * 结束时间(分时日月)
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date endDt;
    /**
     * 水表累计流量
     */
    public Double clWaterTotalAmount;
    /**
     * 电表累计电量
     */
    public Double clEleTotalAmount;
    /**
     * 用户剩余金额
     */
    public Double clMoneyRemainUser;
    /**
     * 用户剩余水量
     */
    public Double clWaterRemainUser;
    /**
     * 本次使用电量
     */
    public Double thisEle;
    /**
     * 本次使用水量
     */
    public Double thisWater;
    /**
     * 本次使用金额
     */
    public Double thisMoney;
    /**
     * 本次使用时间长
     */
    public Integer thisDuration;
    public void valueFrom84(DataV202404 dataV202404, DataCd84Vo cdData) throws Exception{
        this.opDt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataV202404.dt);
        this.openDt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.opDt);
        //this.opRtuDt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.opDt);
        this.opIcCardAddr = cdData.icCardAddr;
        this.opIcCardNo = cdData.icCardNo;
        this.opOrderNo = cdData.orderNo;
        this.opWaterTotalAmount = cdData.waterTotalAmount;
        this.opEleTotalAmount = cdData.eleTotalAmount;
        this.opMoneyRemainUser = cdData.moneyRemainUser;
        this.opWaterRemainUser = cdData.waterRemainUser;
    }
    public void valueFrom85(DataV202404 dataV202404, DataCd85Vo cdData) throws Exception{
        this.startDt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.startDt);
        this.endDt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.endDt);
        this.opType = cdData.opType;
        this.clIcCardAddr = cdData.icCardAddr;
        this.clIcCardNo = cdData.icCardNo;
        this.clOrderNo = cdData.orderNo;
        this.clWaterTotalAmount = cdData.waterTotalAmount;
        this.clEleTotalAmount = cdData.eleTotalAmount;
        this.clMoneyRemainUser = cdData.moneyRemain;
        this.clWaterRemainUser = cdData.waterRemain;
        this.thisEle = cdData.thisEle;
        this.thisWater = cdData.thisWater;
        this.thisMoney = cdData.thisMoney;
        this.thisDuration = cdData.thisDuration;
    }
}
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmOpenCloseHistoryMapper.xml
New file
@@ -0,0 +1,375 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dy.pipIrrGlobal.daoRm.RmOpenCloseHistoryMapper">
  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoRm.RmOpenCloseHistory">
    <!--@mbg.generated-->
    <!--@Table rm_open_close_history-->
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="controller_id" jdbcType="BIGINT" property="controllerId" />
    <result column="intake_id" jdbcType="BIGINT" property="intakeId" />
    <result column="rtu_addr" jdbcType="VARCHAR" property="rtuAddr" />
    <result column="op_dt" jdbcType="TIMESTAMP" property="opDt" />
    <result column="op_rtu_dt" jdbcType="TIMESTAMP" property="opRtuDt" />
    <result column="op_ic_card_addr" jdbcType="VARCHAR" property="opIcCardAddr" />
    <result column="op_ic_card_no" jdbcType="VARCHAR" property="opIcCardNo" />
    <result column="op_order_no" jdbcType="VARCHAR" property="opOrderNo" />
    <result column="open_dt" jdbcType="TIMESTAMP" property="openDt" />
    <result column="op_water_total_amount" jdbcType="FLOAT" property="opWaterTotalAmount" />
    <result column="op_ele_total_amount" jdbcType="FLOAT" property="opEleTotalAmount" />
    <result column="op_money_remain_user" jdbcType="FLOAT" property="opMoneyRemainUser" />
    <result column="op_water_remain_user" jdbcType="FLOAT" property="opWaterRemainUser" />
    <result column="op_type" jdbcType="TINYINT" property="opType" />
    <result column="cl_ic_card_addr" jdbcType="VARCHAR" property="clIcCardAddr" />
    <result column="cl_ic_card_no" jdbcType="VARCHAR" property="clIcCardNo" />
    <result column="cl_order_no" jdbcType="VARCHAR" property="clOrderNo" />
    <result column="start_dt" jdbcType="TIMESTAMP" property="startDt" />
    <result column="end_dt" jdbcType="TIMESTAMP" property="endDt" />
    <result column="cl_water_total_amount" jdbcType="FLOAT" property="clWaterTotalAmount" />
    <result column="cl_ele_total_amount" jdbcType="FLOAT" property="clEleTotalAmount" />
    <result column="cl_money_remain_user" jdbcType="FLOAT" property="clMoneyRemainUser" />
    <result column="cl_water_remain_user" jdbcType="FLOAT" property="clWaterRemainUser" />
    <result column="this_ele" jdbcType="FLOAT" property="thisEle" />
    <result column="this_water" jdbcType="FLOAT" property="thisWater" />
    <result column="this_money" jdbcType="FLOAT" property="thisMoney" />
    <result column="this_duration" jdbcType="INTEGER" property="thisDuration" />
  </resultMap>
  <sql id="Base_Column_List">
    <!--@mbg.generated-->
    id, controller_id, intake_id, rtu_addr, op_dt, op_rtu_dt, op_ic_card_addr, op_ic_card_no,
    op_order_no, open_dt, op_water_total_amount, op_ele_total_amount, op_money_remain_user,
    op_water_remain_user, op_type, cl_ic_card_addr, cl_ic_card_no, cl_order_no, start_dt,
    end_dt, cl_water_total_amount, cl_ele_total_amount, cl_money_remain_user, cl_water_remain_user,
    this_ele, this_water, this_money, this_duration
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
    <!--@mbg.generated-->
    select
    <include refid="Base_Column_List" />
    from rm_open_close_history
    where id = #{id,jdbcType=BIGINT}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
    <!--@mbg.generated-->
    delete from rm_open_close_history
    where id = #{id,jdbcType=BIGINT}
  </delete>
  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.RmOpenCloseHistory">
    <!--@mbg.generated-->
    insert into rm_open_close_history (id, controller_id, intake_id,
      rtu_addr, op_dt, op_rtu_dt,
      op_ic_card_addr, op_ic_card_no, op_order_no,
      open_dt, op_water_total_amount, op_ele_total_amount,
      op_money_remain_user, op_water_remain_user, op_type,
      cl_ic_card_addr, cl_ic_card_no, cl_order_no,
      start_dt, end_dt, cl_water_total_amount,
      cl_ele_total_amount, cl_money_remain_user, cl_water_remain_user,
      this_ele, this_water, this_money,
      this_duration)
    values (#{id,jdbcType=BIGINT}, #{controllerId,jdbcType=BIGINT}, #{intakeId,jdbcType=BIGINT},
      #{rtuAddr,jdbcType=VARCHAR}, #{opDt,jdbcType=TIMESTAMP}, #{opRtuDt,jdbcType=TIMESTAMP},
      #{opIcCardAddr,jdbcType=VARCHAR}, #{opIcCardNo,jdbcType=VARCHAR}, #{opOrderNo,jdbcType=VARCHAR},
      #{openDt,jdbcType=TIMESTAMP}, #{opWaterTotalAmount,jdbcType=FLOAT}, #{opEleTotalAmount,jdbcType=FLOAT},
      #{opMoneyRemainUser,jdbcType=FLOAT}, #{opWaterRemainUser,jdbcType=FLOAT}, #{opType,jdbcType=TINYINT},
      #{clIcCardAddr,jdbcType=VARCHAR}, #{clIcCardNo,jdbcType=VARCHAR}, #{clOrderNo,jdbcType=VARCHAR},
      #{startDt,jdbcType=TIMESTAMP}, #{endDt,jdbcType=TIMESTAMP}, #{clWaterTotalAmount,jdbcType=FLOAT},
      #{clEleTotalAmount,jdbcType=FLOAT}, #{clMoneyRemainUser,jdbcType=FLOAT}, #{clWaterRemainUser,jdbcType=FLOAT},
      #{thisEle,jdbcType=FLOAT}, #{thisWater,jdbcType=FLOAT}, #{thisMoney,jdbcType=FLOAT},
      #{thisDuration,jdbcType=INTEGER})
  </insert>
  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmOpenCloseHistory">
    <!--@mbg.generated-->
    insert into rm_open_close_history
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="controllerId != null">
        controller_id,
      </if>
      <if test="intakeId != null">
        intake_id,
      </if>
      <if test="rtuAddr != null">
        rtu_addr,
      </if>
      <if test="opDt != null">
        op_dt,
      </if>
      <if test="opRtuDt != null">
        op_rtu_dt,
      </if>
      <if test="opIcCardAddr != null">
        op_ic_card_addr,
      </if>
      <if test="opIcCardNo != null">
        op_ic_card_no,
      </if>
      <if test="opOrderNo != null">
        op_order_no,
      </if>
      <if test="openDt != null">
        open_dt,
      </if>
      <if test="opWaterTotalAmount != null">
        op_water_total_amount,
      </if>
      <if test="opEleTotalAmount != null">
        op_ele_total_amount,
      </if>
      <if test="opMoneyRemainUser != null">
        op_money_remain_user,
      </if>
      <if test="opWaterRemainUser != null">
        op_water_remain_user,
      </if>
      <if test="opType != null">
        op_type,
      </if>
      <if test="clIcCardAddr != null">
        cl_ic_card_addr,
      </if>
      <if test="clIcCardNo != null">
        cl_ic_card_no,
      </if>
      <if test="clOrderNo != null">
        cl_order_no,
      </if>
      <if test="startDt != null">
        start_dt,
      </if>
      <if test="endDt != null">
        end_dt,
      </if>
      <if test="clWaterTotalAmount != null">
        cl_water_total_amount,
      </if>
      <if test="clEleTotalAmount != null">
        cl_ele_total_amount,
      </if>
      <if test="clMoneyRemainUser != null">
        cl_money_remain_user,
      </if>
      <if test="clWaterRemainUser != null">
        cl_water_remain_user,
      </if>
      <if test="thisEle != null">
        this_ele,
      </if>
      <if test="thisWater != null">
        this_water,
      </if>
      <if test="thisMoney != null">
        this_money,
      </if>
      <if test="thisDuration != null">
        this_duration,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=BIGINT},
      </if>
      <if test="controllerId != null">
        #{controllerId,jdbcType=BIGINT},
      </if>
      <if test="intakeId != null">
        #{intakeId,jdbcType=BIGINT},
      </if>
      <if test="rtuAddr != null">
        #{rtuAddr,jdbcType=VARCHAR},
      </if>
      <if test="opDt != null">
        #{opDt,jdbcType=TIMESTAMP},
      </if>
      <if test="opRtuDt != null">
        #{opRtuDt,jdbcType=TIMESTAMP},
      </if>
      <if test="opIcCardAddr != null">
        #{opIcCardAddr,jdbcType=VARCHAR},
      </if>
      <if test="opIcCardNo != null">
        #{opIcCardNo,jdbcType=VARCHAR},
      </if>
      <if test="opOrderNo != null">
        #{opOrderNo,jdbcType=VARCHAR},
      </if>
      <if test="openDt != null">
        #{openDt,jdbcType=TIMESTAMP},
      </if>
      <if test="opWaterTotalAmount != null">
        #{opWaterTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="opEleTotalAmount != null">
        #{opEleTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="opMoneyRemainUser != null">
        #{opMoneyRemainUser,jdbcType=FLOAT},
      </if>
      <if test="opWaterRemainUser != null">
        #{opWaterRemainUser,jdbcType=FLOAT},
      </if>
      <if test="opType != null">
        #{opType,jdbcType=TINYINT},
      </if>
      <if test="clIcCardAddr != null">
        #{clIcCardAddr,jdbcType=VARCHAR},
      </if>
      <if test="clIcCardNo != null">
        #{clIcCardNo,jdbcType=VARCHAR},
      </if>
      <if test="clOrderNo != null">
        #{clOrderNo,jdbcType=VARCHAR},
      </if>
      <if test="startDt != null">
        #{startDt,jdbcType=TIMESTAMP},
      </if>
      <if test="endDt != null">
        #{endDt,jdbcType=TIMESTAMP},
      </if>
      <if test="clWaterTotalAmount != null">
        #{clWaterTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="clEleTotalAmount != null">
        #{clEleTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="clMoneyRemainUser != null">
        #{clMoneyRemainUser,jdbcType=FLOAT},
      </if>
      <if test="clWaterRemainUser != null">
        #{clWaterRemainUser,jdbcType=FLOAT},
      </if>
      <if test="thisEle != null">
        #{thisEle,jdbcType=FLOAT},
      </if>
      <if test="thisWater != null">
        #{thisWater,jdbcType=FLOAT},
      </if>
      <if test="thisMoney != null">
        #{thisMoney,jdbcType=FLOAT},
      </if>
      <if test="thisDuration != null">
        #{thisDuration,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmOpenCloseHistory">
    <!--@mbg.generated-->
    update rm_open_close_history
    <set>
      <if test="controllerId != null">
        controller_id = #{controllerId,jdbcType=BIGINT},
      </if>
      <if test="intakeId != null">
        intake_id = #{intakeId,jdbcType=BIGINT},
      </if>
      <if test="rtuAddr != null">
        rtu_addr = #{rtuAddr,jdbcType=VARCHAR},
      </if>
      <if test="opDt != null">
        op_dt = #{opDt,jdbcType=TIMESTAMP},
      </if>
      <if test="opRtuDt != null">
        op_rtu_dt = #{opRtuDt,jdbcType=TIMESTAMP},
      </if>
      <if test="opIcCardAddr != null">
        op_ic_card_addr = #{opIcCardAddr,jdbcType=VARCHAR},
      </if>
      <if test="opIcCardNo != null">
        op_ic_card_no = #{opIcCardNo,jdbcType=VARCHAR},
      </if>
      <if test="opOrderNo != null">
        op_order_no = #{opOrderNo,jdbcType=VARCHAR},
      </if>
      <if test="openDt != null">
        open_dt = #{openDt,jdbcType=TIMESTAMP},
      </if>
      <if test="opWaterTotalAmount != null">
        op_water_total_amount = #{opWaterTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="opEleTotalAmount != null">
        op_ele_total_amount = #{opEleTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="opMoneyRemainUser != null">
        op_money_remain_user = #{opMoneyRemainUser,jdbcType=FLOAT},
      </if>
      <if test="opWaterRemainUser != null">
        op_water_remain_user = #{opWaterRemainUser,jdbcType=FLOAT},
      </if>
      <if test="opType != null">
        op_type = #{opType,jdbcType=TINYINT},
      </if>
      <if test="clIcCardAddr != null">
        cl_ic_card_addr = #{clIcCardAddr,jdbcType=VARCHAR},
      </if>
      <if test="clIcCardNo != null">
        cl_ic_card_no = #{clIcCardNo,jdbcType=VARCHAR},
      </if>
      <if test="clOrderNo != null">
        cl_order_no = #{clOrderNo,jdbcType=VARCHAR},
      </if>
      <if test="startDt != null">
        start_dt = #{startDt,jdbcType=TIMESTAMP},
      </if>
      <if test="endDt != null">
        end_dt = #{endDt,jdbcType=TIMESTAMP},
      </if>
      <if test="clWaterTotalAmount != null">
        cl_water_total_amount = #{clWaterTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="clEleTotalAmount != null">
        cl_ele_total_amount = #{clEleTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="clMoneyRemainUser != null">
        cl_money_remain_user = #{clMoneyRemainUser,jdbcType=FLOAT},
      </if>
      <if test="clWaterRemainUser != null">
        cl_water_remain_user = #{clWaterRemainUser,jdbcType=FLOAT},
      </if>
      <if test="thisEle != null">
        this_ele = #{thisEle,jdbcType=FLOAT},
      </if>
      <if test="thisWater != null">
        this_water = #{thisWater,jdbcType=FLOAT},
      </if>
      <if test="thisMoney != null">
        this_money = #{thisMoney,jdbcType=FLOAT},
      </if>
      <if test="thisDuration != null">
        this_duration = #{thisDuration,jdbcType=INTEGER},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoRm.RmOpenCloseHistory">
    <!--@mbg.generated-->
    update rm_open_close_history
    set controller_id = #{controllerId,jdbcType=BIGINT},
      intake_id = #{intakeId,jdbcType=BIGINT},
      rtu_addr = #{rtuAddr,jdbcType=VARCHAR},
      op_dt = #{opDt,jdbcType=TIMESTAMP},
      op_rtu_dt = #{opRtuDt,jdbcType=TIMESTAMP},
      op_ic_card_addr = #{opIcCardAddr,jdbcType=VARCHAR},
      op_ic_card_no = #{opIcCardNo,jdbcType=VARCHAR},
      op_order_no = #{opOrderNo,jdbcType=VARCHAR},
      open_dt = #{openDt,jdbcType=TIMESTAMP},
      op_water_total_amount = #{opWaterTotalAmount,jdbcType=FLOAT},
      op_ele_total_amount = #{opEleTotalAmount,jdbcType=FLOAT},
      op_money_remain_user = #{opMoneyRemainUser,jdbcType=FLOAT},
      op_water_remain_user = #{opWaterRemainUser,jdbcType=FLOAT},
      op_type = #{opType,jdbcType=TINYINT},
      cl_ic_card_addr = #{clIcCardAddr,jdbcType=VARCHAR},
      cl_ic_card_no = #{clIcCardNo,jdbcType=VARCHAR},
      cl_order_no = #{clOrderNo,jdbcType=VARCHAR},
      start_dt = #{startDt,jdbcType=TIMESTAMP},
      end_dt = #{endDt,jdbcType=TIMESTAMP},
      cl_water_total_amount = #{clWaterTotalAmount,jdbcType=FLOAT},
      cl_ele_total_amount = #{clEleTotalAmount,jdbcType=FLOAT},
      cl_money_remain_user = #{clMoneyRemainUser,jdbcType=FLOAT},
      cl_water_remain_user = #{clWaterRemainUser,jdbcType=FLOAT},
      this_ele = #{thisEle,jdbcType=FLOAT},
      this_water = #{thisWater,jdbcType=FLOAT},
      this_money = #{thisMoney,jdbcType=FLOAT},
      this_duration = #{thisDuration,jdbcType=INTEGER}
    where id = #{id,jdbcType=BIGINT}
  </update>
</mapper>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmOpenCloseLastMapper.xml
New file
@@ -0,0 +1,383 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dy.pipIrrGlobal.daoRm.RmOpenCloseLastMapper">
  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoRm.RmOpenCloseLast">
    <!--@mbg.generated-->
    <!--@Table rm_open_close_last-->
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="controller_id" jdbcType="BIGINT" property="controllerId" />
    <result column="intake_id" jdbcType="BIGINT" property="intakeId" />
    <result column="rtu_addr" jdbcType="VARCHAR" property="rtuAddr" />
    <result column="op_dt" jdbcType="TIMESTAMP" property="opDt" />
    <result column="op_rtu_dt" jdbcType="TIMESTAMP" property="opRtuDt" />
    <result column="op_ic_card_addr" jdbcType="VARCHAR" property="opIcCardAddr" />
    <result column="op_ic_card_no" jdbcType="VARCHAR" property="opIcCardNo" />
    <result column="op_order_no" jdbcType="VARCHAR" property="opOrderNo" />
    <result column="open_dt" jdbcType="TIMESTAMP" property="openDt" />
    <result column="op_water_total_amount" jdbcType="FLOAT" property="opWaterTotalAmount" />
    <result column="op_ele_total_amount" jdbcType="FLOAT" property="opEleTotalAmount" />
    <result column="op_money_remain_user" jdbcType="FLOAT" property="opMoneyRemainUser" />
    <result column="op_water_remain_user" jdbcType="FLOAT" property="opWaterRemainUser" />
    <result column="op_type" jdbcType="TINYINT" property="opType" />
    <result column="cl_ic_card_addr" jdbcType="VARCHAR" property="clIcCardAddr" />
    <result column="cl_ic_card_no" jdbcType="VARCHAR" property="clIcCardNo" />
    <result column="cl_order_no" jdbcType="VARCHAR" property="clOrderNo" />
    <result column="start_dt" jdbcType="TIMESTAMP" property="startDt" />
    <result column="end_dt" jdbcType="TIMESTAMP" property="endDt" />
    <result column="cl_water_total_amount" jdbcType="FLOAT" property="clWaterTotalAmount" />
    <result column="cl_ele_total_amount" jdbcType="FLOAT" property="clEleTotalAmount" />
    <result column="cl_money_remain_user" jdbcType="FLOAT" property="clMoneyRemainUser" />
    <result column="cl_water_remain_user" jdbcType="FLOAT" property="clWaterRemainUser" />
    <result column="this_ele" jdbcType="FLOAT" property="thisEle" />
    <result column="this_water" jdbcType="FLOAT" property="thisWater" />
    <result column="this_money" jdbcType="FLOAT" property="thisMoney" />
    <result column="this_duration" jdbcType="INTEGER" property="thisDuration" />
  </resultMap>
  <sql id="Base_Column_List">
    <!--@mbg.generated-->
    id, controller_id, intake_id, rtu_addr, op_dt, op_rtu_dt, op_ic_card_addr, op_ic_card_no,
    op_order_no, open_dt, op_water_total_amount, op_ele_total_amount, op_money_remain_user,
    op_water_remain_user, op_type, cl_ic_card_addr, cl_ic_card_no, cl_order_no, start_dt,
    end_dt, cl_water_total_amount, cl_ele_total_amount, cl_money_remain_user, cl_water_remain_user,
    this_ele, this_water, this_money, this_duration
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
    <!--@mbg.generated-->
    select
    <include refid="Base_Column_List" />
    from rm_open_close_last
    where id = #{id,jdbcType=BIGINT}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
    <!--@mbg.generated-->
    delete from rm_open_close_last
    where id = #{id,jdbcType=BIGINT}
  </delete>
  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.RmOpenCloseLast">
    <!--@mbg.generated-->
    insert into rm_open_close_last (id, controller_id, intake_id,
      rtu_addr, op_dt, op_rtu_dt,
      op_ic_card_addr, op_ic_card_no, op_order_no,
      open_dt, op_water_total_amount, op_ele_total_amount,
      op_money_remain_user, op_water_remain_user, op_type,
      cl_ic_card_addr, cl_ic_card_no, cl_order_no,
      start_dt, end_dt, cl_water_total_amount,
      cl_ele_total_amount, cl_money_remain_user, cl_water_remain_user,
      this_ele, this_water, this_money,
      this_duration)
    values (#{id,jdbcType=BIGINT}, #{controllerId,jdbcType=BIGINT}, #{intakeId,jdbcType=BIGINT},
      #{rtuAddr,jdbcType=VARCHAR}, #{opDt,jdbcType=TIMESTAMP}, #{opRtuDt,jdbcType=TIMESTAMP},
      #{opIcCardAddr,jdbcType=VARCHAR}, #{opIcCardNo,jdbcType=VARCHAR}, #{opOrderNo,jdbcType=VARCHAR},
      #{openDt,jdbcType=TIMESTAMP}, #{opWaterTotalAmount,jdbcType=FLOAT}, #{opEleTotalAmount,jdbcType=FLOAT},
      #{opMoneyRemainUser,jdbcType=FLOAT}, #{opWaterRemainUser,jdbcType=FLOAT}, #{opType,jdbcType=TINYINT},
      #{clIcCardAddr,jdbcType=VARCHAR}, #{clIcCardNo,jdbcType=VARCHAR}, #{clOrderNo,jdbcType=VARCHAR},
      #{startDt,jdbcType=TIMESTAMP}, #{endDt,jdbcType=TIMESTAMP}, #{clWaterTotalAmount,jdbcType=FLOAT},
      #{clEleTotalAmount,jdbcType=FLOAT}, #{clMoneyRemainUser,jdbcType=FLOAT}, #{clWaterRemainUser,jdbcType=FLOAT},
      #{thisEle,jdbcType=FLOAT}, #{thisWater,jdbcType=FLOAT}, #{thisMoney,jdbcType=FLOAT},
      #{thisDuration,jdbcType=INTEGER})
  </insert>
  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmOpenCloseLast">
    <!--@mbg.generated-->
    insert into rm_open_close_last
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="controllerId != null">
        controller_id,
      </if>
      <if test="intakeId != null">
        intake_id,
      </if>
      <if test="rtuAddr != null">
        rtu_addr,
      </if>
      <if test="opDt != null">
        op_dt,
      </if>
      <if test="opRtuDt != null">
        op_rtu_dt,
      </if>
      <if test="opIcCardAddr != null">
        op_ic_card_addr,
      </if>
      <if test="opIcCardNo != null">
        op_ic_card_no,
      </if>
      <if test="opOrderNo != null">
        op_order_no,
      </if>
      <if test="openDt != null">
        open_dt,
      </if>
      <if test="opWaterTotalAmount != null">
        op_water_total_amount,
      </if>
      <if test="opEleTotalAmount != null">
        op_ele_total_amount,
      </if>
      <if test="opMoneyRemainUser != null">
        op_money_remain_user,
      </if>
      <if test="opWaterRemainUser != null">
        op_water_remain_user,
      </if>
      <if test="opType != null">
        op_type,
      </if>
      <if test="clIcCardAddr != null">
        cl_ic_card_addr,
      </if>
      <if test="clIcCardNo != null">
        cl_ic_card_no,
      </if>
      <if test="clOrderNo != null">
        cl_order_no,
      </if>
      <if test="startDt != null">
        start_dt,
      </if>
      <if test="endDt != null">
        end_dt,
      </if>
      <if test="clWaterTotalAmount != null">
        cl_water_total_amount,
      </if>
      <if test="clEleTotalAmount != null">
        cl_ele_total_amount,
      </if>
      <if test="clMoneyRemainUser != null">
        cl_money_remain_user,
      </if>
      <if test="clWaterRemainUser != null">
        cl_water_remain_user,
      </if>
      <if test="thisEle != null">
        this_ele,
      </if>
      <if test="thisWater != null">
        this_water,
      </if>
      <if test="thisMoney != null">
        this_money,
      </if>
      <if test="thisDuration != null">
        this_duration,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=BIGINT},
      </if>
      <if test="controllerId != null">
        #{controllerId,jdbcType=BIGINT},
      </if>
      <if test="intakeId != null">
        #{intakeId,jdbcType=BIGINT},
      </if>
      <if test="rtuAddr != null">
        #{rtuAddr,jdbcType=VARCHAR},
      </if>
      <if test="opDt != null">
        #{opDt,jdbcType=TIMESTAMP},
      </if>
      <if test="opRtuDt != null">
        #{opRtuDt,jdbcType=TIMESTAMP},
      </if>
      <if test="opIcCardAddr != null">
        #{opIcCardAddr,jdbcType=VARCHAR},
      </if>
      <if test="opIcCardNo != null">
        #{opIcCardNo,jdbcType=VARCHAR},
      </if>
      <if test="opOrderNo != null">
        #{opOrderNo,jdbcType=VARCHAR},
      </if>
      <if test="openDt != null">
        #{openDt,jdbcType=TIMESTAMP},
      </if>
      <if test="opWaterTotalAmount != null">
        #{opWaterTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="opEleTotalAmount != null">
        #{opEleTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="opMoneyRemainUser != null">
        #{opMoneyRemainUser,jdbcType=FLOAT},
      </if>
      <if test="opWaterRemainUser != null">
        #{opWaterRemainUser,jdbcType=FLOAT},
      </if>
      <if test="opType != null">
        #{opType,jdbcType=TINYINT},
      </if>
      <if test="clIcCardAddr != null">
        #{clIcCardAddr,jdbcType=VARCHAR},
      </if>
      <if test="clIcCardNo != null">
        #{clIcCardNo,jdbcType=VARCHAR},
      </if>
      <if test="clOrderNo != null">
        #{clOrderNo,jdbcType=VARCHAR},
      </if>
      <if test="startDt != null">
        #{startDt,jdbcType=TIMESTAMP},
      </if>
      <if test="endDt != null">
        #{endDt,jdbcType=TIMESTAMP},
      </if>
      <if test="clWaterTotalAmount != null">
        #{clWaterTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="clEleTotalAmount != null">
        #{clEleTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="clMoneyRemainUser != null">
        #{clMoneyRemainUser,jdbcType=FLOAT},
      </if>
      <if test="clWaterRemainUser != null">
        #{clWaterRemainUser,jdbcType=FLOAT},
      </if>
      <if test="thisEle != null">
        #{thisEle,jdbcType=FLOAT},
      </if>
      <if test="thisWater != null">
        #{thisWater,jdbcType=FLOAT},
      </if>
      <if test="thisMoney != null">
        #{thisMoney,jdbcType=FLOAT},
      </if>
      <if test="thisDuration != null">
        #{thisDuration,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmOpenCloseLast">
    <!--@mbg.generated-->
    update rm_open_close_last
    <set>
      <if test="controllerId != null">
        controller_id = #{controllerId,jdbcType=BIGINT},
      </if>
      <if test="intakeId != null">
        intake_id = #{intakeId,jdbcType=BIGINT},
      </if>
      <if test="rtuAddr != null">
        rtu_addr = #{rtuAddr,jdbcType=VARCHAR},
      </if>
      <if test="opDt != null">
        op_dt = #{opDt,jdbcType=TIMESTAMP},
      </if>
      <if test="opRtuDt != null">
        op_rtu_dt = #{opRtuDt,jdbcType=TIMESTAMP},
      </if>
      <if test="opIcCardAddr != null">
        op_ic_card_addr = #{opIcCardAddr,jdbcType=VARCHAR},
      </if>
      <if test="opIcCardNo != null">
        op_ic_card_no = #{opIcCardNo,jdbcType=VARCHAR},
      </if>
      <if test="opOrderNo != null">
        op_order_no = #{opOrderNo,jdbcType=VARCHAR},
      </if>
      <if test="openDt != null">
        open_dt = #{openDt,jdbcType=TIMESTAMP},
      </if>
      <if test="opWaterTotalAmount != null">
        op_water_total_amount = #{opWaterTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="opEleTotalAmount != null">
        op_ele_total_amount = #{opEleTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="opMoneyRemainUser != null">
        op_money_remain_user = #{opMoneyRemainUser,jdbcType=FLOAT},
      </if>
      <if test="opWaterRemainUser != null">
        op_water_remain_user = #{opWaterRemainUser,jdbcType=FLOAT},
      </if>
      <if test="opType != null">
        op_type = #{opType,jdbcType=TINYINT},
      </if>
      <if test="clIcCardAddr != null">
        cl_ic_card_addr = #{clIcCardAddr,jdbcType=VARCHAR},
      </if>
      <if test="clIcCardNo != null">
        cl_ic_card_no = #{clIcCardNo,jdbcType=VARCHAR},
      </if>
      <if test="clOrderNo != null">
        cl_order_no = #{clOrderNo,jdbcType=VARCHAR},
      </if>
      <if test="startDt != null">
        start_dt = #{startDt,jdbcType=TIMESTAMP},
      </if>
      <if test="endDt != null">
        end_dt = #{endDt,jdbcType=TIMESTAMP},
      </if>
      <if test="clWaterTotalAmount != null">
        cl_water_total_amount = #{clWaterTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="clEleTotalAmount != null">
        cl_ele_total_amount = #{clEleTotalAmount,jdbcType=FLOAT},
      </if>
      <if test="clMoneyRemainUser != null">
        cl_money_remain_user = #{clMoneyRemainUser,jdbcType=FLOAT},
      </if>
      <if test="clWaterRemainUser != null">
        cl_water_remain_user = #{clWaterRemainUser,jdbcType=FLOAT},
      </if>
      <if test="thisEle != null">
        this_ele = #{thisEle,jdbcType=FLOAT},
      </if>
      <if test="thisWater != null">
        this_water = #{thisWater,jdbcType=FLOAT},
      </if>
      <if test="thisMoney != null">
        this_money = #{thisMoney,jdbcType=FLOAT},
      </if>
      <if test="thisDuration != null">
        this_duration = #{thisDuration,jdbcType=INTEGER},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoRm.RmOpenCloseLast">
    <!--@mbg.generated-->
    update rm_open_close_last
    set controller_id = #{controllerId,jdbcType=BIGINT},
      intake_id = #{intakeId,jdbcType=BIGINT},
      rtu_addr = #{rtuAddr,jdbcType=VARCHAR},
      op_dt = #{opDt,jdbcType=TIMESTAMP},
      op_rtu_dt = #{opRtuDt,jdbcType=TIMESTAMP},
      op_ic_card_addr = #{opIcCardAddr,jdbcType=VARCHAR},
      op_ic_card_no = #{opIcCardNo,jdbcType=VARCHAR},
      op_order_no = #{opOrderNo,jdbcType=VARCHAR},
      open_dt = #{openDt,jdbcType=TIMESTAMP},
      op_water_total_amount = #{opWaterTotalAmount,jdbcType=FLOAT},
      op_ele_total_amount = #{opEleTotalAmount,jdbcType=FLOAT},
      op_money_remain_user = #{opMoneyRemainUser,jdbcType=FLOAT},
      op_water_remain_user = #{opWaterRemainUser,jdbcType=FLOAT},
      op_type = #{opType,jdbcType=TINYINT},
      cl_ic_card_addr = #{clIcCardAddr,jdbcType=VARCHAR},
      cl_ic_card_no = #{clIcCardNo,jdbcType=VARCHAR},
      cl_order_no = #{clOrderNo,jdbcType=VARCHAR},
      start_dt = #{startDt,jdbcType=TIMESTAMP},
      end_dt = #{endDt,jdbcType=TIMESTAMP},
      cl_water_total_amount = #{clWaterTotalAmount,jdbcType=FLOAT},
      cl_ele_total_amount = #{clEleTotalAmount,jdbcType=FLOAT},
      cl_money_remain_user = #{clMoneyRemainUser,jdbcType=FLOAT},
      cl_water_remain_user = #{clWaterRemainUser,jdbcType=FLOAT},
      this_ele = #{thisEle,jdbcType=FLOAT},
      this_water = #{thisWater,jdbcType=FLOAT},
      this_money = #{thisMoney,jdbcType=FLOAT},
      this_duration = #{thisDuration,jdbcType=INTEGER}
    where id = #{id,jdbcType=BIGINT}
  </update>
  <!--根据阀控器地址获取开关阀上报最新数据-->
  <select id="getRmOpenCloseReportLast" resultType="com.dy.pipIrrGlobal.pojoRm.RmOpenCloseLast">
    select
    <include refid="Base_Column_List" />
    from rm_open_close_last
    where rtu_addr = #{rtuAddr}
  </select>
</mapper>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
@@ -448,4 +448,5 @@
      </if>
    </where>
  </select>
</mapper>
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/dbSv/DbSv.java
@@ -52,6 +52,11 @@
    @Autowired
    private RmTimingReportLastMapper rmTimingReportLastDao; // 定点上报最新数据DAO
    @Autowired
    private RmOpenCloseHistoryMapper rmOpenCloseHistoryDao;
    @Autowired
    private RmOpenCloseLastMapper rmOpenCloseLastDao;
    //@Autowired
    //@Lazy
    //private DbSv sv ;
@@ -263,7 +268,45 @@
        this.rmOpenCloseValveHistoryMapperDao.updateByPrimaryKeySelective(po) ;
    }
    /**
     * 保存控制器开关阀上报数据最新记录(202404)
     * @param po
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveRmOpenCloseLast(RmOpenCloseLast po){
        this.rmOpenCloseLastDao.insert(po) ;
    }
    /**
     * 保存控制器开关阀上报数据历史记录(202404)
     * @param po
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveRmOpenCloseHistory(RmOpenCloseHistory po){
        this.rmOpenCloseHistoryDao.insert(po) ;
    }
    /**
     * 得到控制器开关阀上报数据最新记录(202404)
     * @param rtuAddr
     * @return
     */
    public RmOpenCloseLast getRmOpenCloseLast(String rtuAddr){
        List<RmOpenCloseLast> list = rmOpenCloseLastDao.getRmOpenCloseReportLast(rtuAddr);
        if(list != null && list.size() > 0){
            return list.get(0) ;
        }
        return null ;
    }
    /**
     * 保存控制器开关阀上报数据最新记录(202404)
     * @param po
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateRmOpenCloseLast(RmOpenCloseLast po){
        this.rmOpenCloseLastDao.updateByPrimaryKeySelective(po);
    }
    /////////////////////////////////////////////////
    //
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealCloseValveReportV202404.java
New file
@@ -0,0 +1,104 @@
package com.dy.rtuMw.server.rtuData.p206V202404;
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V202404.DataV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd85Vo;
import com.dy.pipIrrGlobal.pojoPr.PrController;
import com.dy.pipIrrGlobal.pojoRm.RmOpenCloseHistory;
import com.dy.pipIrrGlobal.pojoRm.RmOpenCloseLast;
import com.dy.rtuMw.server.rtuData.TaskSurpport;
import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
 * @author ZhuBaoMin
 * @date 2024-06-20 13:48
 * @LastEditTime 2024-06-20 13:48
 * @Description
 */
public class TkDealCloseValveReportV202404 extends TaskSurpport {
    private static final Logger log = LogManager.getLogger(TkDealTimingReportV202404.class.getName());
    //类ID,一定与Tree.xml配置文件中配置一致
    public static final String taskId = "TkDealCloseValveReportV202404";
    /**
     * 执行节点任务:关阀上报
     *
     * @param data 需要处理的数据
     */
    @Override
    public void execute(Object data) {
        Data d = (Data) data;
        DataV202404 dV202404 = (DataV202404) d.getSubData();
        Object cdObj = dV202404.subData;
        if (cdObj != null) {
            try {
                Object[] objs = this.getTaskResults(TkPreGenObjsV202404.taskId);
                DbSv sv = (DbSv) objs[0];
                PrController controller = (PrController) objs[1];
                if (cdObj instanceof DataCd85Vo) {
                    DataCd85Vo cdData = (DataCd85Vo) (cdObj);
                    this.doDeal(sv, controller, d.getRtuAddr(), dV202404, (DataCd85Vo)cdObj);
                }
            } catch (Exception e) {
                log.error("保存控制器开阀报数据时发生异常", e);
            }
        }
    }
    /**
     * 处理关阀报数据
     * @param sv 服务
     * @param controller 控制器对象
     * @param rtuAddr 控制器地址
     * @param dataV202404 协议数据
     * @param cdData 功能数据
     */
    private void doDeal(DbSv sv, PrController controller, String rtuAddr, DataV202404 dataV202404, DataCd85Vo cdData) throws Exception {
        this.saveOrUpdateLast(sv, controller, rtuAddr, dataV202404, cdData);
        this.saveHistory(sv, controller, rtuAddr, dataV202404, cdData);
    }
    /**
     * 保存或更新控制器关阀报最新数据
     * @param sv 服务bean
     * @param controller 控制器对象
     * @param rtuAddr 控制器地址
     * @param dataV202404 协议数据
     * @param cdData 功能数据
     */
    private void saveOrUpdateLast(DbSv sv, PrController controller, String rtuAddr, DataV202404 dataV202404, DataCd85Vo cdData)throws Exception {
        RmOpenCloseLast po = sv.getRmOpenCloseLast(rtuAddr);
        if(po == null){
            po = new RmOpenCloseLast();
            po.controllerId = controller==null?null:controller.getId();
            po.intakeId = controller==null?null:controller.getIntakeId();
            po.rtuAddr = rtuAddr;
            po.valueFrom85(dataV202404, cdData);
            sv.saveRmOpenCloseLast(po);
        }else{
            po.controllerId = controller==null?null:controller.getId();
            po.intakeId = controller==null?null:controller.getIntakeId();
            po.valueFrom85(dataV202404, cdData);
            sv.updateRmOpenCloseLast(po);
        }
    }
    /**
     * 保存控制器关阀报历史数据
     * @param sv 服务bean
     * @param controller 控制器对象
     * @param rtuAddr 控制器地址
     * @param dataV202404 协议数据
     * @param cdData 功能数据
     */
    private void saveHistory(DbSv sv, PrController controller, String rtuAddr, DataV202404 dataV202404, DataCd85Vo cdData)throws Exception {
        RmOpenCloseHistory po = new RmOpenCloseHistory();
        po.controllerId = controller==null?null:controller.getId();
        po.intakeId = controller==null?null:controller.getIntakeId();
        po.rtuAddr = rtuAddr;
        po.valueFrom85(dataV202404, cdData);
        sv.saveRmOpenCloseHistory(po); ;
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealOpenValveReportV202404.java
@@ -4,6 +4,8 @@
import com.dy.common.mw.protocol.p206V202404.DataV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd84Vo;
import com.dy.pipIrrGlobal.pojoPr.PrController;
import com.dy.pipIrrGlobal.pojoRm.RmOpenCloseHistory;
import com.dy.pipIrrGlobal.pojoRm.RmOpenCloseLast;
import com.dy.rtuMw.server.rtuData.TaskSurpport;
import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
import org.apache.logging.log4j.LogManager;
@@ -54,8 +56,8 @@
     * @param cdData 功能数据
     */
    private void doDeal(DbSv sv, PrController controller, String rtuAddr, DataV202404 dataV202404, DataCd84Vo cdData) throws Exception {
        //this.saveOrUpdateLast(sv, controller, rtuAddr, dataV202404, cdData);
        //this.saveHistory(sv, controller, rtuAddr, dataV202404, cdData);
        this.saveOrUpdateLast(sv, controller, rtuAddr, dataV202404, cdData);
        this.saveHistory(sv, controller, rtuAddr, dataV202404, cdData);
    }
    /**
@@ -66,22 +68,22 @@
     * @param dataV202404 协议数据
     * @param cdData 功能数据
     */
    //private void saveOrUpdateLast(DbSv sv, PrController controller, String rtuAddr, DataV202404 dataV202404, DataCd84Vo cdData)throws Exception {
    //    RmTimingReportLast po = sv.getRmTimingReportLast(rtuAddr) ;
    //    if(po == null){
    //        po = new RmTimingReportLast();
    //        po.controllerId = controller==null?null:controller.getId();
    //        po.intakeId = controller==null?null:controller.getIntakeId();
    //        po.rtuAddr = rtuAddr;
    //        po.valueFrom(dataV202404, cdData);
    //        sv.saveRmTimingReportLast(po) ;
    //    }else{
    //        po.controllerId = controller==null?null:controller.getId();
    //        po.intakeId = controller==null?null:controller.getIntakeId();
    //        po.valueFrom(dataV202404, cdData);
    //        sv.updateRmTimingReportLast(po);
    //    }
    //}
    private void saveOrUpdateLast(DbSv sv, PrController controller, String rtuAddr, DataV202404 dataV202404, DataCd84Vo cdData)throws Exception {
        RmOpenCloseLast po = sv.getRmOpenCloseLast(rtuAddr);
        if(po == null){
            po = new RmOpenCloseLast();
            po.controllerId = controller==null?null:controller.getId();
            po.intakeId = controller==null?null:controller.getIntakeId();
            po.rtuAddr = rtuAddr;
            po.valueFrom84(dataV202404, cdData);
            sv.saveRmOpenCloseLast(po);
        }else{
            po.controllerId = controller==null?null:controller.getId();
            po.intakeId = controller==null?null:controller.getIntakeId();
            po.valueFrom84(dataV202404, cdData);
            sv.updateRmOpenCloseLast(po);
        }
    }
    /**
     * 保存控制器工作报历史数据
@@ -91,12 +93,12 @@
     * @param dataV202404 协议数据
     * @param cdData 功能数据
     */
    //private void saveHistory(DbSv sv, PrController controller, String rtuAddr, DataV202404 dataV202404, DataCd84Vo cdData)throws Exception {
    //    RmTimingReportHistory po = new RmTimingReportHistory();
    //    po.controllerId = controller==null?null:controller.getId();
    //    po.intakeId = controller==null?null:controller.getIntakeId();
    //    po.rtuAddr = rtuAddr;
    //    po.valueFrom(dataV202404, cdData);
    //    sv.saveRmTimingReportHistory(po); ;
    //}
    private void saveHistory(DbSv sv, PrController controller, String rtuAddr, DataV202404 dataV202404, DataCd84Vo cdData)throws Exception {
        RmOpenCloseHistory po = new RmOpenCloseHistory();
        po.controllerId = controller==null?null:controller.getId();
        po.intakeId = controller==null?null:controller.getIntakeId();
        po.rtuAddr = rtuAddr;
        po.valueFrom84(dataV202404, cdData);
        sv.saveRmOpenCloseHistory(po); ;
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml
@@ -42,6 +42,7 @@
                            <task id="TkDealWorkingReportV202404" name="控制器工作报(功能码80)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealWorkingReportV202404" />
                            <task id="TkDealTimingReportV202404" name="控制器定时上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealTimingReportV202404" />
                            <task id="TkDealOpenValveReportV202404" name="控制器开阀上报(功能码84)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealOpenValveReportV202404" />
                            <task id="TkDealCloseValveReportV202404" name="控制器关阀上报(功能码85)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealCloseValveReportV202404" />
                        </task>
                        <!-- 识别命令响应数据 -->
                        <task id="TkFindComResponseV202404" name="识别响应命令数据" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkFindComResponseV202404">
pipIrr-platform/pipIrr-web/pipIrr-web-base/src/main/java/com/dy/pipIrrBase/district/DistrictSv.java
@@ -75,7 +75,7 @@
     */
    @Transactional
    public int delete(Long id){
        return this.dao.deleteLogicById(id) ;
        return this.dao.deleteByPrimaryKey(id) ;
    }
    /**
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java
@@ -10,8 +10,10 @@
import com.dy.pipIrrGlobal.daoPr.PrIntakeVcMapper;
import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper;
import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper;
import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper;
import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
import com.dy.pipIrrGlobal.voPr.VoOnLineIntake;
import com.dy.pipIrrGlobal.voRm.VoUnclosedParam;
import com.dy.pipIrrGlobal.voRm.VoUnclosedValve;
@@ -41,6 +43,7 @@
    private final PrIntakeMapper prIntakeMapper;
    private final PrWaterPriceMapper prWaterPriceMapper;
    private final PrIntakeVcMapper prIntakeVcMapper;
    private final SeClientCardMapper seClientCardMapper;
    /**
     * 虚拟卡ID换虚拟卡对象
@@ -158,7 +161,6 @@
                jsonObject.put("isOnLine", entry.getValue());
                jsonArray.add(jsonObject);
            }
            System.out.println(jsonArray);
            return rmCommandHistoryMapper.getUncloseParam(jsonArray.toJSONString(), intakeId);
        } else {
@@ -168,4 +170,13 @@
        }
    }
    /**
     * 根据水卡编号获取水卡对象,远程充值使用
     * @param cardId
     * @return
     */
    public SeClientCard geClientCardByCardId(Long cardId) {
        return seClientCardMapper.selectByPrimaryKey(cardId);
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/Recharge.java
New file
@@ -0,0 +1,34 @@
package com.dy.pipIrrRemote.common.dto;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
 * @author ZhuBaoMin
 * @date 2024-06-26 8:44
 * @LastEditTime 2024-06-26 8:44
 * @Description
 */
@Data
public class Recharge extends DtoBase {
    public static final long serialVersionUID = 202406260745001L;
    /**
     * 水卡ID
     */
    @NotNull(message = "水卡ID不能为空")
    private Long cardId;
    /**
     * 充值金额
     */
    @NotNull(message = "充值金额不能为空")
    private Double chargeMoney;
    /**
     * 充值水量
     */
    private Double chargeWater;
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/result/RemoteResultCode.java
@@ -19,14 +19,16 @@
    GET_RESULT_ERROR(10002, "获取结果异常"),
    PLEASE_SELECT_A_VC(10003, "请选择一张虚拟卡"),
    IN_USE_VC_CANNOT_OPEN_VALVE(10004, "使用中虚拟卡不能用来开阀"),
    VALVE_CLOSED(10005, "该取水口已关阀"),
    VALVE_CLOSED(10005, "该取水口不在线或已关阀"),
    /**
     * RTU
     */
    RTU_NOT_EXIST(20001, "阀控器不存在");
    RTU_NOT_EXIST(20001, "阀控器不存在"),
    //RTU_ADDR_CANNOT_BE_NULL(20002, "阀控器地址不能为空");
    CLIENT_CARD_NOT_EXIST(30001, "水卡不存在");
    private final Integer code;
    private final String message;
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtu/RtuCtrl.java
@@ -1,10 +1,7 @@
package com.dy.pipIrrRemote.rtu;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1;
import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com97Vo;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
@@ -15,7 +12,6 @@
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrGlobal.command.ComSupport;
import com.dy.pipIrrGlobal.command.dto.Param;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
import com.dy.pipIrrRemote.common.CommandSv;
import com.dy.pipIrrRemote.common.dto.Addr;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -26,7 +22,10 @@
import org.springframework.http.MediaType;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Objects;
@@ -88,75 +87,32 @@
            // 创建视图
            ComCd10Vo param = new ComCd10Vo() ;
            param.controllerType = controllerType;
            param.projectNo =projectNo;
            param.projectNo = projectNo;
            param.rtuNewAddr = newRtuAddr;
            // 发送命令并处理请求结果及执行结果
            Param po = new Param();
            po.setComId(comId);
            po.setCommandCode(commandCode);
            po.setIntakeId(intakeId);
            po.setRtuAddr(rtuAddr);
            po.setProtocol(protocol);
            po.setParam(param);
            po.setRtuResultSendWebUrl(rtuResultSendWebUrl);
            po.setOperator(operator);
            return dealWithCommandResult(po);
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV202404.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuResultSendWebUrl);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else if(protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_10;
            // 创建视图
            Com97Vo param = new Com97Vo() ;
            // 构造命令
            Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param);
            // 发送命令
            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
                //if(1 > 0) {
                // 请求成功
                // 创建命令日志对象并添加到数据库中
                String commandName = CodeV1_0_1.getCodeName(commandCode);
                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator);
                commandSv.insert(rmCommandHistory);
                // 处理回调
                BaseResponse response_CallBack = dealWithCallBack(comId);
                //回调失败
                if(!response_CallBack.getCode().equals("0001")) {
                    // 命令日志执行结果改为失败
                    rmCommandHistory = new RmCommandHistory();
                    rmCommandHistory.setId(comId);
                    rmCommandHistory.setResult((byte)0);
                    commandSv.updateCommandResult(rmCommandHistory);
                    return BaseResponseUtils.buildFail(response_CallBack.getMsg());
                    //return BaseResponseUtils.buildFail(response_CallBack.getContent().toString());
                }
                // 回调成功,再判断执行是否成功
                JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent());
                System.out.println(job_content);
                JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData");
                System.out.println(job_subData);
                Boolean dealResult = job_subData.getBoolean("success");
                if(!dealResult) {
                    return BaseResponseUtils.buildFail(response_CallBack.getContent().toString());
                }
                /**
                 * 执行成功,返回回调内容
                 */
                Data myData = (Data)response_CallBack.getContent();
                return BaseResponseUtils.buildSuccess(myData) ;
            } else {
                // 请求失败
                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
                return BaseResponseUtils.buildFail(job_param.getString("message"));
            }
            return BaseResponseUtils.buildSuccess("");
        } else {
            return BaseResponseUtils.buildFail("系统暂不支持该协议");
        }
@@ -176,32 +132,59 @@
            return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        String commandCode = CodeV202404.cd_97;
        //String commandCode = CodeV202404.cd_97;
        Long intakeId = po.getIntakeId();
        Long operator = po.getOperator();
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 取水口ID换阀控器地址及通讯协议
        //PrController prController = commandSv.getControllerByIntakeId(intakeId);
        //if(prController == null) {
        //    return BaseResponseUtils.buildErrorMsg(RemoteResultCode.RTU_NOT_EXIST.getMessage());
        //}
        //String rtuAddr = prController.getRtuAddr();
        //String protocol = prController.getProtocol();
        String rtuAddr = "";
        String protocol = "";
        JSONObject job_rtu = getRtu(intakeId, null);
        if(job_rtu == null) {
            return BaseResponseUtils.buildErrorMsg(RemoteResultCode.RTU_NOT_EXIST.getMessage());
        }
        String rtuAddr = job_rtu.getString("rtuAddr");
        String protocol = job_rtu.getString("protocol");
        // 创建视图
        ComCdXyVo param = new ComCdXyVo();
        param.controllerType = controllerType;
        param.projectNo = projectNo;
        String commandCode = null;
        if(protocol.equals("p206V202404")) {
            // 获取功能码
            commandCode = CodeV202404.cd_97;
        // 创建命令日志对象并添加到数据库中
        RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, "",intakeId, rtuAddr, protocol, param, operator);
        comId = commandSv.insert(rmCommandHistory);
            // 创建视图
            ComCdXyVo param = new ComCdXyVo();
            param.controllerType = controllerType;
            param.projectNo = projectNo;
        // 构造命令
        Command com = command(comId, commandCode,"", rtuAddr, protocol, param);
        return sendCom2Mw(com);
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV202404.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuResultSendWebUrl);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else if(protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_10;
            // 创建视图
            Com97Vo param = new Com97Vo() ;
            return BaseResponseUtils.buildSuccess("");
        } else {
            return BaseResponseUtils.buildFail("系统暂不支持该协议");
        }
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java
@@ -1,45 +1,43 @@
package com.dy.pipIrrRemote.valve;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1;
import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com97Vo;
import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com98Vo;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd15Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd92_A2Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd93_A3Vo;
import com.dy.common.util.IDLongGenerator;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrGlobal.command.ComSupport;
import com.dy.pipIrrGlobal.command.dto.Param;
import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
import com.dy.pipIrrGlobal.voRm.VoUnclosedParam;
import com.dy.pipIrrGlobal.voRm.VoUnclosedValve;
import com.dy.pipIrrGlobal.voSe.VoVirtualCard;
import com.dy.pipIrrRemote.common.CommandSv;
import com.dy.pipIrrRemote.common.dto.DtoBase;
import com.dy.pipIrrRemote.common.dto.ValveClose;
import com.dy.pipIrrRemote.common.dto.Recharge;
import com.dy.pipIrrRemote.common.dto.ValveOpen;
import com.dy.pipIrrRemote.common.enums.LastOperateENUM;
import com.dy.pipIrrRemote.result.RemoteResultCode;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.http.MediaType;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
 * @author ZhuBaoMin
@@ -135,71 +133,24 @@
            param.elePrice = 0.0;
            param.orderNo = orderNo;
            // 构造命令
            Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param);
            // 发送命令
            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
                //if(1 > 0) {
                // 请求成功
                // 创建命令日志对象并添加到数据库中
                String commandName = CodeV202404.getCodeName(commandCode);
                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator);
                commandSv.insert(rmCommandHistory);
                // 处理回调
                BaseResponse response_CallBack = dealWithCallBack(comId);
                // 回调失败
                if(!response_CallBack.getCode().equals("0001")) {
                    // 命令日志执行结果改为失败
                    //rmCommandHistory = new RmCommandHistory();
                    //rmCommandHistory.setId(comId);
                    //rmCommandHistory.setResult((byte)0);
                    //commandSv.updateCommandResult(rmCommandHistory);
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getMsg());
                    //return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                // 回调成功,再判断执行是否成功
                JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent());
                System.out.println(job_content);
                JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData");
                System.out.println(job_subData);
                Boolean dealResult = job_subData.getBoolean("success");
                if(!dealResult) {
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                /**
                 * 执行成功
                 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间
                 */
//                SeVirtualCard virtualCard = new SeVirtualCard();
//                virtualCard.setId(vcId);
//                virtualCard.setInUse((byte) 1);
//                virtualCard.setIntakeId(intakeId);
//                virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
//                virtualCard.setLastOperateTime(new Date());
//                seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
                // 回调返回的内容
                //Data myData = (Data)response_CallBack.getContent();
                //return BaseResponseUtils.buildSuccess(myData);
                JSONObject job_response = new JSONObject();
                job_response.put("rtuAddr", rtuAddr);
                job_response.put("vcNum", vc.getVcNum());
                job_response.put("orderNo", orderNo);
                //job_response.put("operator", operator);
                return BaseResponseUtils.buildSuccess(job_response);
            } else {
                // 请求失败
                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
                return BaseResponseUtils.buildErrorMsg(job_param.getString("message"));
            }
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 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(rtuResultSendWebUrl);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else if(protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_92;
@@ -211,299 +162,24 @@
            param.waterPrice = waterPrice;
            param.orderNo = orderNo;
            // 构造命令
            Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param);
            // 发送命令
            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
                //if(1 > 0) {
                // 请求成功
                // 创建命令日志对象并添加到数据库中
                String commandName = CodeV1_0_1.getCodeName(commandCode);
                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator);
                commandSv.insert(rmCommandHistory);
                // 处理回调
                BaseResponse response_CallBack = dealWithCallBack(comId);
                //回调异常
                if(!response_CallBack.getCode().equals("0001")) {
                    // 命令日志执行结果改为失败
                    rmCommandHistory = new RmCommandHistory();
                    rmCommandHistory.setId(comId);
                    rmCommandHistory.setResult((byte)0);
                    commandSv.updateCommandResult(rmCommandHistory);
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                // 回调超时
                if(response_CallBack.getContent().toString().equals(RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage())) {
                    /**
                     * 回调超时,暂时认为执行失败
                     * 命令置为失败
                     * 虚拟卡依旧保持使用中的状态
                     * 不返回关阀参数
                     */
                    rmCommandHistory = new RmCommandHistory();
                    rmCommandHistory.setId(comId);
                    rmCommandHistory.setResult((byte)0);
                    commandSv.updateCommandResult(rmCommandHistory);
                    //SeVirtualCard virtualCard = new SeVirtualCard();
                    //virtualCard.setId(vcId);
                    //virtualCard.setInUse((byte) 1);
                    //virtualCard.setIntakeId(intakeId);
                    //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
                    //virtualCard.setLastOperateTime(new Date());
                    //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
                    //JSONObject job_response = new JSONObject();
                    //job_response.put("message", RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage());
                    //job_response.put("rtuAddr", rtuAddr);
                    //job_response.put("vcNum", vc.getVcNum());
                    //job_response.put("orderNo", orderNo);
                    //return BaseResponseUtils.buildSuccess(job_response);
                    return BaseResponseUtils.buildErrorMsg(RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage());
                }
                // 回调成功,再判断执行是否成功
                JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent());
                System.out.println(job_content);
                JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData");
                System.out.println(job_subData);
                Boolean dealResult = job_subData.getBoolean("success");
                if(!dealResult) {
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                /**
                 * 执行成功
                 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间
                 */
                SeVirtualCard virtualCard = new SeVirtualCard();
                virtualCard.setId(vcId);
                virtualCard.setInUse((byte) 1);
                virtualCard.setIntakeId(intakeId);
                virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
                virtualCard.setLastOperateTime(new Date());
                seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
                // 回调返回的内容
                //Data myData = (Data)response_CallBack.getContent();
                //return BaseResponseUtils.buildSuccess(myData) ;
                JSONObject job_response = new JSONObject();
                job_response.put("message", "ok");
                job_response.put("rtuAddr", rtuAddr);
                job_response.put("vcNum", vc.getVcNum());
                job_response.put("orderNo", orderNo);
                //job_response.put("operator", operator);
                return BaseResponseUtils.buildSuccess(job_response);
            } else {
                // 请求失败
                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
                return BaseResponseUtils.buildErrorMsg(job_param.getString("message"));
            }
        } else {
            return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议");
        }
    }
    /**
     * 平台远程关阀_参数模式
     * @param valve
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "close", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    @SsoAop()
    public BaseResponse<Boolean> close(@RequestBody @Valid ValveClose valve, BindingResult bindingResult) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmss");
        if(bindingResult != null && bindingResult.hasErrors()){
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        String rtuAddr = valve.getRtuAddr();
        String vcNum = valve.getVcNum();
        String orderNo = valve.getOrderNo();
        Long operator = valve.getOperator();
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 阀控器地址换取水口ID和通讯协议
        JSONObject job_rtu = getRtu(null, rtuAddr);
        if(job_rtu == null) {
            return BaseResponseUtils.buildErrorMsg(RemoteResultCode.RTU_NOT_EXIST.getMessage());
        }
        Long intakeId = job_rtu.getLong("intakeId");
        String protocol = job_rtu.getString("protocol");
        String commandCode = null;
        if(protocol.equals("p206V202404")) {
            // 获取功能码
            commandCode = CodeV202404.cd_93;
            // 创建视图
            ComCd93_A3Vo param = new ComCd93_A3Vo();
            param.controllerType = controllerType;
            param.projectNo = projectNo;
            param.icCardNo = vcNum;
            param.orderNo = orderNo;
            // 构造命令
            Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param);
            // 发送命令
            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
                // 请求成功
                // 创建命令日志对象并添加到数据库中
                String commandName = CodeV202404.getCodeName(commandCode);
                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator);
                commandSv.insert(rmCommandHistory);
                // 处理回调
                BaseResponse response_CallBack = dealWithCallBack(comId);
                // 回调失败
                if(!response_CallBack.getCode().equals("0001")) {
                    // 命令日志执行结果改为失败
                    //rmCommandHistory = new RmCommandHistory();
                    //rmCommandHistory.setId(comId);
                    //rmCommandHistory.setResult((byte)0);
                    //commandSv.updateCommandResult(rmCommandHistory);
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getMsg());
                    //return BaseResponseUtils.buildErrorMsgMsg(WechatResultCode.GET_RESULT_ERROR.getMessage());
                }
                // 回调成功,再判断执行是否成功
                JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent());
                System.out.println(job_content);
                JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData");
                System.out.println(job_subData);
                Boolean dealResult = job_subData.getBoolean("success");
                if(!dealResult) {
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                /**
                 * 执行成功
                 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间
                 */
                //SeVirtualCard virtualCard = seVirtualCardMapper.getVcCardByNum(vcNum);
                //virtualCard.setInUse((byte) 0);
                //virtualCard.setIntakeId(null);
                //virtualCard.setLastOperate(LastOperateENUM.CLOSE_VALVE.getCode());
                //virtualCard.setLastOperateTime(new Date());
                //seVirtualCardMapper.updateByPrimaryKey(virtualCard);
                // 回调返回的内容
                Data myData = (Data)response_CallBack.getContent();
                return BaseResponseUtils.buildSuccess(myData) ;
            } else {
                // 请求失败
                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
                return BaseResponseUtils.buildErrorMsg(job_param.getString("message"));
            }
        } else if(protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_93;
            // 创建视图
            Com98Vo param = new Com98Vo() ;
            param.icCardNo = vcNum;
            param.orderNo = orderNo;
            // 构造命令
            Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param);
            // 发送命令
            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
                //if(1 > 0) {
                // 请求成功
                // 创建命令日志对象并添加到数据库中
                String commandName = CodeV1_0_1.getCodeName(commandCode);
                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator);
                commandSv.insert(rmCommandHistory);
                // 处理回调
                BaseResponse response_CallBack = dealWithCallBack(comId);
                // 回调异常
                if(!response_CallBack.getCode().equals("0001")) {
                    // 命令日志执行结果改为失败
                    rmCommandHistory = new RmCommandHistory();
                    rmCommandHistory.setId(comId);
                    rmCommandHistory.setResult((byte)0);
                    commandSv.updateCommandResult(rmCommandHistory);
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                // 回调超时
                if(response_CallBack.getContent().toString().equals(RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage())) {
                    /**
                     * 回调超时,暂时认为执行失败
                     * 命令置为失败
                     * 虚拟卡依旧保持使用中的状态
                     */
                    rmCommandHistory = new RmCommandHistory();
                    rmCommandHistory.setId(comId);
                    rmCommandHistory.setResult((byte)0);
                    commandSv.updateCommandResult(rmCommandHistory);
                    //SeVirtualCard virtualCard = seVirtualCardMapper.getVcCardByNum(vcNum);
                    //virtualCard.setInUse((byte) 0);
                    //virtualCard.setIntakeId(null);
                    //virtualCard.setLastOperate(LastOperateENUM.CLOSE_VALVE.getCode());
                    //virtualCard.setLastOperateTime(new Date());
                    //seVirtualCardMapper.updateByPrimaryKey(virtualCard);
                    return BaseResponseUtils.buildErrorMsg(RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage());
                }
                // 回调成功,再判断执行是否成功
                JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent());
                System.out.println(job_content);
                JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData");
                System.out.println(job_subData);
                Boolean dealResult = job_subData.getBoolean("success");
                if(!dealResult) {
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                /**
                 * 执行成功
                 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间
                 */
                SeVirtualCard virtualCard = seVirtualCardMapper.getVcCardByNum(vcNum);
                virtualCard.setInUse((byte) 0);
                virtualCard.setIntakeId(null);
                virtualCard.setLastOperate(LastOperateENUM.CLOSE_VALVE.getCode());
                virtualCard.setLastOperateTime(new Date());
                seVirtualCardMapper.updateByPrimaryKey(virtualCard);
                // 回调返回的内容
                Data myData = (Data)response_CallBack.getContent();
                return BaseResponseUtils.buildSuccess(myData) ;
            } else {
                // 请求失败
                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
                return BaseResponseUtils.buildErrorMsg(job_param.getString("message"));
            }
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 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(rtuResultSendWebUrl);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else {
            return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议");
        }
@@ -519,7 +195,6 @@
    @Transactional(rollbackFor = Exception.class)
    @SsoAop()
    public BaseResponse<Boolean> closeByIntake(@RequestBody @Valid DtoBase dtoBase, BindingResult bindingResult) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmss");
        if(bindingResult != null && bindingResult.hasErrors()){
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
@@ -539,6 +214,7 @@
        }
        String rtuAddr = voUnclosedParam.getRtuAddr();
        String vcNum = voUnclosedParam.getVcNum();
        Long vcId = Optional.ofNullable(seVirtualCardMapper.getVcIdByNum(vcNum)).orElse(0L);
        String orderNo = voUnclosedParam.getOrderNo();
        Long comId = idLongGenerator.generate();
@@ -567,63 +243,24 @@
            param.icCardNo = vcNum;
            param.orderNo = orderNo;
            // 构造命令
            Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param);
            // 发送命令
            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
                // 请求成功
                // 创建命令日志对象并添加到数据库中
                String commandName = CodeV202404.getCodeName(commandCode);
                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator);
                commandSv.insert(rmCommandHistory);
                // 处理回调
                BaseResponse response_CallBack = dealWithCallBack(comId);
                // 回调失败
                if(!response_CallBack.getCode().equals("0001")) {
                    // 命令日志执行结果改为失败
                    //rmCommandHistory = new RmCommandHistory();
                    //rmCommandHistory.setId(comId);
                    //rmCommandHistory.setResult((byte)0);
                    //commandSv.updateCommandResult(rmCommandHistory);
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getMsg());
                    //return BaseResponseUtils.buildErrorMsgMsg(WechatResultCode.GET_RESULT_ERROR.getMessage());
                }
                // 回调成功,再判断执行是否成功
                JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent());
                System.out.println(job_content);
                JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData");
                System.out.println(job_subData);
                Boolean dealResult = job_subData.getBoolean("success");
                if(!dealResult) {
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                /**
                 * 执行成功
                 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间
                 */
                //Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum);
                //SeVirtualCard virtualCard = new SeVirtualCard();
                //virtualCard.setId(vcId);
                //virtualCard.setInUse((byte) 0);
                //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
                //virtualCard.setLastOperateTime(new Date());
                //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
                // 回调返回的内容
                Data myData = (Data)response_CallBack.getContent();
                return BaseResponseUtils.buildSuccess(myData) ;
            } else {
                // 请求失败
                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
                return BaseResponseUtils.buildErrorMsg(job_param.getString("message"));
            }
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)2);
            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(rtuResultSendWebUrl);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else if(protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_93;
@@ -633,86 +270,24 @@
            param.icCardNo = vcNum;
            param.orderNo = orderNo;
            // 构造命令
            Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param);
            // 发送命令
            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
                //if(1 > 0) {
                // 请求成功
                // 创建命令日志对象并添加到数据库中
                String commandName = CodeV1_0_1.getCodeName(commandCode);
                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator);
                commandSv.insert(rmCommandHistory);
                // 处理回调
                BaseResponse response_CallBack = dealWithCallBack(comId);
                // 回调异常
                if(!response_CallBack.getCode().equals("0001")) {
                    // 命令日志执行结果改为失败
                    rmCommandHistory = new RmCommandHistory();
                    rmCommandHistory.setId(comId);
                    rmCommandHistory.setResult((byte)0);
                    commandSv.updateCommandResult(rmCommandHistory);
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                // 回调超时
                if(response_CallBack.getContent().toString().equals(RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage())) {
                    /**
                     * 回调超时,暂时认为执行失败
                     * 命令置为失败
                     * 虚拟卡依旧保持使用中的状态
                     */
                    rmCommandHistory = new RmCommandHistory();
                    rmCommandHistory.setId(comId);
                    rmCommandHistory.setResult((byte)0);
                    commandSv.updateCommandResult(rmCommandHistory);
                    //Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum);
                    //SeVirtualCard virtualCard = new SeVirtualCard();
                    //virtualCard.setId(vcId);
                    //virtualCard.setInUse((byte) 0);
                    //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
                    //virtualCard.setLastOperateTime(new Date());
                    //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
                    return BaseResponseUtils.buildErrorMsg(RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage());
                }
                // 回调成功,再判断执行是否成功
                JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent());
                System.out.println(job_content);
                JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData");
                System.out.println(job_subData);
                Boolean dealResult = job_subData.getBoolean("success");
                if(!dealResult) {
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                /**
                 * 执行成功
                 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间
                 */
                Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum);
                SeVirtualCard virtualCard = new SeVirtualCard();
                virtualCard.setId(vcId);
                virtualCard.setInUse((byte) 0);
                virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
                virtualCard.setLastOperateTime(new Date());
                seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
                // 回调返回的内容
                Data myData = (Data)response_CallBack.getContent();
                return BaseResponseUtils.buildSuccess(myData) ;
            } else {
                // 请求失败
                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
                return BaseResponseUtils.buildErrorMsg(job_param.getString("message"));
            }
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)2);
            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(rtuResultSendWebUrl);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else {
            return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议");
        }
@@ -734,4 +309,90 @@
            return BaseResponseUtils.buildException(e.getMessage()) ;
        }
    }
    /**
     * 平台远程充值
     * @param po
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "recharge", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    @SsoAop()
    public BaseResponse<Boolean> recharge(@RequestBody @Valid Recharge po, BindingResult bindingResult) {
        if(bindingResult != null && bindingResult.hasErrors()){
            return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Long intakeId = po.getIntakeId();
        Long cardId = po.getCardId();
        Double chargeMoney = po.getChargeMoney();
        Double chargeWater = po.getChargeWater();
        Long operator = po.getOperator();
        String flowNo = RandomStringUtils.randomNumeric(12); // 生成12位随机数
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 取水口ID换阀控器地址及通讯协议
        JSONObject job_rtu = getRtu(intakeId, null);
        if(job_rtu == null) {
            return BaseResponseUtils.buildErrorMsg(RemoteResultCode.RTU_NOT_EXIST.getMessage());
        }
        String rtuAddr = job_rtu.getString("rtuAddr");
        String protocol = job_rtu.getString("protocol");
        // 水卡ID换水卡地址及水卡编号
        SeClientCard seClientCard = commandSv.geClientCardByCardId(cardId);
        if(seClientCard == null) {
            return BaseResponseUtils.buildErrorMsg(RemoteResultCode.CLIENT_CARD_NOT_EXIST.getMessage());
        }
        String icCardAddr = seClientCard.getCardaddr();
        String icCardNo = seClientCard.getCardnum();
        String commandCode = null;
        if(protocol.equals("p206V202404")) {
            // 获取功能码
            commandCode = CodeV202404.cd_15;
            // 创建视图
            ComCd15Vo param = new ComCd15Vo();
            param.controllerType = controllerType;
            param.projectNo = projectNo;
            param.icCardAddr = icCardAddr;
            param.icCardNo = icCardNo;
            param.chargeMoney = chargeMoney;
            param.chargeWater = chargeWater;
            param.flowNo = flowNo;
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV202404.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuResultSendWebUrl);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else if(protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_10;
            // 创建视图
            Com97Vo param = new Com97Vo() ;
            return BaseResponseUtils.buildSuccess("");
        } else {
            return BaseResponseUtils.buildFail("系统暂不支持该协议");
        }
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/ClientCtrl.java
@@ -8,7 +8,6 @@
import com.dy.pipIrrGlobal.pojoSe.SeCodeVerify;
import com.dy.pipIrrGlobal.pojoSe.SeOpenId;
import com.dy.pipIrrGlobal.voSe.VoClientWechat;
import com.dy.pipIrrSell.wechatpay.PayInfo;
import com.dy.pipIrrWechat.client.dto.CodeLoginDTO;
import com.dy.pipIrrWechat.client.dto.CodeVerifyDTO;
import com.dy.pipIrrWechat.result.WechatResultCode;
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/client/PayInfo.java
New file
@@ -0,0 +1,176 @@
package com.dy.pipIrrWechat.client;
/**
 * @author ZhuBaoMin
 * @date 2024-03-06 13:49
 * @LastEditTime 2024-03-06 13:49
 * @Description
 */
public class PayInfo {
    /**
     * 小程序登录API
     */
    public static String loginUrl = "https://api.weixin.qq.com/sns/jscode2session";
    /**
     * 检验登录态
     */
    public static String checkSessionUrl = "https://api.weixin.qq.com/wxa/checksession";
    /**
     * 重置登录态
     */
    public static String resetUserSessionKeyUrl = "https://api.weixin.qq.com/wxa/resetusersessionkey";
    /**
     * 获取接口调用凭据
     */
    public static String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
    /**
     * 统一下单API
     */
    //public static String orderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    public static String orderUrl = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi";
    /**
     * 平台证书下载URL
     */
    public static String certificates = "https://api.mch.weixin.qq.com/v3/certificates";
    /*
     * 支付结果通知API
     */
    public static String notifyUrl = "https://44978f7456.imdo.co/sell/payment/orderNotify";
    /*
     * 查询订单API
     */
    public static String queryUrl = "https://api.mch.weixin.qq.com/pay/orderquery";
    /**
     * 申请退款API
     */
    public static String refundUrl = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds";
    /*
     * 退款通知API
     */
    public static String refundNotifyUrl = "https://www.muxiaobao.com/wxpay/pay.action";
    /*
     * 退款查询API
     */
    public static String refundQueryUrl = "https://api.mch.weixin.qq.com/pay/refundquery";
    /*
     * 小程序唯一标识
     */
    //public static String appid = "wxbc2b6a00dd904ead";
    public static String appid = "wxf773810cd5643196";
    /*
     * 小程序的 app secret
     */
    //public static String secret = "796ffe3e9921f756db0499e80d6ed0cd";
    public static String secret = "080d4f947095551e988cfe9338e27f15";
    /*
     * 小程序的授权类型,登录凭证校验使用
     */
    public static String grantType = "authorization_code";
    /*
     * 商户号(微信支付分配的商户号)
     */
    public static String mchid = "1640721520";
    /*
     * 商户平台设置的密钥key
     */
    public static String key = "DaYuJieShuiYanJiuYuan20230412ABC";
    /**
     * 商户API证书序列号
     */
    public static String serial_no = "52D65AA66405C738670377F467178F4C950E1606";
    /*
     * 终端IP,调用微信支付API的机器IP
     */
    public static String addrIp = "47.104.211.89";
    /*
     * 随机字符串,长度要求在32位以内
     */
    //public static String nonceStr = PayHelper.generateRandomString();
    /*
     * 时间戳 从1970年1月1日00:00:00至今的秒数,即当前的时间
     */
    //public static Long timeStamp = PayHelper.getTimeStamp();
    /*
     * 交易类型,小程序取值JSAPI
     */
    public static String tradeType = "JSAPI";
    /*
     * 签名类型
     */
    //public static String signType = "MD5";
    public static String signType = "RSA";
    /*
     * 商品描述 商品简单描述,该字段请按照规范传递
     */
    //public static String body = "大禹研究院-水费";
    public static String description = "大禹研究院-水费";
    /*
     * 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
     */
    public static String attach = "天津";
    /*
     * 签名,参与签名参数:appid、attach、mch_id、nonce_str、body、out_trade_no、total_fee、spbill_create_ip、notify_url、trade_type、openid
     */
    public String sign = "";
    /**
     * HTTP头认证类型
     */
    public static String schema = "WECHATPAY2-SHA256-RSA2048";
    /**
     * 私钥文件路径
     */
    public static String privateCertFileName = "C:\\webchat\\apiclient_key.pem";
    public static String publicCertFileName = "C:\\webchat\\wxp_cert.pem";
    /*
     * 微信订单号,优先使用
     */
    public static String transactionid = "";
    /*
     * 商户系统内部订单号
     */
    public static String out_trade_no = "";
    /*
     * 商户退款单号
     */
    public static String out_refund_no = "";
    /*
     * 退款金额
     */
    public static Float refundfee;
    /*
     * 订单金额
     */
    public static Float totalfee;
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/CommandSv.java
@@ -10,8 +10,10 @@
import com.dy.pipIrrGlobal.daoPr.PrIntakeVcMapper;
import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper;
import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper;
import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper;
import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
import com.dy.pipIrrGlobal.voPr.VoOnLineIntake;
import com.dy.pipIrrGlobal.voRm.VoUnclosedValve;
import com.dy.pipIrrGlobal.voSe.VoVirtualCard;
@@ -40,6 +42,7 @@
    private final PrIntakeMapper prIntakeMapper;
    private final PrWaterPriceMapper prWaterPriceMapper;
    private final PrIntakeVcMapper prIntakeVcMapper;
    private final SeClientCardMapper seClientCardMapper;
    /**
     * 虚拟卡ID换虚拟卡对象
@@ -123,4 +126,13 @@
    public Long getVcIdByIntakeId(Long intakeId) {
        return prIntakeVcMapper.getVcIdByIntakeId(intakeId);
    }
    /**
     * 根据水卡编号获取水卡对象,远程充值使用
     * @param cardId
     * @return
     */
    public SeClientCard geClientCardByCardId(Long cardId) {
        return seClientCardMapper.selectByPrimaryKey(cardId);
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java
@@ -1,42 +1,39 @@
package com.dy.pipIrrWechat.command;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1;
import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com97Vo;
import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com98Vo;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd15Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd92_A2Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd93_A3Vo;
import com.dy.common.util.IDLongGenerator;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrGlobal.command.ComSupport;
import com.dy.pipIrrGlobal.command.dto.Param;
import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
import com.dy.pipIrrGlobal.voRm.VoUnclosedValve;
import com.dy.pipIrrGlobal.voSe.VoVirtualCard;
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.enums.LastOperateENUM;
import com.dy.pipIrrWechat.result.WechatResultCode;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.http.MediaType;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
 * @author ZhuBaoMin
@@ -48,13 +45,13 @@
@Slf4j
@Tag(name = "小程序阀控器控制", description = "小程序阀控器控制")
@RestController
@RequestMapping(path="valve")
@RequestMapping(path = "valve")
@RequiredArgsConstructor
public class ValveCtrl extends ComSupport {
    private final CommandSv commandSv;
    private final SeVirtualCardMapper seVirtualCardMapper;
    private final IDLongGenerator idLongGenerator;
    private String rtuResultSendWebUrl = "http://127.0.0.1:8087/wx/comRes/receive" ;
    private String rtuResultSendWebUrl = "http://127.0.0.1:8087/wx/comRes/receive";
    /**
     * 小程序远程开阀
@@ -64,10 +61,8 @@
     */
    @PostMapping(path = "open_wx", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    @SsoAop()
    public BaseResponse<Boolean> open(@RequestBody @Valid ValveOpen valve, BindingResult bindingResult) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmss");
        if(bindingResult != null && bindingResult.hasErrors()){
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
@@ -81,24 +76,24 @@
         * 如果农户未选择虚拟卡,则根据取水口ID获取与之绑定的虚拟卡
         * 如果取水口没有与之绑定的虚拟卡,则提示农户选择一张虚拟卡
         */
        if(vcId == null) {
        if (vcId == null) {
            vcId = commandSv.getVcIdByIntakeId(intakeId);
            if(vcId == null) {
            if (vcId == null) {
                return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage());
            }
        }
        // 获取系统参数
        if(!setuped) {
        if (!setuped) {
            setUp();
        }
        // 虚拟卡ID换虚拟卡对象
        VoVirtualCard vc = commandSv.getVcById(vcId);
        if(vc == null) {
        if (vc == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage());
        }
        if(vc.getInUse() == 1) {
        if (vc.getInUse() == 1) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getMessage());
        }
@@ -107,7 +102,7 @@
        // 取水口ID换阀控器地址及通讯协议
        JSONObject job_rtu = getRtu(intakeId, null);
        if(job_rtu == null) {
        if (job_rtu == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.RTU_NOT_EXIST.getMessage());
        }
        String rtuAddr = job_rtu.getString("rtuAddr");
@@ -117,7 +112,7 @@
        String orderNo = generateOrderNo();
        String commandCode = null;
        if(protocol.equals("p206V202404")) {
        if (protocol.equals("p206V202404")) {
            // 获取功能码
            commandCode = CodeV202404.cd_A2;
@@ -132,147 +127,54 @@
            param.elePrice = 0.0;
            param.orderNo = orderNo;
            // 构造命令
            Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param);
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 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(rtuResultSendWebUrl);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
            // 发送命令
            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
                //if(1 > 0) {
                // 请求成功
                // 创建命令日志对象并添加到数据库中
                String commandName = CodeV202404.getCodeName(commandCode);
                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator);
                commandSv.insert(rmCommandHistory);
                // 处理回调
                BaseResponse response_CallBack = dealWithCallBack(comId);
                // 回调失败
                if(!response_CallBack.getCode().equals("0001")) {
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getMsg());
                    //return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                // 回调成功,再判断执行是否成功
                JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent());
                System.out.println(job_content);
                JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData");
                System.out.println(job_subData);
                Boolean dealResult = job_subData.getBoolean("success");
                if(!dealResult) {
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                /**
                 * 执行成功
                 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间
                 */
                //SeVirtualCard virtualCard = new SeVirtualCard();
                //virtualCard.setId(vcId);
                //virtualCard.setInUse((byte) 1);
                //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
                //virtualCard.setLastOperateTime(new Date());
                //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
                // 回调返回的内容
                Data myData = (Data)response_CallBack.getContent();
                return BaseResponseUtils.buildSuccess(myData) ;
            } else {
                // 请求失败
                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
                return BaseResponseUtils.buildErrorMsg(job_param.getString("message"));
            }
        } else if(protocol.equals("p206V1_0_1")) {
        } else if (protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_97;
            // 创建视图
            Com97Vo param = new Com97Vo() ;
            Com97Vo param = new Com97Vo();
            param.icCardNo = vc.getVcNum();
            param.moneyRemain = vc.getMoney();
            param.waterPrice = waterPrice;
            param.orderNo = orderNo;
            // 构造命令
            Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param);
            // 发送命令
            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
            //if(1 > 0) {
                // 请求成功
                // 创建命令日志对象并添加到数据库中
                String commandName = CodeV1_0_1.getCodeName(commandCode);
                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator);
                commandSv.insert(rmCommandHistory);
                // 处理回调
                BaseResponse response_CallBack = dealWithCallBack(comId);
                //回调异常
                if(!response_CallBack.getCode().equals("0001")) {
                    // 命令日志执行结果改为失败
                    rmCommandHistory = new RmCommandHistory();
                    rmCommandHistory.setId(comId);
                    rmCommandHistory.setResult((byte)0);
                    commandSv.update(rmCommandHistory);
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                // 回调超时
                if(response_CallBack.getContent().toString().equals(WechatResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage())) {
                    /**
                     * 回调超时,暂时认为执行失败
                     * 命令置为失败
                     * 虚拟卡依旧保持使用中的状态
                     */
                    rmCommandHistory = new RmCommandHistory();
                    rmCommandHistory.setId(comId);
                    rmCommandHistory.setResult((byte)0);
                    commandSv.update(rmCommandHistory);
                    //SeVirtualCard virtualCard = new SeVirtualCard();
                    //virtualCard.setId(vcId);
                    //virtualCard.setInUse((byte) 1);
                    //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
                    //virtualCard.setLastOperateTime(new Date());
                    //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
                    return BaseResponseUtils.buildErrorMsg(WechatResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage());
                }
                // 回调成功,再判断执行是否成功
                JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent());
                System.out.println(job_content);
                JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData");
                System.out.println(job_subData);
                Boolean dealResult = job_subData.getBoolean("success");
                if(!dealResult) {
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                /**
                 * 执行成功
                 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间
                 */
                SeVirtualCard virtualCard = new SeVirtualCard();
                virtualCard.setId(vcId);
                virtualCard.setInUse((byte) 1);
                virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
                virtualCard.setLastOperateTime(new Date());
                seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
                // 回调返回的内容
                Data myData = (Data)response_CallBack.getContent();
                return BaseResponseUtils.buildSuccess(myData) ;
            } else {
                // 请求失败
                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
                return BaseResponseUtils.buildErrorMsg(job_param.getString("message"));
            }
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)1);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV1_0_1.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setVcId(vcId);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuResultSendWebUrl);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else {
            return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议");
        }
@@ -280,40 +182,40 @@
    /**
     * 小程序远程关阀
     *
     * @param valve
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "close_wx", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    @SsoAop()
    public BaseResponse<Boolean> close(@RequestBody @Valid ValveClose valve, BindingResult bindingResult) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmss");
        if(bindingResult != null && bindingResult.hasErrors()){
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        String rtuAddr = valve.getRtuAddr();
        String vcNum = valve.getVcNum();
        Long vcId = Optional.ofNullable(seVirtualCardMapper.getVcIdByNum(vcNum)).orElse(0L);
        String orderNo = valve.getOrderNo();
        Long operator = valve.getOperator();
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
        if (!setuped) {
            setUp();
        }
        // 阀控器地址换取水口ID和通讯协议
        JSONObject job_rtu = getRtu(null, rtuAddr);
        if(job_rtu == null) {
        if (job_rtu == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.RTU_NOT_EXIST.getMessage());
        }
        Long intakeId = job_rtu.getLong("intakeId");
        String protocol = job_rtu.getString("protocol");
        String commandCode = null;
        if(protocol.equals("p206V202404")) {
        if (protocol.equals("p206V202404")) {
            // 获取功能码
            commandCode = CodeV202404.cd_A3;
@@ -324,147 +226,51 @@
            param.icCardNo = vcNum;
            param.orderNo = orderNo;
            // 构造命令
            Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param);
            // 发送命令
            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
                // 请求成功
                // 创建命令日志对象并添加到数据库中
                String commandName = CodeV202404.getCodeName(commandCode);
                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator);
                commandSv.insert(rmCommandHistory);
                // 处理回调
                BaseResponse response_CallBack = dealWithCallBack(comId);
                // 回调失败
                if(!response_CallBack.getCode().equals("0001")) {
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getMsg());
                    //return BaseResponseUtils.buildErrorMsg(WechatResultCode.GET_RESULT_ERROR.getMessage());
                }
                // 回调成功,再判断执行是否成功
                JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent());
                System.out.println(job_content);
                JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData");
                System.out.println(job_subData);
                Boolean dealResult = job_subData.getBoolean("success");
                if(!dealResult) {
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                /**
                 * 执行成功
                 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间
                 */
                //Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum);
                //SeVirtualCard virtualCard = new SeVirtualCard();
                //virtualCard.setId(vcId);
                //virtualCard.setInUse((byte) 0);
                //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
                //virtualCard.setLastOperateTime(new Date());
                //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
                // 回调返回的内容
                Data myData = (Data)response_CallBack.getContent();
                return BaseResponseUtils.buildSuccess(myData) ;
            } else {
                // 请求失败
                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
                return BaseResponseUtils.buildErrorMsg(job_param.getString("message"));
            }
        } else if(protocol.equals("p206V1_0_1")) {
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)2);
            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(rtuResultSendWebUrl);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else if (protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_98;
            // 创建视图
            Com98Vo param = new Com98Vo() ;
            Com98Vo param = new Com98Vo();
            param.icCardNo = vcNum;
            param.orderNo = orderNo;
            // 构造命令
            Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param);
            // 发送命令
            JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com));
            if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) {
                //if(1 > 0) {
                // 请求成功
                // 创建命令日志对象并添加到数据库中
                String commandName = CodeV1_0_1.getCodeName(commandCode);
                RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator);
                commandSv.insert(rmCommandHistory);
                // 处理回调
                BaseResponse response_CallBack = dealWithCallBack(comId);
                // 回调异常
                if(!response_CallBack.getCode().equals("0001")) {
                    // 命令日志执行结果改为失败
                    rmCommandHistory = new RmCommandHistory();
                    rmCommandHistory.setId(comId);
                    rmCommandHistory.setResult((byte)0);
                    commandSv.update(rmCommandHistory);
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                // 回调超时
                if(response_CallBack.getContent().toString().equals(WechatResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage())) {
                    /**
                     * 回调超时,暂时认为执行失败
                     * 命令置为失败
                     * 虚拟卡依旧保持使用中的状态
                     */
                    rmCommandHistory = new RmCommandHistory();
                    rmCommandHistory.setId(comId);
                    rmCommandHistory.setResult((byte)0);
                    commandSv.update(rmCommandHistory);
                    //Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum);
                    //SeVirtualCard virtualCard = new SeVirtualCard();
                    //virtualCard.setId(vcId);
                    //virtualCard.setInUse((byte) 0);
                    //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
                    //virtualCard.setLastOperateTime(new Date());
                    //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
                    return BaseResponseUtils.buildErrorMsg(WechatResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage());
                }
                // 回调成功,再判断执行是否成功
                JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent());
                System.out.println(job_content);
                JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData");
                System.out.println(job_subData);
                Boolean dealResult = job_subData.getBoolean("success");
                if(!dealResult) {
                    return BaseResponseUtils.buildErrorMsg(response_CallBack.getContent().toString());
                }
                /**
                 * 执行成功
                 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间
                 */
                Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum);
                SeVirtualCard virtualCard = new SeVirtualCard();
                virtualCard.setId(vcId);
                virtualCard.setInUse((byte) 0);
                virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode());
                virtualCard.setLastOperateTime(new Date());
                seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
                // 回调返回的内容
                Data myData = (Data)response_CallBack.getContent();
                return BaseResponseUtils.buildSuccess(myData) ;
            } else {
                // 请求失败
                JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param");
                return BaseResponseUtils.buildErrorMsg(job_param.getString("message"));
            }
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)2);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV1_0_1.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setVcId(vcId);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuResultSendWebUrl);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else {
            return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议");
        }
@@ -472,18 +278,103 @@
    /**
     * 根据操作员ID获取未关阀记录
     *
     * @param operator
     * @return
     */
    @GetMapping(path = "/get")
    //@SsoAop()
    public BaseResponse<List<VoUnclosedValve>> getUnclosedValves(@RequestParam Long operator){
    public BaseResponse<List<VoUnclosedValve>> getUnclosedValves(@RequestParam Long operator) {
        try {
            List<VoUnclosedValve> res = commandSv.getUnclosedValves(operator);
            return BaseResponseUtils.buildSuccess(res);
        } catch (Exception e) {
            log.error("获取未关阀记录异常", e);
            return BaseResponseUtils.buildException(e.getMessage()) ;
            return BaseResponseUtils.buildException(e.getMessage());
        }
    }
    /**
     * 小程序远程充值
     * @param po
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "recharge", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    public BaseResponse<Boolean> recharge(@RequestBody @Valid Recharge po, BindingResult bindingResult) {
        if(bindingResult != null && bindingResult.hasErrors()){
            return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Long intakeId = po.getIntakeId();
        Long cardId = po.getCardId();
        Double chargeMoney = po.getChargeMoney();
        Double chargeWater = po.getChargeWater();
        Long operator = po.getOperator();
        String flowNo = RandomStringUtils.randomNumeric(12); // 生成12位随机数
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 取水口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");
        // 水卡ID换水卡地址及水卡编号
        SeClientCard seClientCard = commandSv.geClientCardByCardId(cardId);
        if(seClientCard == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.CLIENT_CARD_NOT_EXIST.getMessage());
        }
        String icCardAddr = seClientCard.getCardaddr();
        String icCardNo = seClientCard.getCardnum();
        String commandCode = null;
        if(protocol.equals("p206V202404")) {
            // 获取功能码
            commandCode = CodeV202404.cd_15;
            // 创建视图
            ComCd15Vo param = new ComCd15Vo();
            param.controllerType = controllerType;
            param.projectNo = projectNo;
            param.icCardAddr = icCardAddr;
            param.icCardNo = icCardNo;
            param.chargeMoney = chargeMoney;
            param.chargeWater = chargeWater;
            param.flowNo = flowNo;
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV202404.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuResultSendWebUrl);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else if(protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_10;
            // 创建视图
            Com97Vo param = new Com97Vo() ;
            return BaseResponseUtils.buildSuccess("");
        } else {
            return BaseResponseUtils.buildFail("系统暂不支持该协议");
        }
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/Recharge.java
New file
@@ -0,0 +1,33 @@
package com.dy.pipIrrWechat.command.dto;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
 * @author ZhuBaoMin
 * @date 2024-06-26 10:45
 * @LastEditTime 2024-06-26 10:45
 * @Description
 */
@Data
public class Recharge extends DtoBase {
    public static final long serialVersionUID = 202406261045001L;
    /**
     * 水卡ID
     */
    @NotNull(message = "水卡ID不能为空")
    private Long cardId;
    /**
     * 充值金额
     */
    @NotNull(message = "充值金额不能为空")
    private Double chargeMoney;
    /**
     * 充值水量
     */
    private Double chargeWater;
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/ValveClose.java
@@ -3,6 +3,7 @@
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * @author ZhuBaoMin
@@ -12,6 +13,7 @@
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class ValveClose {
    public static final long serialVersionUID = 202405241727001L;
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/ValveOpen.java
@@ -1,6 +1,7 @@
package com.dy.pipIrrWechat.command.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * @author ZhuBaoMin
@@ -10,6 +11,7 @@
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class ValveOpen extends DtoBase{
    public static final long serialVersionUID = 202405231531001L;
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/qo/OnLineIntakesQO.java
@@ -4,6 +4,7 @@
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * @author ZhuBaoMin
@@ -13,6 +14,7 @@
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class OnLineIntakesQO extends QueryConditionVo {
    /**
     * 中间件返回的RTU在线情况对象数组
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/intake/qo/OnLineIntakesQO.java
@@ -4,6 +4,7 @@
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * @author ZhuBaoMin
@@ -13,6 +14,7 @@
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class OnLineIntakesQO extends QueryConditionVo {
    /**
     * 中间件返回的RTU在线情况对象数组
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java
@@ -28,6 +28,8 @@
    RTU_NOT_EXIST(20001, "阀控器不存在"),
    //RTU_ADDR_CANNOT_BE_NULL(20002, "阀控器地址不能为空");
    CLIENT_CARD_NOT_EXIST(30001, "水卡不存在"),
    /**
     * 微信用户
     */