供水整编-定时任务
parent
a4a2ff45a2
commit
0350cc0cca
|
|
@ -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() + " 条数据到重组表");
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue