diff --git a/src/main/java/com/gunshi/project/hsz/service/WaterCountAnalysisService.java b/src/main/java/com/gunshi/project/hsz/service/WaterCountAnalysisService.java index 352e535..fca07fd 100644 --- a/src/main/java/com/gunshi/project/hsz/service/WaterCountAnalysisService.java +++ b/src/main/java/com/gunshi/project/hsz/service/WaterCountAnalysisService.java @@ -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 waterSupplyAnalysis(Serializable id) { XlPlan byId = xlPlanService.getById(id); @@ -89,12 +89,16 @@ public class WaterCountAnalysisService { List stZvarlBList = stZvarlBService.list();//获取水位-蓄水量 stZvarlBList.sort(Comparator.comparing(StZvarlB::getRz)); //查询时间段的 + List list = attResBaseService.list(); + AttResBase attResBase = list.get(0); LambdaQueryWrapper 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 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); } diff --git a/src/main/java/com/gunshi/project/hsz/timetask/WaterRTask.java b/src/main/java/com/gunshi/project/hsz/timetask/WaterRTask.java deleted file mode 100644 index 15e422e..0000000 --- a/src/main/java/com/gunshi/project/hsz/timetask/WaterRTask.java +++ /dev/null @@ -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 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 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() + " 条数据到重组表"); - } - } -}