wuzeyu
2024-12-06 e4d9487314cb32ed27bdcb027bbf43b4e1e3160f
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeManager.java
@@ -25,11 +25,15 @@
    private static final UpgradeManager INSTANCE = new UpgradeManager();
    private Boolean openNoUpgrade ;//阀开(泵开)不执行升级
    private Integer lastOpenMaxGoOn ;//阀开(泵开)状态设置以来持续最长时间(秒钟),超过这个时间认为状态无效(这个时长取决于工作报间隔)
    private Integer failTryTimes ;//升级失败后,重新偿试升级次数,0表示不重新偿试升级
    private Integer ugMaxRtuSameTime ;//同时升级RTU最大个数
    private Integer notifyTimesAfterOver; //升级结束后,再向web服务系统通知状态的次数
    private int nowNotifyTimesAfterOver; //升级结束后,再向web服务系统通知状态的次数
    private UpgradeTask task ;//升级任务
    private boolean monitorFirst = true ;//是否是第一次监视
    private boolean monitorFirst ;//是否是第一次监视
    private UpgradeManager(){
        monitorFirst = true ;
@@ -43,8 +47,11 @@
     *  初始化配置信息
     */
    public void initOption(UpgradeUnitConfigVo configVo) {
        this.openNoUpgrade = configVo.openNoUpgrade;
        this.lastOpenMaxGoOn = configVo.lastOpenMaxGoOn;
        this.failTryTimes = configVo.failTryTimes;
        this.ugMaxRtuSameTime = configVo.ugMaxRtuAtOnce;
        this.notifyTimesAfterOver = configVo.notifyTimesAfterOver;
    }
    /**
@@ -62,13 +69,15 @@
                    this.task.forceOver();
                }
                this.task = new UpgradeTask();
                this.task.initOption(this.failTryTimes, this.ugMaxRtuSameTime);
                this.task.initOption(this.openNoUpgrade, this.lastOpenMaxGoOn, this.failTryTimes, this.ugMaxRtuSameTime);
                this.task.setTask(vo);
                log.error("==================================================") ;
                log.error("=                                                =") ;
                log.error("=当前设置了升级任务,其中RTU有" + vo.rtuAddrList.size() + "个                    =") ;
                log.error("=                                                =") ;
                log.error("==================================================") ;
                this.nowNotifyTimesAfterOver = 0 ;
                this.monitorFirst = true ;
                log.info("======================================================") ;
                log.info("=                                                    =") ;
                log.info("=设置了升级任务,涉及RTU" + vo.rtuAddrList.size() + "台                            =") ;
                log.info("=                                                    =") ;
                log.info("======================================================") ;
            }catch (Exception e){
                ex = e ;
            }finally {
@@ -88,12 +97,19 @@
     * 因为强制结束升级任务,对一个未升级完成的RTU就会卡死,
     * 所以当强制结束升级任务,代码逻辑并没有强制结果RTU升级过程,如果升级过程也强制停止,那么RTU真会卡死
     */
    public void forceOverUpgradeTask() {
    public String forceOverUpgradeTask() {
        if(this.task != null){
            this.stop();
            this.task.forceOver();
            this.task.countRunningRtuCount();
            if(this.task.curUgRunningRtuTotal > 0){
                return "当前存在升级中的设备,不能结束升级任务" ;
            }else{
                this.stop();
                this.task.forceOver();
                return null ;
            }
        }else{
            return "当前没有升级任务" ;
        }
        this.task = null ;
    }
    /**
@@ -184,6 +200,13 @@
            this.stop() ;
        }else{
            if(!this.task.taskIsOver){
                if(this.openNoUpgrade != null
                        && this.openNoUpgrade.booleanValue()
                        && this.monitorFirst){
                    //第一次进入,进行阀开不升级处理
                    this.task.openNoUpgrade() ;
                }
                this.nowNotifyTimesAfterOver = 0 ;
                //升级任务未完成
                //工作1:判断是否无任何一个RTU进行过升级,并且达到时限,则认为当前升级任务完成
                //-1:无一RTU升级且超时,0:无RTU升级但未超时等待,1有RTU升级正常执行
@@ -191,44 +214,61 @@
                int temp = this.task.countNoOneRtuUpgradeInDuration() ;
                if(temp == -1){
                    //当前没有RTU进行过升级,而且超时了,认为任务已经完成
                    log.error("==================================================") ;
                    log.error("=                                                =") ;
                    log.error("=当前没有RTU进行过升级,而且超时了,认为任务已经完成      =") ;
                    log.error("=                                                =") ;
                    log.error("==================================================") ;
                    this.task.taskIsOver = true ;
                    this.stop();
                    log.info("===========================================================") ;
                    log.info("=                                                         =") ;
                    log.info("=无RTU升级超时,因无一台RTU进行升级,并且等待超时,强制设置升级完成  =") ;
                    log.info("=                                                         =") ;
                    log.info("===========================================================") ;
                }else if(temp == 1){
                    //当前有RTU进行过升级
                    //工作2:统计当前正在升级的RTU数量,为同时升级数量限制做准备
                    this.task.countRunningRtuCount() ;
                    temp = this.task.countRunningRtuCount() ;
                    if(temp > 0){
                        //说前当前还有升级中的RTU
                    }
                    //工作3:统计需要升级但当前离线RTU的情况,超过时限的设置为升级完成
                    int tmp = this.task.countOffRtuAndSetIfOver() ;
                    if(tmp >= 1){
                        //超时,强制设置一些RTU升级失败并且升级完成)
                        log.error("==================================================") ;
                        log.error("=                                                =") ;
                        log.error("=超时,强制设置" + tmp + "个RTU升级失败并且升级完成     =") ;
                        log.error("=                                                =") ;
                        log.error("==================================================") ;
                        //超时,强制设置一些RTU升级失败并且升级完成
                        log.info("======================================================") ;
                        log.info("=                                                    =") ;
                        log.info("=因离线超时,强制设置" + tmp + "台RTU升级失败并且升级完成            =") ;
                        log.info("=                                                    =") ;
                        log.info("======================================================") ;
                    }else if(tmp == 0){
                        log.error("==================================================") ;
                        log.error("=                                                =") ;
                        log.error("=超时,强制设置0个RTU升级失败并且升级完成               =") ;
                        log.error("=                                                =") ;
                        log.error("==================================================") ;
                        /*
                        log.info("======================================================") ;
                        log.info("=                                                    =") ;
                        log.info("=离线超时,但无一台RTU因离线而被设置成升级失败并且升级完成     =") ;
                        log.info("=                                                    =") ;
                        log.info("======================================================") ;
                         */
                    }else{//tmp = -1
                        //无任务逻辑
                    }
                    //工作4:统计是否全部升级完成
                    //工作4:统计进行升级过程而后又停止升级,发呆一定时长的设备
                    tmp = this.task.countRunningIdleRtuAndSetIfOver() ;
                    if(tmp >= 1){
                        //升级发呆超时,强制设置一些RTU升级失败并且升级完成
                        log.info("======================================================") ;
                        log.info("=                                                    =") ;
                        log.info("=因升级发呆超时,强制设置" + tmp + "台RTU升级失败并且升级完成          =") ;
                        log.info("=                                                    =") ;
                        log.info("======================================================") ;
                    }
                    //工作5:统计是否全部升级完成
                    this.task.taskIsOver = this.task.countIsAllOver() ;
                    if(this.task.taskIsOver){
                        log.error("==================================================") ;
                        log.error("=                                                =") ;
                        log.error("=升级全部结束,设置升级任务完成                       =") ;
                        log.error("=                                                =") ;
                        log.error("==================================================") ;
                        log.info("==================================================") ;
                        log.info("=                                                =") ;
                        log.info("= 升级全部结束,设置升级任务完成,涉及RTU" + this.task.taskVo.rtuAddrList.size() + "台          =") ;
                        log.info("=                                                =") ;
                        log.info("==================================================") ;
                    }
                }else if(temp == 0){
                    //当前没有一个RTU进行过升级,也没有超时,不作为
@@ -240,24 +280,38 @@
                        this.task.taskOverDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;//任务完成时间(yyyy-mm-dd HH:MM:SS)
                    }
                    //任务完成,执行最后一次升级状态通知
                    //工作5:升级状态通知
                    //工作6:升级状态通知
                    //if(!first){
                    //    this.notifyUpgradeStatus() ;
                    //}
                }else{
                    //任务未完成,继续执行升级状态通知
                    //工作5: 升级状态通知
                    //工作6: 升级状态通知
                    //if(!first){
                    //    this.notifyUpgradeStatus() ;
                    //}
                }
                //工作5:升级状态通知
                //工作6:升级状态通知
                if(!this.monitorFirst){
                    this.notifyUpgradeStatus() ;
                }
            }else{
                //任务已经完成
                this.stop();
                //工作6:任务结束后,最后发升级状态通知
                if(this.nowNotifyTimesAfterOver == 0){
                    this.nowNotifyTimesAfterOver++ ;
                    this.notifyUpgradeStatus() ;//必须通知一次
                }else{
                    //然后重复通知
                    if(this.nowNotifyTimesAfterOver <= this.notifyTimesAfterOver){
                        //保证上面必须通知一次,那此处上面if中就得用<=
                        this.nowNotifyTimesAfterOver++ ;
                        this.notifyUpgradeStatus() ;
                    }else{
                        this.stop();
                    }
                }
            }
        }
        if(this.monitorFirst){
@@ -266,6 +320,7 @@
        return true ;
    }
    /**
     * 升级状态通知
     */