parent
34a3b1c975
commit
50b09e4b65
|
|
@ -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);//根据时间升序
|
||||
.ge(StRsvrR::getTm,dateRangeSo.getStart())
|
||||
.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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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() + " 条数据到重组表");
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue