DataRecalculationImpl.java 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. package com.jiayue.biz.service.impl;
  2. import cn.hutool.core.util.ZipUtil;
  3. import cn.hutool.poi.excel.ExcelReader;
  4. import cn.hutool.poi.excel.ExcelUtil;
  5. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  6. import com.jiayue.biz.domain.*;
  7. import com.jiayue.biz.mapper.ProphaseAnemometryDataMapper;
  8. import com.jiayue.biz.mapper.ProphaseWeatherDataMapper;
  9. import com.jiayue.biz.service.DataRecalculationService;
  10. import com.jiayue.biz.service.EquipmentAttributeService;
  11. import com.jiayue.biz.service.ProphaseWeatherDataService;
  12. import com.jiayue.biz.service.WindTowerDataChildTableService;
  13. import com.jiayue.biz.util.DateTimeUtil;
  14. import com.jiayue.biz.util.FileUtil;
  15. import com.jiayue.common.core.domain.AjaxResult;
  16. import com.jiayue.common.utils.file.FileUtils;
  17. import lombok.AllArgsConstructor;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.apache.poi.xssf.streaming.SXSSFRow;
  20. import org.apache.poi.xssf.streaming.SXSSFSheet;
  21. import org.apache.poi.xssf.streaming.SXSSFWorkbook;
  22. import org.joda.time.DateTime;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.stereotype.Service;
  25. import org.springframework.web.multipart.MultipartFile;
  26. import java.io.*;
  27. import java.sql.Timestamp;
  28. import java.text.SimpleDateFormat;
  29. import java.util.*;
  30. import java.util.stream.Collectors;
  31. /**
  32. * 上传文件or数据过滤
  33. *
  34. * @author whc
  35. * @Date 2022/06/23
  36. */
  37. @Slf4j
  38. @Service
  39. @AllArgsConstructor
  40. public class DataRecalculationImpl implements DataRecalculationService {
  41. private final WindTowerDataParentTableServiceImpl windTowerDataParentTableService;
  42. private final WindTowerInfoServiceImpl windTowerInfoService;
  43. private final WindTowerCalculationDataServiceImpl windTowerCalculationDataService;
  44. private final WindDirectionStatisticsDataServiceImpl windDirectionStatisticsDataService;
  45. private final EquipmentAttributeService equipmentAttributeService;
  46. private final StatisticsSituationServiceImpl statisticsSituationService;
  47. private AnalysisDataImpl analysisData;
  48. private final ProphaseWeatherDataService prophaseWeatherDataService;
  49. private final ProphaseAnemometryDataMapper prophaseAnemometryDataMapper;
  50. public void teset() {
  51. // File file1 = MultipartFileToFile(file);
  52. // //如果是压缩包
  53. // if(AnalysisDataImpl.isArchiveFile(file1)){
  54. //// String zipPath = file1.getPath();
  55. // //解压文件
  56. // ZipUtil.unzip(file1.getPath() + "\\");
  57. // //删除压缩包
  58. //// FileUtils.deleteFile(zipPath);
  59. // }
  60. }
  61. /**
  62. * 文件上传解析
  63. *
  64. * @param file 上传的文件
  65. * @param equipmentNo 设备编号
  66. * @param recorderNo 记录仪编号
  67. * @return
  68. */
  69. @Override
  70. public AjaxResult uploadFileAnalysis(MultipartFile file, String equipmentNo, String recorderNo) {
  71. try {
  72. //D:\\program\\uploadFile\\new
  73. String path = FileUtil.getFileUploadPath() + File.separator + "new";
  74. File filePath = new File(path);
  75. //判断目录是否存在
  76. if (!filePath.exists()) {
  77. filePath.mkdirs();
  78. }
  79. String originalFilename = file.getOriginalFilename();
  80. //如果是压缩文件
  81. if (originalFilename.contains(".zip")) {
  82. File file1 = MultipartFileToFile(file);
  83. //如果是压缩包
  84. if (AnalysisDataImpl.isArchiveFile(file1)) {
  85. //解压文件
  86. File unzip = ZipUtil.unzip(file1.getPath() + "\\");
  87. File[] files = unzip.listFiles();
  88. if (files != null) {
  89. for (File file2 : files) {
  90. if (file2.getName().contains("rld")) {
  91. String[] id = file2.getName().split("_");
  92. if (id[0].equals(equipmentNo)) {
  93. //文件保存到指定目录下
  94. FileUtil.move(file2.getPath(), path + File.separator);
  95. //如果文件名的后缀为.rld 则转换
  96. //调用系统命令转换
  97. this.systemCommand(equipmentNo, recorderNo);
  98. }
  99. } else if (file2.getName().contains(".RWD")) {
  100. path = "D:\\in\\";
  101. FileUtil.move(file2.getPath(), path);
  102. this.systemCommandRWD();
  103. } else if (file2.getName().contains(".csv") || file2.getName().contains(".CSV")) {
  104. analysisData.acousticRadar(file2, equipmentNo);
  105. } else if (file2.getName().contains(".dat")) {
  106. path = "D:\\in\\";
  107. FileUtil.move(file2.getPath(), path);
  108. analysisData.parseByDat(file2);
  109. } else {
  110. return AjaxResult.error("请检查数据文件是否正确");
  111. }
  112. }
  113. //删除压缩包
  114. FileUtils.deleteFile(file1.getPath());
  115. }
  116. return AjaxResult.success("上传完成");
  117. }
  118. }
  119. //如果不是压缩文件
  120. String[] names = file.getOriginalFilename().split("\\.");
  121. //如果不是rld文件则不解析
  122. if (names[names.length - 1].equals("rld")) {
  123. String[] id = file.getOriginalFilename().split("_");
  124. if (id[0].equals(equipmentNo)) {
  125. //文件保存到指定目录下
  126. file.transferTo(new File(path + File.separator + originalFilename));
  127. //如果文件名的后缀为.rld 则转换
  128. //调用系统命令转换
  129. this.systemCommand(equipmentNo, recorderNo);
  130. return AjaxResult.success("成功");
  131. } else {
  132. return AjaxResult.error("不是该测风塔的文件");
  133. }
  134. } else if (originalFilename.contains(".RWD")) {
  135. path = "D:\\in\\";
  136. file.transferTo(new File(path + File.separator + file.getOriginalFilename()));
  137. this.systemCommandRWD();
  138. return AjaxResult.success("成功");
  139. } else if (originalFilename.contains(".csv")) {
  140. analysisData.acousticRadar(MultipartFileToFile(file), equipmentNo);
  141. return AjaxResult.success("成功");
  142. } else if (originalFilename.contains(".dat")) {
  143. path = "D:\\in\\";
  144. file.transferTo(new File(path + File.separator + file.getOriginalFilename()));
  145. analysisData.parseByDat(MultipartFileToFile(file));
  146. return AjaxResult.success("成功");
  147. } else {
  148. return AjaxResult.error("请检查数据文件是否正确");
  149. }
  150. } catch (Exception ex) {
  151. log.error("上传失败" + ex);
  152. return AjaxResult.error(ex.getMessage());
  153. }
  154. }
  155. /**
  156. * 将MultipartFile转换为File
  157. *
  158. * @param multiFile
  159. * @return
  160. */
  161. public static File MultipartFileToFile(MultipartFile multiFile) {
  162. // 获取文件名
  163. String fileName = multiFile.getOriginalFilename();
  164. // 获取文件后缀
  165. String prefix = fileName.substring(fileName.lastIndexOf("."));
  166. // 若须要防止生成的临时文件重复,能够在文件名后添加随机码
  167. try {
  168. File file = File.createTempFile(fileName, prefix);
  169. multiFile.transferTo(file);
  170. return file;
  171. } catch (Exception e) {
  172. e.printStackTrace();
  173. }
  174. return null;
  175. }
  176. /**
  177. * rwd文件转换txt
  178. */
  179. public void systemCommandRWD() {
  180. try {
  181. Runtime runtime = Runtime.getRuntime();
  182. List<WindTowerInfo> windTowerInfoList = windTowerInfoService.getAllWindTower();
  183. File file = new File("D:\\in\\");
  184. //遍历所有文件
  185. File[] files = file.listFiles();
  186. for (File f : files) {
  187. for (WindTowerInfo w : windTowerInfoList) {
  188. String id = f.getName().substring(0, 4);
  189. String password = w.getPassword();
  190. //如果设备编号相等 则调用命令转换该文件
  191. if (id.equals(w.getEquipmentNo())) {
  192. String cmd = "\"D:\\NRG\\SymDR\\SDR.exe\"" + " /z " + password + " " + f.getPath();
  193. Process ipconfig = runtime.exec(cmd);
  194. ipconfig.waitFor();
  195. InputStream inputStream = ipconfig.getInputStream();
  196. byte[] bytes = new byte[1024];
  197. int len = 0;
  198. while ((len = inputStream.read(bytes)) != -1) {
  199. log.info(new String(bytes, 0, len, "GBK"));
  200. }
  201. }
  202. }
  203. //转换成txt的文件在D:\NRG\ScaledData\目录下 移动到 D:\out\下 转换文件后会有两个文件一个txt 一个log 删除log 移动txt
  204. File file1 = new File("D:\\NRG\\ScaledData\\");
  205. File[] files1 = file1.listFiles();
  206. for (File e : files1) {
  207. String[] name = e.getName().split("\\.");
  208. if (name[1].equals("txt")) {
  209. FileUtil.move(e.getPath(), "D:\\out\\new\\");
  210. } else {
  211. e.delete();
  212. }
  213. }
  214. //转成txt后把文件移动到系统文件备份目录下
  215. File file2 = new File("D:\\in\\");
  216. File[] files2 = file2.listFiles();
  217. //xls移动系统文件目录下
  218. for (File e : files2) {
  219. String[] str = e.getName().split("\\.");
  220. if (str[1].equals("RWD")) {
  221. FileUtil.move(e.getPath(), FileUtil.getSystemFilePath() + File.separator + str[0].substring(0, 4));
  222. } else {
  223. String[] strs = str[0].split("_");
  224. FileUtil.move(e.getPath(), FileUtil.getSystemFilePath() + File.separator + strs[0]);
  225. }
  226. }
  227. //把txt文件转成excel文件并解析
  228. String type = "RWD";
  229. analysisData.analysisData(type);
  230. }
  231. } catch (Exception e) {
  232. e.printStackTrace();
  233. }
  234. }
  235. /**
  236. * 执行命令通过软件解压rld文件到D:\out\new\下
  237. *
  238. * @param equipmentNo 设备编号
  239. * @param recorderNo 记录仪编号
  240. */
  241. public void systemCommand(String equipmentNo, String recorderNo) {
  242. try {
  243. Runtime runtime = Runtime.getRuntime();
  244. //D:\\program\\uploadFile\\new rld文件在这个目录下
  245. File file = new File(FileUtil.getFileUploadPath() + File.separator + "new");
  246. //D:\\program\\uploadFile\\file rld转换成txt文件在这个目录下
  247. File uploadFile = new File(FileUtil.getFileUploadPath() + File.separator + "txtFile");
  248. if (!uploadFile.exists()) {
  249. uploadFile.mkdirs();
  250. }
  251. //遍历所有文件
  252. File[] files = file.listFiles();
  253. for (File f : files) {
  254. //根据编号和记录仪号过滤
  255. List<WindTowerInfo> windTowerInfoList = windTowerInfoService.getAllWindTower().stream().filter(wind -> wind.getEquipmentNo().equals(equipmentNo)
  256. && wind.getRecorderNo().equals(recorderNo)).collect(Collectors.toList());
  257. //测风塔编号和记录仪编号两个条件 能确保塔的唯一性
  258. for (WindTowerInfo w : windTowerInfoList) {
  259. if ("".equals(w.getPassword())) {
  260. log.error(w.getEquipmentNo() + "测风塔没有配置数据密码");
  261. } else {
  262. String[] s = new String[]{
  263. "\"D:\\Program Files (x86)\\Renewable NRG Systems\\SymPRO Desktop\\SymPRODesktop.exe\"",
  264. "/cmd", "convert", "/file", f.getPath(),
  265. "/pass", w.getPassword(), "/type", "\"meas\"", "/outputdir", "\"D:\\program\\uploadFile\\txtFile\""
  266. };
  267. Process ipconfig = runtime.exec(s);
  268. ipconfig.waitFor();
  269. InputStream inputStream = ipconfig.getInputStream();
  270. byte[] bytes = new byte[1024];
  271. int len = 0;
  272. while ((len = inputStream.read(bytes)) != -1) {
  273. log.info(new String(bytes, 0, len, "GBK"));
  274. }
  275. }
  276. }
  277. }
  278. //转成txt后把上传路径 D:\\program\\uploadFile\\new 下的rld文件移动到系统文件里
  279. File file1 = new File(FileUtil.getFileUploadPath() + File.separator + "new");
  280. File[] files1 = file1.listFiles();
  281. //xls移动系统文件目录下
  282. for (File e : files1) {
  283. String[] str = e.getName().split("\\.");
  284. if (str[1].equals("RWD")) {
  285. FileUtil.move(e.getPath(), FileUtil.getSystemFilePath() + File.separator + str[0].substring(0, 4));
  286. } else {
  287. String[] strs = str[0].split("_");
  288. FileUtil.move(e.getPath(), FileUtil.getSystemFilePath() + File.separator + strs[0]);
  289. }
  290. }
  291. //解析数据
  292. this.analysisData();
  293. } catch (Exception e) {
  294. log.error("执行系统命令失败:" + e);
  295. }
  296. }
  297. /**
  298. * 解析数据
  299. */
  300. public void analysisData() {
  301. String txtPath = FileUtil.getFileUploadPath() + File.separator + "txtFile" + File.separator;
  302. String excelDir = FileUtil.getFileUploadPath() + File.separator + "excelFile" + File.separator;
  303. File file = new File(txtPath);
  304. if (!file.exists()) {
  305. file.mkdirs();
  306. }
  307. File excelFiles = new File(excelDir);
  308. if (!excelFiles.exists()) {
  309. excelFiles.mkdirs();
  310. }
  311. File[] files = file.listFiles();
  312. for (File f : files) {
  313. String[] xlsName = f.getName().split(".txt");
  314. String excelFile = excelDir + xlsName[0] + ".xls";
  315. //txt转xls
  316. analysisTXT(f.getPath(), excelFile);
  317. //xls文件解析入库
  318. analysisExcel(new File(excelFile));
  319. //转换成xls文件后删除txt文件
  320. f.delete();
  321. //解析完成后删除xls文件
  322. File exeFile = new File(excelFile);
  323. exeFile.delete();
  324. }
  325. }
  326. /**
  327. * 解析txt文件 输出成xls文件
  328. *
  329. * @param file_in 输入文件
  330. * @param file_out 输出文件
  331. */
  332. public void analysisTXT(String file_in, String file_out) {
  333. /*实例化输入、输出流*/
  334. //输入文件
  335. File f_in = new File(file_in);
  336. FileInputStream ips = null;
  337. InputStreamReader ipsr = null;
  338. //输出文件
  339. File f_out = new File(file_out);
  340. FileOutputStream ops = null;
  341. try {
  342. ips = new FileInputStream(f_in);
  343. ipsr = new InputStreamReader(ips);
  344. ops = new FileOutputStream(f_out);
  345. } catch (FileNotFoundException e) {
  346. // TODO Auto-generated catch block
  347. e.printStackTrace();
  348. }
  349. /*创建excel表格文件并输出*/
  350. //创建工作薄
  351. SXSSFWorkbook wb = new SXSSFWorkbook();
  352. try {
  353. //创建新的一页
  354. SXSSFSheet sheet = wb.createSheet("new sheet");
  355. BufferedReader br = new BufferedReader(ipsr);
  356. String valueString = null;
  357. //表格的有效行计数
  358. int count_line = 0;
  359. Boolean flag = false;
  360. StringBuilder dataName = new StringBuilder();
  361. //循环处理每一行
  362. while ((valueString = br.readLine()) != null) {
  363. if (flag) {//忽略开头代码
  364. //分解每一行有效行
  365. String[] strs_cell = valueString.split("\t");//用“|”切割每一行作为一个单元格数据
  366. SXSSFRow row = sheet.createRow((short) count_line);
  367. for (int i = 0; i < strs_cell.length; ++i) {//循环每个切割得到的数据,除了最后一个(,,,)和第一个(空)
  368. //创建要显示的内容,创建一个单元格,第一个参数为列坐标,第二个参数为行坐标,第三个参数为内容
  369. row.createCell((short) i).setCellValue(strs_cell[i]);
  370. //所有表头
  371. if (!dataName.toString().equals("")) {
  372. dataName.append(",");
  373. dataName.append(strs_cell[i]);
  374. } else {
  375. dataName.append(strs_cell[i]);
  376. }
  377. }
  378. count_line++;
  379. }
  380. if (valueString.equals("Data")) {
  381. flag = true;
  382. }
  383. }
  384. //根据数据表头分解出层高
  385. String[] names = dataName.toString().split(",");
  386. StringBuffer height = new StringBuffer();
  387. StringBuffer wdHeight = new StringBuffer();
  388. for (String name : names) {
  389. if (name.contains("Anem") || name.contains("Vane")) {
  390. String[] keys = name.split("_");
  391. String b = getWsOrWd(keys[1], keys[5]);
  392. String c = keys[2].substring(0, keys[2].length() - 4);
  393. if (b.equals("ws")) {
  394. if (!height.toString().equals("")) {
  395. if (!height.toString().contains(c)) {
  396. height.append(",");
  397. height.append(c);
  398. }
  399. } else {
  400. height.append(c);
  401. }
  402. } else if (b.equals("wd")) {
  403. if (!wdHeight.toString().equals("")) {
  404. if (!wdHeight.toString().contains(c)) {
  405. wdHeight.append(",");
  406. wdHeight.append(c);
  407. }
  408. } else {
  409. wdHeight.append(c);
  410. }
  411. }
  412. }
  413. }
  414. //把创建的表格写入到输出流中,并关闭输出流
  415. wb.write(ops);
  416. } catch (IOException e) {
  417. // TODO Auto-generated catch block
  418. e.printStackTrace();
  419. } finally {
  420. if (wb != null) {
  421. try {
  422. wb.close();
  423. } catch (IOException e) {
  424. // TODO Auto-generated catch block
  425. e.printStackTrace();
  426. }
  427. }
  428. if (ips != null) {
  429. try {
  430. ips.close();
  431. } catch (IOException e) {
  432. // TODO Auto-generated catch block
  433. e.printStackTrace();
  434. }
  435. }
  436. if (ops != null) {
  437. try {
  438. ops.close();
  439. } catch (IOException e) {
  440. // TODO Auto-generated catch block
  441. e.printStackTrace();
  442. }
  443. }
  444. }
  445. }
  446. /**
  447. * 解析excel文件
  448. *
  449. * @param file 文件
  450. */
  451. public void analysisExcel(File file) {
  452. String type = "rld";
  453. ExcelReader reader = ExcelUtil.getReader(file, 0);
  454. List<List<Object>> read = reader.read(0);
  455. List<Object> objects = read.get(0);
  456. Map<String, String> map = new HashMap<>();
  457. String[] fileNames = file.getName().split("_");
  458. CheckDataRecode.map.clear();
  459. //把表格里的数据转换成属性+层高方便解析入库
  460. for (Object object : objects) {
  461. //时间
  462. if (object.equals("Timestamp")) {
  463. reader.addHeaderAlias(object.toString(), "time");
  464. continue;
  465. }
  466. String[] keys = object.toString().split("_");
  467. //TODO改成传进去Ch1_Anem_140.00m_WNW_Avg_m/s 出来的是140风速的属性
  468. //a = 最大 最小 平均值 标差
  469. String a = getKeyStr(keys[4]);
  470. //b = 风速 风向 温 湿 压
  471. String b = getWsOrWd(keys[1], keys[5]);
  472. //c = 层高
  473. String c = keys[2].substring(0, keys[2].length() - 4);
  474. String value = b + a;
  475. if (null != map.get(value + "_" + c)) {
  476. value = value + "_" + Integer.parseInt(c) + "A";
  477. } else {
  478. if (!(b.equals("t") || b.equals("rh") || b.equals("pa"))) {
  479. value = value + "_" + Integer.parseInt(c);
  480. }
  481. }
  482. //判断该数据是否解析过
  483. map.put(value, "1");
  484. CheckDataRecode.map.put(value + "DeadDataStartTime", new DateTime(fileNames[1]));
  485. reader.addHeaderAlias(object.toString(), value);
  486. }
  487. List<Map<String, Object>> allData = reader.readAll();
  488. //数据筛选
  489. List<Map<String, Object>> filterData = new CheckDataRecode().checkValue(allData, type);
  490. String eqId = file.getName().split("_")[0];
  491. windTowerDataParentTableService.packageData(filterData, eqId, type, "");
  492. reader.close();
  493. }
  494. //拼装实体
  495. private String getKeyStr(String key) {
  496. if (("Avg").equals(key)) {
  497. return "Ave";
  498. }
  499. if (("SD").equals(key)) {
  500. return "Sta";
  501. }
  502. return key;
  503. }
  504. //拼装实体
  505. private String getWsOrWd(String key, String key2) {
  506. if (("Anem").equals(key)) {
  507. return "ws";
  508. }
  509. if (("Vane").equals(key)) {
  510. return "wd";
  511. }
  512. if (("Analog").equals(key)) {
  513. if (key2.equals("C")) {
  514. return "t";
  515. }
  516. if (key2.equals("mb") || key2.equals("hPa") || key2.equals("kpa") || key2.equals("KPa")) {
  517. return "pa";
  518. }
  519. if (key2.equals("%RH")) {
  520. return "rh";
  521. }
  522. }
  523. return key;
  524. }
  525. /**
  526. * 数据筛选
  527. *
  528. * @param startTime 开始时间
  529. * @param endTime 结束时间
  530. * @param equipmentNo 设备编号
  531. * @return 成功/失败
  532. */
  533. public AjaxResult dataCheck(Date startTime, Date endTime, String equipmentNo) {
  534. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  535. //所有数据
  536. List<Map<String, Object>> maps = windTowerDataParentTableService.selectDataByBetweenTimeAndEquipmetId(startTime, endTime, equipmentNo);
  537. List<WindTowerInfo> list = windTowerInfoService.getByEquipmentNo(equipmentNo);
  538. CheckDataRecode checkDataRecode = new CheckDataRecode();
  539. checkDataRecode.map.clear();
  540. try {
  541. if (!maps.isEmpty()) {
  542. long startDate = Long.parseLong(maps.get(0).get("time").toString());
  543. long endDate = Long.parseLong(maps.get(0).get("time").toString());
  544. //设置属性死值开始时间
  545. maps.get(0).forEach((k, v) -> {
  546. checkDataRecode.map.put(k + "DeadDataStartTime", new DateTime(Long.parseLong(maps.get(0).get("time").toString())));
  547. });
  548. for (Map<String, Object> map : maps) {
  549. //获取时间
  550. if (startDate > Long.parseLong(map.get("time").toString())) {
  551. startDate = Long.parseLong(map.get("time").toString());
  552. }
  553. if (endDate < Long.parseLong(map.get("time").toString())) {
  554. endDate = Long.parseLong(map.get("time").toString());
  555. }
  556. }
  557. log.info("正在进行数据过滤");
  558. //重新走一遍数据过滤 然后存库
  559. List<Map<String, Object>> mapList = new CheckDataRecode().checkValue(maps, list.get(0).getModelNumber());
  560. windTowerDataParentTableService.packageData(mapList, equipmentNo, list.get(0).getModelNumber(), "DataRecalculation");
  561. log.warn("数据筛选完成");
  562. return AjaxResult.success("数据筛选完成");
  563. } else {
  564. return AjaxResult.success("该时间范围内没有数据");
  565. }
  566. } catch (Exception e) {
  567. return AjaxResult.error("数据筛选失败");
  568. }
  569. }
  570. public AjaxResult statisticsCheck(Date startTime, Date endTime, String equipmentNo) {
  571. try {
  572. //获取到结束时间的当天最后时间
  573. endTime = DateTimeUtil.getDayLastTime(endTime.getTime());
  574. List<StatisticsSituation> statisticsSituations = statisticsSituationService.list();
  575. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.list();
  576. List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataService.getByBetweenTimeAndEquipmentId(startTime, endTime, equipmentNo);
  577. List<WindTowerInfo> windTowerInfoList = windTowerInfoService.getByEquipmentNo(equipmentNo);
  578. //风数据查询
  579. List<ProphaseAnemometryData> prophaseAnemometryDataList = prophaseAnemometryDataMapper.selectList(Wrappers.<ProphaseAnemometryData>lambdaQuery()
  580. .eq(ProphaseAnemometryData::getEquipmentId, equipmentNo)
  581. .le(ProphaseAnemometryData::getTs, new Timestamp(endTime.getTime()))
  582. .ge(ProphaseAnemometryData::getTs, new Timestamp(startTime.getTime())));
  583. //环境数据查询
  584. List<ProphaseWeatherData> prophaseWeatherDataList = prophaseWeatherDataService.selectPublicData(equipmentNo, new Timestamp(startTime.getTime()), new Timestamp(endTime.getTime()));
  585. //把传入的时间按照日或月分割
  586. log.info("开始重新计算统计数据");
  587. ArrayList<WindTowerCalculationData> allDataList = new ArrayList<>();
  588. //小时风功率密度和平均风速
  589. ArrayList<WindTowerCalculationData> dataList = windTowerCalculationDataService.calculateWindPowerDensity(startTime.getTime(), endTime.getTime(), equipmentNo, prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList, windTowerCalculationDataList);
  590. allDataList.addAll(dataList);
  591. //小时风切变
  592. ArrayList<WindTowerCalculationData> calculationData = windTowerCalculationDataService.calculateWindPowerShear(startTime, endTime, equipmentNo, prophaseAnemometryDataList, windTowerCalculationDataList);
  593. allDataList.addAll(calculationData);
  594. //日平均温度
  595. ArrayList<WindTowerCalculationData> tDay = windTowerCalculationDataService.tDay(startTime, endTime, equipmentNo, prophaseWeatherDataList, equipmentAttributeList);
  596. allDataList.addAll(tDay);
  597. //日平均气压
  598. ArrayList<WindTowerCalculationData> paDay = windTowerCalculationDataService.paDay(startTime, endTime, equipmentNo, prophaseWeatherDataList, equipmentAttributeList);
  599. allDataList.addAll(paDay);
  600. //发电量与满发小时数
  601. ArrayList<WindTowerCalculationData> calculateBattery = windTowerCalculationDataService.calculateBattery(startTime.getTime(), endTime.getTime(), windTowerInfoList.get(0), prophaseAnemometryDataList, equipmentAttributeList, windTowerCalculationDataList);
  602. allDataList.addAll(calculateBattery);
  603. //日平均风速
  604. ArrayList<WindTowerCalculationData> wsDay = windTowerCalculationDataService.wsDay(startTime, endTime, equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  605. allDataList.addAll(wsDay);
  606. //日平均风速标差
  607. ArrayList<WindTowerCalculationData> calculationData1 = windTowerCalculationDataService.calculateStaDay(startTime, endTime, equipmentNo, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList);
  608. allDataList.addAll(calculationData1);
  609. //日平均湍流
  610. ArrayList<WindTowerCalculationData> turbulenceDay = windTowerCalculationDataService.turbulenceDay(startTime, endTime, equipmentNo, equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList);
  611. allDataList.addAll(turbulenceDay);
  612. //日平均空气密度
  613. ArrayList<WindTowerCalculationData> airDensityDay = windTowerCalculationDataService.airDensityDay(startTime, endTime, equipmentNo, prophaseWeatherDataList, equipmentAttributeList, windTowerCalculationDataList);
  614. allDataList.addAll(airDensityDay);
  615. //日平均风功率密度
  616. ArrayList<WindTowerCalculationData> wpdDay = windTowerCalculationDataService.wpdDay(startTime, endTime, equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  617. allDataList.addAll(wpdDay);
  618. //日平均风切变
  619. ArrayList<WindTowerCalculationData> shearDay = windTowerCalculationDataService.shearDay(startTime, endTime, equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList, prophaseAnemometryDataList);
  620. allDataList.addAll(shearDay);
  621. List<Long> dateTime = DateTimeUtil.getIntervalTimeByMonth(DateTimeUtil.beginOfMonth(startTime), DateTimeUtil.beginOfMonth(endTime));
  622. for (Long l : dateTime) {
  623. //月平均风速
  624. ArrayList<WindTowerCalculationData> wsMonth = windTowerCalculationDataService.wsMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  625. allDataList.addAll(wsMonth);
  626. //月平均风功率密度
  627. ArrayList<WindTowerCalculationData> wpdMonth = windTowerCalculationDataService.wpdMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  628. allDataList.addAll(wpdMonth);
  629. //月平均湍流
  630. ArrayList<WindTowerCalculationData> turbulenceMonth = windTowerCalculationDataService.turbulenceMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  631. allDataList.addAll(turbulenceMonth);
  632. //月平均空气密度
  633. ArrayList<WindTowerCalculationData> airDensityMonth = windTowerCalculationDataService.airDensityMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList);
  634. allDataList.addAll(airDensityMonth);
  635. //月最大风速
  636. ArrayList<WindTowerCalculationData> wsMaxMonth = windTowerCalculationDataService.wsMaxMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
  637. allDataList.addAll(wsMaxMonth);
  638. //月平均风切变
  639. ArrayList<WindTowerCalculationData> shearMonth = windTowerCalculationDataService.shearMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList, prophaseAnemometryDataList);
  640. allDataList.addAll(shearMonth);
  641. //月平均风速标差
  642. ArrayList<WindTowerCalculationData> staMonth = windTowerCalculationDataService.staMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
  643. allDataList.addAll(staMonth);
  644. //月玫瑰图
  645. windDirectionStatisticsDataService.roseMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList);
  646. //月平均环境数据
  647. ArrayList<WindTowerCalculationData> environmentData = windTowerCalculationDataService.environmentData(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseWeatherDataList, equipmentAttributeList);
  648. allDataList.addAll(environmentData);
  649. //空气密度月逐时
  650. ArrayList<WindTowerCalculationData> airDensityMonth1 = windTowerCalculationDataService.airDensityMonth(equipmentNo, DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), prophaseWeatherDataList);
  651. allDataList.addAll(airDensityMonth1);
  652. //湍流月逐时
  653. ArrayList<WindTowerCalculationData> turbulenceHourForMonth = windTowerCalculationDataService.turbulenceHourForMonth(equipmentNo, DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
  654. allDataList.addAll(turbulenceHourForMonth);
  655. }
  656. // 统计概述
  657. statisticsSituationService.statisticsSituation(windTowerInfoList.get(0), statisticsSituations, equipmentAttributeList);
  658. windTowerCalculationDataService.saveBatchByEquipmentId(allDataList, equipmentNo);
  659. log.info("计算统计数据执行完毕");
  660. return AjaxResult.success("数据已经重新统计");
  661. } catch (Exception e) {
  662. log.info("数据统计计算时异常");
  663. return AjaxResult.error("数据统计计算时异常");
  664. }
  665. }
  666. }