gunshi-project-ss/src/main/java/com/gunshi/project/hsz/service/WaterCountAnalysisService.java

127 lines
5.3 KiB
Java
Raw Normal View History

2025-09-01 14:46:02 +08:00
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;
2025-09-26 17:11:26 +08:00
import java.util.Comparator;
2025-09-01 14:46:02 +08:00
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
2025-09-05 15:38:14 +08:00
private StRsvrRService stRsvrRService;//水库历史水位
2025-09-01 14:46:02 +08:00
public List<WaterAnalysisVo> waterSupplyAnalysis(Serializable id) {
XlPlan byId = xlPlanService.getById(id);
List<WaterAnalysisVo> 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<String,BigDecimal> 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<WaterDispatch> waterDispatchAnalysis(Serializable year) {
2025-09-05 15:38:14 +08:00
return waterDispatchService.lambdaQuery().apply("EXTRACT(YEAR FROM dis_start) = {0}", year)
.in(WaterDispatch::getExeStatus, 0, 2)
.list();
2025-09-01 14:46:02 +08:00
}
public List<WaterCapacityAnalysisVo> waterCapacityAnalysis(DateRangeSo dateRangeSo){
List<WaterCapacityAnalysisVo> res = new ArrayList<>();
List<StZvarlB> stZvarlBList = stZvarlBService.list();//获取水位-蓄水量
2025-09-26 17:11:26 +08:00
stZvarlBList.sort(Comparator.comparing(StZvarlB::getRz));
2025-09-01 14:46:02 +08:00
//查询时间段的
LambdaQueryWrapper<StRsvrR> 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<StRsvrR> 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){
2025-09-26 17:11:26 +08:00
currentCap = stZvarlBService.getWByZvarl(stZvarlBList,new BigDecimal(rz));//根据水位计算出库容
2025-09-01 14:46:02 +08:00
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)
2025-09-26 17:11:26 +08:00
.multiply(new BigDecimal(100));
vo.setRate(rate.setScale(2, RoundingMode.HALF_UP));
2025-09-01 14:46:02 +08:00
}
}else{
vo.setRate(new BigDecimal(0).setScale(2, RoundingMode.DOWN));
}
res.add(vo);
}
return res;
}
}