1:删除不必要的定时任务

2:修改水库蓄水量的计算公式
master
yangzhe123 2025-11-06 10:14:12 +08:00
parent 34a3b1c975
commit 50b09e4b65
2 changed files with 29 additions and 163 deletions

View File

@ -5,10 +5,7 @@ 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 com.gunshi.project.hsz.model.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -42,6 +39,9 @@ public class WaterCountAnalysisService {
@Autowired
private StRsvrRService stRsvrRService;//水库历史水位
@Autowired
private AttResBaseService attResBaseService;
public List<WaterAnalysisVo> waterSupplyAnalysis(Serializable id) {
XlPlan byId = xlPlanService.getById(id);
@ -89,12 +89,16 @@ public class WaterCountAnalysisService {
List<StZvarlB> stZvarlBList = stZvarlBService.list();//获取水位-蓄水量
stZvarlBList.sort(Comparator.comparing(StZvarlB::getRz));
//查询时间段的
List<AttResBase> list = attResBaseService.list();
AttResBase attResBase = list.get(0);
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);//根据时间升序
.le(StRsvrR::getTm,dateRangeSo.getEnd())
.eq(StRsvrR::getStcd,attResBase.getStcd());
queryWrapper.orderByDesc(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());
@ -103,21 +107,31 @@ public class WaterCountAnalysisService {
if(rz != null){
currentCap = stZvarlBService.getWByZvarl(stZvarlBList,new BigDecimal(rz));//根据水位计算出库容
vo.setCap(currentCap);
}else{
currentCap = BigDecimal.ZERO;
vo.setCap(currentCap);
}
if(i > 0){
//获取前一天的库容
BigDecimal prevCap = res.get(i - 1).getCap();
if (prevCap == null || BigDecimal.ZERO.compareTo(prevCap) == 0) {
if(i < stRsvrRS.size() - 1){
//获取前一天的库容由于是降序排列前一天的索引是i+1
BigDecimal prevDayCap = null;
String prevRz = stRsvrRS.get(i + 1).getRz();
if(prevRz != null){
prevDayCap = stZvarlBService.getWByZvarl(stZvarlBList, new BigDecimal(prevRz));
}
if (prevDayCap == null || BigDecimal.ZERO.compareTo(prevDayCap) == 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)
//计算变化率: (当天 - 前一天) / 前一天 * 100
BigDecimal diff = currentCap.subtract(prevDayCap);
BigDecimal rate = diff.divide(prevDayCap, 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));
//最后一天时间上最早的一天没有前一天数据变化率为0
vo.setRate(BigDecimal.ZERO.setScale(2, RoundingMode.DOWN));
}
res.add(vo);
}

View File

@ -1,148 +0,0 @@
package com.gunshi.project.hsz.timetask;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.gunshi.project.hsz.model.StWaterR;
import com.gunshi.project.hsz.model.StWaterRReorganize;
import com.gunshi.project.hsz.service.StWaterRReorganizeService;
import com.gunshi.project.hsz.service.StWaterRService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* (
*/
@Component
@Slf4j
//@EnableScheduling
//@Profile({"prod","dev","local"})
public class WaterRTask {
@Autowired
private StWaterRService stWaterRService;
@Autowired
private StWaterRReorganizeService stWaterRReorganizeService;
//每70分钟执行一次
//@Scheduled(fixedRate = 70 , timeUnit = TimeUnit.MINUTES)
public void syncDataToReorganize() {
LambdaQueryWrapper<StWaterRReorganize> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.orderByDesc(StWaterRReorganize::getTm)
.last("limit 1");
StWaterRReorganize stWaterRReorganize = stWaterRReorganizeService.getBaseMapper().selectOne(queryWrapper);
// 获取整编表数据中最新的时间
String newDate = stWaterRReorganize.getTm();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH");
Date newDateObj;
try {
newDateObj = sdf.parse(newDate);
} catch (ParseException e) {
log.error("时间解析失败{}",e.getMessage());
throw new RuntimeException(e);
}
// 在 newDateObj 基础上加一个小时
Calendar calendar = Calendar.getInstance();
calendar.setTime(newDateObj);
calendar.add(Calendar.HOUR_OF_DAY, 1); // 加一个小时
Date newDatePlusOneHour = calendar.getTime();
// 站点配置
//TODO 站点编号待定。
String ecoStcd = "1114";
String stcd1 = "1112";
String stcd2 = "1113";
List<String> stcds = new ArrayList<>(Arrays.asList(ecoStcd, stcd1, stcd2));
// 查询新数据
LambdaQueryWrapper<StWaterR> stWaterRLambdaQueryWrapper = new LambdaQueryWrapper<>();
stWaterRLambdaQueryWrapper.in(StWaterR::getStcd, stcds)
.ge(StWaterR::getTm, newDatePlusOneHour)
.orderByAsc(StWaterR::getTm); // 按时间排序便于处理
List<StWaterR> stWaterRS = stWaterRService.getBaseMapper().selectList(stWaterRLambdaQueryWrapper);
// 使用 DateTimeFormatter线程安全
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH");
Map<String, List<StWaterR>> groupedByTime = stWaterRS.stream()
.collect(Collectors.groupingBy(waterR -> {
try {
Instant instant = waterR.getTm().toInstant();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
return localDateTime.format(formatter);
} catch (Exception e) {
return "未知时间";
}
}));
// 组装数据并保存
List<StWaterRReorganize> reorganizeList = new ArrayList<>();
for (Map.Entry<String, List<StWaterR>> entry : groupedByTime.entrySet()) {
String timeKey = entry.getKey();
List<StWaterR> timeData = entry.getValue();
StWaterRReorganize reorganize = new StWaterRReorganize();
reorganize.setTm(timeKey);
// 初始化各字段为0
reorganize.setEcologyQ(BigDecimal.ZERO);
reorganize.setEcologyV(BigDecimal.ZERO);
reorganize.setMci1Q(BigDecimal.ZERO);
reorganize.setMci1V(BigDecimal.ZERO);
reorganize.setMci2Q(BigDecimal.ZERO);
reorganize.setMci2V(BigDecimal.ZERO);
reorganize.setSumV(BigDecimal.ZERO);
// 按站点类型处理数据
for (StWaterR waterR : timeData) {
String stcd = waterR.getStcd();
BigDecimal q = waterR.getQ();
BigDecimal v = waterR.getV();
if (ecoStcd.equals(stcd)) {
// 生态供水数据
reorganize.setEcologyQ(q);
reorganize.setEcologyV(v);
} else if (stcd1.equals(stcd)) {
// 干渠灌溉1数据
reorganize.setMci1Q(q);
reorganize.setMci1V(v);
} else if (stcd2.equals(stcd)) {
// 干渠灌溉2数据
reorganize.setMci2Q(q);
reorganize.setMci2V(v);
}
}
// 计算水量小计
BigDecimal sumV = reorganize.getEcologyV()
.add(reorganize.getMci1V())
.add(reorganize.getMci2V());
reorganize.setSumV(sumV);
reorganizeList.add(reorganize);
}
// 批量保存到重组表
if (!reorganizeList.isEmpty()) {
stWaterRReorganizeService.saveBatch(reorganizeList);
System.out.println("成功同步 " + reorganizeList.size() + " 条数据到重组表");
}
}
}