zhubaomin
2025-04-07 1a2b07f01ba4616fd9e894dddf474b56d020158c
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V2/TkDealIcRemainMoneyV2.java
New file
@@ -0,0 +1,177 @@
package com.dy.rtuMw.server.rtuData.p206V2;
import com.dy.common.mw.protocol.Data;
import com.dy.common.mw.protocol.p206V2.DataV2;
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.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 TkDealIcRemainMoneyV2 extends TaskSurpport {
    private static final Logger log = LogManager.getLogger(TkDealIcRemainMoneyV2.class.getName());
    //类ID,一定与Tree.xml配置文件中配置一致
    public static final String taskId = "TkDealIcRemainMoneyV2";
    /**
     * 执行节点任务: 取水口日用水量和漏损量
     *
     * @param data 需要处理的数据
     */
    @Override
    public void execute(Object data) {
        Data d = (Data) data;
        DataV2 dV2 = (DataV2) d.getSubData();//前面任务已经判断不为null
        Object cdObj = dV2.subData;
        if (cdObj != null && (cdObj instanceof DataCd84Vo
                || cdObj instanceof DataCd83OpenVo
                || cdObj instanceof DataCd83CloseVo)){
            Object[] objs = this.getTaskResults(TkPreGenObjsV2.taskId) ;
            DbSv sv = (DbSv)objs[0] ;
            try{
                UpDataVo vo = new 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, dV2, vo);
            }catch (Exception e){
                log.error("保存取水口日用水量和漏损量数据时发生异常", e);
            }
        }
    }
    /**
     * 业务处理
     * @param sv             服务
     * @param dV2        上报数据
     * @param dataVo         上报数据对象
     */
    private void doDeal(DbSv sv, DataV2 dV2, 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 ;
        }
    }
}