| package com.dy.rtuMw.server.rtuData.p206V2; | 
|   | 
| import com.dy.common.mw.protocol.Data; | 
| import com.dy.common.mw.protocol.p206V2.DataV2; | 
| import com.dy.common.mw.protocol.p206V2.upVos.DataCd02Vo; | 
| import com.dy.rtuMw.server.rtuData.TaskSurpport; | 
| import org.apache.logging.log4j.LogManager; | 
| import org.apache.logging.log4j.Logger; | 
|   | 
| import java.text.ParseException; | 
| import java.util.HashMap; | 
| import java.util.Map; | 
|   | 
| /** | 
|  * @Author: liurunyu | 
|  * @Date: 2024/11/1 9:16 | 
|  * @Description | 
|  */ | 
| public class TkDealHearBeatV2 extends TaskSurpport { | 
|   | 
|     private static final Map<String, String> onceUpDataRtus = new HashMap<>(); | 
|   | 
|     private static final Logger log = LogManager.getLogger(TkPreGenObjsV2.class.getName()) ; | 
|   | 
|     //类ID,一定与Tree.xml配置文件中配置一致 | 
|     public static final String taskId = "TkDealHearBeatV2" ; | 
|   | 
|     /** | 
|      * 执行节点任务 | 
|      * @param data 需要处理的数据 | 
|      */ | 
|     @Override | 
|     public void execute(Object data) throws ParseException { | 
|         Data d = (Data)data ; | 
|         String rtuAddr = d.getRtuAddr() ;//TkRtuData里判断了rtuAddr为空 | 
|         DataCd02Vo cd02Vo = null ; | 
|         if(d.subData != null && d.subData instanceof DataV2){ | 
|             DataV2 dataV2 = (DataV2)d.subData ; | 
|             if(dataV2.subData != null && dataV2.subData instanceof DataCd02Vo){ | 
|                 cd02Vo = (DataCd02Vo)dataV2.subData ; | 
|             } | 
|         } | 
|         boolean toNext = true ; | 
|         if(!onceUpDataRtus.containsKey(rtuAddr)){ | 
|             //初次上行数据,不论是否是心跳,都要进行任务树处理 | 
|             //toNext = true ; | 
|             if(cd02Vo != null){ | 
|                 //是心跳数据 | 
|                 onceUpDataRtus.put(rtuAddr, (cd02Vo.alarmVo == null?"":cd02Vo.alarmVo.to1010()) + | 
|                         (cd02Vo.stateVo == null?"":cd02Vo.stateVo.to1010())) ; | 
|             }else{ | 
|                 //不是心跳数据 | 
|                 onceUpDataRtus.put(rtuAddr, "") ; | 
|             } | 
|         }else{ | 
|             if(cd02Vo != null){ | 
|                 //是心跳数据, | 
|                 String alarmStateOld = onceUpDataRtus.get(rtuAddr) ; | 
|                 String alarmStateNew = (cd02Vo.alarmVo == null?"":cd02Vo.alarmVo.to1010()) + | 
|                         (cd02Vo.stateVo == null?"":cd02Vo.stateVo.to1010()) ; | 
|                 if(alarmStateOld.equals(alarmStateNew)){ | 
|                     toNext = false ;//是心跳数据,并且报警与状态未改变,不进行任务树处理,不缓存未变化的报警与状态 | 
|                 }else{ | 
|                     //是心跳数据,并且报警与状态也改变了,进行任务树处理 | 
|                     //toNext = true ; | 
|                     onceUpDataRtus.put(rtuAddr, alarmStateNew) ;//缓存新报警与状态 | 
|                 } | 
|             }else{ | 
|                 //不是心跳数据,要进行任务树处理 | 
|                 //toNext = true ; | 
|             } | 
|         } | 
|         if(toNext){ | 
|             this.toNextTasks(data); | 
|         } | 
|     } | 
| } |