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 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); } } }