InApiServiceImpl.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. package com.jiayue.passback.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.json.JSONArray;
  4. import cn.hutool.json.JSONObject;
  5. import cn.hutool.json.JSONUtil;
  6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.jiayue.passback.constants.CommonStant;
  9. import com.jiayue.passback.entity.ForecastPowerShortTerm;
  10. import com.jiayue.passback.entity.ForecastPowerUltraShortTerm;
  11. import com.jiayue.passback.entity.SysParameter;
  12. import com.jiayue.passback.entity.UploadFileLog;
  13. import com.jiayue.passback.entity.eunm.PredictionModelEnum;
  14. import com.jiayue.passback.mapper.ForecastPowerShortTermMapper;
  15. import com.jiayue.passback.mapper.ForecastPowerUltraShortTermMapper;
  16. import com.jiayue.passback.mapper.SystemParameterMapper;
  17. import com.jiayue.passback.mapper.UploadFileLogMapper;
  18. import com.jiayue.passback.service.ForecastPowerShortTermService;
  19. import com.jiayue.passback.service.ForecastPowerUltraShortTermService;
  20. import com.jiayue.passback.service.InApiService;
  21. import com.jiayue.passback.service.UploadFileLogService;
  22. import com.jiayue.passback.util.CacheUtil;
  23. import com.jiayue.passback.util.JsonResultUtil;
  24. import io.jsonwebtoken.JwtBuilder;
  25. import io.jsonwebtoken.Jwts;
  26. import io.jsonwebtoken.SignatureAlgorithm;
  27. import lombok.extern.slf4j.Slf4j;
  28. import net.jodah.expiringmap.ExpirationPolicy;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.transaction.annotation.Transactional;
  31. import org.springframework.util.DigestUtils;
  32. import javax.annotation.Resource;
  33. import java.math.BigDecimal;
  34. import java.text.ParseException;
  35. import java.text.SimpleDateFormat;
  36. import java.time.LocalDateTime;
  37. import java.time.format.DateTimeFormatter;
  38. import java.util.*;
  39. import java.util.concurrent.TimeUnit;
  40. /**
  41. * 预测数据业务实现
  42. *
  43. * @author yh
  44. * @version 1.0
  45. * @since 2022/5/22 11:29
  46. */
  47. @Slf4j
  48. @Service
  49. public class InApiServiceImpl implements InApiService {
  50. @Resource
  51. private SystemParameterMapper systemParameterMapper;
  52. @Resource
  53. private ForecastPowerShortTermMapper forecastPowerShortTermMapper;
  54. @Resource
  55. private ForecastPowerShortTermService forecastPowerShortTermService;
  56. @Resource
  57. private ForecastPowerUltraShortTermMapper forecastPowerUltraShortTermMapper;
  58. @Resource
  59. private ForecastPowerUltraShortTermService forecastPowerUltraShortTermService;
  60. @Resource
  61. private UploadFileLogService uploadFileLogService;
  62. /**
  63. * 获取token
  64. *
  65. * @param userInfo
  66. * @return
  67. */
  68. @Override
  69. public JSONObject getToken(JSONObject userInfo) {
  70. CacheUtil.cacheMap.entrySet().forEach(entry -> log.info("==========user:" + entry.getKey() + "token" + entry.getValue() + "=========="));
  71. JSONObject result;
  72. //获取用户名密码
  73. String requestUserName = userInfo.getStr(CommonStant.REQUEST_USER_NAME);
  74. String requestUserPass = userInfo.getStr(CommonStant.REQUEST_USER_PASS);
  75. // 设置参数
  76. QueryWrapper<SysParameter> wrapper = new QueryWrapper();
  77. wrapper.eq("C_SYS_KEY", "TOKEN_USER");
  78. SysParameter systemParameter = systemParameterMapper.selectOne(wrapper);
  79. if (systemParameter == null || systemParameter.getSysValue() == null || "".equals(systemParameter.getSysValue()) || systemParameter.getSysValue().split(CommonStant.CHARACTER_COLON).length != 2) {
  80. log.error("系统参数TOKEN_USER不正常");
  81. return JsonResultUtil.failureDesc("系统参数TOKEN_USER不正常");
  82. }
  83. String tokenUser = systemParameter.getSysValue();
  84. // 根据用户名获取密码
  85. String userName = tokenUser.split(CommonStant.CHARACTER_COLON)[0];
  86. String userPassWord = tokenUser.split(CommonStant.CHARACTER_COLON)[1];
  87. // 加密后的密码
  88. String passwordMD5t = DigestUtils.md5DigestAsHex(userPassWord.getBytes()).toUpperCase();
  89. // 如果用户名或密码不匹配
  90. if (!requestUserName.equals(userName) || !requestUserPass.equals(passwordMD5t)) {
  91. log.error("账户密码不匹配");
  92. return JsonResultUtil.failureDesc("账户密码不匹配");
  93. }
  94. // 根据用户名去缓存中获取token,如果token已存在,则返回token,如果token不存在,则创建新token并返回
  95. // 根据用户名获取token
  96. String token = CacheUtil.cacheMap.get(userName);
  97. // 如果token不存在,则生成token
  98. if (token == null || "".equals(token) || "null".equals(token)) {
  99. // 生成token
  100. JwtBuilder builder = Jwts.builder()
  101. .setSubject(requestUserName)
  102. //用于设置签发时间
  103. .setIssuedAt(new Date())
  104. //用于设置签名秘钥
  105. .signWith(SignatureAlgorithm.HS256, requestUserPass);
  106. // 获取token
  107. result = JsonResultUtil.success();
  108. token = builder.compact();
  109. result.set(CommonStant.TOKEN, token);
  110. // 将生成的token放入缓存中
  111. CacheUtil.cacheMap.put(userName, token, ExpirationPolicy.CREATED, 1440, TimeUnit.MINUTES);
  112. CacheUtil.cacheMap.entrySet().forEach(entry -> log.info("==========user:" + entry.getKey() + "token" + entry.getValue() + "=========="));
  113. } else {
  114. // 将缓存中查到的token返回
  115. result = JsonResultUtil.success();
  116. result.set(CommonStant.TOKEN, token);
  117. }
  118. // 返回结果
  119. return result;
  120. }
  121. /**
  122. * 获取短期数据并返回json格式
  123. *
  124. * @param requestJson
  125. * @return
  126. */
  127. @Override
  128. public JSONObject getShortWpfData(JSONObject requestJson) {
  129. // 获取场站id
  130. String stationCode = requestJson.getStr("wfId");
  131. String startTime = requestJson.getStr("beginDate");
  132. String endTime = requestJson.getStr("endDate");
  133. SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
  134. try {
  135. long startTimeL = sdfDate.parse(startTime).getTime();
  136. long oneDay = 24 * 60 * 60 * 1000 - 1000;
  137. long endTimeL = sdfDate.parse(endTime).getTime() + oneDay;
  138. // 获取明日短期预测数据
  139. List<ForecastPowerShortTerm> shortList = getShortArr(startTimeL, endTimeL);
  140. //解析短期文件
  141. JSONObject result = fileAnalysis(stationCode, shortList, null, "dq", requestJson.getStr("beginDate"), requestJson.getStr("endDate"));
  142. return result;
  143. } catch (ParseException e) {
  144. log.error(String.valueOf(e));
  145. return JsonResultUtil.failure("获取超短期数据失败");
  146. }
  147. }
  148. /**
  149. * 接收修正短期数据
  150. *
  151. * @param requestJson
  152. * @return
  153. */
  154. @Override
  155. @Transactional(rollbackFor = Exception.class)
  156. public JSONObject putShortWpfData(JSONObject requestJson) {
  157. // 功率json
  158. JSONObject values = JSONUtil.parseObj(requestJson.getJSONArray("values").get(0));
  159. if (values == null || values.getJSONArray("datas").size() == 0) {
  160. return JsonResultUtil.failureDesc("修正短期数据为空");
  161. }
  162. // 明日修正后数据Arr
  163. JSONArray datas = values.getJSONArray("datas");
  164. // 将修正后的明日的一体化数据数据转化为List
  165. List<ForecastPowerShortTerm> dqList = getDqListMap(datas);
  166. if (dqList == null || dqList.size() == 0 || dqList.size() > 96) {
  167. log.error("修正数据大于96条");
  168. return JsonResultUtil.failureDesc("修正数据大于96条");
  169. }
  170. // 更新
  171. updateShortTerm(dqList);
  172. return JsonResultUtil.success();
  173. }
  174. /**
  175. * 获取超短期文件并解析返回json格式
  176. *
  177. * @param requestJson
  178. * @return
  179. */
  180. @Override
  181. public JSONObject getSShortWpfData(JSONObject requestJson) {
  182. String stationCode = requestJson.getStr("wfId");
  183. List<ForecastPowerUltraShortTerm> ultraShortList = getUltraShortArr(requestJson.getStr("beginDate"), requestJson.getStr("endDate"));
  184. //解析短期文件
  185. JSONObject result = fileAnalysis(stationCode, null, ultraShortList, "cdq", requestJson.getStr("beginDate"), requestJson.getStr("endDate"));
  186. return result;
  187. }
  188. /**
  189. * 接收修正超短期数据
  190. *
  191. * @param requestJson
  192. * @return
  193. */
  194. @Transactional(rollbackFor = Exception.class)
  195. @Override
  196. public JSONObject putSShortWpfData(JSONObject requestJson) {
  197. // 功率json
  198. JSONObject values = JSONUtil.parseObj(requestJson.getJSONArray("values").get(0));
  199. // 所有日期的数据Arr
  200. JSONArray datas = values.getJSONArray("datas");
  201. if (datas.size() == 0) {
  202. return JsonResultUtil.failureDesc("修正超短期数据为空");
  203. }
  204. // 将json数据转化为ListMap
  205. List<ForecastPowerUltraShortTerm> cdqListMap = getCdqListMap(datas);
  206. // 更新
  207. updateUltraShortTerm(cdqListMap);
  208. return JsonResultUtil.success();
  209. }
  210. /**
  211. * 获取上报文件
  212. *
  213. * @param requestJson
  214. * @return
  215. */
  216. @Override
  217. public JSONObject getUploadState(JSONObject requestJson) {
  218. String wfId = requestJson.getStr("wfId");
  219. // 山东短期文件类型
  220. String dqArr[] = {"E131", "E132"};
  221. // 山东超短期文件类型
  222. String cdqArr[] = {"E133"};
  223. // 获取最新短期上报文件状态
  224. UploadFileLog uploadFileLogDq = uploadFileLogService.getNewDateByType(dqArr);
  225. // 获取最新超短期上报文件状态
  226. UploadFileLog uploadFileLogCdq = uploadFileLogService.getNewDateByType(cdqArr);
  227. // 拼接json
  228. JSONArray resultArr = new JSONArray();
  229. JSONObject uploadStateJson = new JSONObject();
  230. String dqFileName = "";
  231. String cdqFileName = "";
  232. int dqFileStatus = 0;
  233. int cdqFileStatus = 0;
  234. if (uploadFileLogDq != null) {
  235. dqFileName = uploadFileLogDq.getFileName();
  236. // 如果是E2 则是上报成功,则设置为1,否则为0
  237. dqFileStatus = ("E2".equals(uploadFileLogDq.getFileStatusEnum()) ? 1 : 0);
  238. }
  239. if (uploadFileLogCdq != null) {
  240. cdqFileName = uploadFileLogCdq.getFileName();
  241. // 如果是E2 则是上报成功,则设置为1,否则为0
  242. cdqFileStatus = ("E2".equals(uploadFileLogCdq.getFileStatusEnum()) ? 1 : 0);
  243. }
  244. uploadStateJson.set("spfupfilename", dqFileName);
  245. uploadStateJson.set("spfupstate", dqFileStatus);
  246. uploadStateJson.set("sspfupfilename", cdqFileName);
  247. uploadStateJson.set("sspfupstate", cdqFileStatus);
  248. uploadStateJson.set("wfId", wfId);
  249. resultArr.add(uploadStateJson);
  250. return JsonResultUtil.success(resultArr);
  251. }
  252. /**
  253. * 解析预测数据并返回规定格式的json
  254. *
  255. * @param startDate
  256. * @param endDate
  257. * @return
  258. */
  259. public JSONObject fileAnalysis(String stationCode, List<ForecastPowerShortTerm> shortList, List<ForecastPowerUltraShortTerm> ultraShortList, String type, String startDate, String endDate) {
  260. JSONArray resultArr = new JSONArray();
  261. boolean jx = true;
  262. String compareDate = "";
  263. // 获取短期文件生成日期
  264. String recDate = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDateTime.now());
  265. // 获取当前时间
  266. // 如果当前时间>=13点,则为pm(下午),否则为上午
  267. LocalDateTime now = LocalDateTime.now();
  268. int nowHour = now.getHour();
  269. String version = "AM";
  270. if (nowHour >= 13) {
  271. version = "PM";
  272. }
  273. // 超短期起始时间
  274. String cdqFileStartTime;
  275. try {
  276. // 日数据
  277. JSONObject dayInfoJson = new JSONObject();
  278. //一天中的96条数据信息
  279. JSONArray valuesArr = new JSONArray();
  280. JSONObject oneJson;
  281. JSONArray datas = new JSONArray();
  282. SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
  283. SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  284. // 如果是短期
  285. if ("dq".equals(type)) {
  286. if (shortList == null || shortList.size() == 0) {
  287. log.error("短期实时数据为空");
  288. return JsonResultUtil.failureDesc("短期实时数据为空");
  289. }
  290. for (int i = 0; i < shortList.size(); i++) {
  291. ForecastPowerShortTerm shortTerm = shortList.get(i);
  292. //当条的日期
  293. String thisDate = sdfDate.format(new Date(shortTerm.getForecastTime()));
  294. // 如果当条的日期和上调日期不一致,新建dayInfoJson(日数据json)
  295. if (!thisDate.equals(compareDate)) {
  296. // 如果不是第一条,且和上一条日期不是同一天,则将上条日期的96条数据放入日json数据
  297. if (!"".equals(compareDate)) {
  298. dayInfoJson.set("datas", datas);
  299. valuesArr.add(dayInfoJson);
  300. datas = new JSONArray();
  301. }
  302. // 将当条日期放入compareDate
  303. compareDate = thisDate;
  304. // 新建日json数据
  305. dayInfoJson = new JSONObject();
  306. dayInfoJson.set("version", version);
  307. dayInfoJson.set("date", thisDate);
  308. dayInfoJson.set("recDate", recDate);
  309. }
  310. // 每一条数据的json,放入预测数据和预测时间
  311. oneJson = new JSONObject();
  312. oneJson.set("data", shortTerm.getFpValue().multiply(new BigDecimal("1000")));
  313. oneJson.set("time", sdfDateTime.format(shortTerm.getForecastTime()));
  314. // 将一每条数据放入datas(一天的json)中
  315. datas.add(oneJson);
  316. }
  317. // 将最后一日数据放入valuesArr
  318. dayInfoJson.set("datas", datas);
  319. valuesArr.add(dayInfoJson);
  320. // 将短期预测数据放入powerJson中
  321. JSONObject powerJson = new JSONObject();
  322. powerJson.set("values", valuesArr);
  323. powerJson.set("wfId", stationCode);
  324. powerJson.set("type", "power");
  325. //返回短期数据JSONArray
  326. resultArr.add(powerJson);
  327. } else if ("cdq".equals(type)) {
  328. if (ultraShortList == null || ultraShortList.size() == 0) {
  329. log.error("超短期实时数据为空");
  330. return JsonResultUtil.failureDesc("超短期实时数据为空");
  331. }
  332. cdqFileStartTime = sdfDateTime.format(ultraShortList.get(0).getForecastTime());
  333. datas = new JSONArray();
  334. dayInfoJson = new JSONObject();
  335. dayInfoJson.set("date", cdqFileStartTime);
  336. for (int i = 0; i < ultraShortList.size(); i++) {
  337. ForecastPowerUltraShortTerm ultraShortTerm = ultraShortList.get(i);
  338. // 每一条数据的json,放入预测数据和预测时间
  339. oneJson = new JSONObject();
  340. oneJson.set("time", sdfDateTime.format(ultraShortTerm.getForecastTime()));
  341. oneJson.set("data", ultraShortTerm.getFpValue().multiply(new BigDecimal("1000")));
  342. // 将一每条数据放入datas(一天的json)中
  343. datas.add(oneJson);
  344. }
  345. // 将最后一日数据放入vaulesArr
  346. dayInfoJson.set("datas", datas);
  347. valuesArr.add(dayInfoJson);
  348. // 将短期预测数据放入powerJson中
  349. JSONObject powerJson = new JSONObject();
  350. powerJson.set("wfId", stationCode);
  351. powerJson.set("values", valuesArr);
  352. powerJson.set("type", "power");
  353. //返回短期数据JSONArray
  354. resultArr.add(powerJson);
  355. }
  356. } catch (Exception e) {
  357. log.error(stationCode + " 解析当天DQ数据错误:", e);
  358. return JsonResultUtil.failureDesc("解析当天DQ数据错误");
  359. }
  360. //如果解析成功
  361. return JsonResultUtil.success(resultArr);
  362. }
  363. /**
  364. * 将修正后的短期数据转为list
  365. *
  366. * @param dqDate
  367. * @return
  368. */
  369. public List<ForecastPowerShortTerm> getDqListMap(JSONArray dqDate) {
  370. // 短期预测数据
  371. List<ForecastPowerShortTerm> shortTermList = new ArrayList<>();
  372. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
  373. Date now = new Date();
  374. try {
  375. // 循环短期数据
  376. for (int i = 0; i < dqDate.size(); i++) {
  377. JSONObject oneJson = dqDate.getJSONObject(i);
  378. ForecastPowerShortTerm forecastPowerShortTerm = new ForecastPowerShortTerm();
  379. // 初始化短期数据实体
  380. forecastPowerShortTerm.setPredictionModelEnum(PredictionModelEnum.E11);
  381. forecastPowerShortTerm.setForecastTime(sdf.parse(oneJson.getStr("time")).getTime());
  382. forecastPowerShortTerm.setGenDate(now);
  383. forecastPowerShortTerm.setFpValue(new BigDecimal(oneJson.getStr("data")).divide(new BigDecimal("1000"), 2, BigDecimal.ROUND_HALF_UP));
  384. shortTermList.add(forecastPowerShortTerm);
  385. }
  386. } catch (ParseException e) {
  387. e.printStackTrace();
  388. }
  389. return shortTermList;
  390. }
  391. /**
  392. * 将修正后的超短期数据转为list
  393. *
  394. * @param dqDate
  395. * @return
  396. */
  397. public List<ForecastPowerUltraShortTerm> getCdqListMap(JSONArray dqDate) {
  398. Date now = new Date();
  399. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
  400. List<ForecastPowerUltraShortTerm> ultraShortTermList = new ArrayList<>();
  401. try {
  402. for (int i = 0; i < dqDate.size(); i++) {
  403. JSONObject oneJson = dqDate.getJSONObject(i);
  404. ForecastPowerUltraShortTerm forecastPowerUltraShortTerm = new ForecastPowerUltraShortTerm();
  405. // 初始化短期数据实体
  406. forecastPowerUltraShortTerm.setGenDate(now);
  407. forecastPowerUltraShortTerm.setForecastTime(sdf.parse(oneJson.getStr("time")).getTime());
  408. forecastPowerUltraShortTerm.setFpValue(new BigDecimal(oneJson.getStr("data")).divide(new BigDecimal("1000"), 2, BigDecimal.ROUND_HALF_UP));
  409. forecastPowerUltraShortTerm.setPredictionModelEnum(PredictionModelEnum.E11);
  410. ultraShortTermList.add(forecastPowerUltraShortTerm);
  411. }
  412. } catch (ParseException e) {
  413. e.printStackTrace();
  414. }
  415. return ultraShortTermList;
  416. }
  417. /**
  418. * 获取短期预测数据
  419. *
  420. * @return
  421. */
  422. public List<ForecastPowerShortTerm> getShortArr(long startTime, long endTime) {
  423. // 获取短期预测数据
  424. LambdaQueryWrapper<ForecastPowerShortTerm> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  425. lambdaQueryWrapper.between(ForecastPowerShortTerm::getForecastTime, startTime, endTime);
  426. List<ForecastPowerShortTerm> shortList = forecastPowerShortTermMapper.selectList(lambdaQueryWrapper);
  427. shortList.sort(Comparator.comparing(ForecastPowerShortTerm::getForecastTime));
  428. return shortList;
  429. }
  430. /**
  431. * 根据开始时间和结束时间获取短期数据
  432. *
  433. * @param beginDate
  434. * @param endDate
  435. * @return
  436. */
  437. public List<ForecastPowerUltraShortTerm> getUltraShortArr(String beginDate, String endDate) {
  438. // 获取短期预测数据
  439. LambdaQueryWrapper<ForecastPowerUltraShortTerm> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  440. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
  441. long beginDateL = 0;
  442. long endDateL = 0;
  443. try {
  444. beginDateL = sdf.parse(beginDate).getTime();
  445. endDateL = sdf.parse(endDate).getTime();
  446. } catch (ParseException e) {
  447. e.printStackTrace();
  448. }
  449. // 获取明天日期
  450. lambdaQueryWrapper.between(ForecastPowerUltraShortTerm::getForecastTime, beginDateL, endDateL);
  451. List<ForecastPowerUltraShortTerm> ultraShortList = forecastPowerUltraShortTermMapper.selectList(lambdaQueryWrapper);
  452. ultraShortList.sort(Comparator.comparing(ForecastPowerUltraShortTerm::getForecastTime));
  453. return ultraShortList;
  454. }
  455. /**
  456. * 将修正后明日数据更新到短期实时表中
  457. *
  458. * @return
  459. */
  460. @Transactional(rollbackFor = Exception.class)
  461. public JSONObject updateShortTerm(List<ForecastPowerShortTerm> shortTermList) {
  462. //升序排列
  463. shortTermList.sort(Comparator.comparing(ForecastPowerShortTerm::getForecastTime));
  464. // 获取传入数据的起始时间
  465. long startTime = shortTermList.get(0).getForecastTime();
  466. long endTime = shortTermList.get(shortTermList.size() - 1).getForecastTime();
  467. // long startTime = DateUtil.beginOfDay(DateUtil.tomorrow()).getTime();
  468. // long endTime = DateUtil.endOfDay(DateUtil.tomorrow()).getTime();
  469. // 根据开始时间和结束时间作为删除的查询条件
  470. LambdaQueryWrapper<ForecastPowerShortTerm> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  471. lambdaQueryWrapper.between(ForecastPowerShortTerm::getForecastTime, startTime, endTime);
  472. shortTermList.sort(Comparator.comparing(ForecastPowerShortTerm::getForecastTime));
  473. // 删除明天的预测数据
  474. forecastPowerShortTermMapper.delete(lambdaQueryWrapper);
  475. log.info("删除:{}~{}时间的短期数据成功",new Date(startTime),new Date(endTime));
  476. // 保存明天的预测数据
  477. forecastPowerShortTermService.saveBatch(shortTermList);
  478. return JsonResultUtil.success();
  479. }
  480. /**
  481. * 将修正后的超短期数据更新到超短期实时表中
  482. *
  483. * @return
  484. */
  485. @Transactional
  486. public JSONObject updateUltraShortTerm(List<ForecastPowerUltraShortTerm> ultraShortTermList) {
  487. LambdaQueryWrapper<ForecastPowerUltraShortTerm> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  488. long startTimeL = ultraShortTermList.stream().mapToLong(ForecastPowerUltraShortTerm::getForecastTime).min().getAsLong();
  489. long endTimeL = ultraShortTermList.stream().mapToLong(ForecastPowerUltraShortTerm::getForecastTime).max().getAsLong();
  490. if (ultraShortTermList.size() > 16) {
  491. log.info("====================超短期个数大于16====================");
  492. return JsonResultUtil.failureDesc("超短期个数大于16");
  493. }
  494. ultraShortTermList.sort(Comparator.comparing(ForecastPowerUltraShortTerm::getForecastTime));
  495. lambdaQueryWrapper.between(ForecastPowerUltraShortTerm::getForecastTime, startTimeL, endTimeL);
  496. forecastPowerUltraShortTermMapper.delete(lambdaQueryWrapper);
  497. forecastPowerUltraShortTermService.saveBatch(ultraShortTermList);
  498. return JsonResultUtil.success();
  499. }
  500. }