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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package com.dy.rtuMw.server.rtuData.p206V1_0_0;
 
import com.dy.rtuMw.server.rtuData.TaskSurpport;
import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V1_0_0.DataCdC0Vo;
import com.dy.common.mw.protocol.p206V1_0_0.DataV1_0_1;
import com.dy.common.util.DateTime;
import com.dy.pipIrrGlobal.pojoPr.PrController;
import com.dy.pipIrrGlobal.pojoRm.RmLossHistory;
import com.dy.pipIrrGlobal.pojoRm.RmLossLast;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
/**
 * @Author liurunyu
 * @Date 2024/2/28 16:31
 * @LastEditTime 2024/2/28 16:31
 * @Description 控制器漏损统计
 */
public class TkDealLoss extends TaskSurpport {
 
    private static final Logger log = LogManager.getLogger(TkDealLoss.class.getName());
 
    //类ID,一定与Tree.xml配置文件中配置一致
    public static final String taskId = "TkDealLoss";
 
    /**
     * 执行节点任务: 处理控制器漏损统计
     *
     * @param data 需要处理的数据
     */
    @Override
    public void execute(Object data) {
        Data d = (Data) data;
        Object subD = d.getSubData();
        if (subD != null) {
            DataV1_0_1 dV1_0_1 = (DataV1_0_1) subD;
//            if (dV1_0_1 != null && dV1_0_1.dataCdC0Vo != null) {
//                Object[] objs = this.getTaskResults(TkPreGenObjs.taskId);
//                DbSv sv = (DbSv) objs[0];
//                PrController controller = (PrController) objs[1];
//                try {
//                    this.doDeal(sv, controller, d.getRtuAddr(), dV1_0_1, dV1_0_1.dataCdC0Vo);
//                } catch (Exception e) {
//                    log.error("保存控制器开阀上报时发生异常", e);
//                }
//            }
        }
    }
 
    /**
     * 业务处理
     * @param sv             服务
     * @param controller     控制器对象
     * @param rtuAddr        控制器地址
     * @param dV1_0_1        上报数据
     * @param dataCdC0Vo 开阀上报数据对象
     */
    private void doDeal(DbSv sv, PrController controller, String rtuAddr, DataV1_0_1 dV1_0_1, DataCdC0Vo dataCdC0Vo) throws Exception {
        RmLossLast poLast = sv.getRmLossLast(rtuAddr);
        if (poLast == null) {
            //数据库中不存在该控制器的漏损数据
            //首先生成最新数据及历史数据,并先保存
            poLast = this.newRmLossLast(controller, rtuAddr, dV1_0_1, dataCdC0Vo);
            this.newAndSaveHistoryDataDeal(sv, controller, rtuAddr, dV1_0_1, dataCdC0Vo, poLast);
            sv.saveRmLossLast(poLast);
        } else {
            if(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCdC0Vo.rtuDt).equals(poLast.dtRtu)){
                //时间一致,重复上报数据,不进行任何处理
            }else{
                RmLossHistory poHistory = null ;
                if(poLast.lastHistoryId != null){
                    poHistory = sv.getRmLossHistory(poLast.lastHistoryId) ;
                }
                if(poHistory == null){
                    poHistory = this.newAndSaveHistoryDataDeal(sv, controller, rtuAddr, dV1_0_1, dataCdC0Vo, poLast);
                }
                if(DateTime.dateFrom_yyyy_MM_dd1(dV1_0_1.dt).equals(poLast.dt)){
                    //同一天数据
                    poLast.lossAmount = dataCdC0Vo.lossAmount ;
                    poLast.dtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1_0_1.dt) ;
                    poLast.dtRtu = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCdC0Vo.rtuDt) ;
                    sv.updateRmLossLast(poLast);
 
                    poHistory.lossAmount = dataCdC0Vo.lossAmount ;
                    poHistory.dtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1_0_1.dt) ;
                    poHistory.dtRtu = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCdC0Vo.rtuDt) ;
                    sv.updateRmLossHistory(poHistory);
                }else if(DateTime.dateFrom_yyyy_MM_dd1(dV1_0_1.dt).after(poLast.dt)){
                    //新的日期
                    poLast = this.newRmLossLast(controller, rtuAddr, dV1_0_1, dataCdC0Vo);
                    this.newAndSaveHistoryDataDeal(sv, controller, rtuAddr, dV1_0_1, dataCdC0Vo, poLast);
                    sv.saveRmLossLast(poLast);
                }else{
                    //这种情况不存在(收到数据的日期早于本地记录中的日期,此种情况不会存在)
                }
            }
        }
    }
 
    /**
     * 生成新的控制器漏损日统计最新记录
     * @param controller
     * @param rtuAddr
     * @param dV1_0_1
     * @param dataCdC0Vo
     * @return
     * @throws Exception
     */
    private RmLossLast newRmLossLast(PrController controller, String rtuAddr, DataV1_0_1 dV1_0_1, DataCdC0Vo dataCdC0Vo)throws Exception {
        RmLossLast po = new RmLossLast(null, null, controller==null?null:controller.getId(), controller==null?null:controller.getIntakeId(),
                rtuAddr,
                DateTime.dateFrom_yyyy_MM_dd1(dV1_0_1.dt),
                DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1_0_1.dt),
                DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCdC0Vo.rtuDt),
                dataCdC0Vo.lossAmount) ;
        return po ;
    }
 
    /**
     * 生成新的控制器漏损日统计历史记录
     * @param controller
     * @param rtuAddr
     * @param dV1_0_1
     * @param dataCdC0Vo
     * @return
     * @throws Exception
     */
    private RmLossHistory newRmLossHistory(PrController controller, String rtuAddr, DataV1_0_1 dV1_0_1, DataCdC0Vo dataCdC0Vo)throws Exception {
        RmLossHistory po = new RmLossHistory(null, controller==null?null:controller.getId(), controller==null?null:controller.getIntakeId(),
                rtuAddr,
                DateTime.dateFrom_yyyy_MM_dd1(dV1_0_1.dt),
                DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1_0_1.dt),
                DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataCdC0Vo.rtuDt),
                dataCdC0Vo.lossAmount) ;
        return po ;
    }
 
 
    /**
     * 保存新的开阀上报历史数据记录,并把ID赋值给最新记录的 lastHistoryId
     * @param sv
     * @param controller
     * @param rtuAddr
     * @param dV1_0_1
     * @param dataCdC0Vo
     * @param poLast
     * @throws Exception
     * @return RmLossHistory
     */
    private RmLossHistory newAndSaveHistoryDataDeal(DbSv sv, PrController controller, String rtuAddr, DataV1_0_1 dV1_0_1, DataCdC0Vo dataCdC0Vo, RmLossLast poLast)throws Exception {
        RmLossHistory poHistory = this.newRmLossHistory(controller, rtuAddr, dV1_0_1, dataCdC0Vo) ;
        sv.saveRmLossHistory(poHistory);
        //由最新数据持有历史数据中的最新记录ID,以方便快速查询
        poLast.lastHistoryId = poHistory == null ? null: poHistory.id ;
        return poHistory ;
    }
 
}