diff --git a/src/main/java/com/gunshi/project/xyt/controller/GateValveRealController.java b/src/main/java/com/gunshi/project/xyt/controller/GateValveRealController.java index bb7c4b6..6869896 100644 --- a/src/main/java/com/gunshi/project/xyt/controller/GateValveRealController.java +++ b/src/main/java/com/gunshi/project/xyt/controller/GateValveRealController.java @@ -22,6 +22,8 @@ import org.springframework.web.bind.annotation.*; import java.io.Serializable; import java.math.BigDecimal; import java.util.List; +import java.util.Map; + /** * 描述: 闸阀开关表 * author: xusan @@ -86,4 +88,10 @@ public class GateValveRealController { public void logExport(@RequestBody GateHisPageSo so, HttpServletResponse response) { service.logExport(so,response); } + + @Operation(summary = "预计可供水时间") + @GetMapping("/supply/time") + public R> supplyTime(@RequestParam(value = "year",required = false) @Parameter(description = "年份") Integer year,@RequestParam(value = "month",required = false) @Parameter(description = "月份") Integer month) { + return R.ok(service.supplyTime(year,month)); + } } \ No newline at end of file diff --git a/src/main/java/com/gunshi/project/xyt/controller/TyYearRainfallController.java b/src/main/java/com/gunshi/project/xyt/controller/TyYearRainfallController.java index 800ff20..68ffb80 100644 --- a/src/main/java/com/gunshi/project/xyt/controller/TyYearRainfallController.java +++ b/src/main/java/com/gunshi/project/xyt/controller/TyYearRainfallController.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gunshi.core.result.R; import com.gunshi.project.xyt.entity.so.TyYearRainfallPageSo; import com.gunshi.project.xyt.entity.vo.TyYearRainfallVo; -import com.gunshi.project.xyt.model.TyYearRainfall; import com.gunshi.project.xyt.service.TyYearRainfallService; import com.gunshi.project.xyt.validate.markers.Insert; import com.gunshi.project.xyt.validate.markers.Update; @@ -50,8 +49,8 @@ public class TyYearRainfallController { @Operation(summary = "列表") @PostMapping("/list") - public R> list() { - return R.ok(service.lambdaQuery().list()); + public R> list() { + return R.ok(service.queryList()); } @Operation(summary = "分页") diff --git a/src/main/java/com/gunshi/project/xyt/model/StWaterRReal.java b/src/main/java/com/gunshi/project/xyt/model/StWaterRReal.java index 121597d..0ecb456 100644 --- a/src/main/java/com/gunshi/project/xyt/model/StWaterRReal.java +++ b/src/main/java/com/gunshi/project/xyt/model/StWaterRReal.java @@ -13,6 +13,7 @@ import jakarta.validation.constraints.Size; import lombok.Data; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; /** @@ -53,7 +54,7 @@ public class StWaterRReal implements Serializable { @TableField(value="q") @Schema(description="流量") // @Size(max = 0,message = "流量最大长度要小于 0") - private String q; + private BigDecimal q; /** * 水量 diff --git a/src/main/java/com/gunshi/project/xyt/service/GateValveRealService.java b/src/main/java/com/gunshi/project/xyt/service/GateValveRealService.java index f0ffdbe..c0cc889 100644 --- a/src/main/java/com/gunshi/project/xyt/service/GateValveRealService.java +++ b/src/main/java/com/gunshi/project/xyt/service/GateValveRealService.java @@ -1,18 +1,21 @@ package com.gunshi.project.xyt.service; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gunshi.project.xyt.entity.so.GateHisPageSo; +import com.gunshi.project.xyt.entity.vo.AttResBaseVo; import com.gunshi.project.xyt.entity.vo.GateStautsVo; import com.gunshi.project.xyt.entity.vo.GateValveOplogVo; -import com.gunshi.project.xyt.mapper.GateValveRMapper; import com.gunshi.project.xyt.mapper.GateValveRealMapper; -import com.gunshi.project.xyt.model.GateValveKey; -import com.gunshi.project.xyt.model.GateValveKeyAutoDao; -import com.gunshi.project.xyt.model.GateValveOplog; -import com.gunshi.project.xyt.model.GateValveReal; +import com.gunshi.project.xyt.mapper.StWaterRRealMapper; +import com.gunshi.project.xyt.mapper.TyYearRainfallMapper; +import com.gunshi.project.xyt.model.*; +import com.gunshi.project.xyt.util.DataHandleUtil; import com.gunshi.project.xyt.util.DateUtil; import com.gunshi.project.xyt.util.ExcelUtil; import jakarta.annotation.Resource; @@ -22,8 +25,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.Date; -import java.util.List; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.util.*; /** * 描述: 闸阀开关表 @@ -39,10 +43,16 @@ public class GateValveRealService extends ServiceImpl gateStatusList() { List list = baseMapper.gateStatusList(); @@ -101,6 +111,65 @@ public class GateValveRealService extends ServiceImpl logList = baseMapper.logList(so); ExcelUtil.exportExcel(logList,"闸阀操作日志",GateValveOplogVo.class,response,"闸阀操作日志"); } + + public Map supplyTime(Integer year, Integer month) { + Map map = new HashMap<>(); + /** + * 可供水量= 实时库容 - 死库容 + * 小时水量= (输水管流量 + 放水管流量)*3600 + * 可供水小时数 = 可供水量 / 小时水量 + * 可供水天数 = 可供水小时数换算为天数 + */ + List list = reservoirWaterService.list(); + if(CollectionUtils.isEmpty(list)){ + return map; + } + AttResBaseVo attResBaseVo = list.get(0); + BigDecimal nowCap = attResBaseVo.getNowCap() == null ? new BigDecimal(0) : attResBaseVo.getNowCap(); + BigDecimal deadCap = attResBaseVo.getDeadCap(); + + BigDecimal supplyV = nowCap.subtract(deadCap); + if(year != null){ + //计算预测来水量 + BigDecimal predictV = calcPredictV(year,month,attResBaseVo.getWatShedArea()); + supplyV = supplyV.add(predictV); + } + List water = stWaterRRealMapper.listRelated(); + //小时水量 + BigDecimal hourQ = water.stream().map(StWaterRReal::getQ).reduce(BigDecimal.ZERO, BigDecimal::add).multiply(new BigDecimal(3600)); + BigDecimal day = supplyV.multiply(new BigDecimal(10000)).divide(hourQ.multiply(new BigDecimal(24)),1, RoundingMode.HALF_UP); + long l = DataHandleUtil.BigDecimalIntegerPart(day); + String date = DateUtil.getPlusDate(new Date(), l); + map.put(day,date); + return map; + } + + private BigDecimal calcPredictV(Integer year, Integer month,BigDecimal watShedArea) { + LocalDate now = LocalDate.now(); + Integer nowMonth = now.getMonthValue(); + + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(TyYearRainfall::getYear,year) + .eq(TyYearRainfall::getType,2) + .ge(TyYearRainfall::getMonth,nowMonth) + .le(TyYearRainfall::getMonth,month); + List list = tyYearRainfallMapper.selectList(queryWrapper); + + //和当前月份相同的降雨量 + Optional first = list.stream().filter(o -> nowMonth == o.getMonth()).findFirst(); + BigDecimal drp = first.isPresent() ? first.get().getDrp() : new BigDecimal(0); + int dayOfMonth = now.getDayOfMonth(); + int total = now.lengthOfMonth(); + BigDecimal nowMonthDrp = new BigDecimal((total - dayOfMonth + 1)).multiply(drp).divide(new BigDecimal(total), 2, RoundingMode.HALF_UP); + + //当前月到预测月份的降雨量 + BigDecimal value = list.stream().filter(o -> nowMonth != o.getMonth()).map(TyYearRainfall::getDrp).reduce(BigDecimal.ZERO, BigDecimal::add); + + //预测来水量 = 月降雨量和 * 水库坝址控制流域面积 + BigDecimal sum = nowMonthDrp.add(value); + return sum.multiply(watShedArea); + } + } diff --git a/src/main/java/com/gunshi/project/xyt/service/TyYearRainfallService.java b/src/main/java/com/gunshi/project/xyt/service/TyYearRainfallService.java index c140b52..42b53a6 100644 --- a/src/main/java/com/gunshi/project/xyt/service/TyYearRainfallService.java +++ b/src/main/java/com/gunshi/project/xyt/service/TyYearRainfallService.java @@ -10,6 +10,7 @@ import com.gunshi.project.xyt.entity.so.TyYearRainfallPageSo; import com.gunshi.project.xyt.entity.vo.TyYearRainfallVo; import com.gunshi.project.xyt.mapper.TyYearRainfallMapper; import com.gunshi.project.xyt.model.TyYearRainfall; +import com.gunshi.project.xyt.util.MyBeanUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -71,13 +72,17 @@ public class TyYearRainfallService extends ServiceImpl ret) { if (ret.getRecords() != null) { - for (TyYearRainfallVo record : ret.getRecords()) { - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.eq(TyYearRainfall::getYear,record.getYear()) - .eq(TyYearRainfall::getType,2) - .orderByAsc(TyYearRainfall::getMonth); - record.setList(this.list(queryWrapper)); - } + queryChild(ret.getRecords()); + } + } + + private void queryChild(List records) { + for (TyYearRainfallVo record : records) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(TyYearRainfall::getYear,record.getYear()) + .eq(TyYearRainfall::getType,2) + .orderByAsc(TyYearRainfall::getMonth); + record.setList(this.list(queryWrapper)); } } @@ -109,6 +114,15 @@ public class TyYearRainfallService extends ServiceImpl queryList() { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(TyYearRainfall::getType,1); + List list = this.list(queryWrapper); + List resList = MyBeanUtil.collectionCopy(list,TyYearRainfallVo.class); + queryChild(resList); + return resList; + } } diff --git a/src/main/java/com/gunshi/project/xyt/util/DataHandleUtil.java b/src/main/java/com/gunshi/project/xyt/util/DataHandleUtil.java index 140a132..9aec129 100644 --- a/src/main/java/com/gunshi/project/xyt/util/DataHandleUtil.java +++ b/src/main/java/com/gunshi/project/xyt/util/DataHandleUtil.java @@ -11,6 +11,16 @@ import java.util.Map; public class DataHandleUtil { + /** + * 判断BigDecimal的小数部分是否为0 + * @param bigDecimal + * @return + */ + public static long BigDecimalIntegerPart(BigDecimal bigDecimal) { + BigDecimal integerPart = bigDecimal.setScale(0, RoundingMode.UP); + return integerPart.longValue(); + } + public static BigDecimal calcData(BigDecimal rz, Map map,List list) { //库容曲线中最近的一组水位 diff --git a/src/main/java/com/gunshi/project/xyt/util/DateUtil.java b/src/main/java/com/gunshi/project/xyt/util/DateUtil.java index 5dfcfed..a370b6d 100644 --- a/src/main/java/com/gunshi/project/xyt/util/DateUtil.java +++ b/src/main/java/com/gunshi/project/xyt/util/DateUtil.java @@ -3,6 +3,7 @@ package com.gunshi.project.xyt.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; @@ -24,6 +25,8 @@ public class DateUtil { private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private static DateTimeFormatter ymdformat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + private static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd日HH时"); private static DateTimeFormatter ym = DateTimeFormatter.ofPattern("YYYYMM"); @@ -116,10 +119,11 @@ public class DateUtil { return minusTime.format(formatter); } - public static String getPlusTime(String str,long hour){ - LocalDateTime dateTime = LocalDateTime.parse(str, formatter); - LocalDateTime minusTime = dateTime.plusHours(hour); - return minusTime.format(formatter); + public static String getPlusDate(Date date,long day){ + String str = convertDateToString(date); + LocalDate localDate = LocalDate.parse(str, ymdformat); + LocalDate plusDay = localDate.plusDays(day); + return plusDay.format(ymdformat); } public static String getTodayEight(){