package com.dy.rtuMw.server.rtuData.p206V202404; 
 | 
  
 | 
import com.dy.common.mw.protocol.Data; 
 | 
import com.dy.common.mw.protocol.p206V202404.DataV202404 ; 
 | 
import com.dy.common.mw.protocol.p206V202404.upVos.*; 
 | 
import com.dy.common.util.DateTime; 
 | 
import com.dy.pipIrrGlobal.pojoPr.PrController; 
 | 
import com.dy.pipIrrGlobal.pojoRm.RmAlarmStateHistory; 
 | 
import com.dy.pipIrrGlobal.pojoRm.RmAlarmStateLast; 
 | 
import com.dy.rtuMw.server.msCenter.MsCenterUnit; 
 | 
import com.dy.rtuMw.server.msCenter.MsObj; 
 | 
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; 
 | 
  
 | 
import java.util.HashMap; 
 | 
import java.util.Map; 
 | 
  
 | 
/** 
 | 
 * @Author liurunyu 
 | 
 * @Date 2024/5/8 14:18 
 | 
 */ 
 | 
public class TkDealAlarmStatusV202404 extends TaskSurpport { 
 | 
  
 | 
    private static final Logger log = LogManager.getLogger(TkDealAlarmStatusV202404.class.getName()) ; 
 | 
  
 | 
    //类ID,一定与Tree.xml配置文件中配置一致 
 | 
    public static final String taskId = "TkDealAlarmStatusV202404" ; 
 | 
  
 | 
    //是否在某个时刻(年月日时)保存了报警状态数据 
 | 
    private static final Map<String, Long> onceSaveAlarmData4Rtus = new HashMap<>(); 
 | 
  
 | 
    /** 
 | 
     * 执行节点任务:报警及状态 
 | 
     * @param data 需要处理的数据 
 | 
     */ 
 | 
    @Override 
 | 
    public void execute(Object data) { 
 | 
        Data d = (Data)data ; 
 | 
        DataV202404 dV202404 = (DataV202404)d.getSubData() ; 
 | 
        Object cdObj = dV202404.subData ; 
 | 
        //前面任务已经判断cdObj不为null 
 | 
        boolean toNext = false ; 
 | 
        try{ 
 | 
            Object[] objs = this.getTaskResults(TkPreGenObjsV202404.taskId) ; 
 | 
            DbSv sv = (DbSv)objs[0] ; 
 | 
            PrController controller = (PrController)objs[1] ; 
 | 
            if(cdObj instanceof DataCd81Vo){ 
 | 
                //设备终端随机自报 
 | 
                //81功能码数据,不进行“在一个小时内没有存储报警数据”的控制 
 | 
                DataCd81Vo cdData = (DataCd81Vo)(cdObj) ; 
 | 
                this.toMsCenter(controller, d.getRtuAddr(), dV202404, cdData, dV202404.dt); 
 | 
                this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ; 
 | 
                this.saveHistory(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ; 
 | 
                this.cacheSaveTime(d.getRtuAddr()); 
 | 
                if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){ 
 | 
                    if(controller != null && controller.getIntakeId() != null){ 
 | 
                        this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ; 
 | 
                        toNext = true ; 
 | 
                    } 
 | 
                } 
 | 
            }else if(cdObj instanceof DataCd80_5BVo){ 
 | 
                //设备终端工作上报 + 查询设备终端实时值 
 | 
                if(this.needSave2Db( d.getRtuAddr())) { 
 | 
                    //在一个小时内没有存储报警数据 
 | 
                    DataCd80_5BVo cdData = (DataCd80_5BVo)(cdObj) ; 
 | 
                    this.toMsCenter(controller, d.getRtuAddr(), dV202404, cdData, dV202404.dt); 
 | 
                    this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ; 
 | 
                    this.saveHistory(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ; 
 | 
                    this.cacheSaveTime(d.getRtuAddr()); 
 | 
                    if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){ 
 | 
                        if(controller != null && controller.getIntakeId() != null){ 
 | 
                            this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ; 
 | 
                            toNext = true ; 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            /* 2025-06-11 王江海说:以下数据中的状态不准确,尤其阀门状态,所以不再采纳 
 | 
            else if(cdObj instanceof DataCd93_A3Vo){ 
 | 
                //平台/APP远程关闭水泵/阀门   +  刷卡关泵/阀上报 
 | 
                if(this.needSave2Db( d.getRtuAddr())) { 
 | 
                    //在一个小时内没有存储报警数据 
 | 
                    DataCd93_A3Vo cdData = (DataCd93_A3Vo)(cdObj) ; 
 | 
                    this.toMsCenter(controller, d.getRtuAddr(), dV202404, cdData, dV202404.dt); 
 | 
                    this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.endDt, cdData, dV202404.dt) ; 
 | 
                    this.saveHistory(sv, controller, d.getRtuAddr(), cdData.endDt, cdData, dV202404.dt) ; 
 | 
                    this.cacheSaveTime(d.getRtuAddr()); 
 | 
                    if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){ 
 | 
                        if(controller != null && controller.getIntakeId() != null){ 
 | 
                            this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ; 
 | 
                            toNext = true ; 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            }else if(cdObj instanceof DataCd84Vo){ 
 | 
                //设备终端刷卡开泵/阀上报 
 | 
                if(this.needSave2Db( d.getRtuAddr())) { 
 | 
                    //在一个小时内没有存储报警数据 
 | 
                    DataCd84Vo cdData = (DataCd84Vo)(cdObj) ; 
 | 
                    this.toMsCenter(controller, d.getRtuAddr(), dV202404, cdData, dV202404.dt); 
 | 
                    this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.openDt, cdData, dV202404.dt) ; 
 | 
                    this.saveHistory(sv, controller, d.getRtuAddr(), cdData.openDt, cdData, dV202404.dt) ; 
 | 
                    this.cacheSaveTime(d.getRtuAddr()); 
 | 
                    if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){ 
 | 
                        if(controller != null && controller.getIntakeId() != null){ 
 | 
                            this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ; 
 | 
                            toNext = true ; 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            }else if(cdObj instanceof DataCdC2Vo){ 
 | 
                //设备终端开关水泵/阀门成功/失败上报 
 | 
                if(this.needSave2Db( d.getRtuAddr())) { 
 | 
                    //在一个小时内没有存储报警数据 
 | 
                    DataCdC2Vo cdData = (DataCdC2Vo)(cdObj) ; 
 | 
                    this.toMsCenter(controller, d.getRtuAddr(), dV202404, cdData, dV202404.dt); 
 | 
                    this.saveOrUpdateLast(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ; 
 | 
                    this.saveHistory(sv, controller, d.getRtuAddr(), cdData.rtuDt, cdData, dV202404.dt) ; 
 | 
                    this.cacheSaveTime(d.getRtuAddr()); 
 | 
                    if(cdData.statePump != null && cdData.statePump.byteValue() == AlarmVo.DevCloseState){ 
 | 
                        if(controller != null && controller.getIntakeId() != null){ 
 | 
                            this.taskResult = new Object[]{controller.getIntakeId(), AlarmVo.DevCloseState} ; 
 | 
                            toNext = true ; 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
             */ 
 | 
        }catch (Exception e){ 
 | 
            log.error("保存控制器报警和状态数据时发生异常", e); 
 | 
        } 
 | 
        if(toNext){ 
 | 
            this.toNextTasks(d); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private boolean needSave2Db(String rtuAddr){ 
 | 
        if(!onceSaveAlarmData4Rtus.containsKey(rtuAddr)){ 
 | 
            return true ; 
 | 
        }else{ 
 | 
            Long time = onceSaveAlarmData4Rtus.get(rtuAddr) ; 
 | 
            Long ymdh = Long.parseLong(DateTime.yyyyMMddHH()) ; 
 | 
            if(ymdh.longValue() == time.longValue()){ 
 | 
                //同一个小时内 
 | 
                return false ; 
 | 
            }else{ 
 | 
                return true ; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
    private void cacheSaveTime(String rtuAddr){ 
 | 
        onceSaveAlarmData4Rtus.put(rtuAddr, Long.parseLong(DateTime.yyyyMMddHH())); 
 | 
    } 
 | 
    /** 
 | 
     * 报警状态数据存入消息中心 
 | 
     * @param controller 控制器对象 
 | 
     * @param rtuAddr 控制器地址 
 | 
     * @param dataV202404 数据对象 
 | 
     * @param alarmVo 报警+状态对象 
 | 
     */ 
 | 
    private void toMsCenter(PrController controller, String rtuAddr, DataV202404 dataV202404,  AlarmVo alarmVo, String dt){ 
 | 
        if(alarmVo != null && controller != null){ 
 | 
            if(alarmVo.hasAlarm()){ 
 | 
                MsObj msObj = new MsObj() ; 
 | 
                msObj.put("name", "报警"); 
 | 
                msObj.put("rtuAddr", rtuAddr); 
 | 
                msObj.put("intakeId", controller.getIntakeId()); 
 | 
                msObj.put("state", alarmVo.alarmContent()); 
 | 
                msObj.put("dt", dt); 
 | 
                MsCenterUnit.getInstance().pushMs(msObj); 
 | 
            } 
 | 
            if(alarmVo.statePump != null){ 
 | 
                MsObj msObj = new MsObj() ; 
 | 
                msObj.put("name", "阀态"); 
 | 
                msObj.put("rtuAddr", rtuAddr); 
 | 
                msObj.put("intakeId", controller.getIntakeId()); 
 | 
                msObj.put("state", alarmVo.statePump); 
 | 
                msObj.put("stateName", alarmVo.statePump==1?"开":"关"); 
 | 
                msObj.put("dt", dt); 
 | 
                MsCenterUnit.getInstance().pushMs(msObj); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 保存报警状态最新数据 
 | 
     * @param sv 服务 
 | 
     * @param controller 控制器对象 
 | 
     * @param rtuAddr 控制器地址 
 | 
     * @param rtuDt 控制器时钟 
 | 
     * @param alarmVo  报警及状态数据 
 | 
     * @param receiveDt 接收数据时本地时钟 
 | 
     */ 
 | 
    private void saveOrUpdateLast(DbSv sv, 
 | 
                                  PrController controller, 
 | 
                                  String rtuAddr, 
 | 
                                  String rtuDt, 
 | 
                                  AlarmVo alarmVo, 
 | 
                                  String receiveDt) throws Exception { 
 | 
        RmAlarmStateLast po = sv.getRmAlarmStateLast(controller.getIntakeId()) ; 
 | 
        if(po == null){ 
 | 
            po = new RmAlarmStateLast(null, 
 | 
                    controller==null?null:controller.getId(), 
 | 
                    controller==null?null:controller.getIntakeId(), 
 | 
                    rtuAddr, 
 | 
                    DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(receiveDt), 
 | 
                    DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(rtuDt), 
 | 
                    alarmVo==null?null:alarmVo.statePump, 
 | 
                    alarmVo==null?null:alarmVo.alarmWaterRemain, 
 | 
                    alarmVo==null?null:alarmVo.alarm0WaterRemain, 
 | 
                    alarmVo==null?null:alarmVo.alarmExceedYear, 
 | 
                    alarmVo==null?null:alarmVo.alarmWaterMeterFault, 
 | 
                    alarmVo==null?null:alarmVo.alarmSteal, 
 | 
                    alarmVo==null?null:alarmVo.alarmWaterMeterBreak, 
 | 
                    alarmVo==null?null:alarmVo.alarmEleMeterFault, 
 | 
                    alarmVo==null?null:alarmVo.alarm0MoneyRemain, 
 | 
                    alarmVo==null?null:alarmVo.alarmDoor, 
 | 
                    alarmVo==null?null:alarmVo.alarmDoor,//2025-02-19机箱外门报警项改为电池电压了 
 | 
                    alarmVo==null?null:alarmVo.alarmEleMiss, 
 | 
                    alarmVo==null?null:alarmVo.alarmEleExceed, 
 | 
                    alarmVo==null?null:alarmVo.alarmEleLowVolt, 
 | 
                    alarmVo==null?null:alarmVo.stateIcEnable, 
 | 
                    alarmVo==null?null:alarmVo.alarmBatteryVolt,//电池电压(1:报警,0:正常) 
 | 
                    alarmVo==null?null:alarmVo.alarmBlockValve,//阀门堵转报警(1:报警,0:正常) 
 | 
                    (byte)0,//供电方式(0: 220V,1:蓄电池) 
 | 
                    System.currentTimeMillis() 
 | 
            ) ; 
 | 
            sv.saveRmAlarmStateLast(po) ; 
 | 
        }else{ 
 | 
            po = this.update(po, controller, rtuDt, alarmVo, receiveDt) ; 
 | 
            sv.updateRmAlarmStateLast(po); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 保存报警状态历史记录 
 | 
     * @param sv 服务 
 | 
     * @param controller 控制器对象 
 | 
     * @param rtuAddr 控制器地址 
 | 
     * @param rtuDt 控制器时钟 
 | 
     * @param alarmVo 报警及状态数据 
 | 
     * @param receiveDt 接收数据时本地时钟 
 | 
     */ 
 | 
    private void saveHistory(DbSv sv, 
 | 
                             PrController controller, 
 | 
                             String rtuAddr, 
 | 
                             String rtuDt, 
 | 
                             AlarmVo alarmVo, 
 | 
                             String receiveDt) throws Exception { 
 | 
        RmAlarmStateHistory po = new RmAlarmStateHistory(null, 
 | 
                controller==null?null:controller.getId(), 
 | 
                controller==null?null:controller.getIntakeId(), 
 | 
                rtuAddr, 
 | 
                DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(receiveDt), 
 | 
                DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(rtuDt), 
 | 
                alarmVo==null?null:alarmVo.statePump, 
 | 
                alarmVo==null?null:alarmVo.alarmWaterRemain, 
 | 
                alarmVo==null?null:alarmVo.alarm0WaterRemain, 
 | 
                alarmVo==null?null:alarmVo.alarmExceedYear, 
 | 
                alarmVo==null?null:alarmVo.alarmWaterMeterFault, 
 | 
                alarmVo==null?null:alarmVo.alarmSteal, 
 | 
                alarmVo==null?null:alarmVo.alarmWaterMeterBreak, 
 | 
                alarmVo==null?null:alarmVo.alarmEleMeterFault, 
 | 
                alarmVo==null?null:alarmVo.alarm0MoneyRemain, 
 | 
                alarmVo==null?null:alarmVo.alarmDoor, 
 | 
                alarmVo==null?null:alarmVo.alarmDoor,//2025-02-19机箱外门报警项改为电池电压了 
 | 
                alarmVo==null?null:alarmVo.alarmEleMiss, 
 | 
                alarmVo==null?null:alarmVo.alarmEleExceed, 
 | 
                alarmVo==null?null:alarmVo.alarmEleLowVolt, 
 | 
                alarmVo==null?null:alarmVo.stateIcEnable, 
 | 
                alarmVo==null?null:alarmVo.alarmBatteryVolt,//电池电压(1:报警,0:正常) 
 | 
                alarmVo==null?null:alarmVo.alarmBlockValve,//阀门堵转报警(1:报警,0:正常) 
 | 
                (byte)0//供电方式(0: 220V,1:蓄电池) 
 | 
        ) ; 
 | 
        sv.saveRmAlarmStateHistory(po) ; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 保存报警状态最新数据 
 | 
     * @param po 实体对象 
 | 
     * @param controller 控制器对象 
 | 
     * @param rtuDt 控制器时钟 
 | 
     * @param alarmVo  报警及状态数据 
 | 
     * @param receiveDt 接收数据时本地时钟 
 | 
     */ 
 | 
    private RmAlarmStateLast update(RmAlarmStateLast po, 
 | 
                                    PrController controller, 
 | 
                                    String rtuDt, 
 | 
                                    AlarmVo alarmVo, 
 | 
                                    String receiveDt) throws Exception { 
 | 
        po.controllerId = controller==null?null:controller.getId() ; 
 | 
        po.intakeId = controller==null?null:controller.getIntakeId() ; 
 | 
  
 | 
        po.dt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(receiveDt) ; 
 | 
        po.rtuDt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(rtuDt) ; 
 | 
        if(alarmVo != null){ 
 | 
            po.valveState = alarmVo.statePump ; 
 | 
            po.alarmRemainWater = alarmVo.alarmWaterRemain ; 
 | 
            po.alarm0WaterRemain = alarmVo.alarm0WaterRemain ; 
 | 
            po.alarmExceedYear = alarmVo.alarmExceedYear ; 
 | 
            po.alarmWaterMeterFault = alarmVo.alarmWaterMeterFault ; 
 | 
            po.alarmLoss = alarmVo.alarmSteal ; 
 | 
            po.alarmWaterMeterBreak = alarmVo.alarmWaterMeterBreak ; 
 | 
            po.alarmEleMeterFault = alarmVo.alarmEleMeterFault ; 
 | 
            po.alarm0MoneyRemain = alarmVo.alarm0MoneyRemain ; 
 | 
            po.alarmInnerDoor = alarmVo.alarmDoor; 
 | 
            po.alarmOuterDoor = alarmVo.alarmDoor; 
 | 
            po.alarmEleMiss = alarmVo.alarmEleMiss ; 
 | 
            po.alarmEleExceed = alarmVo.alarmEleExceed ; 
 | 
            po.alarmEleLowVolt = alarmVo.alarmEleLowVolt ; 
 | 
            po.stateIcEnable = alarmVo.stateIcEnable ; 
 | 
            po.alarmBatteryVolt = alarmVo.alarmBatteryVolt ; 
 | 
            po.alarmValve = alarmVo.alarmBlockValve; 
 | 
        } 
 | 
        return po ; 
 | 
    } 
 | 
  
 | 
} 
 |