AnalysisDataImpl.java 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387
  1. package com.jiayue.biz.service.impl;
  2. import cn.hutool.core.io.FileUtil;
  3. import cn.hutool.core.text.csv.CsvData;
  4. import cn.hutool.core.text.csv.CsvReader;
  5. import cn.hutool.core.text.csv.CsvRow;
  6. import cn.hutool.core.text.csv.CsvUtil;
  7. import cn.hutool.core.util.StrUtil;
  8. import cn.hutool.core.util.ZipUtil;
  9. import cn.hutool.poi.excel.ExcelReader;
  10. import cn.hutool.poi.excel.ExcelUtil;
  11. import com.jiayue.biz.domain.*;
  12. import com.jiayue.biz.service.EmailService;
  13. import com.jiayue.biz.service.EmailWindTowerInfoService;
  14. import com.jiayue.biz.util.CalculationUtil;
  15. import com.jiayue.biz.util.CoordinateUtil;
  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.beans.factory.annotation.Value;
  25. import org.springframework.stereotype.Service;
  26. import java.io.*;
  27. import java.math.BigDecimal;
  28. import java.math.RoundingMode;
  29. import java.nio.charset.Charset;
  30. import java.text.ParseException;
  31. import java.text.SimpleDateFormat;
  32. import java.util.*;
  33. import java.util.stream.Collectors;
  34. import java.util.zip.ZipEntry;
  35. import java.util.zip.ZipFile;
  36. /**
  37. * 采集数据解析实现类
  38. * whc
  39. */
  40. @Slf4j
  41. @Service
  42. public class AnalysisDataImpl {
  43. private static byte[] ZIP_HEADER_1 = new byte[]{80, 75, 3, 4};
  44. private static byte[] ZIP_HEADER_2 = new byte[]{80, 75, 5, 6};
  45. @Value("${file.outPutDir}")
  46. private String outPutDir;
  47. @Value("${file.excelDir}")
  48. private String excelDir;
  49. @Value("${file.outPutBackDir}")
  50. private String outPutBackDir;
  51. @Value("${file.excelBackDir}")
  52. private String excelBackDir;
  53. private String eolFilePath = "D:\\program\\systemFile\\";
  54. private String eolDatafolder = "D:\\EOLdata";
  55. private final WindTowerInfoServiceImpl windTowerInfoService;
  56. private final WindTowerDataParentTableServiceImpl windTowerDataParentTableService;
  57. private final EmailWindTowerInfoServiceImpl emailWindTowerInfoService;
  58. public AnalysisDataImpl(WindTowerInfoServiceImpl windTowerInfoService, WindTowerDataParentTableServiceImpl windTowerDataParentTableService, EmailWindTowerInfoServiceImpl emailWindTowerInfoService) {
  59. this.emailWindTowerInfoService = emailWindTowerInfoService;
  60. this.windTowerInfoService = windTowerInfoService;
  61. this.windTowerDataParentTableService = windTowerDataParentTableService;
  62. }
  63. /**
  64. * 先把outPutDir目录下的文件转成excel放到excelDir里 然后解析excel文件 读取数据存入数据库中
  65. *
  66. * @throws InterruptedException
  67. */
  68. public void analysisData(String type) throws InterruptedException {
  69. String path = outPutDir;
  70. File file = new File(path);
  71. if (!file.exists()) {
  72. file.mkdirs();
  73. }
  74. File[] files = file.listFiles();
  75. for (File f : files) {
  76. if (f.getName().contains(".log")) {
  77. f.delete();
  78. }
  79. String[] xlsName = f.getName().split(".txt");
  80. String excelFile = excelDir + xlsName[0] + ".xls";
  81. HashMap<String, String> hashMap = new HashMap<>();
  82. //txt转xls
  83. if (type.equals("rld")) {
  84. analysisTXT(f.getPath(), excelFile);
  85. } else {
  86. hashMap = analysisRWDTXT(f.getPath(), excelFile);
  87. }
  88. log.info(f.getPath() + "文件已转换成xls移动到备份目录下");
  89. //txt移动备份目录
  90. File txtBackups = new File(outPutBackDir);
  91. if (!txtBackups.exists()) {
  92. txtBackups.mkdirs();
  93. }
  94. FileUtil.move(f, txtBackups, true);
  95. //xls文件解析入库
  96. if (type.equals("rld")) {
  97. analysisExcel(new File(excelFile), type);
  98. } else {
  99. analysisExcelRWD(new File(excelFile), hashMap, type);
  100. }
  101. log.info(xlsName[0] + ".xls" + "已转解析存入数据库并移动到备份目录下");
  102. //xls移动备份目录
  103. File xlsBackups = new File(excelBackDir);
  104. if (!xlsBackups.exists()) {
  105. xlsBackups.mkdirs();
  106. }
  107. FileUtil.move(new File(excelFile), xlsBackups, true);
  108. }
  109. }
  110. /**
  111. * 解析文件 转成txt
  112. */
  113. public HashMap<String, String> analysisRWDTXT(String file_in, String file_out) {
  114. /*实例化输入、输出流*/
  115. //输入文件
  116. File f_in = new File(file_in);
  117. FileInputStream ips = null;
  118. InputStreamReader ipsr = null;
  119. //需要返回的map
  120. HashMap<String, String> CHMap = new HashMap<>();
  121. //输出文件
  122. File f_out = new File(file_out);
  123. FileOutputStream ops = null;
  124. try {
  125. ips = new FileInputStream(f_in);
  126. ipsr = new InputStreamReader(ips);
  127. ops = new FileOutputStream(f_out);
  128. } catch (FileNotFoundException e) {
  129. // TODO Auto-generated catch block
  130. e.printStackTrace();
  131. }
  132. /*创建excel表格文件并输出*/
  133. //创建工作薄
  134. SXSSFWorkbook wb = new SXSSFWorkbook();
  135. try {
  136. //创建新的一页
  137. SXSSFSheet sheet = wb.createSheet("new sheet");
  138. BufferedReader br = new BufferedReader(ipsr);
  139. String valueString = null;
  140. //表格的有效行计数
  141. int count_line = 0;
  142. Boolean flag = false;
  143. String eqId = "";
  144. String latitude = "";
  145. String longitude = "";
  146. String serialNumber = "";
  147. String str = "";
  148. String CH = "";
  149. HashMap<String, String> HeightMap = new HashMap<>();
  150. String heightCheck = "";
  151. StringBuilder dataName = new StringBuilder();
  152. //存放ch和层高
  153. ArrayList<String> list = new ArrayList<>();
  154. //循环处理每一行
  155. while ((valueString = br.readLine()) != null) {
  156. if (valueString.contains("Channel #")) {
  157. String[] strs_cell = valueString.split("\t");
  158. CH = "CH" + strs_cell[1];
  159. }
  160. if (valueString.contains("Description\tNRG")) {
  161. String[] strs_cell = valueString.split("\t");
  162. CHMap.put(CH, strs_cell[strs_cell.length - 1]);
  163. str = valueString;
  164. }
  165. if (valueString.contains("Height")) {
  166. String height = getNumberFromString(valueString);
  167. for (Map.Entry<String, String> p : CHMap.entrySet()) {
  168. if (p.getKey().equals(CH)) {
  169. String h1 = p.getValue() + " " + height;
  170. CHMap.put(CH, h1);
  171. }
  172. }
  173. if (!height.isEmpty()) {
  174. //判断风速是否存在同样层高
  175. if (str.contains("An") && heightCheck.contains(",")) {
  176. String[] split = heightCheck.split(",");
  177. for (String s : split) {
  178. if (height.equals(s)) {
  179. height = height + "A";
  180. }
  181. }
  182. }
  183. if (str.contains("An")) {
  184. str = "An" + height;
  185. //把层高放入临时string
  186. heightCheck = heightCheck + height + ",";
  187. }
  188. HeightMap.put(str, height);
  189. }
  190. }
  191. if (valueString.contains("Site #")) {
  192. //测风塔编号
  193. String[] strs_cell = valueString.split("\t");
  194. eqId = strs_cell[1];
  195. }
  196. if (valueString.contains("Latitude")) {
  197. //纬度
  198. String[] strs_cell = valueString.split("\t");
  199. String[] s = strs_cell[1].split(" ");
  200. String split = s[2].substring(0, 2);
  201. latitude = s[1] + " " + split;
  202. latitude = CoordinateUtil.changeToDu(latitude);
  203. }
  204. if (valueString.contains("Longitude")) {
  205. //经度
  206. String[] strs_cell = valueString.split("\t");
  207. String[] s = strs_cell[1].split(" ");
  208. String split = s[2].substring(0, 2);
  209. longitude = s[1] + " " + split;
  210. longitude = CoordinateUtil.changeToDu(longitude);
  211. }
  212. if (valueString.contains("Serial #")) {
  213. //记录仪编号
  214. if (serialNumber.equals("")) {
  215. String[] strs_cell = valueString.split("\t");
  216. serialNumber = strs_cell[1];
  217. }
  218. }
  219. if (valueString.contains("Date & Time Stamp")) {
  220. flag = true;
  221. }
  222. if (flag) {//忽略开头代码
  223. //分解每一行有效行
  224. String[] strs_cell = valueString.split("\t");//用“|”切割每一行作为一个单元格数据
  225. SXSSFRow row = sheet.createRow((short) count_line);
  226. for (int i = 0; i < strs_cell.length; ++i) {//循环每个切割得到的数据,除了最后一个(,,,)和第一个(空)
  227. //创建要显示的内容,创建一个单元格,第一个参数为列坐标,第二个参数为行坐标,第三个参数为内容
  228. row.createCell((short) i).setCellValue(strs_cell[i]);
  229. //所有表头
  230. if (!dataName.toString().equals("")) {
  231. dataName.append(",");
  232. dataName.append(strs_cell[i]);
  233. } else {
  234. dataName.append(strs_cell[i]);
  235. }
  236. }
  237. count_line++;
  238. }
  239. }
  240. toMap(CHMap);
  241. Set<String> heightSet = new HashSet<>();
  242. Set<String> wdHeightSet = new HashSet<>();
  243. StringBuffer height = new StringBuffer();
  244. StringBuffer wdHeight = new StringBuffer();
  245. //解析层高
  246. for (Map.Entry<String, String> name : HeightMap.entrySet()) {
  247. if (name.getKey().contains("An")) {
  248. String wsH = name.getValue();
  249. heightSet.add(wsH + ",");
  250. }
  251. if (name.getKey().contains("V")) {
  252. String wdH = name.getValue();
  253. wdHeightSet.add(wdH + ",");
  254. }
  255. }
  256. for (String s : heightSet) {
  257. height.append(s);
  258. }
  259. for (String s : wdHeightSet) {
  260. wdHeight.append(s);
  261. }
  262. //删除最后的逗号和不正常数据
  263. height.deleteCharAt(height.toString().length() - 1);
  264. wdHeight.deleteCharAt(wdHeight.toString().length() - 1);
  265. String newHeight = height.toString().replace("-", "");
  266. String newWdHeight = wdHeight.toString().replace("-", "");
  267. if (newHeight.lastIndexOf(",") == newHeight.length() - 1) {
  268. newHeight = newHeight.substring(0, newHeight.length() - 1);
  269. }
  270. if (newWdHeight.lastIndexOf(",") == newWdHeight.length() - 1) {
  271. newWdHeight = newWdHeight.substring(0, newWdHeight.length() - 1);
  272. }
  273. //通过eqId 过滤出这个塔
  274. List<WindTowerInfo> windTowerInfoList = windTowerInfoService.getByEquipmentNo(eqId);
  275. //为了防止两个塔编号相同的情况下 用编号+记录仪号来确定塔的唯一性
  276. //如果这个塔的记录仪编号不等于空 则代表已经更新过记录了
  277. List<WindTowerInfo> collect = windTowerInfoList.stream().sorted(Comparator.comparing(WindTowerInfo::getRecorderNo).reversed()).collect(Collectors.toList());
  278. for (WindTowerInfo w : collect) {
  279. //为了防止两个塔编号相同的情况下 用编号+记录仪号来确定塔的唯一性
  280. //如果这个塔的记录仪编号不等于空 则代表已经更新过记录了
  281. if ("".equals(w.getRecorderNo()) || null == w.getRecorderNo()) {
  282. //如果这个塔的记录仪编号等于空 则直接更新塔的信息
  283. w.setHeights(newHeight);
  284. w.setWdHeights(newWdHeight);
  285. w.setLatitude(new BigDecimal(latitude));
  286. w.setLongitude(new BigDecimal(longitude));
  287. w.setRecorderNo(serialNumber);
  288. windTowerInfoService.saveOrUpdate(w);
  289. }
  290. }
  291. //把创建的表格写入到输出流中,并关闭输出流
  292. wb.write(ops);
  293. } catch (
  294. IOException e) {
  295. // TODO Auto-generated catch block
  296. e.printStackTrace();
  297. } finally {
  298. if (wb != null) {
  299. try {
  300. wb.close();
  301. } catch (IOException e) {
  302. // TODO Auto-generated catch block
  303. e.printStackTrace();
  304. }
  305. }
  306. if (ips != null) {
  307. try {
  308. ips.close();
  309. } catch (IOException e) {
  310. // TODO Auto-generated catch block
  311. e.printStackTrace();
  312. }
  313. }
  314. if (ops != null) {
  315. try {
  316. ops.close();
  317. } catch (IOException e) {
  318. // TODO Auto-generated catch block
  319. e.printStackTrace();
  320. }
  321. }
  322. }
  323. return CHMap;
  324. }
  325. //以上是txt文件
  326. //以下是excel入库文件
  327. /**
  328. * 解析txt文件 输出成xls文件
  329. *
  330. * @param file_in 输入文件
  331. * @param file_out 输出文件
  332. */
  333. public void analysisTXT(String file_in, String file_out) {
  334. /*实例化输入、输出流*/
  335. //输入文件
  336. File f_in = new File(file_in);
  337. FileInputStream ips = null;
  338. InputStreamReader ipsr = null;
  339. //输出文件
  340. File f_out = new File(file_out);
  341. FileOutputStream ops = null;
  342. try {
  343. ips = new FileInputStream(f_in);
  344. ipsr = new InputStreamReader(ips);
  345. ops = new FileOutputStream(f_out);
  346. } catch (FileNotFoundException e) {
  347. // TODO Auto-generated catch block
  348. e.printStackTrace();
  349. }
  350. /*创建excel表格文件并输出*/
  351. //创建工作薄
  352. SXSSFWorkbook wb = new SXSSFWorkbook();
  353. try {
  354. //创建新的一页
  355. SXSSFSheet sheet = wb.createSheet("new sheet");
  356. BufferedReader br = new BufferedReader(ipsr);
  357. String valueString = null;
  358. //表格的有效行计数
  359. int count_line = 0;
  360. Boolean flag = false;
  361. String eqId = "";
  362. String latitude = "";
  363. String longitude = "";
  364. String serialNumber = "";
  365. StringBuilder dataName = new StringBuilder();
  366. //循环处理每一行
  367. while ((valueString = br.readLine()) != null) {
  368. if (valueString.contains("Site Number")) {
  369. //测风塔编号
  370. String[] strs_cell = valueString.split("\t");
  371. eqId = strs_cell[1];
  372. }
  373. if (valueString.contains("Latitude")) {
  374. //纬度
  375. String[] strs_cell = valueString.split("\t");
  376. latitude = strs_cell[1];
  377. }
  378. if (valueString.contains("Longitude")) {
  379. //经度
  380. String[] strs_cell = valueString.split("\t");
  381. longitude = strs_cell[1];
  382. }
  383. if (valueString.contains("Serial Number")) {
  384. //记录仪编号
  385. if (serialNumber.equals("")) {
  386. String[] strs_cell = valueString.split("\t");
  387. serialNumber = strs_cell[1];
  388. }
  389. }
  390. if (flag) {//忽略开头代码
  391. //分解每一行有效行
  392. String[] strs_cell = valueString.split("\t");//用“|”切割每一行作为一个单元格数据
  393. SXSSFRow row = sheet.createRow((short) count_line);
  394. for (int i = 0; i < strs_cell.length; ++i) {//循环每个切割得到的数据,除了最后一个(,,,)和第一个(空)
  395. //创建要显示的内容,创建一个单元格,第一个参数为列坐标,第二个参数为行坐标,第三个参数为内容
  396. row.createCell((short) i).setCellValue(strs_cell[i]);
  397. //所有表头
  398. if (!dataName.toString().equals("")) {
  399. dataName.append(",");
  400. dataName.append(strs_cell[i]);
  401. } else {
  402. dataName.append(strs_cell[i]);
  403. }
  404. }
  405. count_line++;
  406. }
  407. if (valueString.equals("Data")) {
  408. flag = true;
  409. }
  410. }
  411. //根据数据表头分解出层高
  412. String[] names = dataName.toString().split(",");
  413. //风速 层高_风向
  414. StringBuilder height = new StringBuilder();
  415. //风向 层高_风向
  416. StringBuilder wdHeight = new StringBuilder();
  417. for (String name : names) {
  418. if (name.contains("Anem") || name.contains("Vane")) {
  419. String[] keys = name.split("_");
  420. String b = getWsOrWd(keys[1], keys[5]);
  421. //120
  422. String c = keys[2].substring(0, keys[2].length() - 4);
  423. //120_NNW
  424. String d = c + "_" + keys[3];
  425. if (b.equals("ws")) {
  426. if (!height.toString().equals("")) {
  427. boolean flags = false;
  428. for (String h : height.toString().split(",")) {
  429. if (h.equals(d)) {
  430. flags = true;
  431. break;
  432. }
  433. }
  434. if (!flags) {
  435. height.append(",");
  436. height.append(d);
  437. }
  438. } else {
  439. height.append(d);
  440. }
  441. } else if (b.equals("wd")) {
  442. if (!wdHeight.toString().equals("")) {
  443. boolean flags = false;
  444. for (String h : wdHeight.toString().split(",")) {
  445. if (h.equals(d)) {
  446. flags = true;
  447. break;
  448. }
  449. }
  450. if (!flags) {
  451. wdHeight.append(",");
  452. wdHeight.append(d);
  453. }
  454. } else {
  455. wdHeight.append(d);
  456. }
  457. }
  458. }
  459. }
  460. //风速层高 如果一个层高有两个风速仪则第二个为层高A
  461. StringBuilder heights = new StringBuilder();
  462. StringBuilder wdHeights = new StringBuilder();
  463. for (String h : height.toString().split(",")) {
  464. if (heights.toString().equals("")) {
  465. //h=120_NNW h.split("_")[0]=120
  466. heights.append(h.split("_")[0]);
  467. } else {
  468. boolean flags = false;
  469. //判断已添加层高里面是否有 h.split("_")[0] 这个层高 如果有返回true
  470. for (String hs : heights.toString().split(",")) {
  471. if (hs.equals(h.split("_")[0])) {
  472. flags = true;
  473. break;
  474. }
  475. }
  476. //如果有这个层高 则代表一个层高有两个风速仪 应为 120 120A
  477. if (flags) {
  478. heights.append(",").append(h.split("_")[0]).append("A");
  479. } else {
  480. heights.append(",").append(h.split("_")[0]);
  481. }
  482. }
  483. }
  484. for (String h : wdHeight.toString().split(",")) {
  485. if (wdHeights.toString().equals("")) {
  486. //h=120_NNW h.split("_")[0]=120
  487. wdHeights.append(h.split("_")[0]);
  488. } else {
  489. boolean flags = false;
  490. //判断已添加层高里面是否有 h.split("_")[0] 这个层高 如果有返回true
  491. for (String hs : wdHeights.toString().split(",")) {
  492. if (hs.equals(h.split("_")[0])) {
  493. flags = true;
  494. break;
  495. }
  496. }
  497. //如果有这个层高 则代表一个层高有两个风速仪 应为 120 120A
  498. if (flags) {
  499. wdHeights.append(",").append(h.split("_")[0]).append("A");
  500. } else {
  501. wdHeights.append(",").append(h.split("_")[0]);
  502. }
  503. }
  504. }
  505. //通过eqId 过滤出这个塔
  506. List<WindTowerInfo> windTowerInfoList = windTowerInfoService.getByEquipmentNo(eqId);
  507. List<WindTowerInfo> collect = windTowerInfoList.stream().sorted(Comparator.comparing(WindTowerInfo::getRecorderNo).reversed()).collect(Collectors.toList());
  508. for (WindTowerInfo w : collect) {
  509. //为了防止两个塔编号相同的情况下 用编号+记录仪号来确定塔的唯一性
  510. //如果这个塔的记录仪编号不等于空 则代表已经更新过记录了
  511. if ("".equals(w.getRecorderNo()) || null == w.getRecorderNo()) {
  512. //如果这个塔的记录仪编号等于空 则直接更新塔的信息
  513. w.setHeights(heights.toString());
  514. w.setWdHeights(wdHeights.toString());
  515. w.setLatitude(new BigDecimal(latitude));
  516. w.setLongitude(new BigDecimal(longitude));
  517. w.setRecorderNo(serialNumber);
  518. windTowerInfoService.saveOrUpdate(w);
  519. log.info("编号" + eqId + "测风塔信息更新成功");
  520. }
  521. }
  522. //把创建的表格写入到输出流中,并关闭输出流
  523. wb.write(ops);
  524. } catch (IOException e) {
  525. // TODO Auto-generated catch block
  526. e.printStackTrace();
  527. } finally {
  528. if (wb != null) {
  529. try {
  530. wb.close();
  531. } catch (IOException e) {
  532. // TODO Auto-generated catch block
  533. e.printStackTrace();
  534. }
  535. }
  536. if (ips != null) {
  537. try {
  538. ips.close();
  539. } catch (IOException e) {
  540. // TODO Auto-generated catch block
  541. e.printStackTrace();
  542. }
  543. }
  544. if (ops != null) {
  545. try {
  546. ops.close();
  547. } catch (IOException e) {
  548. // TODO Auto-generated catch block
  549. e.printStackTrace();
  550. }
  551. }
  552. }
  553. }
  554. /**
  555. * @param file
  556. */
  557. public void analysisExcelRWD(File file, HashMap<String, String> CHMap, String type) {
  558. File file1 = new File("D:\\analysisData\\new\\");
  559. if (!file1.exists()) {
  560. file1.mkdirs();
  561. }
  562. ExcelReader reader = ExcelUtil.getReader(file, 0);
  563. List<List<Object>> read = reader.read(0);
  564. List<Object> objects = read.get(0);
  565. Map<String, String> map = new HashMap<>();
  566. CheckDataRecode checkDataRecode = new CheckDataRecode();
  567. checkDataRecode.map.clear();
  568. String fileNames = file.getName().substring(4, 12);
  569. for (Object object : objects) {
  570. //时间
  571. if (object.equals("Date & Time Stamp")) {
  572. reader.addHeaderAlias(object.toString(), "time");
  573. continue;
  574. }
  575. String numberFromString = getNumberFromString(object.toString());
  576. int i = Integer.parseInt(numberFromString);
  577. String chValue = CHMap.get("CH" + numberFromString);
  578. String Splicing = object.toString() + " " + chValue;
  579. String[] keys = Splicing.toString().split(" ");
  580. //正常数据长度为6
  581. if (keys.length <= 3) {
  582. continue;
  583. }
  584. //最大 最小 平均 标差
  585. String a = getKeyStrRWD(keys[0]);
  586. //风速 风向 温 湿 压
  587. String b = getWsOrWdRWD(keys[3], keys[4]);
  588. //层高
  589. String c = keys[keys.length - 1];
  590. String value = b + a;
  591. if (null != map.get(value + "_" + c)) {
  592. value = value + "_" + c + "A";
  593. } else {
  594. if (!(b.equals("t") || b.equals("rh") || b.equals("pa"))) {
  595. value = value + "_" + Integer.parseInt(c);
  596. }
  597. }
  598. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  599. try {
  600. checkDataRecode.map.put(value + "DeadDataStartTime", new DateTime(sdf.parse(fileNames).getTime()));
  601. } catch (ParseException e) {
  602. log.error("文件名日期转换异常");
  603. }
  604. //判断该数据是否解析过
  605. map.put(value, "1");
  606. reader.addHeaderAlias(object.toString(), value);
  607. }
  608. List<Map<String, Object>> allData = reader.readAll();
  609. //数据筛选
  610. List<Map<String, Object>> filterData = new CheckDataRecode().checkValue(allData, type);
  611. String equipmentId = file.getName().substring(0, 4);
  612. String eTime = file.getName().substring(4, 12);
  613. windTowerDataParentTableService.packageData(filterData, equipmentId, type, "");
  614. reader.close();
  615. }
  616. public void analysisExcel(File file, String type) {
  617. File file1 = new File("D:\\analysisData\\new\\");
  618. if (!file1.exists()) {
  619. file1.mkdirs();
  620. }
  621. ExcelReader reader = ExcelUtil.getReader(file, 0);
  622. List<List<Object>> read = reader.read(0);
  623. List<Object> objects = read.get(0);
  624. Map<String, String> map = new HashMap<>();
  625. String[] fileNames = file.getName().split("_");
  626. CheckDataRecode.map.clear();
  627. //把表格里的数据转换成属性+层高方便解析入库
  628. for (Object object : objects) {
  629. //时间
  630. if (object.equals("Timestamp")) {
  631. reader.addHeaderAlias(object.toString(), "time");
  632. continue;
  633. }
  634. String[] keys = object.toString().split("_");
  635. //TODO改成传进去Ch1_Anem_140.00m_WNW_Avg_m/s 出来的是140风速的属性
  636. //a = 最大 最小 平均值 标差
  637. String a = getKeyStr(keys[4]);
  638. //b = 风速 风向 温 湿 压
  639. String b = getWsOrWd(keys[1], keys[5]);
  640. //c = 层高
  641. String c = keys[2].substring(0, keys[2].length() - 4);
  642. String value = b + a;
  643. if (null != map.get(value + "_" + c)) {
  644. value = value + "_" + Integer.parseInt(c) + "A";
  645. } else {
  646. if (!(b.equals("t") || b.equals("rh") || b.equals("pa"))) {
  647. value = value + "_" + Integer.parseInt(c);
  648. }
  649. }
  650. //判断该数据是否解析过
  651. map.put(value, "1");
  652. CheckDataRecode.map.put(value + "DeadDataStartTime", new DateTime(fileNames[1]));
  653. reader.addHeaderAlias(object.toString(), value);
  654. }
  655. List<Map<String, Object>> allData = reader.readAll();
  656. //数据筛选
  657. List<Map<String, Object>> filterData = new CheckDataRecode().checkValue(allData, type);
  658. String eqId = file.getName().split("_")[0];
  659. String eTime = file.getName().split("_")[1];
  660. windTowerDataParentTableService.packageData(filterData, eqId, type, "");
  661. reader.close();
  662. }
  663. //拼装实体
  664. private String getKeyStr(String key) {
  665. if (("Avg").equals(key)) {
  666. return "Ave";
  667. }
  668. if (("SD").equals(key)) {
  669. return "Sta";
  670. }
  671. return key;
  672. }
  673. //拼装实体
  674. private String getWsOrWd(String key, String key2) {
  675. if (("Anem").equals(key)) {
  676. return "ws";
  677. }
  678. if (("Vane").equals(key)) {
  679. return "wd";
  680. }
  681. if (("Analog").equals(key)) {
  682. if (key2.equals("C")) {
  683. return "t";
  684. }
  685. if (key2.equals("mb") || key2.equals("hPa") || key2.equals("kpa") || key2.equals("KPa")) {
  686. return "pa";
  687. }
  688. if (key2.equals("%RH")) {
  689. return "rh";
  690. }
  691. }
  692. return key;
  693. }
  694. public Map toMap(Map map) {
  695. return map;
  696. }
  697. private String getKeyStrRWD(String key) {
  698. if (key.contains("Avg")) {
  699. return "Ave";
  700. }
  701. if (key.contains("SD")) {
  702. return "Sta";
  703. }
  704. if (key.contains("Max")) {
  705. return "Max";
  706. }
  707. if (key.contains("Min")) {
  708. return "Min";
  709. }
  710. return key;
  711. }
  712. private String getWsOrWdRWD(String key, String key2) {
  713. if (key.contains("An") || key2.equals("em")) {
  714. return "ws";
  715. }
  716. if (key.contains("V")) {
  717. return "wd";
  718. }
  719. if (key2.contains("C") || key2.contains("T")) {
  720. return "t";
  721. }
  722. if (key2.contains("mb") || key2.contains("hPa") || key2.contains("kpa") || key2.contains("kPa")) {
  723. return "pa";
  724. }
  725. if (key2.contains("%RH")) {
  726. return "rh";
  727. }
  728. return key;
  729. }
  730. /**
  731. * @param file csv文件
  732. * @param eqId 设备Id
  733. */
  734. public void acousticRadar(File file, String eqId) {
  735. List<Map<String, Object>> mapList = new ArrayList<>();
  736. HashMap<String, ArrayList<Double>> wsStaMapList = new HashMap<>();
  737. CsvReader reader = CsvUtil.getReader();
  738. //解析csv文件设置编码为GBK
  739. CsvData data = reader.read(file, Charset.forName("gbk"));
  740. //获取到csv文件
  741. List<CsvRow> rows = data.getRows();
  742. //获取层高
  743. List<WindTowerInfo> equipmentNo = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, eqId).list();
  744. String height = "";
  745. if (equipmentNo.size() == 0) {
  746. CsvRow csvRow = rows.get(0);
  747. StringBuilder heights = new StringBuilder();
  748. for (int i = csvRow.size() - 1; i >= 0; i--) {
  749. if (csvRow.get(i).contains("高度")) {
  750. if (heights.length() != 0) {
  751. heights.append(",");
  752. }
  753. heights.append(CalculationUtil.getNumberFromString(csvRow.get(i)));
  754. }
  755. }
  756. height = heights.toString();
  757. WindTowerInfo windTowerInfo = new WindTowerInfo();
  758. windTowerInfo.setEquipmentNo(eqId);
  759. windTowerInfo.setRecorderNo(eqId);
  760. windTowerInfo.setHeights(height);
  761. windTowerInfo.setWdHeights(height);
  762. windTowerInfoService.saveWindTowerInfo(windTowerInfo);
  763. } else {
  764. WindTowerInfo windTowerInfo = equipmentNo.get(0);
  765. height = windTowerInfo.getHeights();
  766. }
  767. int total = 0;
  768. String str = "";
  769. boolean firstBoolean = true;
  770. //遍历表头 设置表头
  771. try {
  772. for (String s : rows.get(0)) {
  773. if (s.contains("高度")) {
  774. str = CalculationUtil.getNumberFromString(s);
  775. }
  776. if (s.contains("风速")) {
  777. rows.get(0).set(total, "ws_Ave" + str);
  778. }
  779. if (s.contains("风向")) {
  780. rows.get(0).set(total, "wd_Ave" + str);
  781. }
  782. if (s.contains("时间")) {
  783. rows.get(0).set(total, "time");
  784. }
  785. if (s.contains("温度")) {
  786. rows.get(0).set(total, "t_ave");
  787. }
  788. if (s.contains("湿度")) {
  789. rows.get(0).set(total, "rh_ave");
  790. }
  791. if (s.contains("压力")) {
  792. rows.get(0).set(total, "pa_ave");
  793. }
  794. total++;
  795. }
  796. //临时变量
  797. boolean f = false;
  798. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
  799. CheckDataRecode.map.clear();
  800. String time1 = "";
  801. //父表入库
  802. for (CsvRow row : rows) {
  803. //跳过表头
  804. if (!f) {
  805. f = true;
  806. continue;
  807. }
  808. HashMap<String, Object> hashMap = new HashMap<>();
  809. // HashMap<String, Object> firstMap = new HashMap<>();
  810. if (rows.get(0).contains("time")) {
  811. int time = rows.get(0).indexOf("time");
  812. if (!row.get(time).isEmpty()) {
  813. time1 = row.get(time);
  814. //异常数据
  815. if (time1.contains("000000000000")) {
  816. continue;
  817. }
  818. }
  819. }
  820. for (String h : height.split(",")) {
  821. BigDecimal wsAve = conversion("ws_Ave" + h, row, rows);
  822. if (wsStaMapList.get(h) == null) {
  823. ArrayList<Double> wsStaList = new ArrayList<>();
  824. wsStaList.add(wsAve.doubleValue());
  825. wsStaMapList.put(h, wsStaList);
  826. } else {
  827. wsStaMapList.get(h).add(wsAve.doubleValue());
  828. }
  829. }
  830. if ((sdf.parse(time1).getMinutes() % 10) == 0) {
  831. hashMap.put("time", time1);
  832. BigDecimal tAve = conversion("t_ave", row, rows);
  833. hashMap.put("tAve", tAve);
  834. BigDecimal rhAve = conversion("rh_ave", row, rows);
  835. hashMap.put("rhAve", rhAve);
  836. BigDecimal paAve = conversion("pa_ave", row, rows);
  837. hashMap.put("paAve", paAve);
  838. BigDecimal airDensity = BigDecimal.valueOf(1.293).multiply(new BigDecimal(273).divide(new BigDecimal(273).add(CalculationUtil.getBigDecimal(tAve)), 2, RoundingMode.HALF_UP)).multiply(CalculationUtil.getBigDecimal(paAve)).divide(new BigDecimal(1013), 2, RoundingMode.HALF_UP);
  839. hashMap.put("airDensity", airDensity);
  840. for (Map.Entry<String, ArrayList<Double>> entry : wsStaMapList.entrySet()) {
  841. BigDecimal wsAve = conversion("ws_Ave" + entry.getKey(), row, rows);
  842. hashMap.put("wsAve_" + entry.getKey(), wsAve);
  843. BigDecimal wdAve = conversion("wd_Ave" + entry.getKey(), row, rows);
  844. hashMap.put("wdAve_" + entry.getKey(), wdAve);
  845. hashMap.put("wsSta_" + entry.getKey(), CalculationUtil.calculateSD(entry.getValue()));
  846. }
  847. // if(firstBoolean){
  848. // firstMap = hashMap;
  849. // firstBoolean = false;
  850. // }
  851. mapList.add(hashMap);
  852. wsStaMapList = new HashMap<>();
  853. }
  854. }
  855. //过滤数据
  856. List<Map<String, Object>> mapList1 = new CheckDataRecode().checkValue(mapList, "sld");
  857. windTowerDataParentTableService.packageData(mapList1, eqId, "sld", "");
  858. com.jiayue.biz.util.FileUtil.move(file.getPath(), eolFilePath + File.separator + eqId);
  859. } catch (Exception e) {
  860. e.printStackTrace();
  861. }
  862. }
  863. //根据表头位置找到对应数据 换算
  864. public BigDecimal conversion(String filedName, CsvRow row, List<CsvRow> rows) {
  865. BigDecimal data = BigDecimal.ZERO;
  866. if (rows.get(0).contains(filedName)) {
  867. int dataTotal = rows.get(0).indexOf(filedName);
  868. if (!row.get(dataTotal).isEmpty()) {
  869. String windData = row.get(dataTotal);
  870. if (filedName.contains("ws")) {
  871. data = CalculationUtil.getBigDecimal(windData).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
  872. } else {
  873. data = CalculationUtil.getBigDecimal(windData);
  874. }
  875. }
  876. }
  877. return data;
  878. }
  879. //判断是否是压缩包
  880. public static boolean isArchiveFile(File file) {
  881. if (file == null) {
  882. return false;
  883. }
  884. if (file.isDirectory()) {
  885. return false;
  886. }
  887. boolean isArchive = false;
  888. InputStream input = null;
  889. try {
  890. input = new FileInputStream(file);
  891. byte[] buffer = new byte[4];
  892. int length = input.read(buffer, 0, 4);
  893. if (length == 4) {
  894. isArchive = (Arrays.equals(ZIP_HEADER_1, buffer)) || (Arrays.equals(ZIP_HEADER_2, buffer));
  895. }
  896. } catch (IOException e) {
  897. e.printStackTrace();
  898. } finally {
  899. if (input != null) {
  900. try {
  901. input.close();
  902. } catch (IOException e) {
  903. }
  904. }
  905. }
  906. return isArchive;
  907. }
  908. /**
  909. * 从 String 中提取数字
  910. *
  911. * @param string
  912. * @return
  913. */
  914. public static String getNumberFromString(String string) {
  915. String str = string;
  916. str = str.trim();
  917. StringBuffer str2 = new StringBuffer();
  918. if (str != null && !"".equals(str)) {
  919. for (int i = 0; i < str.length(); i++) {
  920. if (str.charAt(i) >= 48 && str.charAt(i) <= 57) {
  921. String s = String.valueOf(str.charAt(i));
  922. str2.append(s);
  923. }
  924. }
  925. }
  926. return str2.toString();
  927. }
  928. public void moveEolFileAndParseEol() {
  929. File file = new File(eolDatafolder);
  930. File[] files = file.listFiles();
  931. try {
  932. for (File file1 : files) {
  933. if (file1.isDirectory()) {
  934. File[] files1 = file1.listFiles();
  935. //筛选包含.log后缀的文件
  936. List<File> fileNameList = Arrays.asList(files1).stream().filter(f -> !f.isDirectory() && f.getName().substring(f.getName().lastIndexOf(".")).contains(".log")).collect(Collectors.toList());
  937. //循环文件名
  938. for (File fileNameForELog : fileNameList) {
  939. String fileName = fileNameForELog.getName().substring(0, fileNameForELog.getName().indexOf(".log"));
  940. //找出wnd文件
  941. List<File> wndFile = Arrays.stream(files1).filter(f -> f.getName().contains(".wnd") && f.getName().contains(fileName)).collect(Collectors.toList());
  942. if (wndFile.size() > 0) {
  943. HashMap<String, String> stringStringHashMap = this.parseWnd(wndFile.get(0));
  944. String eqNo = stringStringHashMap.get("SiteNumber");
  945. //找出csv文件
  946. List<File> csvFile = Arrays.stream(files1).filter(f -> f.getName().contains(".csv") && f.getName().contains(fileName)).collect(Collectors.toList());
  947. if (csvFile.size() > 0 && wndFile.size() > 0) {
  948. parseEol(csvFile.get(0), stringStringHashMap, eqNo, fileNameForELog);
  949. }
  950. }
  951. }
  952. }
  953. }
  954. } catch (Exception e) {
  955. e.printStackTrace();
  956. }
  957. }
  958. //解析eol文件
  959. public void parseEol(File fileCsv, HashMap<String, String> stringStringHashMap, String eqNo, File fileNameForELog) {
  960. //todo 需要修改
  961. // String s = "C:\\Users\\Administrator\\Desktop\\ID220810_20220919_180304_20230515_063537.log_20230515_063540.csv";
  962. // //从文件中读取CSV数据
  963. // File file = FileUtil.file(s);
  964. CsvReader reader = CsvUtil.getReader();
  965. CsvData data = reader.read(fileCsv);
  966. List<CsvRow> rows = data.getRows();
  967. //todo 不严谨但是能用
  968. CsvRow row = data.getRow(2);
  969. HashSet<String> wsHeight = new HashSet<>();
  970. HashSet<String> wdHeight = new HashSet<>();
  971. boolean state = true;
  972. //遍历行
  973. List<Map<String, Object>> dataList = new ArrayList<>();
  974. for (CsvRow csvRow : rows) {
  975. //getRawList返回一个List列表,列表的每一项为CSV中的一个单元格(既逗号分隔部分)
  976. HashMap<String, Object> hashMap = new HashMap<>();
  977. for (int i = 0; i < csvRow.size(); i++) {
  978. String str = csvRow.get(i);
  979. if (str.contains("DateTime")) {
  980. if (state) {
  981. state = false;
  982. break;
  983. }
  984. }
  985. String s1 = this.assembleWind(str, wsHeight, wdHeight);
  986. //修改表头
  987. csvRow.set(i, s1);
  988. hashMap.put(row.get(i), str);
  989. }
  990. //过滤数据
  991. if (hashMap.size() > 3 && !hashMap.get("time").equals("DateTime")) {
  992. dataList.add(hashMap);
  993. }
  994. }
  995. this.emailWindTowerInfoSave(eqNo);
  996. List<WindTowerInfo> list = windTowerInfoService.list();
  997. List<WindTowerInfo> collect = list.stream().filter(w -> w.getEquipmentNo().equals(eqNo)).collect(Collectors.toList());
  998. if (collect.size() > 0) {
  999. if (collect.get(0).getRecorderNo() == null) {
  1000. String wsH = this.heightReverseOrder(wsHeight);
  1001. String wdH = this.heightReverseOrder(wdHeight);
  1002. WindTowerInfo windTowerInfo = new WindTowerInfo();
  1003. windTowerInfo.setEquipmentNo(eqNo);
  1004. windTowerInfo.setName(eqNo);
  1005. windTowerInfo.setId(collect.get(0).getId());
  1006. windTowerInfo.setType("email");
  1007. windTowerInfo.setHeights(wsH);
  1008. windTowerInfo.setWdHeights(wdH);
  1009. windTowerInfo.setLatitude(CalculationUtil.getBigDecimal(stringStringHashMap.get("Latitude")));
  1010. windTowerInfo.setLongitude(CalculationUtil.getBigDecimal(stringStringHashMap.get("Longitude")));
  1011. windTowerInfo.setRecorderNo(stringStringHashMap.get("SiteNumber"));
  1012. windTowerInfo.setModelNumber("eol");
  1013. windTowerInfoService.saveOrUpdate(windTowerInfo);
  1014. } else {
  1015. try {
  1016. //移动原始文件
  1017. com.jiayue.biz.util.FileUtil.move(fileNameForELog.getPath(), eolFilePath + File.separator + eqNo);
  1018. //移动csv文件
  1019. // com.jiayue.biz.util.FileUtil.move(fileCsv.getPath(), eolFilePath + File.separator + eqNo);
  1020. } catch (Exception e) {
  1021. e.printStackTrace();
  1022. }
  1023. windTowerDataParentTableService.packageData(dataList, eqNo, "eol", "");
  1024. }
  1025. }
  1026. }
  1027. //解析经纬度 记录仪编号 解析wnd文件
  1028. public HashMap<String, String> parseWnd(File wndFile) {
  1029. String fileParent = wndFile.getParent();
  1030. String fileName = wndFile.getName();
  1031. String xls = fileName.replace(".wnd", ".csv");
  1032. CsvReader reader = CsvUtil.getReader();
  1033. //从文件中读取CSV数据
  1034. File file = FileUtil.file(fileParent + File.separator + fileName);
  1035. file.renameTo(new File(fileParent + File.separator + xls));
  1036. CsvData data = reader.read(new File(fileParent + File.separator + xls));
  1037. CsvRow row = data.getRow(1);
  1038. String Longitude = "";
  1039. String Latitude = "";
  1040. String SiteNumber = "";
  1041. HashMap<String, String> hashMap = new HashMap<>();
  1042. for (String s1 : row) {
  1043. if (s1.contains("Longitude")) {
  1044. Longitude = CalculationUtil.getNumberFromStringForDian(s1);
  1045. hashMap.put("Longitude", Longitude);
  1046. } else if (s1.contains("Latitude")) {
  1047. Latitude = CalculationUtil.getNumberFromStringForDian(s1);
  1048. hashMap.put("Latitude", Latitude);
  1049. } else if (s1.contains("SiteNumber")) {
  1050. SiteNumber = CalculationUtil.getNumberFromString(s1);
  1051. hashMap.put("SiteNumber", SiteNumber);
  1052. }
  1053. }
  1054. return hashMap;
  1055. }
  1056. public void emailWindTowerInfoSave(String equipmentNo) {
  1057. List<EmailWindTowerInfo> emailWindTowerInfoList = emailWindTowerInfoService.list();
  1058. List<EmailWindTowerInfo> emailWindTowerInfos = emailWindTowerInfoList.stream().filter(e -> e.getEquipmentNo().equals(equipmentNo)).collect(Collectors.toList());
  1059. if (emailWindTowerInfos.size() == 0) {
  1060. EmailWindTowerInfo emailWindTowerInfo = new EmailWindTowerInfo();
  1061. emailWindTowerInfo.setId(UUID.randomUUID().toString());
  1062. emailWindTowerInfo.setEquipmentNo(equipmentNo);
  1063. }
  1064. }
  1065. public String heightReverseOrder(HashSet<String> Height) {
  1066. StringBuilder builder = new StringBuilder();
  1067. List<String> wsCollect = Height.stream().map(Integer::parseInt).sorted(Comparator.reverseOrder()).map(String::valueOf).collect(Collectors.toList());
  1068. for (String h : wsCollect) {
  1069. if (builder.length() > 0) {
  1070. builder.append(",");
  1071. }
  1072. builder.append(h);
  1073. }
  1074. return builder.toString();
  1075. }
  1076. public String assembleWind(String s, HashSet<String> wsHeight, HashSet<String> wdHeight) {
  1077. String str = s;
  1078. if (s.contains("WS")) {
  1079. String wsAndType = s.substring(s.indexOf("WS"));
  1080. //层高
  1081. String height = "";
  1082. if (!s.contains("TI")) {
  1083. height = CalculationUtil.getNumberFromString(s.substring(s.indexOf("WS")));
  1084. wsHeight.add(height);
  1085. }
  1086. //ave/min/max/sta
  1087. String type = this.assembleProperty(wsAndType);
  1088. str = "ws" + type + "_" + height;
  1089. } else if (s.contains("WD")) {
  1090. String wdAndType = s.substring(s.indexOf("WD"));
  1091. //层高
  1092. String height = CalculationUtil.getNumberFromString(wdAndType);
  1093. wdHeight.add(height);
  1094. //ave/min/max/sta
  1095. String type = this.assembleProperty(wdAndType);
  1096. str = "wd" + type + "_" + height;
  1097. } else if (s.contains("DateTime")) {
  1098. str = "time";
  1099. } else if (s.contains("PR")) {
  1100. String type = this.assembleProperty(s);
  1101. str = "pa" + type;
  1102. } else if (s.contains("TEM")) {
  1103. String type = this.assembleProperty(s);
  1104. str = "t" + type;
  1105. }
  1106. return str;
  1107. }
  1108. public String assembleProperty(String property) {
  1109. String s = "";
  1110. if (property.contains("-")) {
  1111. if (property.contains("STDev")) {
  1112. s = "Sta";
  1113. } else if (property.contains("Max")) {
  1114. s = "Max";
  1115. } else if (property.contains("Min")) {
  1116. s = "Min";
  1117. }
  1118. } else {
  1119. s = "Ave";
  1120. }
  1121. return s;
  1122. }
  1123. public boolean windTowerInfoType(String id) {
  1124. List<WindTowerInfo> equipmentNo = windTowerInfoService.getByEquipmentNo(id);
  1125. List<EmailWindTowerInfo> emailWindTowerInfos = emailWindTowerInfoService.lambdaQuery().eq(EmailWindTowerInfo::getEquipmentNo, id).list();
  1126. if (equipmentNo.size() != 0 && emailWindTowerInfos.size() != 0) {
  1127. return true;
  1128. } else {
  1129. if (emailWindTowerInfos.size() == 0) {
  1130. //如果测风塔里面没有这个塔并且邮件测风塔里也没有这个塔 则添加到邮箱读取的测风塔表中
  1131. EmailWindTowerInfo emailWindTowerInfo = new EmailWindTowerInfo();
  1132. emailWindTowerInfo.setEquipmentNo(id);
  1133. emailWindTowerInfoService.save(emailWindTowerInfo);
  1134. log.info(id + " 测风塔信息里没有这个的塔 并且邮件测风塔里也没有这个塔");
  1135. }
  1136. return false;
  1137. }
  1138. }
  1139. /**
  1140. * dat文件解析
  1141. */
  1142. public void parseByDat(File file) {
  1143. String dec = "D:\\in" + File.separator;
  1144. String fileName = file.getName();
  1145. File newFile = new File(file.getPath());
  1146. //修改后缀名 方便解析
  1147. if (fileName.contains(".dat")) {
  1148. String newFileName = fileName.substring(0, fileName.lastIndexOf(".")) + ".csv";
  1149. newFile = new File(dec + newFileName);
  1150. file.renameTo(newFile);
  1151. }
  1152. CsvReader reader = CsvUtil.getReader();
  1153. CsvData csvRows = reader.read(newFile);
  1154. List<CsvRow> rows = csvRows.getRows();
  1155. CsvRow rowsOne = rows.get(1);
  1156. CsvRow rowsF = rows.get(5);
  1157. StringBuilder height = new StringBuilder();
  1158. StringBuilder wdHeight = new StringBuilder();
  1159. WindTowerInfo windTowerInfo = new WindTowerInfo();
  1160. for (int i = rowsOne.size() - 1; i >= 0; i--) {
  1161. String wsOrWdOrTOrRhOrPa = getWsOrWdOrTOrRhOrPa(rowsOne.get(i), height, wdHeight, i, rowsF, windTowerInfo);
  1162. rowsOne.set(i, wsOrWdOrTOrRhOrPa);
  1163. }
  1164. List<WindTowerInfo> equipmentNo = windTowerInfoService.getByEquipmentNo(windTowerInfo.getEquipmentNo());
  1165. if (windTowerInfoType(windTowerInfo.getEquipmentNo())) {
  1166. if (equipmentNo.size() == 0) {
  1167. windTowerInfo.setHeights(height.toString());
  1168. windTowerInfo.setWdHeights(height.toString());
  1169. windTowerInfoService.saveOrUpdate(windTowerInfo);
  1170. }
  1171. List<Map<String, Object>> mapList = parseByHead(rows, rowsOne);
  1172. List<Map<String, Object>> mapList1 = new CheckDataRecode().checkValue(mapList, "dat");
  1173. windTowerDataParentTableService.packageData(mapList1, windTowerInfo.getEquipmentNo(), "dat", "");
  1174. //将后缀名修改回来
  1175. String newFileName = fileName.substring(0, fileName.lastIndexOf(".")) + ".dat";
  1176. File file1 = new File(dec + newFileName);
  1177. newFile.renameTo(file1);
  1178. try {
  1179. com.jiayue.biz.util.FileUtil.move(file1.getPath(), eolFilePath + File.separator + windTowerInfo.getEquipmentNo());
  1180. } catch (Exception e) {
  1181. log.info("dat文件转移失败");
  1182. throw new RuntimeException(e);
  1183. }
  1184. }
  1185. }
  1186. public List<Map<String, Object>> parseByHead(List<CsvRow> rows, CsvRow rowsOne) {
  1187. List<Map<String, Object>> mapList = new ArrayList<>();
  1188. for (int i = 4; i < rows.size(); i++) {
  1189. HashMap<String, Object> hashMap = new HashMap<>();
  1190. for (int j = 0; j < rows.get(i).size(); j++) {
  1191. if (StrUtil.isNotBlank(rowsOne.get(j))) {
  1192. if (rowsOne.get(j).equals("time")) {
  1193. hashMap.put(rowsOne.get(j), rows.get(i).get(j));
  1194. } else {
  1195. hashMap.put(rowsOne.get(j), new BigDecimal(rows.get(i).get(j)));
  1196. }
  1197. }
  1198. }
  1199. mapList.add(hashMap);
  1200. }
  1201. return mapList;
  1202. }
  1203. public String getWsOrWdOrTOrRhOrPa(String attribute, StringBuilder wsHeight, StringBuilder wdHeight, int i, CsvRow rowsF, WindTowerInfo windTowerInfo) {
  1204. String str = "";
  1205. String height = "";
  1206. String avgOrStaOrMaxOrMin = getAvgOrStaOrMaxOrMin(attribute);
  1207. if (attribute.contains("TIMESTAMP")) {
  1208. str = "time";
  1209. } else if (attribute.contains("WS")) {
  1210. height = CalculationUtil.getNumberFromString(attribute);
  1211. if (wsHeight.toString().equals("")) {
  1212. wsHeight.append(height);
  1213. } else {
  1214. if (!wsHeight.toString().contains(height)) {
  1215. wsHeight.append(",").append(height);
  1216. }
  1217. }
  1218. return "ws" + avgOrStaOrMaxOrMin + "_" + height;
  1219. } else if (attribute.contains("WD")) {
  1220. height = CalculationUtil.getNumberFromString(attribute);
  1221. if (wdHeight.toString().equals("")) {
  1222. wdHeight.append(height);
  1223. } else {
  1224. if (!wdHeight.toString().contains(height)) {
  1225. wdHeight.append(",").append(height);
  1226. }
  1227. }
  1228. return "wd" + avgOrStaOrMaxOrMin + "_" + height;
  1229. } else if (attribute.contains("Ta")) {
  1230. str = "t";
  1231. } else if (attribute.contains("RH")) {
  1232. str = "rh";
  1233. } else if (attribute.contains("pa")) {
  1234. str = "pa";
  1235. } else if (attribute.contains("Station")) {
  1236. windTowerInfo.setEquipmentNo(rowsF.get(i));
  1237. } else if (attribute.equals("N")) {
  1238. windTowerInfo.setLatitude(new BigDecimal(rowsF.get(i)));
  1239. } else if (attribute.equals("E")) {
  1240. windTowerInfo.setLongitude(new BigDecimal(rowsF.get(i)));
  1241. } else {
  1242. return "";
  1243. }
  1244. return str + avgOrStaOrMaxOrMin;
  1245. }
  1246. public String getAvgOrStaOrMaxOrMin(String attribute) {
  1247. String str = "";
  1248. if (attribute.contains("Batt") || attribute.contains("Minute")) {
  1249. return str;
  1250. }
  1251. if (attribute.contains("Avg")) {
  1252. str = "Avg";
  1253. } else if (attribute.contains("Std")) {
  1254. str = "Sta";
  1255. } else if (attribute.contains("Max")) {
  1256. str = "Max";
  1257. } else if (attribute.contains("Min")) {
  1258. str = "Min";
  1259. }
  1260. return str;
  1261. }
  1262. }