| package com.dy.rtuMw.server.forTcp; | 
|   | 
| import com.dy.rtuMw.server.rtuData.RtuComResultCache; | 
| import com.dy.rtuMw.server.rtuData.RtuComResultNode; | 
| import com.dy.rtuMw.server.rtuData.RtuDataNode; | 
| import com.dy.rtuMw.server.rtuData.RtuDataCache; | 
| import org.apache.logging.log4j.LogManager; | 
| import org.apache.logging.log4j.Logger; | 
|   | 
| import com.dy.common.mw.protocol.MidResult; | 
| import com.dy.common.mw.protocol.MidResultAction; | 
| import com.dy.common.mw.protocol.MidResultFromRtu; | 
| import com.dy.common.mw.protocol.MidResultToRtu; | 
|   | 
| public class MidResultActionFromRtu implements MidResultAction { | 
|   | 
|     private static Logger log = LogManager.getLogger(MidResultActionFromRtu.class) ; | 
|   | 
|     @Override | 
|     public void doAction(MidResult result) { | 
|         if(result != null && result instanceof MidResultFromRtu){ | 
|             //如果此处需要更多的逻辑处理,可以生成一个任务类(实现CoreTask)对象进行处理 | 
|             //当前,处理直接进行 | 
|             MidResultFromRtu resFromRtu = (MidResultFromRtu)result ; | 
|             if(!resFromRtu.reportOrResponse_trueOrFalse){ | 
|                 //命令应答 | 
|                 //此处实现,与以前不一样, | 
|                 //以前实现:匹配命令是从后向前匹配, | 
|                 //当前实现,匹配命令是从前向后匹配,原因:举例,当批量下发补召命令,如果从后匹配,则前面命令会下发多次,即一个上报次数据会补召多次 | 
|                 MidResultToRtu resToRtu = TcpDownCommandCache.matchFromHead(resFromRtu) ; | 
|                 if(resToRtu != null){ | 
|                     //匹配到下发的命令 | 
|                     resFromRtu.matchedCommand(resToRtu.commandId, resToRtu.rtuResultSendWebUrl) ; | 
|                     this.nextDealRtuData(false, resFromRtu); | 
|                     this.nextDealRtuComResult(resFromRtu); | 
|                 }else{ | 
|                     log.error("匹配命令失败,功能码是:" + ((MidResultFromRtu) result).upCode ); | 
|                     this.nextDealRtuData(false, resFromRtu); | 
|                     //未匹配到下发的命令,命令在缓存因超时被清除了 | 
|                     RtuStatusDealer.commandFail2Success(resFromRtu.rtuAddr) ; | 
|                 } | 
|             }else{ | 
|                 //主动上报数据 | 
|                 this.nextDealRtuData(true, resFromRtu); | 
|             } | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 进入多线程环境中运行 | 
|      * @param reportOrResponse_trueOrFalse | 
|      * @param resFromRtu | 
|      */ | 
|     private void nextDealRtuData(boolean reportOrResponse_trueOrFalse, MidResultFromRtu resFromRtu){ | 
|         try{ | 
|             RtuDataCache.cacheRtuUpData(reportOrResponse_trueOrFalse, new RtuDataNode(resFromRtu.data)); | 
|         }catch(Exception e){ | 
|             log.error(e.getMessage(), e); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 进入单线程环境中运行 | 
|      * @param resFromRtu | 
|      */ | 
|     private void nextDealRtuComResult(MidResultFromRtu resFromRtu){ | 
|         try{ | 
|             RtuComResultCache.cacheRtuComResult(new RtuComResultNode(resFromRtu.data)); | 
|         }catch(Exception e){ | 
|             log.error(e.getMessage(), e); | 
|         } | 
|     } | 
| } |