liurunyu
2023-11-18 c1ddfd71223c1a7d704b6f21b669fbfcb37adc82
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.dy.aceMw.server.forTcp;
 
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
import com.dy.aceMw.server.forMq.ToMqMessageCach;
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;
import com.dy.common.util.rtuMq.MessageType;
 
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 = TcpDownCommandCach.matchFromHead(resFromRtu) ;
                if(resToRtu != null){
                    //匹配到下发的命令
                    resFromRtu.setCommandId(resToRtu.commandId) ;
                    this.sendResult(false, resFromRtu);
                }else{
                    this.sendResult(false, resFromRtu);
                    //未匹配到下发的命令,命令在缓存因超时被清除了
                    RtuStatusDealer.commandFail2Success(resFromRtu.rtuAddr) ;
                }
            }else{
                //主动上报数据
                this.sendResult(true, resFromRtu);
            }
        }
    }
    private void sendResult(boolean reportOrResponse_trueOrFalse, MidResultFromRtu resFromRtu){
        try{
            String json = resFromRtu.data.toJson() ;
            if(reportOrResponse_trueOrFalse){
                ToMqMessageCach.cachObj(MessageType.RtuAutoReport, json);
            }else{
                ToMqMessageCach.cachObj(MessageType.RtuCmdResponse, json);
            }
        }catch(Exception e){
            log.error(e.getMessage(), e);
        }
        
    }
}