WindTowerDataParentTableServiceImpl.java 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846
  1. package com.jiayue.biz.service.impl;
  2. import cn.hutool.core.date.DateTime;
  3. import cn.hutool.core.lang.TypeReference;
  4. import cn.hutool.db.Entity;
  5. import cn.hutool.json.JSONArray;
  6. import com.alibaba.fastjson.JSON;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.jiayue.biz.conf.RequestDataHelper;
  9. import com.jiayue.biz.domain.*;
  10. import com.jiayue.biz.mapper.WindTowerDataParentTableMapper;
  11. import com.jiayue.biz.service.*;
  12. import com.jiayue.biz.util.CalculationUtil;
  13. import com.jiayue.biz.util.CommonUtil;
  14. import com.jiayue.biz.util.FileUtil;
  15. import com.jiayue.common.core.text.Convert;
  16. import com.jiayue.common.utils.DateUtil;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Service;
  20. import javax.servlet.http.HttpServletRequest;
  21. import javax.servlet.http.HttpServletResponse;
  22. import java.io.*;
  23. import java.math.BigDecimal;
  24. import java.math.RoundingMode;
  25. import java.net.URLEncoder;
  26. import java.nio.charset.StandardCharsets;
  27. import java.sql.Timestamp;
  28. import java.text.ParseException;
  29. import java.text.SimpleDateFormat;
  30. import java.util.*;
  31. import java.util.stream.Collectors;
  32. /**
  33. * 测风塔父表数据Service业务层处理
  34. *
  35. * @author whc
  36. * @date 2022-08-04
  37. */
  38. @Slf4j
  39. @Service
  40. public class WindTowerDataParentTableServiceImpl extends ServiceImpl<WindTowerDataParentTableMapper, WindTowerDataParentTable> implements WindTowerDataParentTableService {
  41. @Autowired
  42. WindTowerDataChildTableService windTowerDataChildTableService;
  43. @Autowired
  44. EquipmentAttributeServiceImpl equipmentAttributeService;
  45. @Autowired
  46. WindTowerInfoServiceImpl windTowerInfoService;
  47. @Autowired
  48. AnalysisLogServiceImpl analysisLogService;
  49. @Autowired
  50. DisplayConfigServiceImpl displayConfigService;
  51. @Autowired
  52. ProphaseAnemometryDataService prophaseAnemometryDataService;
  53. @Autowired
  54. ProphaseAnemometryDataOrgService prophaseAnemometryDataOrgService;
  55. @Autowired
  56. ProphaseWeatherDataOrgService prophaseWeatherDataOrgService;
  57. @Autowired
  58. ProphaseWeatherDataService prophaseWeatherDataService;
  59. /**
  60. * 组装数据
  61. *
  62. * @param allData 数据
  63. * @param equipmentId 设备编号
  64. * @param eTime 时间
  65. * @param type 文件类型
  66. * @param operation 操作类型(DataRecalculation数据重算)
  67. */
  68. public void packageData(List<Map<String, Object>> allData, String equipmentId, String eTime, String type, String operation, WindTowerInfo windTowerInfo) {
  69. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  70. if (type.equals("rld")) {
  71. simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  72. }
  73. if (type.equals("sld")) {
  74. simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmm");
  75. }
  76. if (type.equals("eol")) {
  77. simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm");
  78. }
  79. String eqNo = equipmentId;
  80. if (null == windTowerInfo) {
  81. List<WindTowerInfo> windTowerInfoList = windTowerInfoService.list();
  82. windTowerInfo = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(eqNo)).collect(Collectors.toList()).get(0);
  83. }
  84. String windTowerInfoHeights = windTowerInfo.getHeights();
  85. String windTowerInfoWdHeights = windTowerInfo.getWdHeights();
  86. String[] wdHeight = windTowerInfoWdHeights.split(",");
  87. String[] heights = windTowerInfoHeights.split(",");
  88. HashSet<String> heightAll = new HashSet<>();
  89. heightAll.addAll(Arrays.asList(wdHeight));
  90. heightAll.addAll(Arrays.asList(heights));
  91. try {
  92. //所有数据
  93. for (Map<String, Object> m : allData) {
  94. if (!operation.equals("DataRecalculation")) {
  95. this.packageOrgData(m, heightAll, simpleDateFormat, eqNo, "org");
  96. }
  97. //异常数据赋值为-99
  98. if (m.get("abnormalType") != null) {
  99. if (m.get("abnormalType").toString().contains(",")) {
  100. String[] abnormalTypes = m.get("abnormalType").toString().split(",");
  101. for (String abnormalType : abnormalTypes) {
  102. m.put(abnormalType, -99f);
  103. }
  104. } else {
  105. m.put(m.get("abnormalType").toString(), -99f);
  106. }
  107. }
  108. this.packageOrgData(m, heightAll, simpleDateFormat, eqNo, "noOrg");
  109. }
  110. } catch (Exception e) {
  111. log.error("处理文件数据入库错误:{}", e);
  112. }
  113. }
  114. public void packageOrgData(Map<String, Object> m, HashSet<String> heightAll, SimpleDateFormat simpleDateFormat, String equipmentId, String org) {
  115. for (String height : heightAll) {
  116. ProphaseAnemometryData one = new ProphaseAnemometryData();
  117. //组装子表数据
  118. one.setWsAve(m.get("wsAve_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wsAve_" + height)).setScale(2, RoundingMode.HALF_UP)));
  119. one.setWsMin(m.get("wsMin_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wsMin_" + height)).setScale(2, RoundingMode.HALF_UP)));
  120. one.setWsMax(m.get("wsMax_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wsMax_" + height)).setScale(2, RoundingMode.HALF_UP)));
  121. one.setWsSta(m.get("wsSta_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wsSta_" + height)).setScale(2, RoundingMode.HALF_UP)));
  122. one.setWsInst(m.get("wsInst_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wsInst_" + height)).setScale(2, RoundingMode.HALF_UP)));
  123. one.setWdAve(m.get("wdAve_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wdAve_" + height)).setScale(2, RoundingMode.HALF_UP)));
  124. one.setWdMax(m.get("wdMax_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wdMax_" + height)).setScale(2, RoundingMode.HALF_UP)));
  125. one.setWdMin(m.get("wdMin_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wdMin_" + height)).setScale(2, RoundingMode.HALF_UP)));
  126. one.setWdSta(m.get("wdSta_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wdSta_" + height)).setScale(2, RoundingMode.HALF_UP)));
  127. one.setWdInst(m.get("wdInst_" + height) == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("wdInst_" + height)).setScale(2, RoundingMode.HALF_UP)));
  128. one.setLayerHeight(height);
  129. one.setEquipmentId(equipmentId);
  130. if (m.get("time") != null) {
  131. try {
  132. try {
  133. one.setTs(new Timestamp(simpleDateFormat.parse(m.get("time").toString()).getTime()));
  134. } catch (ParseException e) {
  135. one.setTs(new Timestamp(new Date(Long.parseLong(m.get("time").toString())).getTime()));
  136. }
  137. } catch (Exception e) {
  138. log.error("时间转换异常:" + e);
  139. }
  140. }
  141. if (org.equals("org")) {
  142. prophaseAnemometryDataOrgService.insertOneWithNew(one);
  143. } else {
  144. prophaseAnemometryDataService.insertOneWithNew(one);
  145. }
  146. }
  147. ProphaseWeatherData prophaseAnemometryPublicData = new ProphaseWeatherData();
  148. prophaseAnemometryPublicData.setEquipmentId(equipmentId);
  149. if (m.get("paMax") != null)
  150. //kpa转hpa
  151. if (BigDecimal.valueOf(Double.parseDouble(m.get("paMax").toString())).compareTo(new BigDecimal(200)) < 0)
  152. prophaseAnemometryPublicData.setPaMax(Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paMax").toString()).multiply(new BigDecimal(10)).setScale(2, RoundingMode.HALF_UP)));
  153. else
  154. prophaseAnemometryPublicData.setPaMax(Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paMax").toString())));
  155. if (m.get("paMin") != null)
  156. //kpa转hpa
  157. if (BigDecimal.valueOf(Double.parseDouble(m.get("paMin").toString())).compareTo(new BigDecimal(200)) < 0)
  158. prophaseAnemometryPublicData.setPaMin(Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paMin").toString()).multiply(new BigDecimal(10)).setScale(2, RoundingMode.HALF_UP)));
  159. else
  160. prophaseAnemometryPublicData.setPaMin(Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paMin").toString())));
  161. if (m.get("paAve") != null)
  162. //kpa转hpa
  163. if (BigDecimal.valueOf(Double.parseDouble(m.get("paAve").toString())).compareTo(new BigDecimal(200)) < 0)
  164. prophaseAnemometryPublicData.setPaAve(Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paAve").toString()).multiply(new BigDecimal(10)).setScale(2, RoundingMode.HALF_UP)));
  165. else
  166. prophaseAnemometryPublicData.setPaAve(Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paAve").toString())));
  167. prophaseAnemometryPublicData.setPaSta(m.get("paSta") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("paSta")).setScale(2, RoundingMode.HALF_UP)));
  168. prophaseAnemometryPublicData.setTMax(m.get("tMax") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("tMax")).setScale(2, RoundingMode.HALF_UP)));
  169. prophaseAnemometryPublicData.setTMin(m.get("tMin") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("tMin")).setScale(2, RoundingMode.HALF_UP)));
  170. prophaseAnemometryPublicData.setTAve(m.get("tAve") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("tAve")).setScale(2, RoundingMode.HALF_UP)));
  171. prophaseAnemometryPublicData.setTSta(m.get("tSta") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("tSta")).setScale(2, RoundingMode.HALF_UP)));
  172. prophaseAnemometryPublicData.setRhMax(m.get("rhMax") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("rhMax")).setScale(2, RoundingMode.HALF_UP)));
  173. prophaseAnemometryPublicData.setRhMin(m.get("rhMin") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("rhMin")).setScale(2, RoundingMode.HALF_UP)));
  174. prophaseAnemometryPublicData.setRhAve(m.get("rhAve") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("rhAve")).setScale(2, RoundingMode.HALF_UP)));
  175. prophaseAnemometryPublicData.setRhSta(m.get("rhSta") == null ? null : Convert.toFloat(CalculationUtil.getBigDecimal(m.get("rhSta")).setScale(2, RoundingMode.HALF_UP)));
  176. //计算空气密度 1.293*(273/(273+温度摄氏度))*气压百帕/1013
  177. if (prophaseAnemometryPublicData.getTAve() != null && prophaseAnemometryPublicData.getPaAve() != null &&
  178. prophaseAnemometryPublicData.getTAve() != -99 && prophaseAnemometryPublicData.getPaAve() > 0) {
  179. BigDecimal airDensity = BigDecimal.valueOf(1.293).multiply(new BigDecimal(273).divide(new BigDecimal(273).add(BigDecimal.valueOf(prophaseAnemometryPublicData.getTAve())), 2, RoundingMode.HALF_UP)).multiply(BigDecimal.valueOf(prophaseAnemometryPublicData.getPaAve())).divide(new BigDecimal(1013), 2, RoundingMode.HALF_UP);
  180. prophaseAnemometryPublicData.setAirDensity(Convert.toFloat(airDensity));
  181. } else {
  182. //随机数 上限1.28 下限1.15
  183. Random random = new Random();
  184. int randNumber = random.nextInt(128 - 115 + 1) + 115;
  185. BigDecimal air = BigDecimal.valueOf(randNumber).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
  186. prophaseAnemometryPublicData.setAirDensity(Convert.toFloat(air));
  187. }
  188. if (m.get("time") != null) {
  189. try {
  190. try {
  191. prophaseAnemometryPublicData.setTs(new Timestamp(simpleDateFormat.parse(m.get("time").toString()).getTime()));
  192. } catch (ParseException e) {
  193. prophaseAnemometryPublicData.setTs(new Timestamp(new Date(Long.parseLong(m.get("time").toString())).getTime()));
  194. }
  195. } catch (Exception e) {
  196. log.error("时间转换异常:" + e);
  197. }
  198. }
  199. if (org.equals("org")) {
  200. prophaseWeatherDataOrgService.insertOne(prophaseAnemometryPublicData);
  201. } else {
  202. prophaseWeatherDataService.insertOne(prophaseAnemometryPublicData);
  203. }
  204. }
  205. //通道数据保存
  206. public void saveDataForTunnel(HashMap<String, BigDecimal> dataMap, HashSet<Integer> heightSet, String equipmentNo, String time) {
  207. Timestamp curentTimestamp = new Timestamp(DateUtil.parse(time).getTime());
  208. for (Integer height : heightSet) {
  209. // List<EquipmentAttribute> eqHeight = equipmentAttributes.stream().filter(e -> e.getFieldName().equals(height.toString())).collect(Collectors.toList());
  210. ProphaseAnemometryData prophaseAnemometryData = new ProphaseAnemometryData();
  211. prophaseAnemometryData.setLayerHeight(height.toString());
  212. prophaseAnemometryData.setWsAve(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wsAve" + height) == null ? null : dataMap.get("wsAve" + height).toString())));
  213. prophaseAnemometryData.setWsMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wsMin" + height) == null ? null : dataMap.get("wsMin" + height).toString())));
  214. prophaseAnemometryData.setWsMax(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wsMax" + height) == null ? null : dataMap.get("wsMax" + height).toString())));
  215. prophaseAnemometryData.setWsSta(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wsSta" + height) == null ? null : dataMap.get("wsSta" + height).toString())));
  216. prophaseAnemometryData.setWsInst(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wsInst" + height) == null ? null : dataMap.get("wsInst" + height).toString())));
  217. prophaseAnemometryData.setWsGust(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wsGust" + height) == null ? null : dataMap.get("wsGust" + height).toString())));
  218. prophaseAnemometryData.setWdAve(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wdAve" + height) == null ? null : dataMap.get("wdAve" + height).toString())));
  219. prophaseAnemometryData.setWdMax(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wdMax" + height) == null ? null : dataMap.get("wdMax" + height).toString())));
  220. prophaseAnemometryData.setWdMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wdMin" + height) == null ? null : dataMap.get("wdMin" + height).toString())));
  221. prophaseAnemometryData.setWdSta(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wdSta" + height) == null ? null : dataMap.get("wdSta" + height).toString())));
  222. prophaseAnemometryData.setWdInst(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("wdInst" + height) == null ? null : dataMap.get("wdInst" + height).toString())));
  223. prophaseAnemometryData.setEquipmentId(equipmentNo);
  224. prophaseAnemometryData.setTs(curentTimestamp);
  225. prophaseAnemometryDataOrgService.insertOneWithNew(prophaseAnemometryData);
  226. prophaseAnemometryDataService.insertOneWithNew(prophaseAnemometryData);
  227. }
  228. ProphaseWeatherData prophaseWeatherData = new ProphaseWeatherData();
  229. prophaseWeatherData.setEquipmentId(equipmentNo);
  230. if (dataMap.get("paMax") != null) {
  231. //kpa转hpa
  232. if (BigDecimal.valueOf(Double.parseDouble(dataMap.get("paMax").toString())).compareTo(new BigDecimal(200)) < 0)
  233. prophaseWeatherData.setPaMax(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paMax").toString()).multiply(new BigDecimal(10)).setScale(4, RoundingMode.HALF_UP)));
  234. else
  235. prophaseWeatherData.setPaMax(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paMax").toString())));
  236. }
  237. if (dataMap.get("paMin") != null) {
  238. //kpa转hpa
  239. if (BigDecimal.valueOf(Double.parseDouble(dataMap.get("paMin").toString())).compareTo(new BigDecimal(200)) < 0)
  240. prophaseWeatherData.setPaMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paMin").toString()).multiply(new BigDecimal(10)).setScale(4, RoundingMode.HALF_UP)));
  241. else
  242. prophaseWeatherData.setPaMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paMin").toString())));
  243. }
  244. if (dataMap.get("paInst") != null) {
  245. //kpa转hpa
  246. if (BigDecimal.valueOf(Double.parseDouble(dataMap.get("paInst").toString())).compareTo(new BigDecimal(200)) < 0)
  247. prophaseWeatherData.setPaMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paInst").toString()).multiply(new BigDecimal(10)).setScale(4, RoundingMode.HALF_UP)));
  248. else
  249. prophaseWeatherData.setPaMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paInst").toString())));
  250. }
  251. if (dataMap.get("paAve") != null) {
  252. //kpa转hpa
  253. if (BigDecimal.valueOf(Double.parseDouble(dataMap.get("paAve").toString())).compareTo(new BigDecimal(200)) < 0)
  254. prophaseWeatherData.setPaAve(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paAve").toString()).multiply(new BigDecimal(10)).setScale(4, RoundingMode.HALF_UP)));
  255. else
  256. prophaseWeatherData.setPaAve(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paAve").toString())));
  257. }
  258. prophaseWeatherData.setPaSta(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("paSta") == null ? null : dataMap.get("paSta").toString())));
  259. prophaseWeatherData.setTMax(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("tMax") == null ? null : dataMap.get("tMax").toString())));
  260. prophaseWeatherData.setTMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("tMin") == null ? null : dataMap.get("tMin").toString())));
  261. prophaseWeatherData.setTAve(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("tAve") == null ? null : dataMap.get("tAve").toString())));
  262. prophaseWeatherData.setTSta(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("tSta") == null ? null : dataMap.get("tSta").toString())));
  263. prophaseWeatherData.setTInst(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("tInst") == null ? null : dataMap.get("tInst").toString())));
  264. prophaseWeatherData.setRhMax(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("rhMax") == null ? null : dataMap.get("rhMax").toString())));
  265. prophaseWeatherData.setRhMin(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("rhMin") == null ? null : dataMap.get("rhMin").toString())));
  266. prophaseWeatherData.setRhAve(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("rhAve") == null ? null : dataMap.get("rhAve").toString())));
  267. prophaseWeatherData.setRhSta(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("rhSta") == null ? null : dataMap.get("rhSta").toString())));
  268. prophaseWeatherData.setRhInst(Convert.toFloat(CalculationUtil.getBigDecimal(dataMap.get("rhInst") == null ? null : dataMap.get("rhInst").toString())));
  269. //计算空气密度
  270. if (dataMap.get("tAve") != null && dataMap.get("paAve") != null) {
  271. BigDecimal airDensity = BigDecimal.valueOf(1.293).multiply(new BigDecimal(273).divide(new BigDecimal(273).add(dataMap.get("tAve")), 2, RoundingMode.HALF_UP)).multiply(dataMap.get("paAve")).divide(new BigDecimal(1013), 2, RoundingMode.HALF_UP);
  272. prophaseWeatherData.setAirDensity(Convert.toFloat(airDensity));
  273. }
  274. log.info("dataMap.get(tAve):{} ,,, {}", dataMap.get("tAve"), dataMap.get("paAve"));
  275. //设置时间
  276. prophaseWeatherData.setTs(curentTimestamp);
  277. prophaseWeatherDataService.insertOne(prophaseWeatherData);
  278. prophaseWeatherDataOrgService.insertOne(prophaseWeatherData);
  279. }
  280. /**
  281. * 根据时间范围和设备id查询数据
  282. *
  283. * @param startTime 开始时间
  284. * @param endTime 结束时间
  285. * @param equipmentId 设备id
  286. * @return List<Map < String, Object>>
  287. */
  288. public List<Map<String, Object>> selectDataByBetweenTimeAndEquipmetId(Date startTime, Date endTime, String equipmentId) {
  289. return selectByBetweenTimeAndEquipmetId(startTime, endTime, equipmentId);
  290. }
  291. /**
  292. * 根据条件查询数据并分页
  293. *
  294. * @param startTime 开始时间
  295. * @param endTime 结束时间
  296. * @param equipmentId 设备id
  297. * @return
  298. */
  299. public Map<String, Object> selectDataPageByBetweenTimeAndEquipmetId(Date startTime, Date endTime, String equipmentId, Integer pageNo, Integer pageSize) {
  300. List<Map<String, Object>> maps = selectByBetweenTimeAndEquipmetId(startTime, endTime, equipmentId);
  301. Map<String, Object> map = new HashMap<>();
  302. map.put("count", maps.size());
  303. map.put("list", maps.stream().skip((pageNo - 1) * pageSize).limit(pageSize).collect(Collectors.toList()));
  304. return map;
  305. }
  306. //原实时数据查询
  307. public List<Map<String, Object>> selectByBetweenTimeAndEquipmetIdOld(Date startTime, Date endTime, String equipmentId) {
  308. List<Entity> windTowerDataParentTables = baseMapper.selectDataByBetweenTimeAndEquipmetId(equipmentId, startTime, endTime);
  309. //entity转JOSN数组
  310. JSONArray array = new JSONArray(windTowerDataParentTables);
  311. //JSON数据转List<Map<String, Object>>
  312. List<Map<String, Object>> maps = JSON.parseObject(array.toString(), new TypeReference<List<Map<String, Object>>>() {
  313. });
  314. //最终转换后的map
  315. List<Map<String, Object>> newMaps = new ArrayList<>();
  316. // 数据库查出来的结果父一行 子多行 一父多子转换成一父一子
  317. for (int i = 0; i < maps.size(); i++) {
  318. Map<String, Object> newMap = new HashMap<>();
  319. int finalI = i;
  320. maps.get(i).forEach((key, value) -> {
  321. if (!newMaps.isEmpty()) {
  322. //有数据的情况下 如果parent_id相等 则代表应合并成一条
  323. if (newMaps.get(newMaps.size() - 1).get("parent_id").equals(maps.get(finalI).get("parent_id"))) {
  324. //只有风速风向有层高
  325. if (key.contains("ws_") || key.contains("wd_")) {
  326. newMaps.get(newMaps.size() - 1).put(key + maps.get(finalI).get("field_name"), value);
  327. }
  328. } else {
  329. if (key.contains("ws_") || key.contains("wd_")) {
  330. newMap.put(key + maps.get(finalI).get("field_name"), value);
  331. } else {
  332. newMap.put(key, value);
  333. }
  334. }
  335. } else {
  336. if (key.contains("ws_") || key.contains("wd_")) {
  337. newMap.put(key + maps.get(finalI).get("field_name"), value);
  338. } else {
  339. newMap.put(key, value);
  340. }
  341. }
  342. });
  343. //在合并数据的时候是直接往list里put newMap就是空的 如果直接add的话会报错空指针
  344. if (!newMap.isEmpty()) {
  345. newMaps.add(newMap);
  346. }
  347. }
  348. return newMaps;
  349. }
  350. /**
  351. * 实时数据查询
  352. *
  353. * @param timeBegin 开始时间
  354. * @param timeEnd 结束时间
  355. * @param equipmentId 设备编号
  356. * @return List<Map < String, Object>> 实时数据
  357. */
  358. private List<Map<String, Object>> selectByBetweenTimeAndEquipmetId(Date timeBegin, Date timeEnd, String equipmentId) {
  359. Timestamp startTime = new Timestamp(timeBegin.getTime());
  360. Timestamp endTime = new Timestamp(timeEnd.getTime());
  361. HashSet<String> heightSet = new HashSet<>();
  362. //获取测风塔数据
  363. List<WindTowerInfo> list = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, equipmentId).list();
  364. List<Map<String, Object>> mapList = new ArrayList<>();
  365. List<ProphaseAnemometryData> prophaseAnemometryPublicData = prophaseAnemometryDataOrgService.selectAll(equipmentId, startTime, endTime);
  366. List<ProphaseWeatherData> prophaseAnemometryPublicDataList = prophaseWeatherDataOrgService.selectPublicData(equipmentId, startTime, endTime);
  367. String heights = list.get(0).getHeights();
  368. String wdHeights = list.get(0).getWdHeights();
  369. //将层高加入list
  370. heightSet.addAll(Arrays.asList(heights.split(",")));
  371. heightSet.addAll(Arrays.asList(wdHeights.split(",")));
  372. //组装数据
  373. for (ProphaseWeatherData anemometryPublicData : prophaseAnemometryPublicDataList) {
  374. HashMap<String, Object> dataMap = new HashMap<>();
  375. List<ProphaseAnemometryData> prophaseAnemometryData = prophaseAnemometryPublicData.stream().filter(p -> p.getTs().getTime() == anemometryPublicData.getTs().getTime()).collect(Collectors.toList());
  376. dataMap.put("time", anemometryPublicData.getTs().getTime());
  377. dataMap.put("tAve", anemometryPublicData.getTAve());
  378. dataMap.put("tMax", anemometryPublicData.getTMax());
  379. dataMap.put("tMin", anemometryPublicData.getTMin());
  380. dataMap.put("tSta", anemometryPublicData.getTSta());
  381. dataMap.put("tInst", anemometryPublicData.getTInst());
  382. dataMap.put("rhAve", anemometryPublicData.getRhAve());
  383. dataMap.put("rhMax", anemometryPublicData.getRhMax());
  384. dataMap.put("rhMin", anemometryPublicData.getRhMin());
  385. dataMap.put("rhSta", anemometryPublicData.getRhSta());
  386. dataMap.put("rhInst", anemometryPublicData.getRhInst());
  387. dataMap.put("paAve", anemometryPublicData.getPaAve());
  388. dataMap.put("paMax", anemometryPublicData.getPaMax());
  389. dataMap.put("paMin", anemometryPublicData.getPaMin());
  390. dataMap.put("paSta", anemometryPublicData.getPaSta());
  391. dataMap.put("paInst", anemometryPublicData.getPaInst());
  392. dataMap.put("airdensity", anemometryPublicData.getAirDensity());
  393. if (prophaseAnemometryData.size() > 0) {
  394. for (ProphaseAnemometryData prophaseAnemometryDatum : prophaseAnemometryData) {
  395. dataMap.put("wsAve_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWsAve());
  396. dataMap.put("wsMax_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWsMax());
  397. dataMap.put("wsMin_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWsMin());
  398. dataMap.put("wsSta_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWsSta());
  399. dataMap.put("wsInst_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWsInst());
  400. dataMap.put("wdAve_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWdAve());
  401. dataMap.put("wdMax_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWdMax());
  402. dataMap.put("wdMin_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWdMin());
  403. dataMap.put("wdSta_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWdSta());
  404. dataMap.put("wdInst_" + prophaseAnemometryDatum.getLayerHeight(), prophaseAnemometryDatum.getWdInst());
  405. }
  406. }
  407. //过滤value为空的数据
  408. Map<String, Object> collect = dataMap.entrySet().stream().filter(h -> h.getValue() != null).collect(Collectors.toMap(Map.Entry::getKey, h -> h.getValue()));
  409. mapList.add(collect);
  410. }
  411. return mapList;
  412. }
  413. /**
  414. * 导出测风塔数据
  415. *
  416. * @param startTime
  417. * @param endTime
  418. * @param equipmentId
  419. */
  420. public void export(HttpServletResponse response, Long startTime, Long endTime, String equipmentId) {
  421. try {
  422. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  423. BufferedOutputStream bos = null;
  424. StringBuilder templateContent = new StringBuilder();
  425. List<Map<String, Object>> mapList = selectDataByBetweenTimeAndEquipmetId(new Date(startTime), new Date(endTime), equipmentId);
  426. //根据设备编号查找此场站显示的列
  427. List<DisplayConfig> displayConfigs = displayConfigService.findByDisplaySign(equipmentId);
  428. //把显示列分割数组
  429. String[] strings;
  430. if (displayConfigs.size() > 0) {
  431. strings = displayConfigs.get(0).getShowCode().split(",");
  432. } else {
  433. //获取层高根据层高拼
  434. //String s = "equipment_id,time,t_inst,t_max,t_min,t_ave,t_sta,rh_inst,rh_max,rh_min,rh_ave,rh_sta,pa_inst,pa_max,pa_min,pa_ave,ws_inst150,ws_max150,ws_min150,ws_ave150,ws_sta150,wd_inst150,wd_max150,wd_min150,wd_ave150,wd_sta150,ws_inst150A,ws_max150A,ws_min150A,ws_ave150A,ws_sta150A,wd_inst150A,wd_max150A,wd_min150A,wd_ave150A,wd_sta150A,ws_inst140,ws_max140,ws_min140,ws_ave140,ws_sta140,wd_inst140,wd_max140,wd_min140,wd_ave140,wd_sta140,ws_inst140A,ws_max140A,ws_min140A,ws_ave140A,ws_sta140A,wd_inst140A,wd_max140A,wd_min140A,wd_ave140A,wd_sta140A,ws_inst120,ws_max120,ws_min120,ws_ave120,ws_sta120,wd_inst120,wd_max120,wd_min120,wd_ave120,wd_sta120,ws_inst80,ws_max80,ws_min80,ws_ave80,ws_sta80,wd_inst80,wd_max80,wd_min80,wd_ave80,wd_sta80,ws_inst90,ws_max90,ws_min90,ws_ave90,ws_sta90,wd_inst90,wd_max90,wd_min90,wd_ave90,wd_sta90,ws_inst100,ws_max100,ws_min100,ws_ave100,ws_sta100,wd_inst100,wd_max100,wd_min100,wd_ave100,wd_sta100,ws_inst110,ws_max110,ws_min110,ws_ave110,ws_sta110,wd_inst110,wd_max110,wd_min110,wd_ave110,wd_sta110,ws_inst120,ws_max120,ws_min120,ws_ave120,ws_sta120,wd_inst120,wd_max120,wd_min120,wd_ave120,wd_sta120,wd_inst140,wd_max140,wd_min140,wd_ave140,wd_sta140,ws_inst140,ws_max140,ws_min140,ws_ave140,ws_sta140,wd_inst150,wd_max150,wd_min150,wd_ave150,wd_sta150,ws_inst150,ws_max150,ws_min150,ws_ave150,ws_sta150,airDensity";
  435. StringBuffer stringBuffer = new StringBuffer();
  436. stringBuffer.append("equipment_id")
  437. .append(",").append("time")
  438. .append(",").append("t_inst")
  439. .append(",").append("t_max")
  440. .append(",").append("t_min")
  441. .append(",").append("t_ave")
  442. .append(",").append("t_sta")
  443. .append(",").append("rh_inst")
  444. .append(",").append("rh_max")
  445. .append(",").append("rh_min")
  446. .append(",").append("rh_ave")
  447. .append(",").append("rh_sta")
  448. .append(",").append("pa_inst")
  449. .append(",").append("pa_max")
  450. .append(",").append("pa_min")
  451. .append(",").append("pa_ave")
  452. .append(",").append("pa_sta");
  453. //所有层高
  454. String[] height = {"200", "200A", "190", "190A", "180", "180A", "170", "170A", "160", "160A", "150", "150A", "140", "140A", "120", "120A", "110", "110A", "100", "100A", "90", "90A", "80", "80A", "70", "70A", "50", "50A", "30", "30A", "10", "10A"};
  455. Map<String, Object> map = new HashMap<>();
  456. if (!mapList.isEmpty()) {
  457. map = mapList.get(0);
  458. }
  459. //把拼装后的属性和共有的属性拼装
  460. StringBuffer key = getKey(height);
  461. stringBuffer.append(key);
  462. String[] strs = stringBuffer.toString().split(",");
  463. StringBuffer strBuffer = new StringBuffer();
  464. for (String s : strs) {
  465. if (map.get(s) != null) {
  466. strBuffer.append(s).append(",");
  467. }
  468. }
  469. strBuffer.append("air_density");
  470. strings = strBuffer.toString().split(",");
  471. }
  472. //表头
  473. String header = "";
  474. //内容
  475. StringBuilder content = new StringBuilder();
  476. for (String s : strings) {
  477. //获取动态的表头
  478. header += getName(s) + ",";
  479. }
  480. header += "\r\n";
  481. templateContent.append(header);
  482. //拼接内容
  483. if (!mapList.isEmpty()) {
  484. for (Map<String, Object> map : mapList) {
  485. for (String string : strings) {
  486. if (string.equals("time")) {
  487. content.append(sdf.format(map.get(string))).append(",");
  488. } else {
  489. content.append(map.get(string)).append(",");
  490. }
  491. }
  492. content.append("\r\n");
  493. }
  494. }
  495. templateContent.append(content);
  496. sdf = new SimpleDateFormat("yyyy-MM-dd");
  497. response.setContentType("application/x-msdownload;charset=UTF-8");// 文件下载必须配置为application/x-msdownload
  498. response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(sdf.format(startTime) + "至" + sdf.format(endTime) + "测风塔文件" + ".csv", "UTF-8"));// 中文文件名必须使用URLEncoder.encode进行转码
  499. byte[] templateContentBytes = new byte[0];
  500. templateContentBytes = templateContent.toString().getBytes(StandardCharsets.UTF_8);
  501. bos = new BufferedOutputStream(response.getOutputStream());// 向response中写入文件流
  502. bos.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});// 指定csv文件用UTF-8字符集打开
  503. bos.write(templateContentBytes);
  504. response.flushBuffer();
  505. } catch (Exception e) {
  506. e.printStackTrace();
  507. }
  508. }
  509. /**
  510. * 导出测风塔数据文件
  511. *
  512. * @param equipmentId
  513. */
  514. public void exportAll(HttpServletRequest request, HttpServletResponse response, String equipmentId, Long startTime, Long endTime) {
  515. try {
  516. File dataFile = new File(FileUtil.getSystemFilePath() + File.separator + equipmentId);
  517. File[] files = dataFile.listFiles();
  518. String zipPath = FileUtil.getSystemFilePath() + File.separator + equipmentId + File.separator + equipmentId + "数据文件.zip";
  519. List<File> files1 = Arrays.stream(files).map(file -> {
  520. String name = file.getName();
  521. if (name.contains(".rld")) {
  522. String[] rldNameTime = name.split("_");
  523. long time = DateUtil.parse(rldNameTime[1], "yyyy-MM-dd").getTime();
  524. if (time >= startTime && time <= endTime) {
  525. return file;
  526. }
  527. } else if (name.contains(".RWD")) {
  528. String rwdNameTime = name.substring(equipmentId.length(), equipmentId.length() + 8);
  529. long time = DateUtil.parse(rwdNameTime, "yyyyMMdd").getTime();
  530. if (time >= startTime && time <= endTime) {
  531. return file;
  532. }
  533. } else if (name.contains(".elog")) {
  534. String[] elogNameTime = name.split("_");
  535. long time = DateUtil.parse(elogNameTime[1], "yyyyMMdd").getTime();
  536. if (time >= startTime && time <= endTime) {
  537. return file;
  538. }
  539. }
  540. return null;
  541. }).filter(file -> file != null && file.getName().contains(equipmentId)).collect(Collectors.toList());
  542. String[] strDir = new String[files1.size()];
  543. for (int i = 0; i < files1.size(); i++) {
  544. strDir[i] = files1.get(i).toString();
  545. }
  546. FileOutputStream fos2 = new FileOutputStream(new File(zipPath));
  547. //压缩
  548. CommonUtil.toZip(strDir, fos2, true);
  549. downLoadFile(request, response, zipPath);
  550. File deleteFile = new File(zipPath);
  551. //下载完删除本地压缩包
  552. deleteFile.delete();
  553. } catch (Exception e) {
  554. e.printStackTrace();
  555. }
  556. }
  557. /**
  558. * 文件下载
  559. *
  560. * @param request HttpServletRequest
  561. * @param response HttpServletResponse
  562. * @param zipPath 路径
  563. */
  564. public void downLoadFile(HttpServletRequest request,
  565. HttpServletResponse response,
  566. String zipPath) {
  567. response.setContentType("text/html;charset=utf-8");
  568. try {
  569. request.setCharacterEncoding("UTF-8");
  570. } catch (UnsupportedEncodingException e1) {
  571. log.error("系统错误:" + e1.getMessage(), e1);
  572. }
  573. InputStream ins = null;
  574. BufferedInputStream bins = null;
  575. try {
  576. File df = new File(zipPath);
  577. ins = new FileInputStream(df);
  578. bins = new BufferedInputStream(ins);
  579. OutputStream outs = response.getOutputStream();
  580. BufferedOutputStream bouts = new BufferedOutputStream(outs);
  581. response.setHeader("Content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(df.getName(), "UTF-8"));
  582. response.setContentType("application/x-msdownload; charset=utf-8");
  583. int bytesRead = 0;
  584. byte[] buffer = new byte[8192];
  585. while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {
  586. bouts.write(buffer, 0, bytesRead);
  587. }
  588. bouts.flush();
  589. bouts.close();
  590. } catch (Exception e) {
  591. log.error("系统错误:" + e.getMessage(), e);
  592. } finally {
  593. if (bins != null) {
  594. try {
  595. bins.close();
  596. } catch (IOException e) {
  597. e.printStackTrace();
  598. }
  599. }
  600. if (ins != null) {
  601. try {
  602. ins.close();
  603. } catch (IOException e) {
  604. e.printStackTrace();
  605. }
  606. }
  607. }
  608. }
  609. /**
  610. * 根据传入的层高 返回拼装的属性
  611. *
  612. * @param height 层高
  613. * @return
  614. */
  615. private StringBuffer getKey(String[] height) {
  616. StringBuffer strings = new StringBuffer();
  617. for (String s : height) {
  618. strings.append(",").append("ws_inst").append(s).append(",").append("ws_max").append(s).append(",").append("ws_min").append(s).append(",").append("ws_ave").append(s).append(",").append("ws_sta").append(s).append(",").append("wd_inst").append(s).append(",").append("wd_max").append(s).append(",").append("wd_min").append(s).append(",").append("wd_ave").append(s).append(",").append("wd_sta").append(s);
  619. }
  620. return strings;
  621. }
  622. /**
  623. * 根据属性名返回表头
  624. *
  625. * @param name 属性名
  626. * @return
  627. */
  628. private String getName(String name) {
  629. if (name.equals("equipment_id")) {
  630. return "设备编号";
  631. } else if (name.equals("time")) {
  632. return "时间";
  633. } else if (name.equals("t_inst")) {
  634. return "温度瞬时值";
  635. } else if (name.equals("t_max")) {
  636. return "温度最大值";
  637. } else if (name.equals("t_min")) {
  638. return "温度最小值";
  639. } else if (name.equals("t_ave")) {
  640. return "温度平均值";
  641. } else if (name.equals("t_sta")) {
  642. return "温度标差值";
  643. } else if (name.equals("rh_inst")) {
  644. return "湿度瞬时值";
  645. } else if (name.equals("rh_max")) {
  646. return "湿度最大值";
  647. } else if (name.equals("rh_min")) {
  648. return "湿度最小值";
  649. } else if (name.equals("rh_ave")) {
  650. return "湿度平均值";
  651. } else if (name.equals("rh_sta")) {
  652. return "湿度标差值";
  653. } else if (name.equals("pa_inst")) {
  654. return "气压瞬时值";
  655. } else if (name.equals("pa_max")) {
  656. return "气压最大值";
  657. } else if (name.equals("pa_min")) {
  658. return "气压最小值";
  659. } else if (name.equals("pa_ave")) {
  660. return "气压平均值";
  661. } else if (name.equals("pa_sta")) {
  662. return "气压标差值";
  663. } else if (name.contains("ws_inst")) {
  664. return name.substring(7) + "米风速瞬时值";
  665. } else if (name.contains("ws_max")) {
  666. return name.substring(6) + "米风速最大值";
  667. } else if (name.contains("ws_min")) {
  668. return name.substring(6) + "米风速最小值";
  669. } else if (name.contains("ws_ave")) {
  670. return name.substring(6) + "米风速平均值";
  671. } else if (name.contains("ws_sta")) {
  672. return name.substring(6) + "米风速标差值";
  673. } else if (name.contains("wd_inst")) {
  674. return name.substring(7) + "米风向瞬时值";
  675. } else if (name.contains("wd_max")) {
  676. return name.substring(6) + "米风向最大值";
  677. } else if (name.contains("wd_min")) {
  678. return name.substring(6) + "米风向最小值";
  679. } else if (name.contains("wd_ave")) {
  680. return name.substring(6) + "米风向平均值";
  681. } else if (name.contains("wd_sta")) {
  682. return name.substring(6) + "米风向标差值";
  683. } else if (name.equals("air_density")) {
  684. return "空气密度";
  685. } else {
  686. return "";
  687. }
  688. }
  689. /**
  690. * 存一条数据
  691. *
  692. * @param windTowerDataParentTable
  693. * @param windTowerDataChildTable
  694. * @param equipmentId
  695. */
  696. public void saveByEquipmentId(WindTowerDataParentTable windTowerDataParentTable, WindTowerDataChildTable windTowerDataChildTable, String equipmentId) {
  697. Map<String, Object> map = new HashMap<>();
  698. map.put("equipment_id", equipmentId);
  699. RequestDataHelper.setRequestData(map);
  700. windTowerDataChildTableService.saveByEquipmentId(windTowerDataChildTable, equipmentId);
  701. this.save(windTowerDataParentTable);
  702. }
  703. /**
  704. * 存多条数据
  705. *
  706. * @param windTowerDataParentTableList
  707. * @param windTowerDataChildTableList
  708. * @param equipmentId
  709. */
  710. public void saveBatchByEquipmentId(List<WindTowerDataParentTable> windTowerDataParentTableList, List<WindTowerDataChildTable> windTowerDataChildTableList, String equipmentId) {
  711. Map<String, Object> map = new HashMap<>();
  712. map.put("equipment_id", equipmentId);
  713. RequestDataHelper.setRequestData(map);
  714. windTowerDataChildTableService.saveBatchByEquipmentId(windTowerDataChildTableList, equipmentId);
  715. this.saveBatch(windTowerDataParentTableList);
  716. }
  717. /**
  718. * 删除数据
  719. *
  720. * @param equipmentId 设备编号
  721. * @param startTime 开始时间
  722. * @param endTime 结束时间
  723. */
  724. public void deleteDataByBetweenTimeAndEquipmetId(Date startTime, Date endTime, String equipmentId) {
  725. baseMapper.deleteDataByBetweenTimeAndEquipmetId(equipmentId, startTime, endTime);
  726. }
  727. /**
  728. * 删除父表数据
  729. *
  730. * @param startTime 开始时间
  731. * @param endTime 结束时间
  732. * @param equipmentId 设备编号
  733. */
  734. public void deleteBetweenTimeAndEquipmentIdAndParent(Date startTime, Date endTime, String equipmentId) {
  735. baseMapper.deleteBetweenTimeAndEquipmentIdAndParent(equipmentId, startTime, endTime);
  736. }
  737. /**
  738. * 数据完整性
  739. *
  740. * @param equipmentId 设备编号
  741. * @return List<Map < String, Object>>
  742. */
  743. public List<Map<String, Object>> countDataIntegrity(String equipmentId, String startTime, String endTime) {
  744. return baseMapper.countDataIntegrity(equipmentId, startTime, endTime);
  745. }
  746. /**
  747. * 根据设备编号获取该设备的第一条数据
  748. *
  749. * @param equipmentId 设备编号
  750. * @return WindTowerDataParentTable
  751. */
  752. public WindTowerDataParentTable getFirstData(String equipmentId) {
  753. return baseMapper.getFirstData(equipmentId);
  754. }
  755. /**
  756. * 根据设备编号获取该设备的最后一条数据
  757. *
  758. * @param equipmentId 设备编号
  759. * @return WindTowerDataParentTable
  760. */
  761. public WindTowerDataParentTable getLastData(String equipmentId) {
  762. return baseMapper.getLastData(equipmentId);
  763. }
  764. /**
  765. * 根据设备编号获取最新一天的数据
  766. *
  767. * @param equipmentId 设备编号
  768. * @return List<Map < String, Object>>
  769. */
  770. public List<Map<String, Object>> getStartTimeAndEndTimeForData(String equipmentId) {
  771. WindTowerDataParentTable towerDataParentTableServiceLastData = getLastData(equipmentId);
  772. Date endTime = towerDataParentTableServiceLastData.getTime();
  773. DateTime dateTime = DateUtil.beginOfDay(endTime);
  774. return selectDataByBetweenTimeAndEquipmetId(new Date(dateTime.getTime()), endTime, equipmentId);
  775. }
  776. }