diff --git a/src/main/java/com/gunshi/project/xyt/controller/ForecastProjectController.java b/src/main/java/com/gunshi/project/xyt/controller/ForecastProjectController.java index 6c4aab7..ecc811b 100644 --- a/src/main/java/com/gunshi/project/xyt/controller/ForecastProjectController.java +++ b/src/main/java/com/gunshi/project/xyt/controller/ForecastProjectController.java @@ -125,8 +125,8 @@ public class ForecastProjectController { if (Objects.isNull(forecastProject)) { throw new IllegalArgumentException("当前数据不存在"); } - List resultList = forecastResultsService.list(new QueryWrapper().eq("project_id", projectId)); - if(CollectionUtils.isNotEmpty(resultList)) { + List resultList = forecastResultsService.list(new QueryWrapper().eq("project_id", projectId).orderBy(true, true, "tm")); + if (CollectionUtils.isNotEmpty(resultList)) { forecastProject.setVoList(JSON.parseArray(JSON.toJSONString(resultList), ForecastResultVo.class)); forecastResultsService.handleVoList(forecastProject); } diff --git a/src/main/java/com/gunshi/project/xyt/service/ForecastResultsService.java b/src/main/java/com/gunshi/project/xyt/service/ForecastResultsService.java index 0db3e19..867411e 100644 --- a/src/main/java/com/gunshi/project/xyt/service/ForecastResultsService.java +++ b/src/main/java/com/gunshi/project/xyt/service/ForecastResultsService.java @@ -36,6 +36,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Comparator; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -55,6 +56,8 @@ public class ForecastResultsService extends ServiceImpl voList = excuteForecast(forecastTask); + voList.sort(Comparator.comparing(ForecastResultVo::getTm)); return voList; } @@ -127,6 +131,8 @@ public class ForecastResultsService extends ServiceImpl excuteForecast(ForecastTask forecastTask) throws Exception { + // 获取系统当前的水库站编码、汛限水位 + AttResBase attResBase = attResBaseService.getOne(new QueryWrapper<>()); List voList = new ArrayList<>(); Date nowHourTime = forecastTask.getNowTime(); Date startTime = forecastTask.getStartTime(); @@ -137,53 +143,60 @@ public class ForecastResultsService extends ServiceImpl qwExisted = new QueryWrapper<>(); // 如果结束时间在当前时间之前,降雨序列从历史降雨表获取 if (endTime.compareTo(nowHourTime) <= 0) { - qwExisted = new QueryWrapper().eq("stcd", "716153201").ge("tm", startTime).le("tm", endTime).orderBy(true, true, "tm"); + qwExisted = new QueryWrapper().eq("stcd", attResBase.getStcd()).ge("tm", startTime).le("tm", endTime).orderBy(true, true, "tm"); } else { - qwExisted = new QueryWrapper().eq("stcd", "716153201").ge("tm", startTime).le("tm", nowHourTime).orderBy(true, true, "tm"); - pptnRFutureList = getForecastDrpData(nowHourTime, "716153201"); + qwExisted = new QueryWrapper().eq("stcd", attResBase.getStcd()).ge("tm", startTime).le("tm", nowHourTime).orderBy(true, true, "tm"); + pptnRFutureList = getForecastDrpData(nowHourTime, attResBase.getStcd()); } List pptnRExistedList = stPptnRService.list(qwExisted); pptnRAllList.addAll(pptnRExistedList); pptnRAllList.addAll(pptnRFutureList); + if (CollectionUtils.isEmpty(pptnRAllList)) { + return voList; + } // 获取配置参数 List paramList = forecastUseparamService.list(new QueryWrapper().isNotNull("param_code").isNotNull("param_value")); - List uList = forecastUService.list(); - if (CollectionUtils.isEmpty(paramList) || CollectionUtils.isEmpty(uList) || CollectionUtils.isEmpty(pptnRAllList)) { - return voList; + if (CollectionUtils.isEmpty(paramList)) { + throw new IllegalArgumentException("温馨提示:当前洪水预报所依赖的数据尚不完整,请检查入参是否缺失。"); } double dt = 0.0; double Wm = 0.0; - // 每小时的单位径流量,单位m³/s - double[] u = uList.stream().mapToDouble(forecastU -> forecastU.getUValue().doubleValue()).toArray(); Map paramMap = paramList.stream().collect(Collectors.toMap(ForecastUseparam::getParamCode, ForecastUseparam::getParamValue)); - if (paramMap.get("dt").isEmpty() || paramMap.get("Im").isEmpty()) { - return voList; + if (paramMap.get("dt").isEmpty()) { + throw new IllegalArgumentException("温馨提示:当前洪水预报所依赖的数据尚不完整,请检查时间单元△T是否缺失。"); + } + if (paramMap.get("Im").isEmpty()) { + throw new IllegalArgumentException("温馨提示:当前洪水预报所依赖的数据尚不完整,请检查最大初损值Im是否缺失。"); } dt = Double.parseDouble(paramMap.get("dt")); Wm = Double.parseDouble(paramMap.get("Im")); + List uList = forecastUService.list(); + if (CollectionUtils.isEmpty(uList)) { + throw new IllegalArgumentException("温馨提示:当前洪水预报所依赖的数据尚不完整,请检查U(I)单位线是否缺失。"); + } + // 每小时的单位径流量,单位m³/s + double[] u = uList.stream().mapToDouble(forecastU -> forecastU.getUValue().doubleValue()).toArray(); // 根据开始结束时间查询pa Calendar cal = Calendar.getInstance(); cal.setTime(startTime); // 将日期往前推一天 cal.add(Calendar.DATE, -1); - List paList = forecastPaService.list(new QueryWrapper().eq("stcd", "716153201").ge("tm", sdfDay.format(cal.getTime())).le("tm", sdfDay.format(endTime))); + List paList = forecastPaService.list(new QueryWrapper().eq("stcd", attResBase.getStcd()).ge("tm", sdfDay.format(cal.getTime())).le("tm", sdfDay.format(endTime))); if (CollectionUtils.isEmpty(paList)) { - return voList; + throw new IllegalArgumentException("温馨提示:当前洪水预报所依赖的数据尚不完整,请检查每日土壤含水量Pa是否缺失。"); } Map paMap = paList.stream().collect(Collectors.toMap(ForecastPa::getTm, entity -> entity)); // 获取预测开始时间前的最后水库水位 double H1 = 0.0;// 初始水库水位,可以根据H1->V1,H1->q1得到初始的水库库容和下泄流量 - StRsvrR rsvrR = stRsvrRService.getOne(new QueryWrapper().eq("stcd", "716153201").le("tm", startTime).orderBy(true, false, "tm").last("limit 1")); + StRsvrR rsvrR = stRsvrRService.getOne(new QueryWrapper().eq("stcd", attResBase.getStcd()).le("tm", startTime).orderBy(true, false, "tm").last("limit 1")); if (ObjectUtils.isEmpty(rsvrR)) { return voList; } H1 = Double.parseDouble(rsvrR.getRz()); - // 获取汛限水位 - AttResBase attResBase = attResBaseService.getOne(new QueryWrapper<>()); // 泄流量 - List stZqrlBList = stZqrlBService.list(new QueryWrapper().eq("stcd", "716153201")); + List stZqrlBList = stZqrlBService.list(new QueryWrapper().eq("stcd", attResBase.getStcd())); // 水位历史数据 - List rsvrRRealList = stRsvrRService.list(new QueryWrapper().eq("stcd", "716153201").ge("tm", startTime).le("tm", endTime)); + List rsvrRRealList = stRsvrRService.list(new QueryWrapper().eq("stcd", attResBase.getStcd()).ge("tm", startTime).le("tm", endTime)); List resultList = reorganizeRsvrRData(rsvrRRealList, dt); List periods = splitByDay8To8(startTime, endTime); for (Date[] period : periods) { @@ -194,43 +207,40 @@ public class ForecastResultsService extends ServiceImpl pResultList = new ArrayList<>(); - // 筛选时间段内的降雨数据。第一个条件:时间大于等开始时间;第二个条件:时间小于等于结束时间(不包前但包后,比如从8点开始,就要拆下一个时间:9点的数据) - List filterList = pptnRAllList.stream().filter(e -> e.getTm().compareTo(period[0]) >= 0).filter(e -> e.getTm().compareTo(period[1]) <= 0).collect(Collectors.toList()); - // 从第二条数据开始 - for (int i = 1; i < filterList.size(); i++) { - StPptnR stPptnRLast = filterList.get(i - 1); - StPptnR stPptnR = filterList.get(i); - String drp = stPptnR.getDrp(); - // 两条数据的小时差 - double diffHours = dateHourDifference(stPptnRLast.getTm(), stPptnR.getTm()); - // 两条数据间需要增补几条 - int floorNum = (int) Math.floor(diffHours / dt); - for (int j = 0; j < floorNum; j++) { - BigDecimal add = new BigDecimal(drp).divide(BigDecimal.valueOf(floorNum), 2, BigDecimal.ROUND_HALF_UP); - pResultList.add(add.toString()); - } + if (ObjectUtils.isEmpty(forecastPa)) { + throw new IllegalArgumentException("温馨提示:当前洪水预报所依赖的数据尚不完整,请检查每日土壤含水量Pa、K值是否缺失。"); } - double[] PList = pResultList.stream().mapToDouble(Double::parseDouble).toArray(); + // 根据降雨数据,按照△t的颗粒度,均分 + // 筛选时间段内的降雨数据。不包前但包后 + List filterList = pptnRAllList.stream().filter(e -> e.getTm().compareTo(period[0]) >= 0).filter(e -> e.getTm().compareTo(period[1]) <= 0).collect(Collectors.toList()); + Map> retMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(filterList)) { + retMap = reorganizePptnRData(filterList, dt, period[0], period[1]); + } + List pForecastList = retMap.get("listForForecast").stream().map(s -> s.getDrp()).collect(Collectors.toList()); + Map pRealMap = retMap.get("listForReal").stream().collect(Collectors.toMap(pptnR -> sdfMinute.format(pptnR.getTm()), StPptnR::getDrp)); + double[] PList = pForecastList.stream().mapToDouble(Double::parseDouble).toArray(); // 预测执行 List forecastVoList = RrainfallForecast.getData(sdf.format(period[0]), forecastPa.getK().doubleValue(), forecastPa.getPa0().doubleValue(), Wm, forecastPa.getPt0().doubleValue(), H1, dt, - forecastPa.getPa().doubleValue(), PList, u, "716153201"); + forecastPa.getPa().doubleValue(), PList, u, attResBase.getStcd()); if (CollectionUtils.isNotEmpty(forecastVoList)) { // 筛选同时段的真实水位数据 - List realRsvrList = resultList.stream().filter(item -> item.getTm().compareTo(period[0]) >=0 && item.getTm().compareTo(period[1]) <=0).collect(Collectors.toList()); + List realRsvrList = resultList.stream().filter(item -> item.getTm().compareTo(period[0]) >= 0 && item.getTm().compareTo(period[1]) <= 0).collect(Collectors.toList()); + Map realRsvrMap = realRsvrList.stream().collect(Collectors.toMap(rsvr -> sdfMinute.format(rsvr.getTm()), StRsvrR::getRz)); forecastVoList = forecastVoList.subList(0, PList.length); for (int j = 0; j < forecastVoList.size(); j++) { FloodAlgorithemVo floodAlgorithemVo = forecastVoList.get(j); + String dateStr = floodAlgorithemVo.getDateStr(); ForecastResultVo resultVo = new ForecastResultVo(); - resultVo.setTm(floodAlgorithemVo.getDateStr()); + resultVo.setTm(dateStr); resultVo.setYcRkQValue(floodAlgorithemVo.getRq());// 预测入库流量 // resultVo.setRealRkQValue();// 暂无真实入库流量 resultVo.setYcCkQValue(floodAlgorithemVo.getCq());// 预测出库流量 resultVo.setYcSwHValue(floodAlgorithemVo.getKh());// 预测水库水位 H1 = resultVo.getYcSwHValue().doubleValue();// 先以预测水位作为下一次预测段起始值 - if (j < realRsvrList.size()) { - BigDecimal realSwHValue = new BigDecimal(realRsvrList.get(j).getRz()); + String dateMinuteStr = dateStr.substring(0, dateStr.length() - 3);// 年月日 时分 + if (realRsvrMap.containsKey(dateMinuteStr)) { + BigDecimal realSwHValue = new BigDecimal(realRsvrMap.get(dateMinuteStr));// 根据时间取更准确 resultVo.setRealSwHValue(realSwHValue);// 真实水库水位 H1 = realSwHValue.doubleValue();// 如果有真实水位,将最后一条的真实水位作为下一次预测段的初始水位 // 真实出库流量=真实水库水位与泄流量曲线差值法 @@ -246,7 +256,12 @@ public class ForecastResultsService extends ServiceImpl + * @auther: cxw + */ + private Map> reorganizePptnRData(List filterList, double dt, Date startTm, Date endTm) { + Map> retMap = new HashMap<>(); + Map tmDrpMap = filterList.stream().collect(Collectors.toMap(pptnR -> sdfMinute.format(pptnR.getTm()), StPptnR::getDrp)); + List listForForecast = new ArrayList<>();// 传给预测程序使用,缺失的数据为0 + List listForReal = new ArrayList<>();// 返回给前端数据使用,缺失的数据为null + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startTm); + Date dataTm = calendar.getTime(); + // 使用时间一直往后加时间 + while (dataTm.compareTo(endTm) < 0) { + // 时间加1小时,得到应该拆数据的时间,后面往前推 + calendar.add(Calendar.HOUR_OF_DAY, 1); + String shareDrp = "";// 应该分的drp + // 如果下一小时不为空 + if (tmDrpMap.containsKey(sdfMinute.format(calendar.getTime()))) { + StPptnR stPptnRHalf = new StPptnR(); + StPptnR stPptnRHour = new StPptnR(); + stPptnRHour.setTm(calendar.getTime());// 整点时间 + String dataTmDrpHalf = tmDrpMap.get(sdfMinute.format(calendar.getTime())); + BigDecimal drp = new BigDecimal(dataTmDrpHalf).divide(new BigDecimal(2), 2, BigDecimal.ROUND_HALF_UP); + shareDrp = String.valueOf(drp); + stPptnRHalf.setDrp(shareDrp); + stPptnRHour.setDrp(shareDrp); + // 往前推半小时 + calendar.add(Calendar.MINUTE, -(int) (dt * 60)); + stPptnRHalf.setTm(calendar.getTime()); + // 先存半小时数据 + listForForecast.add(stPptnRHalf); + listForReal.add(stPptnRHalf); + // 再存整小时数据 + listForForecast.add(stPptnRHour); + listForReal.add(stPptnRHour); + } else { + StPptnR stPptnRHalfForecast = new StPptnR(); + StPptnR stPptnRHourForecast = new StPptnR(); + StPptnR stPptnRHalfReal = new StPptnR(); + StPptnR stPptnRHourReal = new StPptnR(); + stPptnRHourForecast.setTm(calendar.getTime());// 整点时间 + stPptnRHourReal.setTm(calendar.getTime());// 整点时间 + // 往前推半小时 + calendar.add(Calendar.MINUTE, -(int) (dt * 60)); + stPptnRHalfForecast.setTm(calendar.getTime()); + stPptnRHalfReal.setTm(calendar.getTime()); + // 先存半小时数据 + stPptnRHalfForecast.setDrp("0.00"); + listForForecast.add(stPptnRHalfForecast); + stPptnRHalfReal.setDrp("-1"); + listForReal.add(stPptnRHalfReal); + // 再存整小时数据 + stPptnRHourForecast.setDrp("0.00"); + listForForecast.add(stPptnRHourForecast); + stPptnRHourReal.setDrp("-1"); + listForReal.add(stPptnRHourReal); + } + // 往后推半小时复位 + calendar.add(Calendar.MINUTE, (int) (dt * 60)); + dataTm = calendar.getTime(); + } + retMap.put("listForForecast", listForForecast); + retMap.put("listForReal", listForReal); + return retMap; + } + /** * @description: 将两个时间按照早八点分割成多段 * @param startDate diff --git a/src/main/java/com/gunshi/project/xyt/timetask/DataTask.java b/src/main/java/com/gunshi/project/xyt/timetask/DataTask.java index 33887ba..1540ae3 100644 --- a/src/main/java/com/gunshi/project/xyt/timetask/DataTask.java +++ b/src/main/java/com/gunshi/project/xyt/timetask/DataTask.java @@ -190,7 +190,7 @@ public class DataTask { calendar.add(Calendar.DATE, -40); } else { calendar.setTime(stm); - calendar.add(Calendar.HOUR, 1); + calendar.add(Calendar.HOUR_OF_DAY, 1); } stm = calendar.getTime(); Response resp = client.newCall(new Request.Builder().url(owrsvrPath + hbskpphisRoute) @@ -227,7 +227,7 @@ public class DataTask { * @date: 2024-07-11, 周四, 14:21:35 */ @Async - @Scheduled(fixedRate = 5, timeUnit = TimeUnit.MINUTES) + @Scheduled(cron = "0 30 8 * * ?") public void getSkYqDayData() { Date now = new Date(); System.out.println("雨情按天定时任务,执行时间:" + sdf.format(now)); @@ -352,7 +352,7 @@ public class DataTask { calendar.add(Calendar.DATE, -40); } else { calendar.setTime(stm); - calendar.add(Calendar.HOUR, 1); + calendar.add(Calendar.HOUR_OF_DAY, 1); } stm = calendar.getTime(); Response resp = client.newCall(new Request.Builder().url(owrsvrPath + hbskzzhisRoute) @@ -453,7 +453,7 @@ public class DataTask { calendar.add(Calendar.DATE, -40); } else { calendar.setTime(stm); - calendar.add(Calendar.HOUR, 1); + calendar.add(Calendar.HOUR_OF_DAY, 1); } stm = calendar.getTime(); Response resp = client.newCall(new Request.Builder().url(owrsvrPath + hbskpichisRoute) diff --git a/src/main/java/com/gunshi/project/xyt/timetask/PaDataTask.java b/src/main/java/com/gunshi/project/xyt/timetask/PaDataTask.java index 124d1cd..b01a4cd 100644 --- a/src/main/java/com/gunshi/project/xyt/timetask/PaDataTask.java +++ b/src/main/java/com/gunshi/project/xyt/timetask/PaDataTask.java @@ -7,10 +7,12 @@ import com.gunshi.algorithm.RunoffService; import com.gunshi.project.xyt.model.ForecastK; import com.gunshi.project.xyt.model.ForecastPa; import com.gunshi.project.xyt.model.ForecastUseparam; +import com.gunshi.project.xyt.model.StStbprpB; import com.gunshi.project.xyt.service.ForecastKService; import com.gunshi.project.xyt.service.ForecastPaService; import com.gunshi.project.xyt.service.ForecastUseparamService; import com.gunshi.project.xyt.service.StPptnRService; +import com.gunshi.project.xyt.service.StStbprpBService; import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -56,6 +58,9 @@ public class PaDataTask { @Autowired private StPptnRService stPptnRService; + @Autowired + private StStbprpBService stStbprpBService; + /** * @description: 每天8点30计算的Pa * @param @@ -73,54 +78,58 @@ public class PaDataTask { // 获取配置参数 List paramList = forecastUseparamService.list(new QueryWrapper().isNotNull("param_code").isNotNull("param_value")); List kList = forecastKService.list(); - // 获取最新pa - ForecastPa forecastPaLast = forecastPaService.getOne(new QueryWrapper().orderBy(true, false, "tm").last("limit 1")); - if (CollectionUtils.isNotEmpty(paramList) && CollectionUtils.isNotEmpty(kList) && ObjectUtils.isNotEmpty(forecastPaLast) && !forecastPaLast.getTm().equals(sdfDay.format(nowTime))) { - String lastTm = forecastPaLast.getTm(); - // 获取空缺时间的所有降雨,当天8点到第二天8点间的drp和 - List> mapList = stPptnRService.getPptnRDataList("716153201", lastTm); - Map pptnrMap; - if (CollectionUtils.isNotEmpty(mapList)) { - pptnrMap = mapList.stream().collect(Collectors.toMap(map -> (String) map.get("tm"), map -> map.get("drp"))); - } else { - return; - } - Map kMap = kList.stream().collect(Collectors.toMap(ForecastK::getMonth, ForecastK::getKValue)); - Map paramMap = paramList.stream().collect(Collectors.toMap(ForecastUseparam::getParamCode, ForecastUseparam::getParamValue)); - double Im = Double.parseDouble(paramMap.get("Im"));// 土壤含水量最大值(最大初损值)Im - // 第一次的pa0是最新一条的pa - List list = new ArrayList<>(); - ForecastPa forecastPa = null; - int i = 0; - while (!lastTm.equals(sdfDay.format(nowTime))){ - double lastPa0 = forecastPaLast.getPa().doubleValue(); - double lastPt0; - // 第一次使用最新一条的降雨 - if(i == 0){ - lastPt0 = forecastPaLast.getPt0().doubleValue(); - i ++; - } else { - lastPt0 = Double.valueOf(ObjectUtils.isEmpty(pptnrMap.get(lastTm)) ? "0.0" : pptnrMap.get(lastTm).toString()); + // 查询所有需要统计pa值的站点 + List stStbprpBList = stStbprpBService.list(new QueryWrapper().eq("source", "SK")); + if (CollectionUtils.isNotEmpty(stStbprpBList)) { + for (StStbprpB stb : stStbprpBList) { + String stcd = stb.getStcd(); + // 获取最新pa + ForecastPa forecastPaLast = forecastPaService.getOne(new QueryWrapper().eq("stcd", stcd).orderBy(true, false, "tm").last("limit 1")); + if (CollectionUtils.isNotEmpty(paramList) && CollectionUtils.isNotEmpty(kList) && ObjectUtils.isNotEmpty(forecastPaLast) && !forecastPaLast.getTm().equals(sdfDay.format(nowTime))) { + Calendar calendar2 = Calendar.getInstance(); + calendar2.setTime(sdfDay.parse(forecastPaLast.getTm())); + calendar2.add(Calendar.DAY_OF_MONTH, -3); + String searchTm = sdfDay.format(calendar2.getTime()); + String lastTm = forecastPaLast.getTm(); + // 获取空缺时间的所有降雨,当天8点到第二天8点间的drp和 + List> mapList = stPptnRService.getPptnRDataList(stcd, searchTm); + Map pptnrMap; + if (CollectionUtils.isNotEmpty(mapList)) { + pptnrMap = mapList.stream().collect(Collectors.toMap(map -> (String) map.get("tm"), map -> map.get("drp"))); + } else { + return; + } + Map kMap = kList.stream().collect(Collectors.toMap(ForecastK::getMonth, ForecastK::getKValue)); + Map paramMap = paramList.stream().collect(Collectors.toMap(ForecastUseparam::getParamCode, ForecastUseparam::getParamValue)); + double Im = Double.parseDouble(paramMap.get("Im"));// 土壤含水量最大值(最大初损值)Im + // 第一次的pa0是最新一条的pa + List list = new ArrayList<>(); + ForecastPa forecastPa = null; + int i = 0; + while (!lastTm.equals(sdfDay.format(nowTime))) { + double lastPa0 = forecastPaLast.getPa().doubleValue(); + double lastPt0 = Double.valueOf(ObjectUtils.isEmpty(pptnrMap.get(lastTm)) ? "0.0" : pptnrMap.get(lastTm).toString()); + forecastPa = new ForecastPa(); + // 最新加1天 + calendar.setTime(sdfDay.parse(lastTm)); + calendar.add(Calendar.DAY_OF_MONTH, 1); + lastTm = sdfDay.format(calendar.getTime()); + double k = kMap.get(Integer.valueOf(lastTm.substring(5, 7))).doubleValue(); + double pa = RunoffService.PaCaculate(k, lastPa0, lastPt0, Im); + forecastPa.setStcd(stcd); + forecastPa.setTm(lastTm); + forecastPa.setK(new BigDecimal(k).setScale(2, BigDecimal.ROUND_HALF_UP)); + forecastPa.setPa0(new BigDecimal(lastPa0)); + forecastPa.setIm(new BigDecimal(Im)); + forecastPa.setPt0(new BigDecimal(lastPt0).setScale(2, BigDecimal.ROUND_HALF_UP)); + forecastPa.setPa(new BigDecimal(pa)); + list.add(forecastPa); + forecastPaLast = forecastPa; + } + if (CollectionUtils.isNotEmpty(list)) { + forecastPaService.saveBatch(list); + } } - forecastPa = new ForecastPa(); - // 最新加1天 - calendar.setTime(sdfDay.parse(lastTm)); - calendar.add(Calendar.DAY_OF_MONTH, 1); - lastTm = sdfDay.format(calendar.getTime()); - double k = kMap.get(Integer.valueOf(lastTm.substring(5, 7))).doubleValue(); - double pa = RunoffService.PaCaculate(k, lastPa0, lastPt0, Im); - forecastPa.setStcd("716153201"); - forecastPa.setTm(lastTm); - forecastPa.setK(new BigDecimal(k).setScale(2, BigDecimal.ROUND_HALF_UP)); - forecastPa.setPa0(new BigDecimal(lastPa0)); - forecastPa.setIm(new BigDecimal(Im)); - forecastPa.setPt0(new BigDecimal(lastPt0).setScale(2, BigDecimal.ROUND_HALF_UP)); - forecastPa.setPa(new BigDecimal(pa)); - list.add(forecastPa); - forecastPaLast = forecastPa; - } - if(CollectionUtils.isNotEmpty(list)){ - forecastPaService.saveBatch(list); } } }