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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
package com.dy.rtuMw.server.rtuData.p206V1;
 
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V1.DataV1;
import com.dy.common.mw.protocol.p206V1.upVos.DataCd83CloseVo;
import com.dy.common.mw.protocol.p206V1.upVos.DataCd83OpenVo;
import com.dy.common.mw.protocol.p206V1.upVos.DataCd84Vo;
import com.dy.pipIrrGlobal.voSe.VoCardInfo1;
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/8/7 17:05
 * @Description 处理IC卡剩余金额
 */
public class TkDealIcRemainMoney  extends TaskSurpport {
 
    private static final Logger log = LogManager.getLogger(TkDealIcRemainMoney.class.getName());
 
    //类ID,一定与Tree.xml配置文件中配置一致
    public static final String taskId = "TkDealIcRemainMoney";
 
    /**
     * 执行节点任务: 取水口日用水量和漏损量
     *
     * @param data 需要处理的数据
     */
    @Override
    public void execute(Object data) {
        Data d = (Data) data;
        DataV1 dV1 = (DataV1) d.getSubData();//前面任务已经判断不为null
        Object cdObj = dV1.subData;
        if (cdObj != null && (cdObj instanceof DataCd84Vo
                || cdObj instanceof DataCd83OpenVo
                || cdObj instanceof DataCd83CloseVo)){
            Object[] objs = this.getTaskResults(TkPreGenObjs.taskId) ;
            DbSv sv = (DbSv)objs[0] ;
            try{
                TkDealIcRemainMoney.UpDataVo vo = new TkDealIcRemainMoney.UpDataVo() ;
                if(cdObj instanceof DataCd84Vo){
                    vo.valueFrom( (DataCd84Vo)cdObj, null, null);
                }else if(cdObj instanceof DataCd83OpenVo){
                    vo.valueFrom(null,  (DataCd83OpenVo)cdObj,null);
                }else if(cdObj instanceof DataCd83CloseVo){
                    vo.valueFrom(null,null, (DataCd83CloseVo)cdObj);
                }
                this.doDeal(sv, dV1, vo);
            }catch (Exception e){
                log.error("保存取水口日用水量和漏损量数据时发生异常", e);
            }
        }
    }
 
    /**
     * 业务处理
     * @param sv             服务
     * @param dV1        上报数据
     * @param dataVo         上报数据对象
     */
    private void doDeal(DbSv sv, DataV1 dV1, TkDealIcRemainMoney.UpDataVo dataVo) throws Exception {
        if(dataVo.icCardNo != null){
            if(!dataVo.isVirIcCard){
                //实体卡
                if(dataVo.remainMoney != null){
                    VoCardInfo1 vo = sv.getIcCard(dataVo.icCardAddr, dataVo.icCardNo) ;
                    if(vo != null && vo.id != null){
                        if(vo.money != null){
                            if(vo.money > dataVo.remainMoney){
                                //本地的剩余金额 大于 RTU上报的剩余金额
                                this.updateIcCardRemainMoney(sv, vo.id, dataVo.remainMoney);
                            }else{
                                //本地的剩余金额 小于 RTU上报的剩余金额,说明当前上报可能是补报或其他原因造成的现象
                                //不做处理
                            }
                        }else{
                            //这种情况一般不会存在,除非有什么误操作造成
                            this.updateIcCardRemainMoney(sv, vo.id, dataVo.remainMoney);
                        }
                    }
                }
            }else{
                //虚拟卡
                if(dataVo.remainMoney != null){
                    VoCardInfo1 vo = sv.getVirIcCard(dataVo.icCardNo) ;
                    if(vo != null && vo.id != null){
                        if(vo.money != null){
                            if(vo.money > dataVo.remainMoney){
                                //本地的剩余金额 大于 RTU上报的剩余金额
                                this.updateVirIcCardRemainMoney(sv, vo.id, dataVo.remainMoney);
                            }else{
                                //本地的剩余金额 小于 RTU上报的剩余金额,说明当前上报可能是补报或其他原因造成的现象
                                //不做处理
                            }
                        }else{
                            //这种情况一般不会存在,除非有什么误操作造成
                            this.updateVirIcCardRemainMoney(sv, vo.id, dataVo.remainMoney);
                        }
                    }
                }
            }
        }
    }
 
    /**
     * 更新实体卡剩余金额
     * @param id
     * @param remainMoney
     */
    private void updateIcCardRemainMoney(DbSv sv, Long id , Double remainMoney){
        sv.updateIcCardRemainMoney(id,remainMoney);
    }
 
    /**
     * 更新虚拟卡剩余金额
     * @param id
     * @param remainMoney
     */
    private void updateVirIcCardRemainMoney(DbSv sv, Long id , Double remainMoney){
        sv.updateVirIcCardRemainMoney(id, remainMoney);
    }
 
 
    private class UpDataVo{
        public Boolean isVirIcCard ;//是否为虚拟卡
        public String icCardAddr ;//卡地址
        public String icCardNo ;//卡编号
        public Double remainMoney ; //剩余金额
 
        public void valueFrom(DataCd84Vo vo84, DataCd83OpenVo vo83Op, DataCd83CloseVo vo83Cl){
            if(vo84 != null){
                if(this.isAll0(vo84.cardAddr)){
                    this.isVirIcCard = true ;
                }else{
                    this.isVirIcCard = false ;
                }
                this.icCardAddr = vo84.cardAddr ;
                this.icCardNo = vo84.cardNo ;
                this.remainMoney = vo84.remainMoney ;
            }else if(vo83Op != null){
                if(this.isAll0(vo83Op.icCardAddr)){
                    this.isVirIcCard = true ;
                }else{
                    this.isVirIcCard = false ;
                }
                this.icCardAddr = vo83Op.icCardAddr ;
                this.icCardNo = vo83Op.icCardNo ;
                this.remainMoney = vo83Op.remainMoney ;
            }else if(vo83Cl != null){
                if(this.isAll0(vo83Cl.icCardAddr)){
                    this.isVirIcCard = true ;
                }else{
                    this.isVirIcCard = false ;
                }
                this.icCardAddr = vo83Cl.icCardAddr ;
                this.icCardNo = vo83Cl.icCardNo ;
                this.remainMoney = vo83Cl.remainMoney ;
            }
        }
 
        private boolean isAll0(String s){
            if(s != null && !s.trim().equals("")){
                s = s.replaceAll("0", "") ;
                if(s.equals("")){
                    return true ;
                }else{
                    return false ;
                }
            }
            return false ;
        }
    }
 
 
}