zhubaomin
2024-10-23 57a26dab8612f2da5a1b073d6276dc3bb58d43d3
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
package com.dy.rtuMw.server.rtuData.p206V1_0_0;
 
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V1_0_0.DataV1_0_1;
import com.dy.common.mw.protocol.p206V1_0_0.upVos.DataAlarmVo;
import com.dy.common.mw.protocol.p206V1_0_0.upVos.DataCdC0Vo;
import com.dy.common.mw.protocol.p206V202404.DataV202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd83Vo;
import com.dy.pipIrrGlobal.pojoPr.PrController;
import com.dy.pipIrrGlobal.pojoRm.RmOnHourReportHistory;
import com.dy.pipIrrGlobal.pojoRm.RmOnHourReportLast;
import com.dy.pipIrrGlobal.pojoRm.RmTimingReportHistory;
import com.dy.pipIrrGlobal.pojoRm.RmTimingReportLast;
import com.dy.rtuMw.server.ServerProperties;
import com.dy.rtuMw.server.forMs.SendMsCache;
import com.dy.rtuMw.server.rtuData.TaskSurpport;
import com.dy.rtuMw.server.rtuData.dbSv.DbSv;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
/**
 * @Author liurunyu
 * @Date 2024/1/16 14:11
 * @LastEditTime 2024/1/16 14:11
 * @Description 控制器自报实时数据(功能码为C0)(整点上报)
 */
public class TkDealOnHourReport extends TaskSurpport {
 
    private static final Logger log = LogManager.getLogger(TkDealOnHourReport.class.getName()) ;
 
    //类ID,一定与Tree.xml配置文件中配置一致
    public static final String taskId = "TkDealOnHourReport" ;
 
    /**
     * 执行节点任务:控制器自报数据(功能码为C0)
     * @param data 需要处理的数据
     */
    @Override
    public void execute(Object data) {
        Data d = (Data) data;
        DataV1_0_1 dV1_0_1 = (DataV1_0_1) d.getSubData();//前面任务已经判断不为null
        Object cdObj = dV1_0_1.subData;
        if (cdObj != null && cdObj instanceof DataCdC0Vo){
            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, (DataCdC0Vo)cdObj);
            }catch (Exception e){
                log.error("保存控制器整点上报数据时发生异常", e);
            }
        }
    }
    /**
     * 处理阀上报数据
     * @param sv 服务
     * @param controller 控制器对象
     * @param rtuAddr 控制器地址
     * @param cdData 协议数据
     * @param cdData 功能数据
     */
    private void doDeal(DbSv sv, PrController controller, String rtuAddr, DataV1_0_1 dV1_0_1, DataCdC0Vo cdData) throws Exception {
        this.saveOrUpdateLast(sv, controller, rtuAddr, dV1_0_1, cdData);
        this.saveHistory(sv, controller, rtuAddr, dV1_0_1, cdData);
    }
    /**
     * 保存自报最新数据
     * @param sv 服务
     * @param controller 控制器对象
     * @param rtuAddr 控制器地址
     * @param cdData 自报数据对象
     */
    private void saveOrUpdateLast(DbSv sv, PrController controller, String rtuAddr, DataV1_0_1 dV1_0_1, DataCdC0Vo cdData) throws Exception {
        RmOnHourReportLast po = sv.getRmOnHourReportLast(controller.getIntakeId()) ;
        if(po == null){
            po = new RmOnHourReportLast();
            po.controllerId = controller==null?null:controller.getId();
            po.intakeId = controller==null?null:controller.getIntakeId();
            po.rtuAddr = rtuAddr;
            po.valueFrom(dV1_0_1, cdData);
            sv.saveRmOnHourReportLast(po) ;
            if(po.lossAmount >= ServerProperties.intakeAlarmLossMinValue){
                this.sendMessage(controller, po.lossAmount);
            }
        }else{
            po.controllerId = controller==null?null:controller.getId();
            po.intakeId = controller==null?null:controller.getIntakeId();
            po.valueFrom(dV1_0_1, cdData);
            sv.updateRmOnHourReportLast(po);
            if(po.lossAmount >= ServerProperties.intakeAlarmLossMinValue){
                this.sendMessage(controller, po.lossAmount);
            }
        }
    }
 
 
    /**
     * 保存或更新控制器该上报历史数据
     * @param sv 服务bean
     * @param controller 控制器对象
     * @param rtuAddr 控制器地址
     * @param dV1_0_1 协议数据
     * @param cdData 功能数据
     */
    private void saveHistory(DbSv sv, PrController controller, String rtuAddr, DataV1_0_1 dV1_0_1, DataCdC0Vo cdData)throws Exception {
        RmOnHourReportHistory po = new RmOnHourReportHistory();
        po.controllerId = controller==null?null:controller.getId();
        po.intakeId = controller==null?null:controller.getIntakeId();
        po.rtuAddr = rtuAddr;
        po.valueFrom(dV1_0_1, cdData);
        sv.saveRmOnHourReportHistory(po); ;
    }
 
 
 
    /**
     * 向钉钉发送消息
     * @param controller
     */
    private void sendMessage(PrController controller, Double lossAmount){
        String ms = "取水口“" + controller.getIntakeName() + "”漏水报警,今日漏损量" + lossAmount + "立方米";
        try{
            SendMsCache.cacheMs(ms);
        }catch (Exception e){
            log.error("缓存钉钉消息异常:", e);
        }
    }
 
}