zhubaomin
2025-02-21 1e6561acc89b7105c1dcbf5395845d6046f1453d
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV
13个文件已修改
1个文件已添加
342 ■■■■ 已修改文件
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1/CodeV1.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V2/upVos/DataAlarmVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/CodeV202404.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/ProtocolConstantV206V202404.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/global/GlParse.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/AlarmVo.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmAlarmStateHistory.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkDealAlarmStatus.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkPreGenObjs.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V2/TkDealAlarmStatusV2.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealAlarmStatusV202404.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealVirCardStateV202404.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkPreGenObjsV202404.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1/CodeV1.java
@@ -2,7 +2,7 @@
public class CodeV1 {
    //功能码为字符串,十六进制数据
    public static final String cd_02 = "02" ;//遥测站链路检测
    public static final String cd_02 = "02" ;//遥测站链路检测     主动上报
    public static final String cd_10 = "10" ;//设置遥测站终端地址
    public static final String cd_11 = "11" ;//设置遥测站时钟(未实现)
    public static final String cd_12 = "12" ;//设置工作模式(未实现)
@@ -30,9 +30,9 @@
    public static final String cd_6A = "6A" ;//查询阀门堵转电流值
    public static final String cd_6B = "6B" ;//查询阀门超时时间
    public static final String cd_6D = "6D" ;//查询阶梯水价
    public static final String cd_81 = "81" ;//随机自报报 ok
    public static final String cd_83 = "83" ;//遥测站开关阀自报 ok
    public static final String cd_84 = "84" ;//开阀工作报 ok
    public static final String cd_81 = "81" ;//随机自报报     主动上报
    public static final String cd_83 = "83" ;//遥测站开关阀自报    主动上报
    public static final String cd_84 = "84" ;//开阀工作报    主动上报
    public static final String cd_91 = "91" ;//清空历史记录
    public static final String cd_92 = "92" ;//遥控启动阀门
    public static final String cd_93 = "93" ;//遥控关闭阀门
@@ -44,7 +44,7 @@
    public static final String cd_A1 = "A1" ;//定时关阀式计划开阀
    public static final String cd_A2 = "A2" ;//定量关阀式计划开阀
    public static final String cd_B0 = "B0" ;//查询实时数据(未实现)
    public static final String cd_C0 = "C0" ;//遥测站整点上报实时数据 ok
    public static final String cd_C0 = "C0" ;//遥测站整点上报实时数据    主动上报
    public static final String cd_1600 = "1600" ;//升级复位
    public static final String cd_1601 = "1601" ;//升级配置
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V2/upVos/DataAlarmVo.java
@@ -69,7 +69,7 @@
        }
       if(loss != null && loss == 1){
            txt += (hasTxt?"、":"") + "漏损报警" ;
           hasTxt = true ;
            hasTxt = true ;
        }
        return txt ;
    }
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/CodeV202404.java
@@ -2,12 +2,10 @@
public class CodeV202404 {
    //功能码为字符串,十六进制数据
    public static final String cd_02 = "02" ;//链路检测
    public static final String cd_02 = "02" ;//链路检测     主动上报
    public static final String cd_10 = "10" ;//设置设备终端地址
    public static final String cd_8A = "8A" ;//设备登录
    public static final String cd_50 = "50" ; //查询设备终端地址
    public static final String cd_80 = "80" ; //设备终端工作上报
    public static final String cd_81 = "81" ; //设备终端随机自报
    public static final String cd_5B = "5B" ; //查询设备终端实时值
    public static final String cd_65 = "65" ; //查询设备终端用户用水记录
    public static final String cd_97 = "97" ; //清除设备终端用户用水记录
@@ -26,9 +24,11 @@
    public static final String cd_93 = "93" ; //平台远程关闭水泵/阀门
    public static final String cd_A2 = "A2" ; //APP远程开启水泵/阀门
    public static final String cd_A3 = "A3" ; //APP远程关闭水泵/阀门
    public static final String cd_83 = "83" ; //遥测终端定点上报
    public static final String cd_84 = "84" ; //刷卡开泵/阀上报
    public static final String cd_85 = "85" ; //刷卡关泵/阀上报
    public static final String cd_80 = "80" ; //设备终端工作上报    主动上报
    public static final String cd_81 = "81" ; //设备终端随机自报    主动上报
    public static final String cd_83 = "83" ; //遥测终端定点上报(一天报一次)    主动上报
    public static final String cd_84 = "84" ; //刷卡开泵/阀上报    主动上报
    public static final String cd_85 = "85" ; //刷卡关泵/阀上报    主动上报
    public static final String cd_9A = "9A" ; //查询年用水量
    public static final String cd_26 = "26" ; //设置设备终端年用水量
    public static final String cd_21 = "21" ; //设置设备终端IP地址
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/ProtocolConstantV206V202404.java
@@ -48,6 +48,8 @@
    public static final int codeIndex = 12 ;//功能码字节数组下标
    public static final int dataIndex = 13 ;//具体数据字节数组下标
    public static final String vsCardAddr = "00000000";//本系统应用的虚拟卡,卡物理地址采用10个0作为模拟
    ////////////////////////////////////////////////
    //
    //远程升级相关
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/global/GlParse.java
@@ -70,12 +70,16 @@
        b = bs[index + 1] ;
        vo.alarm0MoneyRemain = (byte)(b & 0x1) ;
        vo.alarmInnerDoor = (byte)((b >> 1) & 1) ;
        vo.alarmOuterDoor = (byte)((b >> 2) & 1) ;
        vo.alarmDoor = (byte)((b >> 1) & 1) ;
        vo.alarmBatteryVolt = (byte)((b >> 2) & 1) ;
        vo.alarmEleMiss = (byte)((b >> 3) & 1) ;
        vo.alarmEleExceed = (byte)((b >> 4) & 1) ;
        vo.alarmEleLowVolt = (byte)((b >> 5) & 1) ;
        vo.stateIcEnable = (byte)((b >> 6) & 1) ;
        vo.stateOpClValve = (byte)((b >> 7) & 1) ;
        b = bs[index + 2] ;
        vo.alarmBlockValve = (byte)(b & 0x1) ;
    }
    public static String parseTp(byte[] bs, short index){
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/AlarmVo.java
@@ -6,23 +6,97 @@
 * @Description
 */
public class AlarmVo {
    public static final byte DevOpenState = 1 ;
    public static final byte DevCloseState = 0 ;
    public Byte statePump ; //泵/阀状态    (1:开泵/阀;0:关泵/阀)
    public Byte alarmWaterRemain ; //剩余水量报警    (1:小于报警上限报警 0:正常)
    public Byte alarm0WaterRemain ; //剩余水量为0关泵/阀    (1:剩余水量为0关泵  0:正常)
    public Byte alarmExceedYear ; //年度超采报警    (1:年用水量大于限制水量报警 0:正常)
    public Byte alarmWaterMeterFault ; //外部流量计故障    (1:流量计故障报警 0:正常)
    public Byte alarmSteal ; //偷水报警    (1:绕开控制器用水报警 0:正常)
    public Byte alarmSteal ; //偷水报警    (1:绕开控制器用水报警 0:正常)(2025-02-19:对应靳总协议中的漏损报警,即关阀态时有流量产生)
    public Byte alarmWaterMeterBreak ; //流量计损坏报警    (1:正常通讯但瞬时为0报警 0:正常)
    public Byte alarmEleMeterFault ; //电表故障报警    (1:和电表通讯断或数据不正常 0:正常)
    public Byte alarm0MoneyRemain ; //剩余金额为0    (1:剩余金额为0报警  0:正常)
    public Byte alarmInnerDoor ; //控制器内门报警    (1:内门打开报警    0:正常)
    public Byte alarmOuterDoor ; //控制器外门报警    (1:外门打开报警    0:正常)
    public Byte alarmDoor; //控制器内门报警    (1:内门打开报警    0:正常)
    public Byte alarmBatteryVolt; //电池电压低报警    (1:电池低关阀报警    0:正常)
    public Byte alarmEleMiss ; //交流缺项报警    (1:三相缺项报警    0:正常)
    public Byte alarmEleExceed ; //交流过流报警    (1:交流过流报警    0:正常)
    public Byte alarmEleExceed ; //交流过流报警 (1:交流过流报警    0:正常)
    public Byte alarmEleLowVolt ; //三相电欠压报警    (1:欠压报警        0:正常)
    public Byte stateIcEnable ; //IC卡使能    (1、IC有刷卡支持    0:不支持)
    public Byte stateIcEnable ; //IC卡使能 (1:IC有刷卡支持    0:不支持)
    public Byte alarmBlockValve; //阀门故障报警 (1:阀门堵转   0:阀门正常(不堵转))
    public Byte stateOpClValve ; //阀门开关状态 (1:开关阀不到位    0:开关阀到位)
    public boolean hasAlarm(){
        boolean flag = false ;
        if((alarmBatteryVolt != null && alarmBatteryVolt == 1) ||
                (alarmWaterMeterFault != null && alarmWaterMeterFault == 1) ||
                (alarmWaterMeterBreak != null && alarmWaterMeterBreak == 1) ||
                (alarmSteal != null && alarmSteal == 1) ||
                (alarmBlockValve != null && alarmBlockValve == 1) ){
            flag = true ;
        }
        return flag ;
    }
    public boolean hasAlarmExcludeLoss(){
        boolean flag = false ;
        if((alarmBatteryVolt != null && alarmBatteryVolt == 1) ||
                (alarmWaterMeterFault != null && alarmWaterMeterFault == 1) ||
                (alarmWaterMeterBreak != null && alarmWaterMeterBreak == 1)||
                (alarmBlockValve != null && alarmBlockValve == 1) ){
            flag = true ;
        }
        return flag ;
    }
    public String alarmContent(){
        String txt = "" ;
        boolean hasTxt = false ;
        if(alarmBatteryVolt != null && alarmBatteryVolt == 1){
            txt += (hasTxt?"、":"") + "电池电压低报警" ;
            hasTxt = true ;
        }
        if(alarmWaterMeterFault != null && alarmWaterMeterFault == 1){
            txt += (hasTxt?"、":"") + "外部流量计故障报警" ;
            hasTxt = true ;
        }
        if(alarmWaterMeterBreak != null && alarmWaterMeterBreak == 1){
            txt += (hasTxt?"、":"") + "流量计故障报警" ;
            hasTxt = true ;
        }
        if(alarmSteal != null && alarmSteal == 1){
            txt += (hasTxt?"、":"") + "漏损报警" ;
            hasTxt = true ;
        }
       if(alarmBlockValve != null && alarmBlockValve == 1){
            txt += (hasTxt?"、":"") + "阀门故障报警" ;
            hasTxt = true ;
        }
        return txt ;
    }
    public String alarmContentExcludeLoss(){
        String txt = "" ;
        boolean hasTxt = false ;
        if(alarmBatteryVolt != null && alarmBatteryVolt == 1){
            txt += (hasTxt?"、":"") + "电池电压低报警" ;
            hasTxt = true ;
        }
        if(alarmWaterMeterFault != null && alarmWaterMeterFault == 1){
            txt += (hasTxt?"、":"") + "外部流量计故障报警" ;
            hasTxt = true ;
        }
        if(alarmWaterMeterBreak != null && alarmWaterMeterBreak == 1){
            txt += (hasTxt?"、":"") + "流量计故障报警" ;
            hasTxt = true ;
        }
        if(alarmBlockValve != null && alarmBlockValve == 1){
            txt += (hasTxt?"、":"") + "阀门故障报警" ;
            hasTxt = true ;
        }
        return txt ;
    }
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      泵/阀状态 : ") ;
@@ -53,10 +127,10 @@
        sb.append(alarm0MoneyRemain == null?"未知":(alarm0MoneyRemain.byteValue() == 0 ? "正常":(alarm0MoneyRemain.byteValue() == 1 ? "关泵/阀":"未知"))) ;
        sb.append("\n") ;
        sb.append("      控制器内门 : ") ;
        sb.append(alarmInnerDoor == null?"未知":(alarmInnerDoor.byteValue() == 0 ? "正常":(alarmInnerDoor.byteValue() == 1 ? "报警":"未知"))) ;
        sb.append(alarmDoor == null?"未知":(alarmDoor.byteValue() == 0 ? "正常":(alarmDoor.byteValue() == 1 ? "报警":"未知"))) ;
        sb.append("\n") ;
        sb.append("      控制器外门 : ") ;
        sb.append(alarmOuterDoor == null?"未知":(alarmOuterDoor.byteValue() == 0 ? "正常":(alarmOuterDoor.byteValue() == 1 ? "报警":"未知"))) ;
        sb.append("      电池电压低 : ") ;
        sb.append(alarmBatteryVolt == null?"未知":(alarmBatteryVolt.byteValue() == 0 ? "正常":(alarmBatteryVolt.byteValue() == 1 ? "报警":"未知"))) ;
        sb.append("\n") ;
        sb.append("      交流缺项 : ") ;
        sb.append(alarmEleMiss == null?"未知":(alarmEleMiss.byteValue() == 0 ? "正常":(alarmEleMiss.byteValue() == 1 ? "报警":"未知"))) ;
@@ -70,6 +144,12 @@
        sb.append("      IC卡功能 : ") ;
        sb.append(stateIcEnable == null?"未知":(stateIcEnable.byteValue() == 0 ? "无效":(stateIcEnable.byteValue() == 1 ? "有效":"未知"))) ;
        sb.append("\n") ;
        sb.append("      阀门开关状态 : ") ;
        sb.append(stateOpClValve == null?"未知":(stateOpClValve.byteValue() == 0 ? "正常":(stateOpClValve.byteValue() == 1 ? "未到位":"未知"))) ;
        sb.append("\n") ;
        sb.append("      阀门堵转报警 : ") ;
        sb.append(alarmBlockValve == null?"未知":(alarmBlockValve.byteValue() == 0 ? "正常":(alarmBlockValve.byteValue() == 1 ? "报警":"未知"))) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/RmAlarmStateHistory.java
@@ -120,6 +120,7 @@
    public Byte alarmInnerDoor;
    /**
     * 2025-02-19 含义变为 电池电压报警(1:报警,0:正常)
     * 控制器外门打开报警(1:报警,0:正常)
     */
    public Byte alarmOuterDoor;
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkDealAlarmStatus.java
@@ -114,7 +114,7 @@
     * @param stateVo 状态对象
     */
    private void toMsCenter(PrController controller, String rtuAddr, DataV1 dV1, DataAlarmVo alarmVo, DataStateVo stateVo){
        if(alarmVo != null && controller != null){
        if(alarmVo != null && controller != null && alarmVo.hasAlarm()){
            MsObj msObj = new MsObj() ;
            msObj.put("name", "报警");
            msObj.put("rtuAddr", rtuAddr);
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkPreGenObjs.java
@@ -57,7 +57,7 @@
        if(sv != null){
            PrController controller = sv.getControllersByRtuAddrAndIntakeNotNull(rtuAddr) ;
            PrControllerTramp controllerTramp = null ;
            SeClient clientVo = null ;//这个值对象中只有id和name会有值
            SeClient clientVo = null ;//这个值对象中只有id、name、address会有值
            if(controller == null){
                //数据库中未查询到控制器(RTU实体)(已经绑定且控制器地址相符)
                //流浪者控制器
@@ -90,7 +90,7 @@
                (d1.subData instanceof DataCd83OpenVo ||
                        d1.subData instanceof DataCd83CloseVo ||
                        d1.subData instanceof DataCd84Vo)){
            //开阀后,关阀报,阀开工作报
            //开阀报,关阀报,阀开工作报
            String icCardAddr = null ;
            String icCardNo = null ;
            if(d1.subData instanceof DataCd83OpenVo){
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V2/TkDealAlarmStatusV2.java
@@ -37,6 +37,7 @@
        Data d = (Data)data ;
        Object subD = d.getSubData() ;
        if(subD != null){
            boolean toNext = false ;
            DataV2 dV2 = (DataV2)subD ;
            if(dV2 != null && dV2.subData != null){
                //dV2.dataCd81Vo、 dV2.dataCd84Vo 与 dV2.dataCdC0Vo 不会同时有值
@@ -57,6 +58,7 @@
                            if(dataCd02Vo.stateVo != null && dataCd02Vo.stateVo.valveState != null && dataCd02Vo.stateVo.valveState.byteValue() == DataStateVo.ValveCloseState){
                                if(controller != null && controller.getIntakeId() != null){
                                    this.taskResult = new Object[]{controller.getIntakeId(), DataStateVo.ValveCloseState} ;
                                    toNext = true ;
                                }
                            }
                        }
@@ -73,6 +75,7 @@
                            if(dataCd81Vo.stateVo != null && dataCd81Vo.stateVo.valveState != null && dataCd81Vo.stateVo.valveState.byteValue() == DataStateVo.ValveCloseState){
                                if(controller != null && controller.getIntakeId() != null){
                                    this.taskResult = new Object[]{controller.getIntakeId(), DataStateVo.ValveCloseState} ;
                                    toNext = true ;
                                }
                            }
                        }
@@ -106,6 +109,7 @@
                            if(dataCdC0Vo.stateVo != null && dataCdC0Vo.stateVo.valveState != null && dataCdC0Vo.stateVo.valveState.byteValue() == DataStateVo.ValveCloseState){
                                if(controller != null && controller.getIntakeId() != null){
                                    this.taskResult = new Object[]{controller.getIntakeId(), DataStateVo.ValveCloseState} ;
                                    toNext = true ;
                                }
                            }
                        }
@@ -113,6 +117,9 @@
                } catch (Exception e) {
                    log.error("保存控制器报警和状态数据时发生异常", e);
                }
            }
            if(toNext){
                this.toNextTasks(d);
            }
        }
    }
@@ -126,7 +133,7 @@
     * @param stateVo 状态对象
     */
    private void toMsCenter(PrController controller, String rtuAddr, DataV2 dV12, DataAlarmVo alarmVo, DataStateVo stateVo){
        if(alarmVo != null && controller != null){
        if(alarmVo != null && controller != null && alarmVo.hasAlarm()){
            MsObj msObj = new MsObj() ;
            msObj.put("name", "报警");
            msObj.put("rtuAddr", rtuAddr);
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealAlarmStatusV202404.java
@@ -12,8 +12,6 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Date;
/**
 * @Author liurunyu
 * @Date 2024/5/8 14:18
@@ -35,6 +33,7 @@
        DataV202404 dV202404 = (DataV202404)d.getSubData() ;
        Object cdObj = dV202404.subData ;
        //前面任务已经判断cdObj不为null
        boolean toNext = false ;
        try{
            Object[] objs = this.getTaskResults(TkPreGenObjsV202404.taskId) ;
            DbSv sv = (DbSv)objs[0] ;
@@ -44,29 +43,62 @@
                DataCd81Vo cdData = (DataCd81Vo)(cdObj) ;
                this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ;
                this.saveHistory(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ;
                if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){
                    if(controller != null && controller.getIntakeId() != null){
                        this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ;
                        toNext = true ;
                    }
                }
            }else if(cdObj instanceof DataCd80_5BVo){
                //设备终端工作上报 + 查询设备终端实时值
                DataCd80_5BVo cdData = (DataCd80_5BVo)(cdObj) ;
                this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ;
                this.saveHistory(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ;
                if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){
                    if(controller != null && controller.getIntakeId() != null){
                        this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ;
                        toNext = true ;
                    }
                }
            }else if(cdObj instanceof DataCd93_A3Vo){
                //平台/APP远程关闭水泵/阀门   +  刷卡关泵/阀上报
                DataCd93_A3Vo cdData = (DataCd93_A3Vo)(cdObj) ;
                this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.endDt, cdData, dV202404.dt) ;
                this.saveHistory(sv, controller, d.getRtuAddr(), cdData.endDt, cdData, dV202404.dt) ;
                if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){
                    if(controller != null && controller.getIntakeId() != null){
                        this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ;
                        toNext = true ;
                    }
                }
            }else if(cdObj instanceof DataCd84Vo){
                //设备终端刷卡开泵/阀上报
                DataCd84Vo cdData = (DataCd84Vo)(cdObj) ;
                this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.openDt, cdData, dV202404.dt) ;
                this.saveHistory(sv, controller, d.getRtuAddr(), cdData.openDt, cdData, dV202404.dt) ;
                if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){
                    if(controller != null && controller.getIntakeId() != null){
                        this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ;
                        toNext = true ;
                    }
                }
            }else if(cdObj instanceof DataCdC2Vo){
                //设备终端开关水泵/阀门成功/失败上报
                DataCdC2Vo cdData = (DataCdC2Vo)(cdObj) ;
                this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ;
                this.saveHistory(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ;
                if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){
                    if(controller != null && controller.getIntakeId() != null){
                        this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ;
                        toNext = true ;
                    }
                }
            }
        }catch (Exception e){
            log.error("保存控制器报警和状态数据时发生异常", e);
        }
        if(toNext){
            this.toNextTasks(d);
        }
    }
    /**
@@ -101,21 +133,20 @@
                    alarmVo==null?null:alarmVo.alarmWaterMeterBreak,
                    alarmVo==null?null:alarmVo.alarmEleMeterFault,
                    alarmVo==null?null:alarmVo.alarm0MoneyRemain,
                    alarmVo==null?null:alarmVo.alarmInnerDoor,
                    alarmVo==null?null:alarmVo.alarmOuterDoor,
                    alarmVo==null?null:alarmVo.alarmDoor,
                    alarmVo==null?null:alarmVo.alarmDoor,//2025-02-19机箱外门报警项改为电池电压了
                    alarmVo==null?null:alarmVo.alarmEleMiss,
                    alarmVo==null?null:alarmVo.alarmEleExceed,
                    alarmVo==null?null:alarmVo.alarmEleLowVolt,
                    alarmVo==null?null:alarmVo.stateIcEnable,
                    (byte)0,//电池电压(1:报警,0:正常)
                    (byte)0,//阀门报警(1:报警,0:正常)
                    alarmVo==null?null:alarmVo.alarmBatteryVolt,//电池电压(1:报警,0:正常)
                    alarmVo==null?null:alarmVo.alarmBlockValve,//阀门堵转报警(1:报警,0:正常)
                    (byte)0,//供电方式(0: 220V,1:蓄电池)
                    System.currentTimeMillis()
            ) ;
            sv.saveRmAlarmStateLast(po) ;
        }else{
            po = this.update(po, controller, rtuDt, alarmVo, receiveDt) ;
            this.updateVirCardNoUseState(sv, controller, alarmVo) ;
            sv.updateRmAlarmStateLast(po);
        }
    }
@@ -150,14 +181,14 @@
                alarmVo==null?null:alarmVo.alarmWaterMeterBreak,
                alarmVo==null?null:alarmVo.alarmEleMeterFault,
                alarmVo==null?null:alarmVo.alarm0MoneyRemain,
                alarmVo==null?null:alarmVo.alarmInnerDoor,
                alarmVo==null?null:alarmVo.alarmOuterDoor,
                alarmVo==null?null:alarmVo.alarmDoor,
                alarmVo==null?null:alarmVo.alarmDoor,//2025-02-19机箱外门报警项改为电池电压了
                alarmVo==null?null:alarmVo.alarmEleMiss,
                alarmVo==null?null:alarmVo.alarmEleExceed,
                alarmVo==null?null:alarmVo.alarmEleLowVolt,
                alarmVo==null?null:alarmVo.stateIcEnable,
                (byte)0,//电池电压(1:报警,0:正常)
                (byte)0,//阀门报警(1:报警,0:正常)
                alarmVo==null?null:alarmVo.alarmBatteryVolt,//电池电压(1:报警,0:正常)
                alarmVo==null?null:alarmVo.alarmBlockValve,//阀门堵转报警(1:报警,0:正常)
                (byte)0//供电方式(0: 220V,1:蓄电池)
        ) ;
        sv.saveRmAlarmStateHistory(po) ;
@@ -192,32 +223,16 @@
            po.alarmWaterMeterBreak = alarmVo.alarmWaterMeterBreak ;
            po.alarmEleMeterFault = alarmVo.alarmEleMeterFault ;
            po.alarm0MoneyRemain = alarmVo.alarm0MoneyRemain ;
            po.alarmInnerDoor = alarmVo.alarmInnerDoor ;
            po.alarmOuterDoor = alarmVo.alarmOuterDoor ;
            po.alarmInnerDoor = alarmVo.alarmDoor;
            po.alarmOuterDoor = alarmVo.alarmDoor;
            po.alarmEleMiss = alarmVo.alarmEleMiss ;
            po.alarmEleExceed = alarmVo.alarmEleExceed ;
            po.alarmEleLowVolt = alarmVo.alarmEleLowVolt ;
            po.stateIcEnable = alarmVo.stateIcEnable ;
            po.alarmBatteryVolt = alarmVo.alarmBatteryVolt ;
            po.alarmValve = alarmVo.alarmBlockValve;
        }
        return po ;
    }
    /**
     * 虚拟卡在取水中的占用状态改为非应用状态
     */
    private void updateVirCardNoUseState(DbSv sv,
                                PrController controller,
                                AlarmVo alarmVo){
        if(alarmVo != null){
            if(alarmVo.statePump != null && alarmVo.statePump.byteValue() == 0){
                //阀门关闭状态
                if(controller != null && controller.getIntakeId() != null){
                    //虚拟卡在取水中的占用状态改为非应用状态
                    Date now = new Date() ;
                    sv.updateVirCardNoUseState(controller.getIntakeId(), now);
                }
            }
        }
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealVirCardStateV202404.java
New file
@@ -0,0 +1,43 @@
package com.dy.rtuMw.server.rtuData.p206V202404;
import com.dy.common.mw.protocol.p206V202404.upVos.AlarmVo;
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;
import java.util.Date;
/**
 * @Author: liurunyu
 * @Date: 2024/8/9 9:49
 * @Description
 */
public class TkDealVirCardStateV202404 extends TaskSurpport {
    private static final Logger log = LogManager.getLogger(TkDealVirCardStateV202404.class.getName()) ;
    //类ID,一定与Tree.xml配置文件中配置一致
    public static final String taskId = "TkDealVirCardStateV202404" ;
    /**
     * 执行节点任务:虚拟卡在取水口上的占用状态改为非占用状态
     * @param data 需要处理的数据
     */
    @Override
    public void execute(Object data) {
        Object[] objs = this.getTaskResults(TkDealAlarmStatusV202404.taskId);
        if(objs != null && objs.length >= 2){
            Long intakeId = (Long)objs[0] ;
            Byte valveState = (Byte)objs[1] ;
            if(intakeId != null && valveState.byteValue() == AlarmVo.DevCloseState){
                objs = this.getTaskResults(TkPreGenObjsV202404.taskId);
                DbSv sv = (DbSv) objs[0];
                //虚拟卡在取水口上的占用状态改为非占用状态
                Date now = new Date() ;
                sv.updateVirCardNoUseState(intakeId, now);
            }
        }
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkPreGenObjsV202404.java
@@ -3,10 +3,12 @@
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.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.upVos.*;
import com.dy.common.springUtil.SpringContextUtil;
import com.dy.pipIrrGlobal.pojoPr.PrController;
import com.dy.pipIrrGlobal.pojoPr.PrControllerTramp;
import com.dy.pipIrrGlobal.pojoSe.SeClient;
import com.dy.rtuMw.server.ServerProperties;
import com.dy.rtuMw.server.rtuData.TaskSurpport;
import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
@@ -16,11 +18,16 @@
import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * @Author liurunyu
 * @Date 2024/5/8 14:18
 */
public class TkPreGenObjsV202404 extends TaskSurpport {
    private static final Map<String, Boolean> onceUpDataRtus = new HashMap<>();
    private static final Logger log = LogManager.getLogger(TkPreGenObjsV202404.class.getName()) ;
@@ -35,10 +42,24 @@
    public void execute(Object data) throws ParseException {
        Data d = (Data)data ;
        String rtuAddr = d.getRtuAddr() ;//TkRtuData里判断了rtuAddr为空
        DbSv sv = (DbSv) SpringContextUtil.getBean(DbSv.class) ;
        if(d.subData != null && d.subData instanceof DataV202404){
            DataV202404 dataV1 = (DataV202404)d.subData ;
            if(dataV1.subData != null && dataV1.subData instanceof DataCd02Vo){
                //过滤掉心跳数据
                if(onceUpDataRtus.containsKey(rtuAddr)){
                    return ;
                }
            }
        }
        if(!onceUpDataRtus.containsKey(rtuAddr)){
            onceUpDataRtus.put(rtuAddr, true) ;
        }
        DbSv sv = SpringContextUtil.getBean(DbSv.class) ;
        if(sv != null){
            PrController controller = sv.getControllersByRtuAddrAndIntakeNotNull(rtuAddr) ;
            PrControllerTramp controllerTramp = null ;
            SeClient clientVo = null ;//这个值对象中只有id、name、address会有值
            if(controller == null){
                //数据库中未查询到控制器(RTU实体)(已经绑定且控制器地址相符)
                //流浪者控制器
@@ -49,9 +70,13 @@
                    //第一次发现,下发清空RTU历史命令,以使其重新开始记录新地点的数据
                    this.sendClearCommand(rtuAddr, d.protocol);
                }
            }else{
                if(d.subData != null && d.subData instanceof DataV202404){
                    clientVo = this.getClient(sv, (DataV202404)d.subData);
                }
            }
            //不论是否为流浪控制器(RTU实体),都要进行下步工作,记录其上报的一些数据,当绑定控制器后,数据自动有了归属
            this.taskResult = new Object[]{sv, controller, controllerTramp} ;
            this.taskResult = new Object[]{sv, controller, controllerTramp, clientVo} ;
            this.toNextTasks(data);
        }else{
            log.error("严重错误,未能得到DbSv对象");
@@ -59,6 +84,41 @@
    }
    /**
     * 得到相关农户信息
     */
    private SeClient getClient(DbSv sv, DataV202404 d1){
        SeClient clientVo = null ;
        if(d1.subData != null &&
                (d1.subData instanceof DataCd84Vo ||
                        d1.subData instanceof DataCd85Vo ||
                        d1.subData instanceof DataCd80_5BVo)){
            //开阀报,关阀报,阀开工作报
            String icCardAddr = null ;
            String icCardNo = null ;
            if(d1.subData instanceof DataCd84Vo){
                DataCd84Vo vo = (DataCd84Vo)d1.subData ;
                icCardAddr = vo.icCardAddr ;
                icCardNo = vo.icCardNo ;
            }else if(d1.subData instanceof DataCd85Vo){
                DataCd85Vo vo = (DataCd85Vo)d1.subData ;
                icCardAddr = vo.icCardAddr ;
                icCardNo = vo.icCardNo ;
            }else if(d1.subData instanceof DataCd80_5BVo){
                DataCd80_5BVo vo = (DataCd80_5BVo)d1.subData ;
                icCardAddr = vo.icCardAddr ;
                icCardNo = vo.icCardNo ;
            }
            if(icCardAddr != null && icCardNo != null){
                if(icCardAddr.equals(ProtocolConstantV206V202404.vsCardAddr)){
                    clientVo = sv.getClientIdAndNameByVsCardNo(icCardNo) ;
                }else{
                    clientVo = sv.getClientIdAndNameByCardAddrAndCardNo(icCardAddr, icCardNo) ;
                }
            }
        }
        return clientVo ;
    }
    /**
     * 发送清空RTU的命令
     * @param rtuAddr
     * @param protocol
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml
@@ -18,7 +18,7 @@
                            <task id="TkDealAlarmStatus" name="控制器报警与状态及向钉钉发送报警信息" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealAlarmStatus">
                                <task id="TkDealVirCardState" name="虚拟卡占用状态恢复" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealVirCardState" />
                            </task>
                            <task id="TkDealOnHourReport" name="控制器自报数据(定点报)(功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealOnHourReport" />
                            <task id="TkDealOnHourReport" name="控制器自报数据(整点报)(功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealOnHourReport" />
                            <task id="TkDealWorkReport" name="控制器阀开工作上报(功能码84)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealWorkReport" />
                            <task id="TkDealOpenValveReport" name="控制器开阀上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealOpenValveReport" />
                            <task id="TkDealCloseValveReport" name="控制器关阀上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealCloseValveReport" />
@@ -46,7 +46,7 @@
                                <task id="TkDealAlarmStatusV2" name="控制器报警与状态及向钉钉发送报警信息" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealAlarmStatusV2">
                                    <task id="TkDealVirCardStateV2" name="虚拟卡占用状态恢复" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealVirCardStateV2" />
                                </task>
                                <task id="TkDealOnHourReportV2" name="控制器自报数据(定点报)(功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealOnHourReportV2" />
                                <task id="TkDealOnHourReportV2" name="控制器自报数据(整点报)(功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealOnHourReportV2" />
                                <task id="TkDealWorkReportV2" name="控制器阀开工作上报(功能码84)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealWorkReportV2" />
                                <task id="TkDealOpenValveReportV2" name="控制器开阀上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealOpenValveReportV2" />
                                <task id="TkDealCloseValveReportV2" name="控制器关阀上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V2.TkDealCloseValveReportV2" />
@@ -71,9 +71,11 @@
                    <task id="TkDealControllerNoTrampV202404" name="非流浪者RTU" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealControllerNoTrampV202404">
                        <!-- 识别非命令应答上行数据 -->
                        <task id="TkFindReportV202404" name="识别非命令应答上行数据" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkFindReportV202404">
                            <task id="TkDealAlarmStatusV202404" name="控制器报警与状态" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealAlarmStatusV202404" />
                            <task id="TkDealAlarmStatusV202404" name="控制器报警与状态及向钉钉发送报警信息" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealAlarmStatusV202404">
                                <task id="TkDealVirCardStateV202404" name="虚拟卡占用状态恢复" enable="true" class="com.dy.rtuMw.server.rtuData.p206V202404.TkDealVirCardStateV202404" />
                            </task>
                            <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="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>