27个文件已修改
8个文件已添加
937 ■■■■ 已修改文件
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_92_A2_Up.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/global/GlParse.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd92_A2Vo.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd93_A3Vo.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkDealOpenValveReport.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealCloseValveReportV202404.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealOpenValveReportV202404.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkRtuDealCommandResponseV202404.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransCtrl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/ComCtrl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/ComSv.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd15/CdCtrl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd16/CdCtrl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd22/CdCtrl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd30/CdCtrl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd31/CdCtrl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd50/CdCtrl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd55/CdCtrl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd56/CdCtrl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd5B/CdCtrl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd5C/CdCtrl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd65/CdCtrl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd68/CdCtrl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd92/CdCtrl.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd92/CdDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd92/CdParam.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd92/CdSv.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd93/CdCtrl.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd93/CdDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd93/CdParam.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd93/CdSv.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd97/CdCtrl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd98/CdCtrl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd99/CdCtrl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_92_A2_Up.java
@@ -77,8 +77,9 @@
        index += 8 ;
        cdData.orderNo = ByteUtil.BCD2String_BE(bs, index, index + 7) ;
        index += 8 ;
        cdData.opDt = GlParse.parseRtuDt(bs, index) ;
        //2025-05-13江海叫删除
        //index += 8 ;
        //cdData.opDt = GlParse.parseRtuDt(bs, index) ;
        index += 6 ;
        cdData.opType = bs[index];
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/global/GlParse.java
@@ -346,7 +346,7 @@
        cdData.eleTotalAmount = ByteUtil.BCD2Long_LE(bs, index, index + 4)/100.0D ;
        index += 5 ;
        cdData.moneyRemain = ByteUtil.BCD2Long_LE(bs, index, index + 4)/100.0D ;
        cdData.moneyRemain = ByteUtil.BCD2Long_LE(bs, index, index + 4)/10000.0D ;
        index += 5 ;
        cdData.waterRemain = ByteUtil.BCD2Long_LE(bs, index, index + 4)/100.0D ;
@@ -358,7 +358,7 @@
        cdData.thisWater = ByteUtil.BCD2Long_LE(bs, index, index + 3)/100.0D ;
        index += 4 ;
        cdData.thisMoney = ByteUtil.BCD2Long_LE(bs, index, index + 3)/100.0D ;
        cdData.thisMoney = ByteUtil.BCD2Long_LE(bs, index, index + 3)/10000.0D ;
        index += 4 ;
        cdData.thisDuration = ByteUtil.BCD2Int_LE(bs, index, index + 1) ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd92_A2Vo.java
@@ -1,18 +1,20 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import com.dy.common.mw.protocol.UpComResVo;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.CommonV202404;
import lombok.Data;
//平台/APP远程关闭水泵/阀门
@Data
public class DataCd92_A2Vo {
public class DataCd92_A2Vo implements UpComResVo {
    public String controllerType;//控制器类型
    public Integer projectNo ;//项目编号
    public String icCardNo ;//IC卡编号(17位数字)
    public String orderNo ;//订单号(16位数字)
    public String opDt ;//开泵/阀时间(yyyy-mm-dd HH:MM:SS)
    //2025-05-13江海叫删除
    //public String opDt ;//开泵/阀时间(yyyy-mm-dd HH:MM:SS)
    public Byte opType ;//开阀类型
    public Byte opResult ;//开启泵/阀结果: 0x00:成功 0x81:失败
@@ -40,9 +42,11 @@
        sb.append("      订单号 : ") ;
        sb.append(orderNo == null?"未知":orderNo) ;
        sb.append("\n") ;
        /*
        sb.append("      开泵/阀时间 : ") ;
        sb.append(opDt == null?"未知":opDt) ;
        sb.append("\n") ;
         */
        sb.append("      开启泵/阀类型 : ") ;
        sb.append(opType == null?"未知":(opType.byteValue() == 0x01 ? "平台":"用户")) ;
        sb.append("\n") ;
@@ -52,4 +56,50 @@
        return sb.toString() ;
    }
    public String toStr(boolean showBase){
        StringBuffer sb = new StringBuffer() ;
        if(showBase){
            sb.append(comName + " : \n") ;
            sb.append("控制器类型 : ") ;
            sb.append(CommonV202404.ctrlDevType(controllerType)) ;
            sb.append("\n") ;
            sb.append("项目编号 : ") ;
            sb.append(projectNo == null?"未知":projectNo) ;
            sb.append("\n") ;
        }
        sb.append("IC卡编号 : ") ;
        sb.append(icCardNo == null?"未知":icCardNo) ;
        sb.append("\n") ;
        sb.append("订单号 : ") ;
        sb.append(orderNo == null?"未知":orderNo) ;
        sb.append("\n") ;
        /*
        sb.append("开泵/阀时间 : ") ;
        sb.append(opDt == null?"未知":opDt) ;
        sb.append("\n") ;
         */
        sb.append("开启泵/阀类型 : ") ;
        sb.append(opType == null?"未知":(opType.byteValue() == 0x01 ? "平台":"用户")) ;
        sb.append("\n") ;
        sb.append("开启泵/阀结果 : ") ;
        sb.append(opResult == null?"未知":(opResult.byteValue() == 0x01 ? "成功":"失败")) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
    public String comLog(){
        StringBuilder sb = new StringBuilder() ;
        sb.append("远程开阀命令回复:\n");
        sb.append(opResult == null?"未知":(opResult.byteValue() == 0x01 ? "成功":"失败"));
        sb.append("\n");
        return sb.toString() ;
    }
    @Override
    public String comLog(String code) {
        return null;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd93_A3Vo.java
@@ -1,5 +1,6 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import com.dy.common.mw.protocol.UpComResVo;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.CommonV202404;
import lombok.Data;
@@ -8,7 +9,7 @@
//平台/APP远程关闭水泵/阀门   +  刷卡关泵/阀上报
@Data
@EqualsAndHashCode(callSuper=false)
public class DataCd93_A3Vo extends AlarmVo {
public class DataCd93_A3Vo extends AlarmVo implements UpComResVo {
    public String controllerType;//控制器类型
    public Integer projectNo ;//项目编号
@@ -87,10 +88,83 @@
        sb.append("      本次使用金额 : ") ;
        sb.append(thisMoney == null?"未知":thisMoney) ;
        sb.append("\n") ;
        sb.append("      本次使用时间长 : ") ;
        sb.append("      本次使用时长 : ") ;
        sb.append(thisDuration == null?"未知": thisDuration) ;
        sb.append("\n") ;
        return sb.toString() + super.toString() ;
    }
    public String toStr(boolean showBase){
        StringBuffer sb = new StringBuffer() ;
        if(showBase){
            sb.append(comName + " : \n") ;
            sb.append("控制器类型 : ") ;
            sb.append(CommonV202404.ctrlDevType(controllerType)) ;
            sb.append("\n") ;
            sb.append("项目编号 : ") ;
            sb.append(projectNo == null?"未知":projectNo) ;
            sb.append("\n") ;
        }
        sb.append("关泵/阀类型 : ") ;
        sb.append(clType == null?"未知":(clType.byteValue() == 0x00 ? "刷卡":(clType.byteValue() == 0x01 ? "平台":(clType.byteValue() == 0x02 ? "APP":(clType.byteValue() == 0x03 ? "非法卡":(clType.byteValue() == 0x04 ? "水表异常":(clType.byteValue() == 0x05 ? "电表异常":(clType.byteValue() == 0x06 ? "剩余水量不足":(clType.byteValue() == 0x07 ? "剩余金额不足":(clType.byteValue() == 0x08 ? "无流量":(clType.byteValue() == 0x09 ? "掉电再上电":"未知"))))))))))) ;
        sb.append("\n") ;
        sb.append("关启泵/阀结果 : ") ;
        sb.append(clResult == null?"未知":(clResult.byteValue() == 0x01 ? "成功":"失败")) ;
        sb.append("\n") ;
        sb.append("IC卡地址 : ") ;
        sb.append(icCardAddr == null?"未知":icCardAddr) ;
        sb.append("\n") ;
        sb.append("IC卡编号 : ") ;
        sb.append(icCardNo == null?"未知":icCardNo) ;
        sb.append("\n") ;
        sb.append("订单号 : ") ;
        sb.append(orderNo == null?"未知":orderNo) ;
        sb.append("\n") ;
        sb.append("开始时间 : ") ;
        sb.append(startDt == null?"未知":startDt) ;
        sb.append("\n") ;
        sb.append("结束时间 : ") ;
        sb.append(endDt == null?"未知":endDt) ;
        sb.append("\n") ;
        sb.append("水表累计流量 : ") ;
        sb.append(waterTotalAmount == null?"未知":waterTotalAmount) ;
        sb.append("\n") ;
        sb.append("电表累计电量 : ") ;
        sb.append(eleTotalAmount == null?"未知":eleTotalAmount) ;
        sb.append("\n") ;
        sb.append("用户剩余金额 : ") ;
        sb.append(moneyRemain == null?"未知":moneyRemain) ;
        sb.append("\n") ;
        sb.append("用户剩余水量 : ") ;
        sb.append(waterRemain == null?"未知":waterRemain) ;
        sb.append("\n") ;
        sb.append("本次使用电量 : ") ;
        sb.append(thisEle == null?"未知":thisEle) ;
        sb.append("\n") ;
        sb.append("本次使用水量 : ") ;
        sb.append(thisWater == null?"未知":thisWater) ;
        sb.append("\n") ;
        sb.append("本次使用金额 : ") ;
        sb.append(thisMoney == null?"未知":thisMoney) ;
        sb.append("\n") ;
        sb.append("本次使用时长 : ") ;
        sb.append(thisDuration == null?"未知": thisDuration) ;
        sb.append("\n") ;
        return sb.toString() + super.toString() ;
    }
    public String comLog(){
        StringBuilder sb = new StringBuilder() ;
        sb.append("远程关阀命令回复:\n");
        sb.append(clResult == null?"未知":(clResult.byteValue() == 0x01 ? "成功":"失败"));
        sb.append("\n");
        return sb.toString() ;
    }
    @Override
    public String comLog(String code) {
        return null;
    }
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java
@@ -49,8 +49,8 @@
    /**
     * 根据虚拟卡ID获取虚拟卡对象
     * @param vcId
     * @return
     * @param vcId 虚拟卡ID
     * @return 虚拟卡对象
     */
    VoVirtualCard getVcById(@Param("vcId") Long vcId);
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkDealOpenValveReport.java
@@ -241,7 +241,6 @@
        poLast.intakeId = controller==null?null:controller.getIntakeId();
        poLast.rtuAddr = rtuAddr;
        poLast.updateFrom(dV1, dataCd83OpenVo, clearLastCloseValve);
        if(poHistory != null){
            poHistory.clientId = clientVo==null?null:clientVo.getId() ;
            poHistory.clientName = clientVo==null?null:clientVo.getName() ;
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealCloseValveReportV202404.java
@@ -21,6 +21,9 @@
 * @LastEditTime 2024-06-20 13:48
 * @Description
 */
/**
 * 处理控制器关阀上报
 */
public class TkDealCloseValveReportV202404 extends TaskSurpport {
    private static final Logger log = LogManager.getLogger(TkDealCloseValveReportV202404.class.getName());
@@ -29,7 +32,6 @@
    /**
     * 执行节点任务:关阀上报
     *
     * @param data 需要处理的数据
     */
    @Override
@@ -94,8 +96,8 @@
            sv.saveRmOpenCloseValveLast(poLast);
        }else{
            //数据库中存在该控制器的开关阀数据
            if(poLast.closeDt != null && poLast.clIcCardAddr != null && poLast.clIcCardNo != null){
                if(poLast.closeDt.equals(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd85Vo.endDt))
            if(poLast.clOrderNo != null && poLast.clIcCardAddr != null && poLast.clIcCardNo != null){
                if(poLast.clOrderNo.equals(dataCd85Vo.orderNo)
                        && poLast.clIcCardAddr.equals(dataCd85Vo.icCardAddr)
                        && poLast.clIcCardNo.equals(dataCd85Vo.icCardNo)){
                    //重复上报,原因是下行数据处理慢了,就重复上报了
@@ -114,20 +116,15 @@
                    if(poLast.lastHistoryId != null){
                        poHistory = sv.getRmOpenCloseValveHistory(poLast.lastHistoryId) ;
                        if(poHistory != null){
                            if(poHistory.openDt != null){
                                //上面已经判断了poLast.openDt == null,所以此处一般会是poHistory.openDt != null
                                if(poHistory.openDt.equals(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd85Vo.startDt))){
                            if(poHistory.opOrderNo != null){
                                if(poHistory.opOrderNo.equals(dataCd85Vo.orderNo)){
                                    //匹配成功
                                    //当前关阀是原记录中开阀的对应关阀
                                    this.updateCloseValve(clientVo, controller, rtuAddr, poLast, poHistory, dV202404, dataCd85Vo, false) ;
                                    sv.updateRmOpenCloseValveHistory(poHistory);
                                }else if(poHistory.openDt.after(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd85Vo.startDt))){
                                    //匹配失败(对于after:等于或晚于都返回true)
                                    //本地最新数据中的开阀时间晚于当前关阀上报中的开阀时间,说明是补报
                                    this.dealSupplyReport() ;
                                }else{
                                    //匹配失败
                                    //本地最新数据中的开阀时间早于当前关阀上报中的开阀时间,说明是新的一次关阀报,而且对应关阀报的上一次开阀报未收到
                                    //当前关阀不是原记录中开阀的对应关阀,说明是新的一次关阀报,而且对应关阀报的上一次开阀报未收到
                                    this.newHistoryDataDeal(sv, clientVo, controller, rtuAddr, dV202404, dataCd85Vo, poLast, true);
                                }
                            }else{
@@ -145,12 +142,9 @@
                    }
                }
            }else if(poLast.opType != null){
                //原记录存在关阀数据,也存在开阀数据,首先进行开关阀时间对比
                if(poLast.closeDt != null && poLast.closeDt.equals(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd85Vo.endDt))){
                //原记录存在关阀数据,也存在开阀数据,首先进行对比
                if(poLast.clOrderNo != null && poLast.clOrderNo.equals(dataCd85Vo.orderNo)){
                    //重复上报了,不进行处理
                }else if(poLast.closeDt != null && poLast.closeDt.after(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd85Vo.endDt))){
                    //补报的许久之前的数据(对于after:等于或晚于都返回true)
                    this.dealSupplyReport() ;
                }else {
                    //是新的上报关阀数据
                    //进行历史数据匹配
@@ -158,14 +152,19 @@
                    if(poLast.lastHistoryId != null) {
                        poHistory = sv.getRmOpenCloseValveHistory(poLast.lastHistoryId);
                        if (poHistory != null) {
                            if(poHistory.openDt.equals(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd85Vo.startDt))){
                                //匹配上了
                                this.updateCloseValve(clientVo, controller, rtuAddr, poLast, poHistory, dV202404, dataCd85Vo, false) ;
                                sv.updateRmOpenCloseValveHistory(poHistory);
                            if(poHistory.clOrderNo.equals(dataCd85Vo.orderNo)){
                                //重复上报了,不进行处理
                            }else{
                                //上个关阀报未上报
                                this.updateCloseValve(clientVo, controller, rtuAddr, poLast, null, dV202404, dataCd85Vo, true) ;
                                this.newHistoryDataDeal(sv, clientVo, controller, rtuAddr, dV202404, dataCd85Vo, poLast, null);
                                if(poLast.closeDt != null && poLast.closeDt.equals(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd85Vo.endDt))){
                                    //重复上报了,不进行处理
                                }else if(poLast.closeDt != null && poLast.closeDt.after(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd85Vo.endDt))){
                                    //补报的许久之前的数据(对于after:等于或晚于都返回true)
                                    this.dealSupplyReport() ;
                                }else {
                                    //上个开阀报未上报
                                    this.updateCloseValve(clientVo, controller, rtuAddr, poLast, null, dV202404, dataCd85Vo, true) ;
                                    this.newHistoryDataDeal(sv, clientVo, controller, rtuAddr, dV202404, dataCd85Vo, poLast, null);
                                }
                            }
                        }else{
                            //这种情况不存在,但为安全也进行处理,也认为上个关阀报未上报
@@ -310,5 +309,4 @@
            poHistory.updateFrom(dV202404, dataCd85Vo, false);
        }
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealOpenValveReportV202404.java
@@ -19,7 +19,8 @@
 * @author ZhuBaoMin
 * @date 2024-06-17 9:36
 * @LastEditTime 2024-06-17 9:36
 * @Description 控制器开阀上报(功能码84)
 * @Description
 * 处理控制器开阀上报
 */
public class TkDealOpenValveReportV202404 extends TaskSurpport {
    private static final Logger log = LogManager.getLogger(TkDealTimingReportV202404.class.getName());
@@ -93,8 +94,8 @@
            sv.saveRmOpenCloseValveLast(poLast);
        }else{
            //数据库中存在该控制器的开关阀数据
            if(poLast.openDt != null && poLast.opIcCardAddr != null && poLast.opIcCardNo != null){
                if(poLast.openDt.equals(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd84Vo.openDt))
            if(poLast.opOrderNo != null && poLast.opIcCardAddr != null && poLast.opIcCardNo != null){
                if(poLast.opOrderNo.equals(dataCd84Vo.orderNo)
                        && poLast.opIcCardAddr.equals(dataCd84Vo.icCardAddr)
                        && poLast.opIcCardNo.equals(dataCd84Vo.icCardNo)){
                    //重复上报,原因是下行数据处理慢了,就重复上报了
@@ -103,7 +104,7 @@
            }
            if(poLast.opType != null){
                //原记录存在开阀数据,首先进行时间对比
                if(poLast.openDt != null && poLast.openDt.equals(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd84Vo.openDt))){
                if(poLast.opOrderNo != null && poLast.opOrderNo.equals(dataCd84Vo.orderNo)){
                    //重复上报的开阀数据,不进行处理
                }else if(poLast.openDt != null && poLast.openDt.after(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd84Vo.openDt))){
                    //补报的许久之前的开阀数据(对于after:等于或晚于都返回true)
@@ -116,16 +117,8 @@
                }
            }else if(poLast.clType != null){
                //原记录不存在开阀数据,但存在关阀数据,首先进行时间比对
                if(poLast.clOpenDt != null && poLast.clOpenDt.before(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd84Vo.openDt))){
                    //当前上报是新的开阀数据,把最新(last)数据中的关阀内容清空
                    this.updateOpenValve(clientVo, controller, rtuAddr, poLast, null, dataV202404, dataCd84Vo, true) ;
                    //生成并保存新的开阀上报历史数据记录
                    this.newHistoryDataDeal(sv, clientVo, controller, rtuAddr, dataV202404, dataCd84Vo, poLast);
                }else if(poLast.clOpenDt != null && poLast.clOpenDt.after(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd84Vo.openDt))){
                    //补报的许久之前的开阀报数据(对于after:等于或晚于都返回true)
                    this.dealSupplyReport() ;
                }else {
                    //当前上报的开阀数据与原来的关阀数据同一时间,这种情况应该不存在,但也处理
                if(poLast.clOrderNo != null && poLast.clOrderNo.equals(dataCd84Vo.orderNo)){
                    //当前上报的开阀数据与原来的关阀数据匹配
                    RmOpenCloseValveHistory poHistory = null ;
                    if(poLast.lastHistoryId != null){
                        poHistory = sv.getRmOpenCloseValveHistory(poLast.lastHistoryId) ;
@@ -134,6 +127,20 @@
                    if(poHistory != null){
                        sv.updateRmOpenCloseValveHistory(poHistory);
                    }
                }else if(poLast.clOpenDt != null && poLast.clOpenDt.before(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd84Vo.openDt))){
                    //当前上报是新的开阀数据,把最新(last)数据中的关阀内容清空
                    this.updateOpenValve(clientVo, controller, rtuAddr, poLast, null, dataV202404, dataCd84Vo, true) ;
                    //生成并保存新的开阀上报历史数据记录
                    this.newHistoryDataDeal(sv, clientVo, controller, rtuAddr, dataV202404, dataCd84Vo, poLast);
                }else if(poLast.clOpenDt != null && poLast.clOpenDt.after(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCd84Vo.openDt))){
                    //补报的许久之前的开阀报数据(对于after:等于或晚于都返回true)
                    this.dealSupplyReport() ;
                }else {
                    //订单号不同,时间相同
                    //认为当前上报是新的开阀数据,把最新(last)数据中的关阀内容清空
                    this.updateOpenValve(clientVo, controller, rtuAddr, poLast, null, dataV202404, dataCd84Vo, true) ;
                    //生成并保存新的开阀上报历史数据记录
                    this.newHistoryDataDeal(sv, clientVo, controller, rtuAddr, dataV202404, dataCd84Vo, poLast);
                }
            }else{
                //if(poLast.opType == null && po.clType == null)
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkRtuDealCommandResponseV202404.java
@@ -1,8 +1,12 @@
package com.dy.rtuMw.server.rtuData.p206V202404;
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.UpComResVo;
import com.dy.common.mw.protocol.p206V202404.DataV202404;
import com.dy.common.util.DateTime;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
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;
@@ -29,18 +33,32 @@
        if(protocolData != null){
            DataV202404 dV202404 = (DataV202404)protocolData ;
            if(dV202404 != null) {
//            if (dV1 != null && dV1.dataCdC0Vo != null) {
//                Object[] objs = this.getTaskResults(TkPreGenObjs.taskId) ;
//                DbSv sv = (DbSv)objs[0] ;
//                PrController controller = (PrController)objs[1] ;
//                try{
//                    this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), dV1, dV1.dataCdC0Vo) ;
//                    this.saveHistory(sv, controller, d.getRtuAddr(),dV1, dV1.dataCdC0Vo) ;
//                }catch (Exception e){
//                    log.error("保存控制器自报数据时发生异常", e);
//                }
//            }
                Object[] objs = this.getTaskResults(TkPreGenObjsV202404.taskId);
                DbSv sv = (DbSv) objs[0];
                //PrController controller = (PrController) objs[1];
                try{
                    RmCommandHistory po = sv.getCommandLog(d.commandId) ;
                    if(po != null){
                        po = this.updateCommandLogPo(po, d.code, dV202404, dV202404.subData) ;
                        sv.updateCommandLog(po);
                    }else{
                        log.error("未得到命令日志(" + d.getCommandId() + ")");
                    }
                }catch (Exception e){
                    log.error("保存控制器自报数据时发生异常", e);
                }
            }
        }
    }
    public RmCommandHistory updateCommandLogPo(RmCommandHistory po, String code, DataV202404 dV202404, Object obj) throws Exception{
        po.setResultTime(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV202404.dt==null?DateTime.yyyy_MM_dd_HH_mm_ss():dV202404.dt));
        if(obj instanceof UpComResVo){
            UpComResVo vo = (UpComResVo)obj ;
            po.setResult((byte)1);
            po.setResultText(vo.comLog()!=null?vo.comLog():vo.comLog(code));
            log.info("----------------------------------\n" + (vo.comLog()!=null?vo.comLog():vo.comLog(code)));
        }
        return po ;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransCtrl.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.util.Callback;
import com.dy.common.util.NumUtil;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
@@ -73,7 +74,7 @@
                        res = super.doSend(sv, com) ;
                        if(res == null) {
                            //发送命令后
                            res = super.after(dto.comCode);
                            res = super.after(dto.comCode, null);
                        }
                    }catch (Exception e){
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null?"":e.getMessage())) ;
@@ -111,7 +112,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/ComCtrl.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.mw.protocol.Command;
import com.dy.common.util.Callback;
import com.dy.common.util.IDLongGenerator;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
@@ -155,11 +156,11 @@
     * 发送命令后
     * @return
     */
    public BaseResponse<Object> after(String comCode) {
    public BaseResponse<Object> after(String comCode, Callback callback) {
        try{
            //等待通信中间件通知控制器执行命令上行数据(命令结果)
            JSONObject resultData = feature.get(waitMwRtnResultTimeout, TimeUnit.SECONDS);
            return BaseResponseUtils.buildSuccess(this.createRtnMsg(comCode, resultData));
            return BaseResponseUtils.buildSuccess(this.dealComResult(comCode, resultData, callback));
        }catch (Exception e){
            return BaseResponseUtils.buildFail("等待通信中间件通知命令结果超时");
        }
@@ -189,5 +190,5 @@
    /**
     * 生成命令返回信息
     */
    protected abstract String createRtnMsg(String code, JSONObject resultData);
    protected abstract String dealComResult(String code, JSONObject resultData, Callback callback);
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/ComSv.java
@@ -1,12 +1,19 @@
package com.dy.pipIrrRemote.monitor.common;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.dy.pipIrrGlobal.command.CommandSv;
import com.dy.pipIrrGlobal.daoPr.PrCommonIntakesMapper;
import com.dy.pipIrrGlobal.daoPr.PrControllerMapper;
import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper;
import com.dy.pipIrrGlobal.pojoPr.PrCommonIntakes;
import com.dy.pipIrrGlobal.pojoPr.PrController;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
import com.dy.pipIrrGlobal.voRm.VoUnclosedParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
/**
 * @Author: liurunyu
@@ -19,6 +26,8 @@
    protected PrControllerMapper prControllerDao ;
    @Autowired
    protected RmCommandHistoryMapper rmCommandHistoryDao ;
    @Autowired
    private PrCommonIntakesMapper prCommonIntakesDao;
    public PrController getRtu(Long intakeId){
        return this.getRtu(prControllerDao, intakeId);
@@ -45,4 +54,43 @@
                                             Long operator) {
        return this.saveComHistoryPo(rmCommandHistoryDao, comId, protocol, commandCode, commandName, intakeId, rtuAddr, param, operator) ;
    }
    /**
     * 添加常用取水口或更新使用信息
     * @param operatorId
     * @param intakeId
     * @return
     */
    public PrCommonIntakes addOrUpdateOftenUseIntake(Long operatorId, Long intakeId) {
        PrCommonIntakes po = prCommonIntakesDao.selectByOperatorAndIntake(operatorId, intakeId);
        if(po == null) {
            po = new PrCommonIntakes();
            po.setOperatorId(operatorId);
            po.setIntakeId(intakeId);
            po.setLastUsedTime(new Date());
            po.setUsageCount(1);
            prCommonIntakesDao.insert(po);
        }else{
            po.setLastUsedTime(new Date());
            po.setUsageCount(po.getUsageCount() + 1);
            prCommonIntakesDao.updateByPrimaryKeySelective(po);
        }
        return po ;
    }
    /**
     * 根据取水口ID获取该取水口未关阀参数,平台选择取水口关阀使用
     * @param intakeId
     * @return
     */
    public VoUnclosedParam selectUncloseParam(Long intakeId, String rtuAddr) {
        JSONArray jsonArr = new JSONArray();
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("rtuAddr", rtuAddr);
        jsonObj.put("isOnLine", true);
        jsonArr.add(jsonObj);
        return rmCommandHistoryDao.getUncloseParam(jsonArr.toJSONString(), intakeId);
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd15/CdCtrl.java
@@ -4,8 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCdXyVo;
import com.dy.common.util.Callback;
import com.dy.common.util.NumUtil;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
@@ -64,7 +64,7 @@
                //发送命令前-3:保存命令日志
                SeClientCard icPo = sv.selectClientIcCardById(Long.parseLong(dto.icCardId.trim())) ;
                if(icPo == null){
                    return BaseResponseUtils.buildError("服务端出错,未得到农户IC卡") ;
                    return BaseResponseUtils.buildErrorMsg("服务端出错,未得到农户IC卡") ;
                }
                CdParam comParam = CdParam.builder().commandCode(ComCode).projectNo(projectNo).controllerType(controllerType)
                        .icCardAddr(icPo.getCardaddr())//IC卡地址(8位数字或字母)
@@ -86,7 +86,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -121,7 +121,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd16/CdCtrl.java
@@ -4,8 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCdXyVo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -14,7 +14,6 @@
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.http.MediaType;
@@ -77,7 +76,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -112,7 +111,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd22/CdCtrl.java
@@ -4,8 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCdXyVo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -76,7 +76,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -111,7 +111,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd30/CdCtrl.java
@@ -4,8 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCdXyVo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -73,7 +73,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -93,7 +93,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd31/CdCtrl.java
@@ -5,6 +5,7 @@
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCdXyVo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -73,7 +74,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -93,7 +94,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd50/CdCtrl.java
@@ -4,9 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd50Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCdXyVo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -16,7 +15,6 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.http.MediaType;
import org.springframework.validation.BindingResult;
@@ -75,7 +73,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -95,7 +93,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd55/CdCtrl.java
@@ -5,9 +5,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd55Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd65Vo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -78,7 +77,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -98,7 +97,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONArray codeData = resultData.getJSONArray("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd56/CdCtrl.java
@@ -4,8 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd56Vo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -73,7 +73,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -93,7 +93,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd5B/CdCtrl.java
@@ -4,8 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd80_5BVo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -73,7 +73,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -93,7 +93,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd5C/CdCtrl.java
@@ -5,6 +5,7 @@
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd5CVo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -75,7 +76,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -95,7 +96,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd65/CdCtrl.java
@@ -4,8 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd65Vo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -76,7 +76,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -96,7 +96,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd68/CdCtrl.java
@@ -4,8 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd68Vo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -73,7 +73,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -93,7 +93,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd92/CdCtrl.java
New file
@@ -0,0 +1,171 @@
package com.dy.pipIrrRemote.monitor.p202404V201.cd92;
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.p206V202404.upVos.DataCd92_A2Vo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrGlobal.voSe.VoVirtualCard;
import com.dy.pipIrrRemote.common.dto.DtoBase;
import com.dy.pipIrrRemote.monitor.common.ComCtrl;
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.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.http.MediaType;
import org.springframework.validation.BindingResult;
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;
/**
 * @Author: liurunyu
 * @Date: 2025/5/13 08:33
 * @Description
 */
@Slf4j
@Tag(name = "远程命令", description = "平台远程开阀")
@RestController("cd92Ctrl")
@RequestMapping(path = "p202404V201/cd92")
@RequiredArgsConstructor
@Scope("prototype") //因为有对象类属性,所以采用原型模式,每次请求新建一个实例对象
public class CdCtrl extends ComCtrl {
    private static final String RtuSuccessMsg = "控制器接收并执行命令成功,无返回数据";
    private static final String ComCode = "92" ;
    @Autowired
    private CdSv sv ;
    /**
     * 向设备(控制器)发送命令
     * @param dto 前端发来的值对象
     * @param bindingResult 对dto验证的结果
     * @return 返回前端
     */
    @PostMapping(path = "send", consumes = MediaType.APPLICATION_JSON_VALUE)
    @SsoAop()
    public BaseResponse<Object> send(@RequestBody @Valid CdDto dto, BindingResult bindingResult) {
        BaseResponse<Object> res ;
        //发送命令前-1:验证
        res = super.pre1(sv, ComCode, dto, bindingResult);
        if(res == null) {
            //发送命令前-2:获得数据
            res = super.pre2(sv, ComCode, dto, bindingResult);
            if (res == null) {
                if(dto.vtCardId == null || "".equals(dto.vtCardId.trim())){
                    Long vtId = sv.selectVcIdByIntakeId(dto.getIntakeId()) ;
                    if(vtId == null) {
                        return BaseResponseUtils.buildErrorMsg("请选择一张虚拟卡");
                    }else{
                        dto.vtCardId = vtId.toString() ;
                    }
                }
                VoVirtualCard vcPo = sv.selectClientVtCardById(Long.parseLong(dto.vtCardId.trim())) ;
                if(vcPo == null){
                    return BaseResponseUtils.buildErrorMsg("服务端出错,未得到农户虚拟卡") ;
                }
                if(vcPo.getInUse().booleanValue()){
                    return BaseResponseUtils.buildErrorMsg("农户该虚拟卡已经被占用,不能再应用其开阀") ;
                }
                if(vcPo.getMoney() <= 0.0){
                    return BaseResponseUtils.buildErrorMsg("农户该虚拟卡中剩余金额为0,不能再应用其开阀") ;
                }
                Double waterPrice = sv.selectWaterPrice() ;
                if(waterPrice == null){
                    return BaseResponseUtils.buildErrorMsg("服务端出错,未得到水价") ;
                }
                CdParam comParam = CdParam.builder().commandCode(ComCode).projectNo(projectNo).controllerType(controllerType)
                        .icCardNo("" + vcPo.getVcNum())//用户卡序列号(17位数字)(6字节BCD,2字节HEX)
                        .waterRemain(0.0)//用户剩余水量, 两个小数点, 单位m3, 0~99999999.99
                        .moneyRemain(vcPo.getMoney())//用户剩余水量, 两个小数点, 单位m3, 0~99999999.99
                        .waterPrice(waterPrice)//水量单价 单位:元, 2个小数点
                        .elePrice(0.0)//电量单价 单位:元, 2个小数点
                        .orderNo(RandomStringUtils.randomNumeric(16))//订单号(16位数字)
                        .build();
                //发送命令前-3:保存命令日志
                res = super.pre3(sv, dto.getIntakeId(), dto.getOperator(), ComCode, comParam);
                if (res == null) {
                    //发送命令前-4:准备Feature
                    super.pre4();
                    try {
                        //创建外部命令(发给控制器)
                        Command com = sv.createOuterCommand(ctrlPo.getRtuAddr(), "" + comId, ComCode);
                        com.rtuResultSendWebUrl = rtuResultSendWebUrl;
                        com.param = comParam;
                        //发送命令
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode, new Callback() {
                                @Override
                                public void call(Object obj) {
                                    Boolean success = (Boolean) obj;
                                    if(success){
                                        // 添加常用取水口或更新使用信息
                                        sv.addOrUpdateOftenUseIntake(dto.getOperator(), dto.getIntakeId()) ;
                                        //开阀成功,虚拟卡记录上标记已被占用
                                        sv.setVcUsed(vcPo.getId(), dto.getIntakeId());
                                    }
                                }
                                @Override
                                public void call(Object... objs) {
                                }
                                @Override
                                public void exception(Exception e) {
                                }
                            });
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
                    } finally {
                        //最终
                        super.end();
                    }
                }
            }
        }
        return res ;
    }
    @Override
    protected String checkDto(DtoBase dto) {
        return null;
    }
    @Override
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
            if(codeData == null){
                msg = RtuSuccessMsg ;
            }else {
                String json = codeData.toJSONString();
                DataCd92_A2Vo cvo = JSON.parseObject(json, DataCd92_A2Vo.class) ;
                if(cvo != null){
                    if(callback != null){
                        if(cvo.opResult != null && cvo.opResult.byteValue() == (byte)0){
                            callback.call(true);//开阀成功
                        }else{
                            callback.call(false);//开阀失败
                        }
                    }
                    msg = cvo.toStr(false) ;
                }else{
                    msg = RtuSuccessMsg ;
                }
            }
        }else{
            msg = RtuSuccessMsg ;
        }
        return msg;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd92/CdDto.java
New file
@@ -0,0 +1,19 @@
package com.dy.pipIrrRemote.monitor.p202404V201.cd92;
import com.dy.pipIrrRemote.common.dto.DtoBase;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * @Author: liurunyu
 * @Date: 2025/5/13 08:33
 * @Description
 */
@Data
@EqualsAndHashCode(callSuper=true)
public class CdDto extends DtoBase {
    public static final long serialVersionUID = 202505130833001L;
    public String vtCardId ;//用户卡(虚拟卡)序列号(17位数字)(6字节BCD,2字节HEX)
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd92/CdParam.java
New file
@@ -0,0 +1,25 @@
package com.dy.pipIrrRemote.monitor.p202404V201.cd92;
import com.dy.pipIrrRemote.monitor.common.CdParameter;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.SuperBuilder;
/**
 * @Author: liurunyu
 * @Date: 2025/5/13 08:33
 * @Description
 */
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
public class CdParam extends CdParameter {
    public String icCardNo ;//用户卡序列号(17位数字)(6字节BCD,2字节HEX)
    public Double waterRemain ;//用户剩余水量, 两个小数点, 单位m3, 0~99999999.99
    public Double moneyRemain ;//用户剩余金额, 两个小数点, 单位元, 0~999999.99
    public Double waterPrice ;//水量单价 单位:元, 2个小数点
    public Double elePrice ;//电量单价 单位:元, 2个小数点
    public String orderNo ;//订单号(16位数字)
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd92/CdSv.java
New file
@@ -0,0 +1,57 @@
package com.dy.pipIrrRemote.monitor.p202404V201.cd92;
import com.dy.pipIrrGlobal.daoPr.PrIntakeVcMapper;
import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper;
import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper;
import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
import com.dy.pipIrrGlobal.voSe.VoVirtualCard;
import com.dy.pipIrrRemote.monitor.common.ComSv;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
 * @Author: liurunyu
 * @Date: 2025/5/13 08:33
 * @Description
 */
@Slf4j
@Service("cd92Sv")
public class CdSv extends ComSv {
    @Autowired
    protected SeVirtualCardMapper seVirtualCardDao ;
    @Autowired
    protected PrWaterPriceMapper prWaterPriceDao ;
    @Autowired
    protected PrIntakeVcMapper prIntakeVcDao ;
    public VoVirtualCard selectClientVtCardById(Long id){
        return seVirtualCardDao.getVcById(id) ;
    }
    public Double selectWaterPrice(){
        return prWaterPriceDao.getPrice() ;
    }
    /**
     * 根据取水口ID获取与之绑定虚拟卡ID
     * @param intakeId
     * @return
     */
    public Long selectVcIdByIntakeId(Long intakeId) {
        return prIntakeVcDao.getVcIdByIntakeId(intakeId);
    }
    /**
     * 设置虚拟卡被占用
     */
    public void setVcUsed(Long id, Long intakeId){
        SeVirtualCard po = new SeVirtualCard() ;
        po.setId(id);
        po.setIntakeId(intakeId);
        po.setInUse((byte)1);
        po.setOpenTime(new Date());
        seVirtualCardDao.updateByPrimaryKeySelective(po);
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd93/CdCtrl.java
New file
@@ -0,0 +1,151 @@
package com.dy.pipIrrRemote.monitor.p202404V201.cd93;
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.p206V202404.upVos.DataCd93_A3Vo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrGlobal.voRm.VoUnclosedParam;
import com.dy.pipIrrRemote.common.dto.DtoBase;
import com.dy.pipIrrRemote.monitor.common.ComCtrl;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.http.MediaType;
import org.springframework.validation.BindingResult;
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;
/**
 * @Author: liurunyu
 * @Date: 2025/5/13 09:38
 * @Description
 */
@Slf4j
@Tag(name = "远程命令", description = "平台远程关阀")
@RestController("cd93Ctrl")
@RequestMapping(path = "p202404V201/cd93")
@RequiredArgsConstructor
@Scope("prototype") //因为有对象类属性,所以采用原型模式,每次请求新建一个实例对象
public class CdCtrl extends ComCtrl {
    private static final String RtuSuccessMsg = "控制器接收并执行命令成功,无返回数据";
    private static final String ComCode = "93" ;
    @Autowired
    private CdSv sv ;
    /**
     * 向设备(控制器)发送命令
     * @param dto 前端发来的值对象
     * @param bindingResult 对dto验证的结果
     * @return 返回前端
     */
    @PostMapping(path = "send", consumes = MediaType.APPLICATION_JSON_VALUE)
    @SsoAop()
    public BaseResponse<Object> send(@RequestBody @Valid CdDto dto, BindingResult bindingResult) {
        BaseResponse<Object> res ;
        //发送命令前-1:验证
        res = super.pre1(sv, ComCode, dto, bindingResult);
        if(res == null) {
            //发送命令前-2:获得数据
            res = super.pre2(sv, ComCode, dto, bindingResult);
            if (res == null) {
                //获取开阀命令参数
                VoUnclosedParam opPa = sv.selectUncloseParam(dto.getIntakeId(), ctrlPo.getRtuAddr());
                if(opPa == null) {
                    return BaseResponseUtils.buildFail("该取水口上无您最近的开阀操作");
                }
                Long vcId = sv.getVcIdByNum(opPa.getVcNum()) ;
                if(vcId == null) {
                    return BaseResponseUtils.buildFail("服务端出错,未得到虚拟卡ID");
                }
                //发送命令前-3:保存命令日志
                CdParam comParam = CdParam.builder().commandCode(ComCode).projectNo(projectNo).controllerType(controllerType)
                        .icCardNo(opPa.getVcNum())//用户卡序列号(17位数字)(6字节BCD,2字节HEX)
                        .orderNo(opPa.getOrderNo())//订单号(16位数字)
                        .build();
                res = super.pre3(sv, dto.getIntakeId(), dto.getOperator(), ComCode, comParam);
                if (res == null) {
                    //发送命令前-4:准备Feature
                    super.pre4();
                    try {
                        //创建外部命令(发给控制器)
                        Command com = sv.createOuterCommand(ctrlPo.getRtuAddr(), "" + comId, ComCode);
                        com.rtuResultSendWebUrl = rtuResultSendWebUrl;
                        com.param = comParam;
                        //发送命令
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode, new Callback() {
                                @Override
                                public void call(Object obj) {
                                    Boolean success = (Boolean) obj;
                                    if(success){
                                        //关阀成功,解除虚拟卡被占用
                                        sv.setVcNoUsed(vcId);
                                    }
                                }
                                @Override
                                public void call(Object... objs) {
                                }
                                @Override
                                public void exception(Exception e) {
                                }
                            });
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
                    } finally {
                        //最终
                        super.end();
                    }
                }
            }
        }
        return res ;
    }
    @Override
    protected String checkDto(DtoBase dto) {
        return null;
    }
    @Override
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
            if(codeData == null){
                msg = RtuSuccessMsg ;
            }else {
                String json = codeData.toJSONString();
                DataCd93_A3Vo cvo = JSON.parseObject(json, DataCd93_A3Vo.class) ;
                if(cvo != null){
                    if(callback != null){
                        if(cvo.clResult != null && cvo.clResult == 0){
                            callback.call(true);//关阀成功
                        }else{
                            callback.call(false);//关阀失败
                        }
                    }
                    msg = cvo.toStr(false) ;
                }else{
                    msg = RtuSuccessMsg ;
                }
            }
        }else{
            msg = RtuSuccessMsg ;
        }
        return msg;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd93/CdDto.java
New file
@@ -0,0 +1,18 @@
package com.dy.pipIrrRemote.monitor.p202404V201.cd93;
import com.dy.pipIrrRemote.common.dto.DtoBase;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * @Author: liurunyu
 * @Date: 2025/5/13 09:38
 * @Description
 */
@Data
@EqualsAndHashCode(callSuper=true)
public class CdDto extends DtoBase {
    public static final long serialVersionUID = 202505130938001L;
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd93/CdParam.java
New file
@@ -0,0 +1,21 @@
package com.dy.pipIrrRemote.monitor.p202404V201.cd93;
import com.dy.pipIrrRemote.monitor.common.CdParameter;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.SuperBuilder;
/**
 * @Author: liurunyu
 * @Date: 2025/5/13 09:38
 * @Description
 */
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
public class CdParam extends CdParameter {
    public String icCardNo ;//用户卡序列号(17位数字)(6字节BCD,2字节HEX)
    public String orderNo ;//订单号(16位数字)
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd93/CdSv.java
New file
@@ -0,0 +1,54 @@
package com.dy.pipIrrRemote.monitor.p202404V201.cd93;
import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper;
import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
import com.dy.pipIrrGlobal.voSe.VoVirtualCard;
import com.dy.pipIrrRemote.monitor.common.ComSv;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @Author: liurunyu
 * @Date: 2025/5/13 09:38
 * @Description
 */
@Slf4j
@Service("cd93Sv")
public class CdSv extends ComSv {
    @Autowired
    protected SeVirtualCardMapper seVirtualCardDao ;
    @Autowired
    protected PrWaterPriceMapper prWaterPriceDao ;
    public VoVirtualCard selectClientVtCardById(Long id){
        return seVirtualCardDao.getVcById(id) ;
    }
    public Double selectWaterPrice(){
        return prWaterPriceDao.getPrice() ;
    }
    /**
     * 解除虚拟卡被占用
     */
    public void setVcNoUsed(Long id){
        SeVirtualCard po = new SeVirtualCard() ;
        po.setId(id);
        po.setIntakeId(null);
        po.setInUse((byte)0);
        po.setOpenTime(null);
        seVirtualCardDao.updateByPrimaryKeySelective(po);
    }
    /**
     * 通过虚拟卡编号得到记录实体ID
     * @param vcNum
     * @return
     */
    public Long getVcIdByNum(String vcNum){
        return seVirtualCardDao.getVcIdByNum(vcNum) ;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd97/CdCtrl.java
@@ -4,8 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCdXyVo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -73,7 +73,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -93,7 +93,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd98/CdCtrl.java
@@ -4,8 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCdXyVo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -73,7 +73,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -93,7 +93,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/cd99/CdCtrl.java
@@ -4,8 +4,8 @@
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCdXyVo;
import com.dy.common.util.Callback;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pipIrrRemote.common.dto.DtoBase;
@@ -73,7 +73,7 @@
                        res = super.doSend(sv, com);
                        if (res == null) {
                            //发送命令后
                            res = super.after(ComCode);
                            res = super.after(ComCode, null);
                        }
                    } catch (Exception e) {
                        res = BaseResponseUtils.buildFail("服务端构造并向通信中间件发送请求时异常" + (e.getMessage() == null ? "" : e.getMessage()));
@@ -93,7 +93,7 @@
    }
    @Override
    protected String createRtnMsg(String code, JSONObject resultData){
    protected String dealComResult(String code, JSONObject resultData, Callback callback){
        String msg;
        if(resultData != null){
            JSONObject codeData = resultData.getJSONObject("data") ;