package com.dy.pipIrrTemp.changeSome; 
 | 
  
 | 
import com.dy.common.util.DateTime; 
 | 
import com.dy.pipIrrGlobal.daoTmp.ChangeMapper; 
 | 
import com.dy.pipIrrGlobal.pojoRm.RmIntakeAmountDay; 
 | 
import com.dy.pipIrrGlobal.pojoSt.StIntakeAmountMonth; 
 | 
import com.dy.pipIrrGlobal.pojoSt.StIntakeAmountYear; 
 | 
import com.dy.pipIrrGlobal.voSt.VoIntake; 
 | 
import com.dy.pipIrrGlobal.voTmp.VoRmIntakeAmountDay; 
 | 
import com.dy.pipIrrTemp.util.StClientAmountConstant; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
  
 | 
import java.util.Date; 
 | 
import java.util.List; 
 | 
  
 | 
/** 
 | 
 * @Author: liurunyu 
 | 
 * @Date: 2024/12/14 9:25 
 | 
 * @Description 
 | 
 */ 
 | 
  
 | 
  
 | 
@Slf4j 
 | 
@Service 
 | 
public class ChSomeIntakeAmountSv { 
 | 
  
 | 
    private ChangeMapper dao; 
 | 
  
 | 
    @Autowired 
 | 
    private void setDao(ChangeMapper dao){ 
 | 
        this.dao = dao; 
 | 
    } 
 | 
  
 | 
  
 | 
    //////////////////////////////////////// 
 | 
    // 
 | 
    // 有关日统计 
 | 
    // 
 | 
    /////////////////////////////////////// 
 | 
  
 | 
    /** 
 | 
     * 调整取水口日取水量统计 
 | 
     * @throws Exception 
 | 
     */ 
 | 
    public void chIntakeAmountDay() throws Exception{ 
 | 
        RmIntakeAmountDay lastAd = null ; 
 | 
        List<VoIntake> list = dao.selectAllPrIntakes() ; 
 | 
        if(list != null && list.size() > 0){ 
 | 
            for(VoIntake vo : list){ 
 | 
                lastAd = null ; 
 | 
                List<RmIntakeAmountDay> adList = dao.selectOneIntakeAllAmountDay(vo.getIntakeId()) ; 
 | 
                if(adList != null && adList.size() > 0){ 
 | 
                    //adList中数据以id升序排列 
 | 
                    for(RmIntakeAmountDay ad : adList){ 
 | 
                        if(lastAd == null){ 
 | 
                            lastAd = ad ; 
 | 
                            if(lastAd.amount != null && lastAd.amount > StClientAmountConstant.IntakeAmountDayFlag){ 
 | 
                                this.doUpdateOneIntakeAmountDay(lastAd.id, 0.0); 
 | 
                            } 
 | 
                        }else{ 
 | 
                            if(ad.amount != null && ad.amount > StClientAmountConstant.IntakeAmountDayFlag){ 
 | 
                                if(ad.totalAmountLast != null && lastAd.totalAmountLast != null){ 
 | 
                                    //重新计算日取水量 
 | 
                                    ad.amount = ad.totalAmountLast - lastAd.totalAmountLast; 
 | 
                                    if(ad.amount < 0){//计算日取水量后,可能会有这种情况发生(负值) 
 | 
                                        log.info("出现调整后的日取水量出现负值" + ad.amount 
 | 
                                                + "情况,数据id=" + ad.id 
 | 
                                                + ",取水口id=" + ad.intakeId 
 | 
                                                + ",日期=" + ad.dt 
 | 
                                                + ",设置水量=0.0" 
 | 
                                        ); 
 | 
                                        ad.amount = 0.0 ; 
 | 
                                    } 
 | 
                                    if(ad.amount > StClientAmountConstant.IntakeAmountDayFlag){ 
 | 
                                        //计算日取水量后,仍大于IntakeAmountDayFlag 
 | 
                                        log.info("出现调整后的日取水量仍大于" 
 | 
                                                + StClientAmountConstant.IntakeAmountDayFlag 
 | 
                                                + "的情况,数据id=" + ad.id 
 | 
                                                + ",取水口id=" + ad.intakeId 
 | 
                                                + ",日期=" + ad.dt 
 | 
                                                + ad.amount 
 | 
                                        ); 
 | 
                                        if(ad.dt != null && lastAd.dt != null){ 
 | 
                                            if(DateTime.daysBetweenyyyy_MM_dd(ad.dt, lastAd.dt) == 1){ 
 | 
                                                //只相差一天 
 | 
                                                log.info("出现相差一天但日取水量大于" 
 | 
                                                        + StClientAmountConstant.IntakeAmountDayFlag 
 | 
                                                        + "的情况,数据id=" + ad.id 
 | 
                                                        + ",取水口id=" + ad.intakeId 
 | 
                                                        + ",日期=" + ad.dt 
 | 
                                                        + ",设置水量=0.0" 
 | 
                                                        + ",设置前水量= " + ad.amount 
 | 
                                                ); 
 | 
                                                ad.amount = 0.0 ; 
 | 
                                            }else{ 
 | 
                                                //已经修改后的数值仍然大于IntakeAmountDayFlag,说明是大日未上报数据而积累下来,可以大于IntakeAmountDayFlag 
 | 
                                                //ad.amount = ad.amount ; 
 | 
                                                log.info("出现相差多天日取水量大于" 
 | 
                                                        + StClientAmountConstant.IntakeAmountDayFlag 
 | 
                                                        + "的情况,数据id=" + ad.id 
 | 
                                                        + ",取水口id=" + ad.intakeId 
 | 
                                                        + ",日期=" + ad.dt 
 | 
                                                        + ",水量保持不变=" + ad.amount 
 | 
                                                ); 
 | 
                                            } 
 | 
                                        } 
 | 
                                    } 
 | 
                                }else{ 
 | 
                                    log.info("出现相差多天日取水量大于" 
 | 
                                            + StClientAmountConstant.IntakeAmountDayFlag 
 | 
                                            + "并且属性totalAmountLast为null的情况,数据id=" + ad.id 
 | 
                                            + ",取水口id=" + ad.intakeId 
 | 
                                            + ",日期=" + ad.dt 
 | 
                                            + ",设置水量=0.0" 
 | 
                                            + ",设置前水量= " + ad.amount 
 | 
                                    ); 
 | 
                                    ad.amount = 0.0 ; 
 | 
                                } 
 | 
                                this.doUpdateOneIntakeAmountDay(ad.id,  ad.amount); 
 | 
                            } 
 | 
                        } 
 | 
                        lastAd = ad ; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Transactional 
 | 
    protected int doUpdateOneIntakeAmountDay(Long id, Double amount){ 
 | 
        return dao.updateOneIntakeAmountDay(id, amount); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 删除所有取水口日取水量统计 
 | 
     * @throws Exception 
 | 
     */ 
 | 
    //@Transactional 
 | 
    //public void deleteAllIntakeAmountDay(){ 
 | 
    //    dao.deleteAllIntakeAmountDay(); 
 | 
    //} 
 | 
    /** 
 | 
     * 删除一些取水口日取水量统计 
 | 
     * @throws Exception 
 | 
     */ 
 | 
    @Transactional 
 | 
    public void deleteSomeIntakeAmountDay(){ 
 | 
        dao.deleteSomeIntakeAmountDay(); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 统计取水口日取水量 
 | 
     * @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<VoRmIntakeAmountDay> 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_HH_mm_ss(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<VoRmIntakeAmountDay> list) throws Exception{ 
 | 
        if(list != null && list.size() > 0){ 
 | 
            Date date = DateTime.dateFrom_yyyy_MM_dd(year + "-" + month + "-" + day) ; 
 | 
            for(VoRmIntakeAmountDay vo : list){ 
 | 
                dao.updateOneIntakeAmountDay1(vo.intakeId, date, vo.amount, vo.money, vo.times); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
    //////////////////////////////////////// 
 | 
    // 
 | 
    // 有关月统计 
 | 
    // 
 | 
    /////////////////////////////////////// 
 | 
  
 | 
    /** 
 | 
     * 删除所有取水口月取水量统计 
 | 
     * @throws Exception 
 | 
     */ 
 | 
    @Transactional 
 | 
    public void deleteAllIntakeAmountMonth(){ 
 | 
        dao.deleteAllIntakeAmountMonth(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 统计取水口月取水量 
 | 
     * @throws Exception 
 | 
     */ 
 | 
    public void statisticsIntakeAmountMonth() throws Exception{ 
 | 
        int nowYear = Integer.parseInt(DateTime.yyyy()) ; 
 | 
        int nowMonth = Integer.parseInt(DateTime.MM()) ; 
 | 
        Date startDt ; 
 | 
        Date endDt ; 
 | 
        List<StIntakeAmountMonth> list ; 
 | 
        for(int year = StClientAmountConstant.DealStartYear; year <= nowYear; year ++){ 
 | 
            list = null ; 
 | 
            if(year < nowYear){ 
 | 
                for(int month = 1 ; month <= 12 ; month ++){ 
 | 
                    startDt = DateTime.dateFrom_yyyy_MM_dd(year + "-" + month + "-01") ; 
 | 
                    endDt = DateTime.dateFrom_yyyy_MM_dd(year + "-" + month + "-" + DateTime.endDayOfMonth(year, month)) ; 
 | 
                    list = dao.statisticAllIntakeAmountMonthFromAmountDay(startDt, endDt) ; 
 | 
                    this.doStatisticsIntakeAmountMonth(year, month, list) ; 
 | 
                } 
 | 
            }else{ 
 | 
                for(int month = 1 ; month <= nowMonth ; month ++){ 
 | 
                    startDt = DateTime.dateFrom_yyyy_MM_dd(year + "-" + month + "-01") ; 
 | 
                    endDt = DateTime.dateFrom_yyyy_MM_dd(year + "-" + month + "-" + DateTime.endDayOfMonth(year, month)) ; 
 | 
                    list = dao.statisticAllIntakeAmountMonthFromAmountDay(startDt, endDt) ; 
 | 
                    this.doStatisticsIntakeAmountMonth(year, month, list) ; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
    @Transactional 
 | 
    protected void doStatisticsIntakeAmountMonth(int year, int month, List<StIntakeAmountMonth> list) throws Exception{ 
 | 
        if(list != null && list.size() > 0){ 
 | 
            for(StIntakeAmountMonth po : list){ 
 | 
                po.year = year ; 
 | 
                po.month = month ; 
 | 
                dao.saveOneIntakeAmountMonth(po) ; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
    //////////////////////////////////////// 
 | 
    // 
 | 
    // 有关年统计 
 | 
    // 
 | 
    /////////////////////////////////////// 
 | 
    /** 
 | 
     * 删除所有取水口年取水量统计 
 | 
     * @throws Exception 
 | 
     */ 
 | 
    @Transactional 
 | 
    public void deleteAllIntakeAmountYear(){ 
 | 
        dao.deleteAllIntakeAmountYear(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 统计取水口月取水量 
 | 
     * @throws Exception 
 | 
     */ 
 | 
    public void statisticsIntakeAmountYear() throws Exception{ 
 | 
        int nowYear = Integer.parseInt(DateTime.yyyy()) ; 
 | 
        Date startDt ; 
 | 
        Date endDt ; 
 | 
        List<StIntakeAmountYear> list ; 
 | 
        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") ; 
 | 
            list = dao.statisticAllIntakeAmountYearFromAmountDay(startDt, endDt) ; 
 | 
            this.doStatisticsIntakeAmountYear(year, list) ; 
 | 
        } 
 | 
    } 
 | 
    @Transactional 
 | 
    protected void doStatisticsIntakeAmountYear(int year, List<StIntakeAmountYear> list) throws Exception{ 
 | 
        if(list != null && list.size() > 0){ 
 | 
            for(StIntakeAmountYear po : list){ 
 | 
                po.year = year ; 
 | 
                dao.saveOneIntakeAmountYear(po) ; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |