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