From a4d06f653442ecb91cc48f7ffb4042d6db8d8745 Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Thu, 22 Feb 2024 18:34:16 +0800
Subject: [PATCH] 新预测水位接口

---
 skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/IHsybService.java               |    4 
 skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/impl/HsybServiceImpl.java       |  120 ++++++++++++++++---
 skjcmanager/skjcmanager-service-api/skjcmanager-nky-api/src/main/java/cn/gistack/nky/resultpojo/NewSwFuturePo.java   |   11 +
 skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/impl/HstPredictServiceImpl.java |  184 ++++++++++++++++--------------
 4 files changed, 210 insertions(+), 109 deletions(-)

diff --git a/skjcmanager/skjcmanager-service-api/skjcmanager-nky-api/src/main/java/cn/gistack/nky/resultpojo/NewSwFuturePo.java b/skjcmanager/skjcmanager-service-api/skjcmanager-nky-api/src/main/java/cn/gistack/nky/resultpojo/NewSwFuturePo.java
new file mode 100644
index 0000000..c81965c
--- /dev/null
+++ b/skjcmanager/skjcmanager-service-api/skjcmanager-nky-api/src/main/java/cn/gistack/nky/resultpojo/NewSwFuturePo.java
@@ -0,0 +1,11 @@
+package cn.gistack.nky.resultpojo;
+
+import lombok.Data;
+
+@Data
+public class NewSwFuturePo {
+
+	private String time;
+
+	private String sw;
+}
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/IHsybService.java b/skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/IHsybService.java
index a6f6b31..465a596 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/IHsybService.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/IHsybService.java
@@ -1,8 +1,12 @@
 package cn.gistack.nky.service;
 
+import cn.gistack.nky.resultpojo.NewSwFuturePo;
+
 import java.util.List;
 
 public interface IHsybService {
 
 	List<List<String>> getFuture(String resCd);
+
+	List<NewSwFuturePo> getNewFuture(String resId);
 }
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/impl/HstPredictServiceImpl.java b/skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/impl/HstPredictServiceImpl.java
index 5979ff0..65473b3 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/impl/HstPredictServiceImpl.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/impl/HstPredictServiceImpl.java
@@ -7,6 +7,7 @@
 import cn.gistack.nky.requestpojo.PredictWatersPo;
 import cn.gistack.nky.requestpojo.QueryReqPo;
 import cn.gistack.nky.resultpojo.DataResChildrenPo;
+import cn.gistack.nky.resultpojo.NewSwFuturePo;
 import cn.gistack.nky.service.IHstPredictService;
 import cn.gistack.nky.service.IHsybService;
 import cn.gistack.nky.service.INkyService;
@@ -36,7 +37,11 @@
 	@Override
 	public void getData(String type) {
 		List<DataResChildrenPo> cdList = getCdList(type);
-		List<DataResChildrenPo> collect = cdList.stream().filter(item -> item.getRes_cd().equals("42011640018") || item.getRes_cd().equals("42128140006")).collect(Collectors.toList());
+		List<DataResChildrenPo> collect = cdList.stream().filter(
+//			item -> item.getRes_cd().equals("42011640018") || item.getRes_cd().equals("42128140006")
+			item -> item.getRes_cd().equals("42011640018") || item.getRes_cd().equals("42130350046")|| item.getRes_cd().equals("42092250024")|| item.getRes_cd().equals("42022250039")|| item.getRes_cd().equals("42132150292")
+
+		).collect(Collectors.toList());
 		collect.forEach(dataResChildrenPo -> {
 			//循环请求预测结果
 			QueryReqPo queryReqPo = new QueryReqPo(dataResChildrenPo, type);
@@ -54,97 +59,104 @@
 	@Override
 	public void predictData(String type) {
 		List<DataResChildrenPo> cdList = getCdList(type);
-		//暂时筛选出这两个水库的数据
-		List<DataResChildrenPo> collect = cdList.stream().filter(item -> item.getRes_cd().equals("42011640018") || item.getRes_cd().equals("42128140006")).collect(Collectors.toList());
+		//暂时筛选出数据
+		List<DataResChildrenPo> collect = cdList.stream().filter(
+			item -> item.getRes_cd().equals("42011640018") || item.getRes_cd().equals("42130350046")|| item.getRes_cd().equals("42092250024")|| item.getRes_cd().equals("42022250039")|| item.getRes_cd().equals("42132150292")
+		).collect(Collectors.toList());
 
-		predict(collect,type);
+//		predict(collect,type);
+
+		newPredict(collect,type);
 
 
-//
-//		if (type.equals("1")) {
-//			//渗压
-//			collect.forEach(dataResChildrenPo -> {
-//				//所有水库请求预报数据
-////				if (!resCd.equals(dataResChildrenPo.getRes_cd())) {
-//				//请求预报水位
-//				List<List<String>> future = hsybService.getFuture(dataResChildrenPo.getRes_cd());
-//				resCd = dataResChildrenPo.getRes_cd();
-//				if (future != null && future.size() > 0) {
-//					List<PredictWatersPo> po = new ArrayList<>();
-//					future.forEach(item -> {
-//						PredictWatersPo predictWatersPo = new PredictWatersPo();
-//						//设置时间
-//						predictWatersPo.setTime(item.get(0));
-//						//设置预测水位
-//						predictWatersPo.setValue(Double.parseDouble(item.get(2)));
-//						po.add(predictWatersPo);
-//					});
-//					HstPredictReqPo arimaPredictReqPo = new HstPredictReqPo(dataResChildrenPo, type, po);
-//					//循环预测请求
-//					nkyService.hstPredict(arimaPredictReqPo);
-//				}
-////				}
-//			});
-//		} else if (type.equals("2")) {
-//			//渗流
-//			collect.forEach(dataResChildrenPo -> {
-//				//所有水库请求预报数据
-////				if (!resCd.equals(dataResChildrenPo.getRes_cd())) {
-//				//请求预报水位
-//				List<List<String>> future = hsybService.getFuture(dataResChildrenPo.getRes_cd());
-//				resCd = dataResChildrenPo.getRes_cd();
-//				if (future != null && future.size() > 0) {
-//					List<PredictWatersPo> po = new ArrayList<>();
-//					future.forEach(item -> {
-//						PredictWatersPo predictWatersPo = new PredictWatersPo();
-//						//设置时间
-//						predictWatersPo.setTime(item.get(0));
-//						//设置预测水位
-//						predictWatersPo.setValue(Double.parseDouble(item.get(2)));
-//						po.add(predictWatersPo);
-//					});
-//					HstPredictReqPo arimaPredictReqPo = new HstPredictReqPo(dataResChildrenPo, type, po);
-//					//循环预测请求
-//					nkyService.hstPredict(arimaPredictReqPo);
-//				}
-////				}
-//			});
-//
-//
-//		} else if (type.equals("3") || type.equals("4") || type.equals("5")) {
-//			collect.forEach(dataResChildrenPo -> {
-//				//所有水库请求预报数据
-////				if (!resCd.equals(dataResChildrenPo.getRes_cd())) {
-//				//请求预报水位
-//				List<List<String>> future = hsybService.getFuture(dataResChildrenPo.getRes_cd());
-//				resCd = dataResChildrenPo.getRes_cd();
-//				if (future != null && future.size() > 0) {
-//					List<PredictWatersPo> po = new ArrayList<>();
-//					future.forEach(item -> {
-//						PredictWatersPo predictWatersPo = new PredictWatersPo();
-//						//设置时间
-//						predictWatersPo.setTime(item.get(0));
-//						//设置预测水位
-//						predictWatersPo.setValue(Double.parseDouble(item.get(2)));
-//						po.add(predictWatersPo);
-//					});
-//					//循环预测请求(位移一起请求减少请求次数)
-//					HstPredictReqPo arimaPredictReqPoX = new HstPredictReqPo(dataResChildrenPo, "3", po);
-//					nkyService.hstPredict(arimaPredictReqPoX);
-//
-//					HstPredictReqPo arimaPredictReqPoY = new HstPredictReqPo(dataResChildrenPo, "4", po);
-//					nkyService.hstPredict(arimaPredictReqPoY);
-//
-//					HstPredictReqPo arimaPredictReqPoZ = new HstPredictReqPo(dataResChildrenPo, "5", po);
-//					nkyService.hstPredict(arimaPredictReqPoZ);
-//				}
-////				}
-//			});
+	}
+
+	private void newPredict(List<DataResChildrenPo> collect, String type) {
+
+		String resCd = "";
+		//无数据直接返回
+		if (collect.size() == 0){
+			return;
+		}
+		List<NewSwFuturePo> future = new ArrayList<>();
+		if (type.equals("1") || type.equals("2")){
+
+			for (int i = 0; i < collect.size(); i++) {
+				DataResChildrenPo dataResChildrenPo = collect.get(i);
+				String currentResCd = dataResChildrenPo.getRes_cd();
+
+				//第一个水库
+				if (future.size() == 0 && resCd.equals("")){
+					future = hsybService.getNewFuture(currentResCd);
+					//当前水库
+					resCd = currentResCd;
+				} else if (!resCd.equals(currentResCd)) {
+					//其他水库,获取新的预测数据
+					future = hsybService.getNewFuture(currentResCd);
+					//更换为新水库
+					resCd = currentResCd;
+				}
+
+				//预测数据构造请求数据
+				if (future != null && future.size() > 0) {
+					List<PredictWatersPo> po = new ArrayList<>();
+					future.forEach(item -> {
+						PredictWatersPo predictWatersPo = new PredictWatersPo();
+						//设置时间
+						predictWatersPo.setTime(item.getTime());
+						//设置预测水位
+						predictWatersPo.setValue(Double.parseDouble(item.getSw()));
+						po.add(predictWatersPo);
+					});
+					HstPredictReqPo arimaPredictReqPo = new HstPredictReqPo(dataResChildrenPo, type, po);
+					//循环预测请求
+					nkyService.hstPredict(arimaPredictReqPo);
+				}
 
 
+			}
+		}else if (type.equals("3") || type.equals("4") || type.equals("5")){
 
-//		}
-//		resCd = "";
+			for (int i = 0; i < collect.size(); i++) {
+				DataResChildrenPo dataResChildrenPo = collect.get(i);
+				String currentResCd = dataResChildrenPo.getRes_cd();
+
+				//第一个水库
+				if (future.size() == 0 && resCd.equals("")){
+					future = hsybService.getNewFuture(currentResCd);
+					//当前水库
+					resCd = currentResCd;
+				} else if (!resCd.equals(currentResCd)) {
+					//其他水库,获取新的预测数据
+					future = hsybService.getNewFuture(currentResCd);
+					//更换为新水库
+					resCd = currentResCd;
+				}
+
+				//预测数据构造请求数据
+				if (future != null && future.size() > 0) {
+					List<PredictWatersPo> po = new ArrayList<>();
+					future.forEach(item -> {
+						PredictWatersPo predictWatersPo = new PredictWatersPo();
+						//设置时间
+						predictWatersPo.setTime(item.getTime());
+						//设置预测水位
+						predictWatersPo.setValue(Double.parseDouble(item.getSw()));
+						po.add(predictWatersPo);
+					});
+					//循环预测请求(位移一起请求减少请求次数)
+					HstPredictReqPo arimaPredictReqPoX = new HstPredictReqPo(dataResChildrenPo, "3", po);
+					nkyService.hstPredict(arimaPredictReqPoX);
+
+					HstPredictReqPo arimaPredictReqPoY = new HstPredictReqPo(dataResChildrenPo, "4", po);
+					nkyService.hstPredict(arimaPredictReqPoY);
+
+					HstPredictReqPo arimaPredictReqPoZ = new HstPredictReqPo(dataResChildrenPo, "5", po);
+					nkyService.hstPredict(arimaPredictReqPoZ);
+				}
+			}
+		}
+
 	}
 
 	private void predict(List<DataResChildrenPo> collect, String type) {
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/impl/HsybServiceImpl.java b/skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/impl/HsybServiceImpl.java
index e9121bf..38c89ef 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/impl/HsybServiceImpl.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-nky/src/main/java/cn/gistack/nky/service/impl/HsybServiceImpl.java
@@ -2,20 +2,19 @@
 
 import cn.gistack.common.utils.CommonUtil;
 import cn.gistack.common.utils.SpringContextUtil;
-import cn.gistack.nky.resultpojo.HsybGetFuturePo;
+import cn.gistack.nky.resultpojo.*;
 import cn.gistack.nky.service.IHsybService;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.tool.utils.DateUtil;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springframework.http.*;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -25,8 +24,10 @@
 
 	private static String ONLINE = "http://10.42.7.148:50001";
 	private static String LOCAL = "https://sk.hubeishuiyi.cn";
-	private static String GET_FUTURE =  "/hsybApi/api/fh-admin/skkr/getFuture";
-	private static String GET_FUTURE_ONLINE =  "/api/fh-admin/skkr/getFuture";
+	private static String GET_FUTURE = "/hsybApi/api/fh-admin/skkr/getFuture";
+	private static String GET_NEW_FUTURE = "/hsybApi/api/fh-admin/skkr/getSkFutureSw";
+	private static String GET_FUTURE_ONLINE = "/api/fh-admin/skkr/getFuture";
+	private static String GET_NEW_FUTURE_ONLINE = "/api/fh-admin/skkr/getSkFutureSw";
 
 	private static String AUTHORIZATION = "Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJBRE1JTiIsIlVzZXJJZCI6IjEiLCJzY29wZSI6WyJhbGwiXSwiVXNlclJlYWxOYW1lIjoi6LaF57qn566h55CG5ZGYIiwiVXNlclh6cWhkbSI6IjQyMDUiLCJleHAiOjI1MTk3NzIwMTAsImp0aSI6ImExNTcxYzk1LTBkNjMtNDkyYi1iOWEyLTE2ZTIzNTQ5ZTY1ZiIsImNsaWVudF9pZCI6InVzZXItc2VydmljZSJ9.ebNVZrw9LbhKaj2w6RR8b2wccQiDkhvBeq79SxxCK-yWiOlIFqBkotTN4TNJg8umcpyYvLILwvqXWRJhffEtgi25sX2y6MqLIWM4kMZ9d8ptdnSmTpBPhltSiQOM0KFa1kl5nSDCBwYOLn-pESJglam76cjpgZNoC88x3iNHacdiXDItY0rtY85HrQ26uyJu9UovKtmYmZRHsIbGMpDta5Q1p4vfaCIr-YUayDrCweZJiQDEEcOSpWJ7O7RMk3pRkX_4UmPHFzrOI2lMp1jQIhxnSTE7EVAz_4z8h8r46muSkpF54Ic4XSawHKqdSLHx8T05LB0MpvOzWMPS6c1uHA";
 
@@ -45,15 +46,63 @@
 		}
 	}
 
+	@Override
+	public List<NewSwFuturePo> getNewFuture(String resId) {
+		Map<String, Object> params = new HashMap<>();
+		params.put("resId", resId);
+		HsybGetFuturePo get = apiRequest(GET_NEW_FUTURE, "GET", params);
+
+		//程序转为hashmap,手动转换类型
+		List<NewSwFuturePo> data =JSON.parseArray(JSON.toJSONString(get.getData()), NewSwFuturePo.class);
+		List<NewSwFuturePo> filterData = filterPredict(data);
+
+		log.info(StringUtil.format("过滤后的预测水位数据:{}", JSON.toJSONString(filterData)));
+		return filterData;
+	}
+
+	private HsybGetFuturePo apiRequest(String url, String type, Map<String, Object> params) {
+		// 获取环境
+		String activeProfile = SpringContextUtil.getActiveProfile();
+		if (activeProfile.equals("dev")) {
+			url = LOCAL + url;
+		}
+		if (activeProfile.equals("prod")) {
+			url = ONLINE + GET_NEW_FUTURE_ONLINE;
+		}
+		if (activeProfile.equals("test")) {
+			url = ONLINE + GET_NEW_FUTURE_ONLINE;
+		}
+
+		HttpMethod method;
+		if (type.toLowerCase().equals("get".toLowerCase())) {
+			method = HttpMethod.GET;
+		} else {
+			method = HttpMethod.POST;
+		}
+		// 声明一个header变量
+		HttpHeaders headers = new HttpHeaders();
+		url = url + "?resId=" + params.get("resId");
+		HttpEntity<String> httpEntity = new HttpEntity(null, headers);
+		log.info("请求地址:" + url);
+		log.info("请求参数:" + params);
+		RestTemplate template = new RestTemplate();
+		ResponseEntity<HsybGetFuturePo> response = template.exchange(url, method, httpEntity, HsybGetFuturePo.class);
+
+		if (response.getStatusCodeValue() == 200) {
+			return response.getBody();
+		}
+		return null;
+	}
+
 	public HsybGetFuturePo apiRequest(String url, String jsonparams) {
 
 		// 获取环境
 		String activeProfile = SpringContextUtil.getActiveProfile();
 		if (activeProfile.equals("dev")) {
-			url = LOCAL+ url ;
+			url = LOCAL + url;
 		}
 		if (activeProfile.equals("prod")) {
-			url = ONLINE+ GET_FUTURE_ONLINE ;
+			url = ONLINE + GET_FUTURE_ONLINE;
 		}
 		if (activeProfile.equals("test")) {
 			url = ONLINE + GET_FUTURE_ONLINE;
@@ -101,18 +150,11 @@
 		//获取等于当前时间的水位数据
 		List<List<String>> collect = data.stream().filter(infoList -> infoList.get(0).equals(nowTime)).collect(Collectors.toList());
 
-		collect.forEach(infoList->{
+		collect.forEach(infoList -> {
 			//给第一项重新赋值,因为后面取的是第一项,且预测参数时间只要日期
-			infoList.set(0,infoList.get(4).split(" ")[0]);
+			infoList.set(0, infoList.get(4).split(" ")[0]);
 		});
 		return collect;
-
-
-
-
-
-
-
 
 
 //
@@ -173,10 +215,42 @@
 //		return distinctList;
 	}
 
-	public Integer findIndex(List<List<String>> list,String reg){
+	public List<NewSwFuturePo> filterPredict(List<NewSwFuturePo> list){
+
+		/**
+		 * {
+		 *             "sw": "88.72",
+		 *             "time": "2024-02-01 16:00:00",
+		 *             "resId": "42092250024"
+		 *         },
+		 *         {
+		 *             "sw": "88.72",
+		 *             "time": "2024-02-01 17:00:00",
+		 *             "resId": "42092250024"
+		 *         },
+		 */
+		if (list.size() == 0){
+			return null;
+		}
+
+		//先拿第一个数据,第一个数据就是当前时间的下一个整点的预测数据
+		NewSwFuturePo newSwFuturePo = list.get(0);
+
+		//获取预测数据中,和第一条时间部分相同的数据;再筛选掉水位为0的数据
+		List<NewSwFuturePo> filterList = list.stream().filter(item -> item.getTime().indexOf(newSwFuturePo.getTime().split(" ")[1]) > -1).filter(item->!item.getSw().equals("0.0")).collect(Collectors.toList());
+
+		//给时间重新赋值,因为南科院hst预测只需要日期
+		filterList.forEach(e->{
+			e.setTime(e.getTime().split(" ")[0]);
+		});
+
+		return filterList;
+	}
+
+	public Integer findIndex(List<List<String>> list, String reg) {
 		for (int i = 0; i < list.size(); i++) {
-			if (list.get(i).get(0).indexOf(reg)>-1){
-				return 	i;
+			if (list.get(i).get(0).indexOf(reg) > -1) {
+				return i;
 			}
 		}
 		return -1;

--
Gitblit v1.9.3