1、通信中间件中,取水口日取水量统计重新实现,统计数据来源只采用关阀报,不再采用工作报和开阀报了;
2、临时任务中,增加统计取水口是取水量统计。
11个文件已修改
1个文件已删除
1个文件已添加
539 ■■■■ 已修改文件
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/DateTime.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoTmp/ChangeMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/Temp4ChangeMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkDealIntakeAmountDay.java 327 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/changeSome/ChSomeCtrl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/changeSome/ChSomeIntakeAmountSv.java 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/changeSome/ChSomeIntakeLossSv.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/statistics/StClientAmountConstant.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/statistics/StClientAmountDaySv.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/statistics/StClientAmountMonthSv.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/statistics/StClientAmountYearSv.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/util/StClientAmountConstant.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/DateTime.java
@@ -1491,7 +1491,22 @@
                "09", "11", "12", "13", "14", "15", "16", "17", "18", "19",
                "20", "21", "22", "23" };
    }
    public static int[] dayGrpInMonth(int year, int month){
        if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12){
             return new int[]{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} ;
        }else{
            if(month == 2){
                if(isLeapYear(year)){
                    return new int[]{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} ;
                }else{
                    return new int[]{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} ;
                }
            }else{
                return new int[]{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} ;
            }
        }
    }
    public static String getWeek(int wk) {
        if (wk == 1) {
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoTmp/ChangeMapper.java
@@ -42,11 +42,40 @@
     * @return 影响实体数
     */
    int updateOneIntakeAmountDay(@Param("id")Long id, @Param("amount")Double amount);
    /**
     * 更新一个取水口的日用水量统计
     *
     * @return 影响实体数
     */
    /**
     * 更新一个取水口的日用水量统计
     *
     * @return 影响实体数
     */
    int updateOneIntakeAmountDay1(@Param("intakeId")Long intakeId, @Param("dt")Date dt,
                                  @Param("amount")Double amount, @Param("money")Double money, @Param("times")Integer times);
    /**
     * 删除所有取水口的日用水量统计
     * @return 影响实体数
     */
    int deleteAllIntakeAmountDay();
    /**
     * 统计所有取水口的日用水量
     * @return 实体集合
     */
    List<RmIntakeAmountDay> statisticAllIntakeAmountDayFromOpenCloseValveHistory(@Param("startDt")Date startDt,
                                                                         @Param("endDt")Date endDt);
    List<RmIntakeAmountDay> selectStIntakeDayStatisticsByDate(@Param("intakeId")Long intakeId, @Param("date")Date date);
    /**
     * 删除所有取水口的月用水量统计
     * @return 影响实体数
     */
pipIrr-platform/pipIrr-global/src/main/resources/mapper/Temp4ChangeMapper.xml
@@ -34,6 +34,39 @@
        where id = #{id, jdbcType=BIGINT}
    </update>
    <update id="updateOneIntakeAmountDay1" >
        update rm_intake_amount_day
        set amount = #{amount, jdbcType=FLOAT},
        money = #{money, jdbcType=FLOAT},
        times = #{times, jdbcType=INTEGER}
        where intake_id = #{intakeId, jdbcType=BIGINT}
        and dt = #{dt, jdbcType=DATE}
    </update>
    <delete id="deleteAllIntakeAmountDay">
        delete from rm_intake_amount_day
    </delete>
    <!--  -->
    <select id="statisticAllIntakeAmountDayFromOpenCloseValveHistory" resultType="com.dy.pipIrrGlobal.pojoRm.RmIntakeAmountDay">
        select intake_id as intakeId ,
        sum(cl_this_amount) as amount,
        sum(cl_this_money) as money,
        count(id) as times
        from  rm_open_close_valve_history
        where cl_dt <![CDATA[>=]]> #{startDt, jdbcType=DATE}
        and cl_dt <![CDATA[<=]]> #{endDt, jdbcType=DATE}
        group by intake_id
    </select>
    <select id="selectStIntakeDayStatisticsByDate" resultType="com.dy.pipIrrGlobal.pojoRm.RmIntakeAmountDay">
        select *
        from  rm_intake_amount_day
        where rm_intake_amount_day.intake_id = #{intakeId, jdbcType=BIGINT}
        and dt = #{date, jdbcType=DATE}
    </select>
    <delete id="deleteAllIntakeAmountMonth">
        delete from st_intake_amount_month
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkDealIntakeAmountDay.java
@@ -37,22 +37,34 @@
        Data d = (Data) data;
        DataV1 dV1 = (DataV1) d.getSubData();//前面任务已经判断不为null
        Object cdObj = dV1.subData;
        if (cdObj != null && (cdObj instanceof DataCdC0Vo
            || cdObj instanceof DataCd84Vo
            || cdObj instanceof DataCd83OpenVo
            || cdObj instanceof DataCd83CloseVo)){
        /**
         * 2025-01-11
         * 原来实现本任务功能,数据从84,83,C0功能码数据中获得统计数据,但后来数据中增加了金额与开关阀次数,
         * 从而使得从三种数据中统计数据相当困难与自相矛盾,所以修改实现方式,只从83数据中统计本数据,并且从几
         * 个月来运行数据看,只要设备能上线,基本上各种上报数据都能上报上来,所以没有必须从84及C0数据中统计数据了
         * 至此,本实现方式主永久实现方式,不再修改回去了,实践证明,以前的实现方式数据是统计不准确的。
         */
        if (cdObj != null
                && (
                    //cdObj instanceof DataCdC0Vo ||
                    //cdObj instanceof DataCd84Vo ||
                    //cdObj instanceof DataCd83OpenVo ||
                    cdObj instanceof DataCd83CloseVo
                )){
            Object[] objs = this.getTaskResults(TkPreGenObjs.taskId) ;
            DbSv sv = (DbSv)objs[0] ;
            PrController controller = (PrController)objs[1] ;
            try{
                UpDataVo vo = new UpDataVo() ;
                /*
                if(cdObj instanceof DataCdC0Vo){
                    vo.valueFrom((DataCdC0Vo)cdObj, null, null, null);
                }else if(cdObj instanceof DataCd84Vo){
                    vo.valueFrom(null, (DataCd84Vo)cdObj, null, null);
                }else if(cdObj instanceof DataCd83OpenVo){
                    vo.valueFrom(null,null,  (DataCd83OpenVo)cdObj,null);
                }else if(cdObj instanceof DataCd83CloseVo){
                }else */
                if(cdObj instanceof DataCd83CloseVo){
                    vo.valueFrom(null,null,null, (DataCd83CloseVo)cdObj);
                }
                this.doDeal(sv, controller, d.getRtuAddr(), dV1, vo);
@@ -76,7 +88,7 @@
            //数据库中不存在该取水口的日取水量数据
            //首先生成最新数据及历史数据,并先保存
            poLast = this.newRmIntakeAmountLast(controller, rtuAddr, dV1, dataVo);
            this.newAndSaveHistoryDataDeal(sv, controller, rtuAddr, dV1, dataVo, poLast);
            this.newAndSaveRmIntakeAmountHistory(sv, controller, rtuAddr, dV1, dataVo, poLast);
            sv.saveRmIntakeAmountLast(poLast);
        } else {
            if(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dataVo.rtuDt).before(poLast.rtuDtLast)){
@@ -91,21 +103,21 @@
                    //因为上行数据中的日期时间是可进行计算的
                    if(DateTime.dateFrom_yyyy_MM_dd1(dV1.dt).equals(poLast.dt)){
                        //同一天数据
                        poLast = this.updateRmIntakeAmountLastByControllerChange(poLast, controller, rtuAddr, dV1, dataVo);
                        poLast = this.updateRmIntakeAmountLastBySameDateByControllerChange(poLast, controller, rtuAddr, dV1, dataVo);
                        RmIntakeAmountDay poHistory = null ;
                        if(poLast.lastHistoryId != null){
                            poHistory = sv.getRmIntakeAmountDay(poLast.lastHistoryId) ;
                        }
                        if(poHistory == null){
                            this.newAndSaveHistoryDataDeal(sv, controller, rtuAddr, dV1, dataVo, poLast);
                            this.newAndSaveRmIntakeAmountHistory(sv, controller, rtuAddr, dV1, dataVo, poLast);
                        }else{
                            poHistory = this.updateRmIntakeAmountByControllerChange(poHistory, poLast, controller, rtuAddr, dV1, dataVo);
                            poHistory = this.updateRmIntakeAmountBySameDateByControllerChange(poHistory, poLast, controller, rtuAddr, dV1, dataVo);
                            sv.updateRmIntakeAmountDay(poHistory);
                        }
                    }else{
                        //非同一天,所以新生成一个历史记录
                        poLast = this.updateRmIntakeAmountLastByControllerChange(poLast, controller, rtuAddr, dV1, dataVo);
                        this.newAndSaveHistoryDataDeal(sv, controller, rtuAddr, dV1, dataVo, poLast);
                        poLast = this.updateRmIntakeAmountLastByNewDateByControllerChange(poLast, controller, rtuAddr, dV1, dataVo);
                        this.newAndSaveRmIntakeAmountHistory(sv, controller, rtuAddr, dV1, dataVo, poLast);
                    }
                }else{
                    //未更换控制器
@@ -117,7 +129,7 @@
                            poHistory = sv.getRmIntakeAmountDay(poLast.lastHistoryId) ;
                        }
                        if(poHistory == null){
                            this.newAndSaveHistoryDataDeal(sv, controller, rtuAddr, dV1, dataVo, poLast);
                            this.newAndSaveRmIntakeAmountHistory(sv, controller, rtuAddr, dV1, dataVo, poLast);
                        }else{
                            poHistory = this.updateRmIntakeAmountBySameDateNewData(poHistory, poLast, controller, rtuAddr, dV1, dataVo);
                            sv.updateRmIntakeAmountDay(poHistory);
@@ -125,7 +137,7 @@
                    }else if(DateTime.dateFrom_yyyy_MM_dd1(dV1.dt).after(poLast.dt)){
                        //新的日期
                        poLast = this.updateRmIntakeAmountLastByNewDateNewData(poLast, controller, rtuAddr, dV1, dataVo);
                        this.newAndSaveHistoryDataDeal(sv, controller, rtuAddr, dV1, dataVo, poLast);
                        this.newAndSaveRmIntakeAmountHistory(sv, controller, rtuAddr, dV1, dataVo, poLast);
                    }else{
                        //这种情况不存在
                    }
@@ -153,6 +165,11 @@
        po.dt = DateTime.dateFrom_yyyy_MM_dd1(dV1.dt);
        po.dtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1.dt);
        po.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt);
        po.amount = cdData.amount ;
        po.money = cdData.money ;
        po.times = 1 ;
        /* 2025-01-11
        if(cdData.isCloseValve != null && cdData.isCloseValve){
            po.amount = cdData.amount ;
            po.money = cdData.money ;
@@ -161,41 +178,10 @@
            po.amount = 0.0D ;
            po.money = 0.0D ;
            po.times = 0 ;
        }
        }*/
        po.rtuAddrLast = rtuAddr;
        return po ;
    }
    /**
     * 生成新的取水口用水统计历史记录
     * @param controller
     * @param rtuAddr
     * @param dV1
     * @param cdData
     * @return
     * @throws Exception
     */
    private RmIntakeAmountDay newRmIntakeAmountDay(PrController controller, String rtuAddr, DataV1 dV1, UpDataVo cdData, RmIntakeAmountDayLast lastPo)throws Exception {
        RmIntakeAmountDay po = new RmIntakeAmountDay() ;
        po.intakeId = controller==null?null:controller.getIntakeId();
        po.controllerIdLast = controller==null?null:controller.getId();
        po.rtuAddrLast = rtuAddr;
        po.dt = DateTime.dateFrom_yyyy_MM_dd1(dV1.dt);
        po.dtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1.dt);
        po.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt);
        if(lastPo != null){
            po.amount = lastPo.amount ;
            po.money = lastPo.money ;
            po.times = lastPo.times ;
        }else{
            po.amount = 0.0D ;
            po.money = 0.0D ;
            po.times = 0 ;
        }
        po.totalAmountLast = cdData.totalAmount ;
        return po ;
    }
    /**
     * 保存新的历史数据记录,并把ID赋值给最新记录的 lastHistoryId
@@ -203,13 +189,32 @@
     * @param controller
     * @param rtuAddr
     * @param dV1
     * @param dataCdC0Vo
     * @param cdData
     * @param poLast
     * @throws Exception
     * @return RmIntakeAmountDay
     */
    private RmIntakeAmountDay newAndSaveHistoryDataDeal(DbSv sv, PrController controller, String rtuAddr, DataV1 dV1, UpDataVo dataCdC0Vo, RmIntakeAmountDayLast poLast)throws Exception {
        RmIntakeAmountDay poHistory = this.newRmIntakeAmountDay(controller, rtuAddr, dV1, dataCdC0Vo, poLast) ;
    private RmIntakeAmountDay newAndSaveRmIntakeAmountHistory(DbSv sv, PrController controller, String rtuAddr, DataV1 dV1, UpDataVo cdData, RmIntakeAmountDayLast poLast)throws Exception {
        RmIntakeAmountDay poHistory = new RmIntakeAmountDay() ;
        poHistory.intakeId = controller==null?null:controller.getIntakeId();
        poHistory.controllerIdLast = controller==null?null:controller.getId();
        poHistory.rtuAddrLast = rtuAddr;
        poHistory.dt = DateTime.dateFrom_yyyy_MM_dd1(dV1.dt);
        poHistory.dtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1.dt);
        poHistory.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt);
        poHistory.totalAmountLast = cdData.totalAmount ;
        //2025-01-11
        if(poLast != null){
            poHistory.amount = poLast.amount ;
            poHistory.money = poLast.money ;
            poHistory.times = poLast.times ;
        }else{
            poHistory.amount = 0.0D ;
            poHistory.money = 0.0D ;
            poHistory.times = 0 ;
        }
        sv.saveRmIntakeAmountDay(poHistory);
        //由最新数据持有历史数据中的最新记录ID,以方便快速查询
        poLast.lastHistoryId = poHistory == null ? null: poHistory.id ;
@@ -218,7 +223,7 @@
    /**
     * 取水口更换了控制器,此时只更新部分属性
     * 取水口更换了控制器,同一天数据,此时只更新部分属性
     * @param controller
     * @param rtuAddr
     * @param dV1
@@ -226,17 +231,110 @@
     * @return
     * @throws Exception
     */
    private RmIntakeAmountDayLast updateRmIntakeAmountLastByControllerChange(RmIntakeAmountDayLast lastPo, PrController controller, String rtuAddr, DataV1 dV1, UpDataVo cdData)throws Exception {
    private RmIntakeAmountDayLast updateRmIntakeAmountLastBySameDateByControllerChange(RmIntakeAmountDayLast lastPo, PrController controller, String rtuAddr, DataV1 dV1, UpDataVo cdData)throws Exception {
        lastPo.intakeId = controller==null?null:controller.getIntakeId();
        lastPo.controllerIdLast = controller==null?null:controller.getId();
        lastPo.rtuAddrLast = rtuAddr;
        lastPo.dt = DateTime.dateFrom_yyyy_MM_dd1(dV1.dt);
        lastPo.dtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1.dt);
        lastPo.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt);
        //lastPo.amount = lastPo.amount ; //日累计取水量保持不变,
        lastPo.totalAmountLast = cdData.totalAmount ;
        //阀控器更换了,并且是同一天数据
        //只有关阀报数据(2025-01-11)
        if(lastPo.amount == null){
            lastPo.amount = cdData.amount ;
        }else{
            lastPo.amount += cdData.amount ;
        }
        if(lastPo.money == null){
            lastPo.money = cdData.money ;
        }else{
            lastPo.money += cdData.money ;
        }
        if(lastPo.times == null){
            lastPo.times = 1 ;
        }else{
            lastPo.times += 1 ;
        }
        /*
        if(cdData.isCloseValve != null && cdData.isCloseValve.booleanValue()){
            //是从关阀报中得到的数据
            if(lastPo.amount == null){
                lastPo.amount = cdData.amount ;
            }else{
                lastPo.amount += cdData.amount ;
            }
            if(lastPo.money == null){
                lastPo.money = cdData.money ;
            }else{
                lastPo.money += cdData.money ;
            }
            if(lastPo.times == null){
                lastPo.times = 1 ;
            }else{
                lastPo.times += 1 ;
            }
        }else{
            //非关阀报数据
            //不作为
        }*/
        return lastPo ;
    }
    /**
     * 取水口更换了控制器在,此时只更新部分属性
     * @param controller
     * @param rtuAddr
     * @param dV1
     * @param cdData
     * @return
     * @throws Exception
     */
    private RmIntakeAmountDay updateRmIntakeAmountBySameDateByControllerChange(RmIntakeAmountDay po, RmIntakeAmountDayLast lastPo, PrController controller, String rtuAddr, DataV1 dV1, UpDataVo cdData)throws Exception {
        po.intakeId = controller==null?null:controller.getIntakeId();
        po.controllerIdLast = controller==null?null:controller.getId();
        po.rtuAddrLast = rtuAddr;
        po.dt = lastPo.dt ;
        po.dtLast = lastPo.dtLast;
        po.rtuDtLast = lastPo.rtuDtLast;
        po.totalAmountLast = lastPo.totalAmountLast ;
        //阀控器更换了,并且是同一天数据
        //只有关阀报数据(2025-01-11)
        po.amount = lastPo.amount ;
        po.money = lastPo.money ;
        po.times = lastPo.times ;
        return po ;
    }
    /**
     * 取水口更换了控制器,非同一天数据,此时更新部分属性
     * @param controller
     * @param rtuAddr
     * @param dV1
     * @param cdData
     * @return
     * @throws Exception
     */
    private RmIntakeAmountDayLast updateRmIntakeAmountLastByNewDateByControllerChange(RmIntakeAmountDayLast lastPo, PrController controller, String rtuAddr, DataV1 dV1, UpDataVo cdData)throws Exception {
        lastPo.intakeId = controller==null?null:controller.getIntakeId();
        lastPo.controllerIdLast = controller==null?null:controller.getId();
        lastPo.rtuAddrLast = rtuAddr;
        lastPo.dt = DateTime.dateFrom_yyyy_MM_dd1(dV1.dt);
        lastPo.dtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1.dt);
        lastPo.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt);
        lastPo.totalAmountLast = cdData.totalAmount ;
        //阀控器更换了,并且是新一天数据 2025-01-11
        lastPo.amount = cdData.amount ;
        lastPo.money = cdData.money ;
        lastPo.times = 1 ;
        return lastPo ;
    }
    /**
     * 收到同一天的新的数据,进行更新数据
@@ -261,37 +359,58 @@
            //上面时标作了更新,也正常,相当于本次上报的累计流量与上次上报的累计流量数值相等
            //lastPo.totalAmountLast = lastPo.totalAmountLast ;
            //lastPo.amount = lastPo.amount; //本日的日累计水量保持不变
        }else{
            Double added = cdData.totalAmount - lastPo.totalAmountLast ;
            if(added > 0){
                if(lastPo.amount == null){
                    lastPo.amount = added ;
                }else{
                    lastPo.amount += added ;
                }
            }else{
                //可能是更换水表了,新表底值对原表底值小。
                //本次置量值不变,下次再上报时,就能正常计算了。
                //lastPo.amount = lastPo.amount ; //日累计取水量不变
            }
            if(cdData.isCloseValve != null && cdData.isCloseValve.booleanValue()){
                //是从关阀报中得到的数据
                if(lastPo.money == null){
                    lastPo.money = cdData.money ;
                }else{
                    lastPo.money += cdData.money ;
                }
                if(lastPo.times == null){
                    lastPo.times = 1 ;
                }else{
                    lastPo.times += 1 ;
                }
            }else{
                lastPo.money = 0.0D ;
                lastPo.times = 1 ;
            }
            lastPo.totalAmountLast = cdData.totalAmount ;
        }else {
            lastPo.totalAmountLast = cdData.totalAmount;
        }
        //是同一天数据
        //只有关阀报数据(2025-01-11)
        if(lastPo.amount == null){
            lastPo.amount = cdData.amount ;
        }else{
            lastPo.amount += cdData.amount ;
        }
        if(lastPo.money == null){
            lastPo.money = cdData.money ;
        }else{
            lastPo.money += cdData.money ;
        }
        if(lastPo.times == null){
            lastPo.times = 1 ;
        }else{
            lastPo.times += 1 ;
        }
        /* 2025-01-11
        Double added = cdData.totalAmount - lastPo.totalAmountLast ;
        if(added > 0){
            if(lastPo.amount == null){
                lastPo.amount = added ;
            }else{
                lastPo.amount += added ;
            }
        }else{
            //可能是更换水表了,新表底值比原表底值小。
            //本次置量值不变,下次再上报时,就能正常计算了。
            //lastPo.amount = lastPo.amount ; //日累计取水量不变
        }
        if(cdData.isCloseValve != null && cdData.isCloseValve.booleanValue()){
            //是从关阀报中得到的数据
            if(lastPo.money == null){
                lastPo.money = cdData.money ;
            }else{
                lastPo.money += cdData.money ;
            }
            if(lastPo.times == null){
                lastPo.times = 1 ;
            }else{
                lastPo.times += 1 ;
            }
        }else{
            //非关阀报数据
            //不作为
        }
        */
        return lastPo ;
    }
@@ -312,6 +431,14 @@
        lastPo.dt = DateTime.dateFrom_yyyy_MM_dd1(dV1.dt);//日期变了
        lastPo.dtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(dV1.dt);
        lastPo.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt);
        lastPo.totalAmountLast = cdData.totalAmount ;
        //新的一天数据 2025-01-11
        lastPo.amount = cdData.amount ;
        lastPo.money = cdData.money ;
        lastPo.times = 1 ;
        /*
        if(cdData.totalAmount == 0.0F){
            //发现阀控器一个bug,经常上报累计流量为0,推测是阀控器未能从水表采集到数据时会上报0值
            //这种情况数据不做处理
@@ -329,45 +456,20 @@
                //本次置0,下次再上报时,就能正常计算了。
                lastPo.amount = 0.0D; //日累计水量归0
            }
            lastPo.totalAmountLast = cdData.totalAmount ;
        }
        if(cdData.isCloseValve != null && cdData.isCloseValve.booleanValue()){
            //是从关阀报中得到的数据
            lastPo.money = cdData.money ;
            lastPo.times = 1 ;
        }else{
            lastPo.money = 0.0D ;
            lastPo.times = 0 ;
            //非关阀报数据
            //不作为
        }
        */
        return lastPo ;
    }
    /**
     * 取水口更换了控制器在,此时只更新部分属性
     * @param controller
     * @param rtuAddr
     * @param dV1
     * @param cdData
     * @return
     * @throws Exception
     */
    private RmIntakeAmountDay updateRmIntakeAmountByControllerChange(RmIntakeAmountDay po, RmIntakeAmountDayLast lastPo, PrController controller, String rtuAddr, DataV1 dV1, UpDataVo cdData)throws Exception {
        po.intakeId = controller==null?null:controller.getIntakeId();
        po.controllerIdLast = controller==null?null:controller.getId();
        po.rtuAddrLast = rtuAddr;
        po.dt = lastPo.dt ;
        po.dtLast = lastPo.dtLast;
        po.rtuDtLast = lastPo.rtuDtLast;
        po.amount = lastPo.amount ;
        po.money = lastPo.money ;
        po.times = lastPo.times ;
        po.totalAmountLast = lastPo.totalAmountLast ;
        return po ;
    }
    /**
     * 更新历史记录
@@ -385,11 +487,11 @@
        po.dt = lastPo.dt ;
        po.dtLast = lastPo.dtLast;
        po.rtuDtLast = lastPo.rtuDtLast;
        po.totalAmountLast = lastPo.totalAmountLast ;
        po.amount = lastPo.amount ;//此时lastPo.amount已经增加上了增量
        po.money = lastPo.money ;//此时lastPo.money已经增加上了增量
        po.times = lastPo.times ;//此时lastPo.times已经增加上了增量
        po.totalAmountLast = lastPo.totalAmountLast ;
        return po ;
    }
@@ -403,6 +505,7 @@
        public String rtuDt ;//控制器时钟
        public void valueFrom(DataCdC0Vo voC0, DataCd84Vo vo84, DataCd83OpenVo vo83Op, DataCd83CloseVo vo83Cl){
            /*
            if(voC0 != null){
                this.totalAmount = voC0.totalAmount ;
                this.rtuDt = voC0.rtuDt ;
@@ -412,13 +515,13 @@
            }else if(vo83Op != null){
                this.totalAmount = vo83Op.totalAmount ;
                this.rtuDt = vo83Op.rtuDt ;
            }else if(vo83Cl != null){
            }else if(vo83Cl != null){ */
                this.totalAmount = vo83Cl.totalAmount ;
                this.amount = vo83Cl.thisAmount ;
                this.money = vo83Cl.thisMoney ;
                this.isCloseValve = true ;
                this.rtuDt = vo83Cl.rtuDt ;
            }
            /*} */
        }
    }
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml
@@ -23,7 +23,7 @@
                            <task id="TkDealOpenValveReport" name="控制器开阀上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealOpenValveReport" />
                            <task id="TkDealCloseValveReport" name="控制器关阀上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealCloseValveReport" />
                            <task id="TkDealLoss" name="取水口日漏损量(功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealLoss" />
                            <task id="TkDealIntakeAmountDay" name="取水口日用水量(功能码84、功能码83、功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealIntakeAmountDay" />
                            <task id="TkDealIntakeAmountDay" name="取水口日用水量(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealIntakeAmountDay" />
                            <task id="TkDealClientAmountDay" name="农户日用水量(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealClientAmountDay" />
                            <task id="TkDealIcRemainMoney" name="IC卡剩余金额(功能码84、功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1.TkDealIcRemainMoney" />
                        </task>
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/changeSome/ChSomeCtrl.java
@@ -54,6 +54,18 @@
        return BaseResponseUtils.buildSuccess(true);
    }
    /**
     * 重新统计取水口月取水量
     * @return
     */
    @GetMapping(path = "reStatisticsAllIntakeDayAmount")
    @SsoAop()
    public BaseResponse<Boolean> reStatisticsAllIntakeDayAmount() throws Exception{
        this.intakeAmountSv.deleteAllIntakeAmountDay();
        this.intakeAmountSv.statisticsIntakeAmountDay();
        return BaseResponseUtils.buildSuccess(true);
    }
    /**
     * 重新统计取水口月取水量
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/changeSome/ChSomeIntakeAmountSv.java
@@ -6,6 +6,7 @@
import com.dy.pipIrrGlobal.pojoSt.StIntakeAmountMonth;
import com.dy.pipIrrGlobal.pojoSt.StIntakeAmountYear;
import com.dy.pipIrrGlobal.voSt.VoIntake;
import com.dy.pipIrrTemp.util.StClientAmountConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -26,8 +27,6 @@
public class ChSomeIntakeAmountSv {
    private ChangeMapper dao;
    private static final int IntakeAmountDayFlag = 800 ;//2024-12-14统计元谋数据库实时数据,发现大于800的正确的数据不存在,而小于800的基本为正确数据
    @Autowired
    private void setDao(ChangeMapper dao){
@@ -57,11 +56,11 @@
                    for(RmIntakeAmountDay ad : adList){
                        if(lastAd == null){
                            lastAd = ad ;
                            if(lastAd.amount != null && lastAd.amount > IntakeAmountDayFlag){
                            if(lastAd.amount != null && lastAd.amount > StClientAmountConstant.IntakeAmountDayFlag){
                                this.doUpdateOneIntakeAmountDay(lastAd.id, 0.0);
                            }
                        }else{
                            if(ad.amount != null && ad.amount > IntakeAmountDayFlag){
                            if(ad.amount != null && ad.amount > StClientAmountConstant.IntakeAmountDayFlag){
                                if(ad.totalAmountLast != null && lastAd.totalAmountLast != null){
                                    //重新计算日取水量
                                    ad.amount = ad.totalAmountLast - lastAd.totalAmountLast;
@@ -74,10 +73,10 @@
                                        );
                                        ad.amount = 0.0 ;
                                    }
                                    if(ad.amount > IntakeAmountDayFlag){
                                    if(ad.amount > StClientAmountConstant.IntakeAmountDayFlag){
                                        //计算日取水量后,仍大于IntakeAmountDayFlag
                                        log.info("出现调整后的日取水量仍大于"
                                                + IntakeAmountDayFlag
                                                + StClientAmountConstant.IntakeAmountDayFlag
                                                + "的情况,数据id=" + ad.id
                                                + ",取水口id=" + ad.intakeId
                                                + ",日期=" + ad.dt
@@ -87,7 +86,7 @@
                                            if(DateTime.daysBetweenyyyy_MM_dd(ad.dt, lastAd.dt) == 1){
                                                //只相差一天
                                                log.info("出现相差一天但日取水量大于"
                                                        + IntakeAmountDayFlag
                                                        + StClientAmountConstant.IntakeAmountDayFlag
                                                        + "的情况,数据id=" + ad.id
                                                        + ",取水口id=" + ad.intakeId
                                                        + ",日期=" + ad.dt
@@ -99,7 +98,7 @@
                                                //已经修改后的数值仍然大于IntakeAmountDayFlag,说明是大日未上报数据而积累下来,可以大于IntakeAmountDayFlag
                                                //ad.amount = ad.amount ;
                                                log.info("出现相差多天日取水量大于"
                                                        + IntakeAmountDayFlag
                                                        + StClientAmountConstant.IntakeAmountDayFlag
                                                        + "的情况,数据id=" + ad.id
                                                        + ",取水口id=" + ad.intakeId
                                                        + ",日期=" + ad.dt
@@ -110,7 +109,7 @@
                                    }
                                }else{
                                    log.info("出现相差多天日取水量大于"
                                            + IntakeAmountDayFlag
                                            + StClientAmountConstant.IntakeAmountDayFlag
                                            + "并且属性totalAmountLast为null的情况,数据id=" + ad.id
                                            + ",取水口id=" + ad.intakeId
                                            + ",日期=" + ad.dt
@@ -134,6 +133,53 @@
        return dao.updateOneIntakeAmountDay(id, amount);
    }
    /**
     * 删除所有取水口日取水量统计
     * @throws Exception
     */
    @Transactional
    public void deleteAllIntakeAmountDay(){
        dao.deleteAllIntakeAmountDay();
    }
    /**
     * 统计取水口日取水量
     * @throws Exception
     */
    public void statisticsIntakeAmountDay() throws Exception{
        int nowYear = Integer.parseInt(DateTime.yyyy()) ;
        int nowMonth = Integer.parseInt(DateTime.mm()) ;
        int nowDay = Integer.parseInt(DateTime.dd()) ;
        Date startDt ;
        Date endDt ;
        List<RmIntakeAmountDay> list ;
        boolean stop = false ;
        for(int[] ym : StClientAmountConstant.yearMonthGrp) {
            int[] dates = DateTime.dayGrpInMonth(ym[0], ym[1]);
            for(int day: dates){
                if(ym[0] == nowYear && ym[1] == nowMonth && day > nowDay){
                    stop = true ;
                }
                if(!stop){
                    startDt = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(ym[0] + "-" + ym[1] + "-" + day + " 00:00:00") ;
                    endDt = DateTime.dateFrom_yyyy_MM_dd(ym[0] + "-" + ym[1] + "-" + day + " 23:59:59") ;
                    list = dao.statisticAllIntakeAmountDayFromOpenCloseValveHistory(startDt, endDt) ;
                    this.doStatisticsIntakeAmountDay(ym[0], ym[1], day, list) ;
                }else{
                    break ;
                }
            }
        }
    }
    @Transactional
    protected void doStatisticsIntakeAmountDay(int year, int month, int day, List<RmIntakeAmountDay> list) throws Exception{
        if(list != null && list.size() > 0){
            Date date = DateTime.dateFrom_yyyy_MM_dd(year + "-" + month + "-" + day) ;
            for(RmIntakeAmountDay po : list){
                dao.updateOneIntakeAmountDay1(po.intakeId, date, po.amount, po.money, po.times);
            }
        }
    }
    ////////////////////////////////////////
@@ -141,9 +187,6 @@
    // 有关月统计
    //
    ///////////////////////////////////////
    private static final int DealStartYear = 2024 ;
    private static final int DealStartMonth = 8 ;
    /**
     * 删除所有取水口月取水量统计
@@ -164,7 +207,7 @@
        Date startDt ;
        Date endDt ;
        List<StIntakeAmountMonth> list ;
        for(int year = DealStartYear; year <= nowYear; year ++){
        for(int year = StClientAmountConstant.DealStartYear; year <= nowYear; year ++){
            list = null ;
            if(year < nowYear){
                for(int month = 1 ; month <= 12 ; month ++){
@@ -218,7 +261,7 @@
        Date startDt ;
        Date endDt ;
        List<StIntakeAmountYear> list ;
        for(int year = DealStartYear; year <= nowYear; year ++){
        for(int year = StClientAmountConstant.DealStartYear; year <= nowYear; year ++){
            list = null ;
            startDt = DateTime.dateFrom_yyyy_MM_dd(year + "-01-01") ;
            endDt = DateTime.dateFrom_yyyy_MM_dd(year + "-12-31") ;
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/changeSome/ChSomeIntakeLossSv.java
@@ -9,6 +9,7 @@
import com.dy.pipIrrGlobal.pojoSt.StLossMonth;
import com.dy.pipIrrGlobal.pojoSt.StLossYear;
import com.dy.pipIrrGlobal.voSt.VoIntake;
import com.dy.pipIrrTemp.util.StClientAmountConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -27,9 +28,6 @@
public class ChSomeIntakeLossSv {
    private ChangeMapper dao;
    private static final int IntakeLossDayFlag = 800 ;//2024-12-14统计元谋数据库实时数据,发现大于800的正确的数据不存在,而小于800的基本为正确数据
    @Autowired
    private void setDao(ChangeMapper dao){
        this.dao = dao;
@@ -52,7 +50,7 @@
                if(adList != null && adList.size() > 0){
                    //adList中数据以id升序排列
                    for(RmLossDay ad : adList){
                        if(ad.lossAmount != null && ad.lossAmount > IntakeLossDayFlag){
                        if(ad.lossAmount != null && ad.lossAmount > StClientAmountConstant.IntakeLossDayFlag){
                            this.doUpdateOneIntakeLossDay(ad.id, 0.0);
                        }
                    }
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/statistics/StClientAmountConstant.java
File was deleted
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/statistics/StClientAmountDaySv.java
@@ -5,10 +5,8 @@
import com.dy.pipIrrGlobal.daoRm.RmClientAmountDayMapper;
import com.dy.pipIrrGlobal.daoSt.StClientAmountDayMapper;
import com.dy.pipIrrGlobal.pojoSt.StClientAmountDay;
import com.dy.pipIrrGlobal.pojoSt.StConsumeClientMonth;
import com.dy.pipIrrGlobal.pojoSt.StConsumeClientYear;
import com.dy.pipIrrGlobal.voSt.VoClientAmountStatistics;
import com.dy.pipIrrGlobal.voSt.VoClientConsumeStatistics;
import com.dy.pipIrrTemp.util.StClientAmountConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/statistics/StClientAmountMonthSv.java
@@ -1,14 +1,11 @@
package com.dy.pipIrrTemp.statistics;
import com.dy.common.util.DateTime;
import com.dy.common.util.IDLongGenerator;
import com.dy.pipIrrGlobal.daoSt.StClientAmountDayMapper;
import com.dy.pipIrrGlobal.daoSt.StClientAmountMonthMapper;
import com.dy.pipIrrGlobal.pojoSt.StClientAmountMonth;
import com.dy.pipIrrGlobal.pojoSt.StConsumeClientMonth;
import com.dy.pipIrrGlobal.pojoSt.StConsumeClientYear;
import com.dy.pipIrrGlobal.voSt.VoClientAmountStatistics;
import com.dy.pipIrrGlobal.voSt.VoClientConsumeStatistics;
import com.dy.pipIrrTemp.util.StClientAmountConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/statistics/StClientAmountYearSv.java
@@ -4,9 +4,9 @@
import com.dy.pipIrrGlobal.daoSt.StClientAmountDayMapper;
import com.dy.pipIrrGlobal.daoSt.StClientAmountMonthMapper;
import com.dy.pipIrrGlobal.daoSt.StClientAmountYearMapper;
import com.dy.pipIrrGlobal.pojoSt.StClientAmountMonth;
import com.dy.pipIrrGlobal.pojoSt.StClientAmountYear;
import com.dy.pipIrrGlobal.voSt.VoClientAmountStatistics;
import com.dy.pipIrrTemp.util.StClientAmountConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
pipIrr-platform/pipIrr-web/pipIrr-web-temp/src/main/java/com/dy/pipIrrTemp/util/StClientAmountConstant.java
New file
@@ -0,0 +1,19 @@
package com.dy.pipIrrTemp.util;
/**
 * @Author: liurunyu
 * @Date: 2024/12/30 13:49
 * @Description
 */
public class StClientAmountConstant {
    public static final int IntakeLossDayFlag = 800 ;//2024-12-14统计元谋数据库实时数据,发现大于800的正确的数据不存在,而小于800的基本为正确数据
    public static final int IntakeAmountDayFlag = 800 ;//2024-12-14统计元谋数据库实时数据,发现大于800的正确的数据不存在,而小于800的基本为正确数据
    public static final int DealStartYear = 2024 ;
    public static final int DealStartMonth = 8 ;
    public static final int[][] yearMonthGrp = {{2024, 9}, {2024, 10}, {2024, 11}, {2024, 12}, {2025, 1}, {2025, 2}, {2025, 3}, {2025, 4}};
}