zhubaomin
9 天以前 00d54db361d697cf8fdf2f15940f4650b21b3185
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/MidResultActionFromRtu.java
New file
@@ -0,0 +1,73 @@
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);
      }
   }
}