KprZilaishuiLevelBizFun.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package io.github.pnoker.gateway.bizmgr;
  2. import com.alibaba.fastjson.JSONObject;
  3. import io.github.pnoker.gateway.comtool.TimeTool;
  4. import io.github.pnoker.gateway.dbdao.DBMgrProxy;
  5. import io.github.pnoker.gateway.dbdao.zilaishuiSource.service.ZilaishuiRealListService;
  6. import org.influxdb.dto.QueryResult;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.util.CollectionUtils;
  10. import org.springframework.util.ObjectUtils;
  11. import java.time.Duration;
  12. import java.time.LocalDateTime;
  13. import java.time.format.DateTimeFormatter;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Map;
  17. import java.util.concurrent.CountDownLatch;
  18. import java.util.stream.Collectors;
  19. /**
  20. * @ClassName KprZilaishuiLevelBizFun
  21. * @Description: TODO 市自来水水位预测
  22. * @Author LX
  23. * @Date 2024/12/11
  24. * @Version V1.0
  25. **/
  26. public class KprZilaishuiLevelBizFun {
  27. private static final Logger log = LoggerFactory.getLogger(KprZilaishuiLevelBizFun.class);
  28. private final static String mStrClassName = "KprZilaishuiLevelBizFun";
  29. private final static String EMPTY_NULL = "NULL";
  30. public static ZilaishuiRealListService getZilaishuiApi(){
  31. return DBMgrProxy.getInstance().applyZilaishuiDbApi();
  32. }
  33. static DateTimeFormatter formater = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  34. //TODO 初始化添加计算每个液位计站点每日的每小时液位量计算
  35. public static void initWaterLevelReacordAll(String startFindTime){
  36. //TODO ① 首先查询水厂设备配置信息
  37. try {
  38. System.out.println("计算小时液位开始时间:"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
  39. System.out.println("计算小时液位起始时间:("+startFindTime+")进行中:......");
  40. List<Map<String, Object>> configList = getZilaishuiApi().getWaterLevelCollectionConfigList(null);
  41. if (!CollectionUtils.isEmpty(configList)) {
  42. //TODO 按照设备分组
  43. Map<Object, List<Map<String, Object>>> groupedData =
  44. configList.stream().collect(Collectors.groupingBy(item -> item.get("device_code")));
  45. final CountDownLatch latch = new CountDownLatch(groupedData.keySet().size());
  46. //TODO 外层循环组织机构
  47. for (Object key:groupedData.keySet()){
  48. try{
  49. new Thread(() -> {
  50. //TODO 根据当前配置信息item 查询远通数据中的历史数据
  51. //TODO 首先查询当前水厂设备的从startFindTime之后到得到数据
  52. LocalDateTime startDateTime = LocalDateTime.parse(startFindTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  53. //TODO 需计算的循环天数
  54. Long days = 0L;
  55. days = Duration.between(startDateTime, LocalDateTime.now()).toDays();
  56. days+=1;
  57. //TODO 此循环天数每一天所查的是所有设备每小时数据合
  58. final CountDownLatch latch2 = new CountDownLatch(days.intValue());
  59. for(Long k = 0L;k<days;k++) {
  60. LocalDateTime newStartDateTime = startDateTime.minusDays(-k.intValue());
  61. String startDate = newStartDateTime.format(formater);
  62. String endDate = newStartDateTime.minusDays(-1).format(formater);
  63. try {
  64. new Thread(() -> {
  65. List<Map<String, Object>> deviceList = groupedData.get(key);
  66. //TODO 循环获取该天该水厂每个设备数据
  67. //TODO 查询当前天日期内每小时的设备数据
  68. for (int i = 0; i < 24; i++) {
  69. String startTime = newStartDateTime.withHour(i).format(formater);
  70. //TODO 需要加个05分把endTime的整点数据查出来
  71. String endTime = newStartDateTime.minusHours(-(i + 1)).withMinute(5).withSecond(0).format(formater);
  72. //TODO 此循环计算该小时所有设备的用水量
  73. for (Map<String, Object> item : deviceList) {
  74. // 定义字符串日期时间的格式
  75. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  76. // 解析字符串以创建 LocalDateTime 实例
  77. LocalDateTime dateTime = LocalDateTime.parse(endTime, formatter);
  78. Integer itemCount = getZilaishuiApi().getTabWaterHistoryCount(
  79. " AND TAG_CODE = '" + item.get("collcation_tag") + "' " +
  80. " and QCQUISITION_TIME >= to_date('" + startDate + "', 'yyyy-mm-dd hh24:mi:ss')" +
  81. " and QCQUISITION_TIME <= to_date('" + endDate + "', 'yyyy-mm-dd hh24:mi:ss')" +
  82. " AND ABS(" +
  83. " (QCQUISITION_TIME - TRUNC(QCQUISITION_TIME, 'HH')) * 24 * 60 " +
  84. " ) <= 5");//查询 -- 采集时间接近整点,误差在5分钟内
  85. if (itemCount != null && itemCount > 0) {
  86. List<Map<String, Object>> tapWaterHistoryList = getZilaishuiApi().getPageZILAISHUI_HISTORY2(itemCount, 0,
  87. " AND TAG_CODE = '" + item.get("collcation_tag") + "' " +
  88. " and QCQUISITION_TIME >= to_date('" + startTime + "', 'yyyy-mm-dd hh24:mi:ss')" +
  89. " and QCQUISITION_TIME <= to_date('" + endTime + "', 'yyyy-mm-dd hh24:mi:ss')" +
  90. " AND ABS( " +
  91. " (QCQUISITION_TIME - TRUNC(QCQUISITION_TIME, 'HH')) * 24 * 60 " +
  92. " ) <= 5 " +
  93. " order by QCQUISITION_TIME");
  94. //TODO 直接插入即可 查询已经筛选出两条了
  95. if (!CollectionUtils.isEmpty(tapWaterHistoryList) && tapWaterHistoryList.size() > 1) {
  96. //TODO 数据库操作
  97. for (Map<String,Object> mapEntity:tapWaterHistoryList) {
  98. Map<String, Object> recordAllEntity = new HashMap<>();//需要添加的实体数据
  99. recordAllEntity.put("device_code", groupedData.get(key).get(0).get("device_code"));
  100. recordAllEntity.put("value", mapEntity.get("VAL"));
  101. recordAllEntity.put("time", LocalDateTime.parse(mapEntity.get("QCQUISITION_TIME").toString(), formatter)
  102. .withMinute(0).withSecond(0).format(formatter));//采集时间(小时的最后时间)
  103. recordAllEntity.put("value_tag", "level");
  104. List<Map<String, Object>> queryLevelRecord = getZilaishuiApi().getWaterLevelRecordAllList(1, 0,
  105. " WHERE device_code = '" + recordAllEntity.get("device_code")
  106. + "' AND time = '" + recordAllEntity.get("time") + "' AND value_tag = '" + recordAllEntity.get("value_tag") + "'");
  107. if (CollectionUtils.isEmpty(queryLevelRecord)) {
  108. //TODO 说明不存在,进行插入
  109. if(!ObjectUtils.isEmpty(recordAllEntity.get("value"))) {
  110. int insertCode = getZilaishuiApi().insertWaterLevelRecordAll(" (" +
  111. "'" + recordAllEntity.get("device_code") + "'," +
  112. "'" + recordAllEntity.get("value") + "'," +
  113. "'" + recordAllEntity.get("value_tag") + "'," +
  114. "'" + recordAllEntity.get("time") + "'" +
  115. ") ");
  116. if (insertCode < 0) {
  117. log.error(String.format("Batch insertWaterLevelRecordAll 未成功:{%s} ",
  118. JSONObject.toJSON(recordAllEntity)));
  119. }
  120. }
  121. }else{
  122. //TODO 说明存在,进行修改
  123. if(!ObjectUtils.isEmpty(recordAllEntity.get("value"))) {
  124. int updateCode = getZilaishuiApi().updateWaterLevelRecordAll(String.valueOf(recordAllEntity.get("value"))," WHERE " +
  125. "(" +
  126. " device_code = '" + recordAllEntity.get("device_code") + "' and" +
  127. " \"time\" = '" + recordAllEntity.get("time") + "' and" +
  128. " value_tag = '" + recordAllEntity.get("value_tag") + "'" +
  129. ") ");
  130. if (updateCode < 0) {
  131. log.error(String.format("Batch updateWaterLevelRecordAll 未成功:{%s} ",
  132. JSONObject.toJSON(recordAllEntity)));
  133. }
  134. }
  135. }
  136. }
  137. }
  138. }
  139. }
  140. }
  141. latch2.countDown();
  142. }).start();
  143. }catch(Exception ex){
  144. }
  145. }
  146. try {
  147. latch2.await();
  148. }catch(Exception ex){
  149. }
  150. latch.countDown();
  151. }).start();
  152. }catch(Exception ex){
  153. log.error(String.format("Batch" +
  154. " initWaterReacordAll ERROR:{%s} "
  155. , ex.getLocalizedMessage()));
  156. }
  157. }
  158. latch.await();
  159. System.out.println("计算小时液位检查机制("+startFindTime+")结束时间:"+TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
  160. }
  161. }catch(Exception ex){
  162. log.error(String.format("Batch initWaterCollecationReacordAll ERROR:{%s} "
  163. , ex.getLocalizedMessage()));
  164. }
  165. }
  166. public static void insertDailyData(){
  167. KprZilaishuiLevelBizFun.getZilaishuiApi().insertDailyData();
  168. }
  169. public static void insertForecastData(){
  170. KprZilaishuiLevelBizFun.getZilaishuiApi().insertForecastData();
  171. }
  172. }