diff --git a/src/main/java/com/gunshi/project/hsz/timetask/WaterRTask.java b/src/main/java/com/gunshi/project/hsz/timetask/WaterRTask.java new file mode 100644 index 0000000..cc0a35b --- /dev/null +++ b/src/main/java/com/gunshi/project/hsz/timetask/WaterRTask.java @@ -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 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 stcds = new ArrayList<>(Arrays.asList(ecoStcd, stcd1, stcd2)); + + // 查询新数据 + LambdaQueryWrapper stWaterRLambdaQueryWrapper = new LambdaQueryWrapper<>(); + stWaterRLambdaQueryWrapper.in(StWaterR::getStcd, stcds) + .ge(StWaterR::getTm, newDatePlusOneHour) + .orderByAsc(StWaterR::getTm); // 按时间排序便于处理 + + List stWaterRS = stWaterRService.getBaseMapper().selectList(stWaterRLambdaQueryWrapper); + + // 使用 DateTimeFormatter(线程安全) + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH"); + Map> 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 reorganizeList = new ArrayList<>(); + + for (Map.Entry> entry : groupedByTime.entrySet()) { + String timeKey = entry.getKey(); + List 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() + " 条数据到重组表"); + } + } +}