供水整编-定时任务

master
yangzhe123 2025-09-05 15:58:05 +08:00
parent a4a2ff45a2
commit 0350cc0cca
1 changed files with 143 additions and 0 deletions

View File

@ -0,0 +1,143 @@
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 = 10 , timeUnit = TimeUnit.SECONDS)
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();
// 站点配置
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() + " 条数据到重组表");
}
}
}