package com.gunshi.project.hsz.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.gunshi.db.dto.DateRangeSo; import com.gunshi.project.hsz.entity.vo.WaterAnalysisVo; import com.gunshi.project.hsz.entity.vo.WaterCapacityAnalysisVo; import com.gunshi.project.hsz.model.StRsvrR; import com.gunshi.project.hsz.model.StZvarlB; import com.gunshi.project.hsz.model.WaterDispatch; import com.gunshi.project.hsz.model.XlPlan; 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.io.Serializable; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; @Service @Slf4j @Transactional(rollbackFor = Exception.class) public class WaterCountAnalysisService { @Autowired private XlPlanService xlPlanService;//兴利计划 @Autowired private StWaterRReorganizeService stWaterRReorganizeService;//供水量整编 @Autowired private WaterDispatchService waterDispatchService;//水量调度 @Autowired private StZvarlBService stZvarlBService;//水位-库容 @Autowired private StRsvrRService stRsvrRService;//水库历史水位 public List waterSupplyAnalysis(Serializable id) { XlPlan byId = xlPlanService.getById(id); List res = new ArrayList<>(); WaterAnalysisVo waterAnalysisGGVo = new WaterAnalysisVo(); waterAnalysisGGVo.setType(0); WaterAnalysisVo waterAnalysisSTVo = new WaterAnalysisVo(); waterAnalysisSTVo.setType(1); res.add(waterAnalysisGGVo); res.add(waterAnalysisSTVo); //判断该兴利计划是年度月度 if(byId == null){ throw new IllegalArgumentException("对不起,该计划不存在"); } //如果是月度 //计划灌溉供水量 BigDecimal ggWater = byId.getGgWater(); waterAnalysisGGVo.setPlanSupply(ggWater); //计划生态供水量 BigDecimal stWater = byId.getStWater(); waterAnalysisSTVo.setPlanSupply(stWater); Map map; if(byId.getPlanType().equals(byId.MONTH)){ map = stWaterRReorganizeService.getWaterSupplyerYeaarOrMonth(byId.MONTH,byId.getPlanDate()); }else{ //年度 map = stWaterRReorganizeService.getWaterSupplyerYeaarOrMonth(byId.YEAR,byId.getPlanDate()); } waterAnalysisGGVo.setRealSupply(map.get("gg")); waterAnalysisGGVo.setGapSupply(waterAnalysisGGVo.getRealSupply().subtract(waterAnalysisGGVo.getPlanSupply())); waterAnalysisSTVo.setRealSupply(map.get("st")); waterAnalysisSTVo.setGapSupply(waterAnalysisSTVo.getRealSupply().subtract(waterAnalysisSTVo.getPlanSupply())); return res; } public List waterDispatchAnalysis(Serializable year) { return waterDispatchService.lambdaQuery().apply("EXTRACT(YEAR FROM dis_start) = {0}", year) .in(WaterDispatch::getExeStatus, 0, 2) .list(); } public List waterCapacityAnalysis(DateRangeSo dateRangeSo){ List res = new ArrayList<>(); List stZvarlBList = stZvarlBService.list();//获取水位-蓄水量 stZvarlBList.sort(Comparator.comparing(StZvarlB::getRz)); //查询时间段的 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.apply("date_part('hour',tm) = 8") // 获取每天早上八点的数据 .ge(StRsvrR::getTm,dateRangeSo.getStart()) .le(StRsvrR::getTm,dateRangeSo.getEnd()); queryWrapper.orderByAsc(StRsvrR::getTm);//根据时间升序 List stRsvrRS = stRsvrRService.getBaseMapper().selectList(queryWrapper);//获取水库的历史时间段的水位 for (int i = 0; i < stRsvrRS.size(); i++) { WaterCapacityAnalysisVo vo = new WaterCapacityAnalysisVo(); vo.setTm(stRsvrRS.get(i).getTm()); String rz = stRsvrRS.get(i).getRz();//历史水位 BigDecimal currentCap = BigDecimal.ZERO; if(rz != null){ currentCap = stZvarlBService.getWByZvarl(stZvarlBList,new BigDecimal(rz));//根据水位计算出库容 vo.setCap(currentCap); } if(i > 0){ //获取前一天的库容 BigDecimal prevCap = res.get(i - 1).getCap(); if (prevCap == null || BigDecimal.ZERO.compareTo(prevCap) == 0) { vo.setRate(BigDecimal.ZERO.setScale(2, RoundingMode.DOWN)); } else { //计算变化率: (当天 - 上一天) / 上一天 * 100 BigDecimal diff = currentCap.subtract(prevCap); BigDecimal rate = diff.divide(prevCap, 4, RoundingMode.HALF_UP) .multiply(new BigDecimal(100)); vo.setRate(rate.setScale(2, RoundingMode.HALF_UP)); } }else{ vo.setRate(new BigDecimal(0).setScale(2, RoundingMode.DOWN)); } res.add(vo); } return res; } }