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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package com.dy.rtuMw.server.rtuData.p206V2;
 
import com.dy.common.mw.protocol.Command;
import com.dy.common.mw.protocol.CommandType;
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V2.CodeV2;
import com.dy.common.mw.protocol.p206V2.DataV2;
import com.dy.common.mw.protocol.p206V2.ProtocolConstantV206V2;
import com.dy.common.mw.protocol.p206V2.upVos.DataCd02Vo;
import com.dy.common.mw.protocol.p206V2.upVos.DataCd83CloseVo;
import com.dy.common.mw.protocol.p206V2.upVos.DataCd83OpenVo;
import com.dy.common.mw.protocol.p206V2.upVos.DataCd84Vo;
import com.dy.common.springUtil.SpringContextUtil;
import com.dy.pipIrrGlobal.pojoPr.PrController;
import com.dy.pipIrrGlobal.pojoPr.PrControllerTramp;
import com.dy.pipIrrGlobal.pojoSe.SeClient;
import com.dy.rtuMw.server.ServerProperties;
import com.dy.rtuMw.server.rtuData.TaskSurpport;
import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
import com.dy.rtuMw.web.com.CommandCtrl;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
import java.text.ParseException;
import java.util.Date;
 
public class TkPreGenObjsV2 extends TaskSurpport {
 
    private static final Logger log = LogManager.getLogger(TkPreGenObjsV2.class.getName()) ;
 
    //类ID,一定与Tree.xml配置文件中配置一致
    public static final String taskId = "TkPreGenObjsV2" ;
 
    /**
     * 执行节点任务
     * @param data 需要处理的数据
     */
    @Override
    public void execute(Object data) throws ParseException {
        Data d = (Data)data ;
        String rtuAddr = d.getRtuAddr() ;//TkRtuData里判断了rtuAddr为空
        DbSv sv = SpringContextUtil.getBean(DbSv.class) ;
        if(sv != null){
            PrController controller = sv.getControllersByRtuAddrAndIntakeNotNull(rtuAddr) ;
            PrControllerTramp controllerTramp = null ;
            SeClient clientVo = null ;//这个值对象中只有id和name会有值
            if(controller == null){
                //数据库中未查询到控制器(RTU实体)(已经绑定且控制器地址相符)
                //流浪者控制器
                controllerTramp = sv.getPrControllerTrampByRtuAddr(rtuAddr);
                if(controllerTramp == null){
                    //第一次发现
                    controllerTramp = new PrControllerTramp(null, rtuAddr, d.getProtocol(), (d.protocolVer==null?null:d.protocolVer.intValue()), new Date(), ServerProperties.orgTag) ;
                    //第一次发现,下发清空RTU历史命令,以使其重新开始记录新地点的数据
                    this.sendClearCommand(rtuAddr, d.protocol);
                }
            }else{
                if(d.subData != null && d.subData instanceof DataV2){
                    clientVo = this.getClient(sv, (DataV2)d.subData);
                }
            }
            //不论是否为流浪控制器(RTU实体),都要进行下步工作,记录其上报的一些数据,当绑定控制器后,数据自动有了归属
            this.taskResult = new Object[]{sv, controller, controllerTramp, clientVo} ;
            this.toNextTasks(data);
        }else{
            log.error("严重错误,未能得到DbSv对象");
        }
    }
 
    /**
     * 得到相关农户信息
     */
    private SeClient getClient(DbSv sv, DataV2 d1){
        SeClient clientVo = null ;
        if(d1.subData != null &&
                (d1.subData instanceof DataCd83OpenVo ||
                        d1.subData instanceof DataCd83CloseVo ||
                        d1.subData instanceof DataCd84Vo)){
            //开阀后,关阀报,阀开工作报
            String icCardAddr = null ;
            String icCardNo = null ;
            if(d1.subData instanceof DataCd83OpenVo){
                DataCd83OpenVo vo = (DataCd83OpenVo)d1.subData ;
                icCardAddr = vo.icCardAddr ;
                icCardNo = vo.icCardNo ;
            }else if(d1.subData instanceof DataCd83CloseVo){
                DataCd83CloseVo vo = (DataCd83CloseVo)d1.subData ;
                icCardAddr = vo.icCardAddr ;
                icCardNo = vo.icCardNo ;
            }else if(d1.subData instanceof DataCd84Vo){
                DataCd84Vo vo = (DataCd84Vo)d1.subData ;
                icCardAddr = vo.cardAddr ;
                icCardNo = vo.cardNo ;
            }
            if(icCardAddr != null && icCardNo != null){
                if(icCardAddr.equals(ProtocolConstantV206V2.vsCardAddr)){
                    clientVo = sv.getClientIdAndNameByVsCardNo(icCardNo) ;
                }else{
                    clientVo = sv.getClientIdAndNameByCardAddrAndCardNo(icCardAddr, icCardNo) ;
                }
            }
        }
        return clientVo ;
    }
 
    /**
     * 发送清空RTU的命令
     * @param rtuAddr
     * @param protocol
     */
    private void sendClearCommand(String rtuAddr, String protocol){
        Command com = new Command() ;
        com.id = Command.defaultId ;
        com.rtuAddr = rtuAddr ;
        com.protocol = protocol ;
        com.type = CommandType.outerCommand;
        com.code = CodeV2.cd_91 ;//当前是P206V2协议的任务
        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ;
        com.param = null ;
        com.attachment = null ;
        CommandCtrl comCtrl = SpringContextUtil.getBean(CommandCtrl.class) ;
        if(comCtrl != null){
            comCtrl.sendOutComFromLocal(com) ;
        }
    }
}