diff --git a/src/main/java/com/gunshi/project/hsz/controller/WaterCountAnalysisController.java b/src/main/java/com/gunshi/project/hsz/controller/WaterCountAnalysisController.java new file mode 100644 index 0000000..f26a745 --- /dev/null +++ b/src/main/java/com/gunshi/project/hsz/controller/WaterCountAnalysisController.java @@ -0,0 +1,52 @@ +package com.gunshi.project.hsz.controller; + +import com.gunshi.core.result.R; +import com.gunshi.db.dto.DateRangeSo; +import com.gunshi.db.dto.MonthRangeSo; +import com.gunshi.project.hsz.entity.vo.WaterAnalysisVo; +import com.gunshi.project.hsz.entity.vo.WaterCapacityAnalysisVo; +import com.gunshi.project.hsz.model.WaterDispatch; +import com.gunshi.project.hsz.model.XlPlan; +import com.gunshi.project.hsz.service.WaterCountAnalysisService; +import com.gunshi.project.hsz.service.XlPlanService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.io.Serializable; +import java.util.List; + +@Tag(name = "水资源调度-统计分析") +@RestController +@RequestMapping(value="/wca") +public class WaterCountAnalysisController { + + + @Autowired + private WaterCountAnalysisService waterCountAnalysisService; + + + @Operation(summary = "供水分析") + @GetMapping("/waterSupplyAnalysis") + public R> waterSupplyAnalysis(@RequestParam("id") Serializable id) { + + List res = waterCountAnalysisService.waterSupplyAnalysis(id); + return R.ok(res); + } + + + @Operation(summary = "调度执行分析") + @GetMapping("/waterDispatchAnalysis") + public R> waterDispatchAnalysis(@RequestParam("year") Serializable year) { + List res = waterCountAnalysisService.waterDispatchAnalysis(year); + return R.ok(res); + } + + @Operation(summary = "水库蓄水量分析") + @PostMapping("/waterCapacityAnalysis") + public R> waterCapacityAnalysis(@RequestBody DateRangeSo dateRangeSo) { + List res = waterCountAnalysisService.waterCapacityAnalysis(dateRangeSo); + return R.ok(res); + } +} diff --git a/src/main/java/com/gunshi/project/hsz/entity/vo/WaterAnalysisVo.java b/src/main/java/com/gunshi/project/hsz/entity/vo/WaterAnalysisVo.java new file mode 100644 index 0000000..ce41399 --- /dev/null +++ b/src/main/java/com/gunshi/project/hsz/entity/vo/WaterAnalysisVo.java @@ -0,0 +1,25 @@ +package com.gunshi.project.hsz.entity.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class WaterAnalysisVo { + + + @Schema(description = "用水类型 0灌溉 1生态") + private Integer type; + + @Schema(description = "计划供水量") + private BigDecimal planSupply; + + @Schema(description = "实际供水量") + private BigDecimal realSupply; + + @Schema(description = "偏差量") + private BigDecimal gapSupply; + +} diff --git a/src/main/java/com/gunshi/project/hsz/entity/vo/WaterCapacityAnalysisVo.java b/src/main/java/com/gunshi/project/hsz/entity/vo/WaterCapacityAnalysisVo.java new file mode 100644 index 0000000..1601caf --- /dev/null +++ b/src/main/java/com/gunshi/project/hsz/entity/vo/WaterCapacityAnalysisVo.java @@ -0,0 +1,23 @@ +package com.gunshi.project.hsz.entity.vo; + + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class WaterCapacityAnalysisVo { + + @Schema(description = "时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date tm; + + @Schema(description = "蓄水量") + private BigDecimal cap; + + @Schema(description = "变化率") + private BigDecimal rate; +} diff --git a/src/main/java/com/gunshi/project/hsz/model/WaterDispatch.java b/src/main/java/com/gunshi/project/hsz/model/WaterDispatch.java index d5bbced..2e0c08d 100644 --- a/src/main/java/com/gunshi/project/hsz/model/WaterDispatch.java +++ b/src/main/java/com/gunshi/project/hsz/model/WaterDispatch.java @@ -36,6 +36,10 @@ public class WaterDispatch { @Schema(description = "是否下发 0 是 1 否") private Integer isDistribute; + + @TableField("dis_year") + private String disYear; + /** * 调度指令名称 */ diff --git a/src/main/java/com/gunshi/project/hsz/service/WaterCountAnalysisService.java b/src/main/java/com/gunshi/project/hsz/service/WaterCountAnalysisService.java new file mode 100644 index 0000000..82da904 --- /dev/null +++ b/src/main/java/com/gunshi/project/hsz/service/WaterCountAnalysisService.java @@ -0,0 +1,125 @@ +package com.gunshi.project.hsz.service; + + +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 lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +@Slf4j +@Transactional(rollbackFor = Exception.class) +public class WaterCountAnalysisService { + + @Autowired + private XlPlanService xlPlanService;//兴利计划 + + @Autowired + private StWaterRReorganizeService stWaterRReorganizeService;//供水量整编 + + @Autowired + private WaterDispatchService waterDispatchService;//水量调度 + + @Autowired + private StZvarlBService stZvarlBService;//水位-库容 + + @Autowired + private StRsvrRService stRsvrRService; + + + public List waterSupplyAnalysis(Serializable id) { + XlPlan byId = xlPlanService.getById(id); + List res = new ArrayList<>(); + WaterAnalysisVo waterAnalysisGGVo = new WaterAnalysisVo(); + waterAnalysisGGVo.setType(0); + WaterAnalysisVo waterAnalysisSTVo = new WaterAnalysisVo(); + waterAnalysisSTVo.setType(1); + res.add(waterAnalysisGGVo); + res.add(waterAnalysisSTVo); + //判断该兴利计划是年度月度 + if(byId == null){ + throw new IllegalArgumentException("对不起,该计划不存在"); + } + //如果是月度 + //计划灌溉供水量 + BigDecimal ggWater = byId.getGgWater(); + waterAnalysisGGVo.setPlanSupply(ggWater); + //计划生态供水量 + BigDecimal stWater = byId.getStWater(); + waterAnalysisSTVo.setPlanSupply(stWater); + Map map; + if(byId.getPlanType().equals(byId.MONTH)){ + map = stWaterRReorganizeService.getWaterSupplyerYeaarOrMonth(byId.MONTH,byId.getPlanDate()); + }else{ + //年度 + map = stWaterRReorganizeService.getWaterSupplyerYeaarOrMonth(byId.YEAR,byId.getPlanDate()); + } + waterAnalysisGGVo.setRealSupply(map.get("gg")); + waterAnalysisGGVo.setGapSupply(waterAnalysisGGVo.getRealSupply().subtract(waterAnalysisGGVo.getPlanSupply())); + waterAnalysisSTVo.setRealSupply(map.get("st")); + waterAnalysisSTVo.setGapSupply(waterAnalysisSTVo.getRealSupply().subtract(waterAnalysisSTVo.getPlanSupply())); + + return res; + } + + public List waterDispatchAnalysis(Serializable year) { + List list = waterDispatchService.listByYear(year.toString()); + return list; + } + + public List waterCapacityAnalysis(DateRangeSo dateRangeSo){ + List res = new ArrayList<>(); + List stZvarlBList = stZvarlBService.list();//获取水位-蓄水量 + //查询时间段的 + 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);//根据时间升序 + List stRsvrRS = stRsvrRService.getBaseMapper().selectList(queryWrapper);//获取水库的历史时间段的水位 + for (int i = 0; i < stRsvrRS.size(); i++) { + WaterCapacityAnalysisVo vo = new WaterCapacityAnalysisVo(); + vo.setTm(stRsvrRS.get(i).getTm()); + String rz = stRsvrRS.get(i).getRz();//历史水位 + BigDecimal currentCap = BigDecimal.ZERO; + if(rz != null){ + //TODO 这里需要根据公式进行计算 + currentCap = stZvarlBService.getWFromZvarl(new BigDecimal(rz).setScale(0,RoundingMode.DOWN),null,stZvarlBList);//获取库容 + vo.setCap(currentCap); + } + if(i > 0){ + //获取前一天的库容 + BigDecimal prevCap = res.get(i - 1).getCap(); + if (prevCap == null || BigDecimal.ZERO.compareTo(prevCap) == 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) + .multiply(new BigDecimal(100)) + .setScale(2, RoundingMode.DOWN); + vo.setRate(rate); + } + }else{ + vo.setRate(new BigDecimal(0).setScale(2, RoundingMode.DOWN)); + } + res.add(vo); + } + return res; + } +} diff --git a/src/main/java/com/gunshi/project/hsz/service/WaterDispatchService.java b/src/main/java/com/gunshi/project/hsz/service/WaterDispatchService.java index c58688d..ae7ea26 100644 --- a/src/main/java/com/gunshi/project/hsz/service/WaterDispatchService.java +++ b/src/main/java/com/gunshi/project/hsz/service/WaterDispatchService.java @@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; import java.util.Objects; @Service @@ -66,4 +67,8 @@ public class WaterDispatchService extends ServiceImpl waterDispatchPage = baseMapper.selectPage(pageSo.getPageSo().toPage(), queryWrapper); return waterDispatchPage; } + + public List listByYear(String year) { + return this.lambdaQuery().eq(WaterDispatch::getDisYear, year).in(WaterDispatch::getExeStatus,0,2).list(); + } }