From 63486c527b01c459110a88930d9cda1ded633aee Mon Sep 17 00:00:00 2001
From: “djh” <“3298565835@qq.com”>
Date: Tue, 11 Nov 2025 10:32:30 +0800
Subject: [PATCH] 修改新增气象数据统计

---
 src/main/java/com/gkhy/fourierSpecialGasMonitor/service/impl/DataReceiveServiceImpl.java |   52 +++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/gkhy/fourierSpecialGasMonitor/service/impl/DataReceiveServiceImpl.java b/src/main/java/com/gkhy/fourierSpecialGasMonitor/service/impl/DataReceiveServiceImpl.java
index 4847ac4..9de5cd1 100644
--- a/src/main/java/com/gkhy/fourierSpecialGasMonitor/service/impl/DataReceiveServiceImpl.java
+++ b/src/main/java/com/gkhy/fourierSpecialGasMonitor/service/impl/DataReceiveServiceImpl.java
@@ -17,6 +17,7 @@
 import com.gkhy.fourierSpecialGasMonitor.repository.GasConcentrationRepository;
 import com.gkhy.fourierSpecialGasMonitor.service.*;
 import com.gkhy.fourierSpecialGasMonitor.utils.SendMessageUtil;
+import com.gkhy.fourierSpecialGasMonitor.utils.SummaryUtils;
 import com.gkhy.fourierSpecialGasMonitor.websocket.GasConcentrationExcWebsocketServer;
 import com.gkhy.fourierSpecialGasMonitor.websocket.GasConcentrationWebsocketServer;
 import com.gkhy.fourierSpecialGasMonitor.websocket.GasDeviceExcWebsocketServer;
@@ -39,6 +40,7 @@
 import java.io.IOException;
 import java.lang.reflect.Field;
 import java.text.MessageFormat;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -91,6 +93,9 @@
     @Autowired
     private GasFluxWebsocketServer gasFluxWebsocketServer;
 
+    @Autowired
+    private SummaryStatsService summaryStatsService;
+
     private static final ReentrantLock lock = new ReentrantLock();
 
     @Autowired
@@ -119,7 +124,7 @@
 
     private static final DateTimeFormatter warnLogFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
 
-    private static final String[] DEVICE_EXC_RECEIVER = {"17625323889","18019908965"};
+    private static final String[] DEVICE_EXC_RECEIVER = {"17625323889","18019908965","18899396560"};
 
     @PostConstruct
     public void init() {
@@ -201,7 +206,7 @@
             descs.add(GasFluxStateEnum.INVERSION_FAILED_10_MINUTES_NO_DATA.getDesc());
         }
         String message = JSON.toJSONString(reqDTO);
-        //todo 暂时改为实时推送给前端
+        //暂时改为实时推送给前端
         try {
             GasDeviceExcWebsocketServer.sendInfo(message,null);
         } catch (IOException e) {
@@ -213,8 +218,7 @@
             if (lastLog == null || now.compareTo(lastLog.getTime().plusHours(1)) >= 0) {
                 Map<String, String> mesMap = new HashMap<>();
                 mesMap.put("message","数据异常,无法进行监测");
-                mesMap.put(" level","设备离线");
-                //// TODO: 2024/2/22
+                mesMap.put(" level","设备离线");  // todo
                 List<String> deviceExcReceiver = Arrays.asList(DEVICE_EXC_RECEIVER);
                 if (!CollectionUtils.isEmpty(deviceExcReceiver)) {
                     List<String> distinctPhone = deviceExcReceiver.stream().distinct().collect(Collectors.toList());
@@ -232,6 +236,7 @@
             log.setContent(content);
             log.setTime(now);
             log.setExecDesc(execInfo);
+            log.setDelFlag(0);
             DeviceExceptionLog save =  deviceExceptionLogService.save(log);
             if (save == null) {
                 logger.info("【警告】设备异常日志保存>>>>>>>>>>>>>>>>>>失败");
@@ -268,10 +273,48 @@
         GasConcentration save = gasConcentrationService.save(gasConcentration);
         if (save == null)
             throw new DataReceiveException(this.getClass(), ForeignResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(),"气体实时数据保存失败");
+        //计算平局值,最大值,最小值
+        computeAndSaveDailySummaryStats(save);
         dataCacheAndPush(save);
         execDataCountAndPush(reqDto);
         return ForeignResult.success();
     }
+
+    /**
+     * 计算并保存当天的气体浓度统计数据(若统计为空则初始化,否则更新)
+     * @param newData 新插入的气体浓度数据
+     */
+    private void computeAndSaveDailySummaryStats(GasConcentration newData) {
+        //  定义当天时间范围(00:00:00 至当前时间)
+        LocalDateTime todayStart = LocalDate.now().atStartOfDay();
+        LocalDateTime now = LocalDateTime.now();
+
+        //  查询当天已有的统计数据
+        SummaryStats dailyStats = gasConcentrationService.findStats(todayStart, now);
+
+        // 若统计数据为空,创建新对象并初始化(用新数据作为初始值)
+        if (dailyStats == null || dailyStats.isEmpty()) {
+            dailyStats = new SummaryStats();
+            SummaryUtils.initSummaryStats(dailyStats, newData);
+        } else {
+            // 若统计数据已存在,更新统计值(根据新数据重新计算 min/max/avg)
+            SummaryUtils.updateSummaryStats(dailyStats, newData);
+        }
+
+
+        dailyStats.setTemp(newData.getTemp());
+        dailyStats.setHumidity(newData.getHumidity());
+        dailyStats.setWindSpeed(newData.getWindSpeed());
+        dailyStats.setWindDirection(newData.getWindDirection());
+        dailyStats.setPressure(newData.getPressure());
+        // 补充通用字段(时间取最新数据的时间)
+        dailyStats.setTime(newData.getTime());
+
+        //  保存统计结果
+        summaryStatsService.save(dailyStats);
+    }
+
+
 
 
     private  void execDataCountAndPush(UploadGasConcentrationReqDTO reqDto){
@@ -378,7 +421,6 @@
             Map<String, String> mesMap = new HashMap<>();
             mesMap.put("message",warnTime+" "+gasCategory.getName());
             mesMap.put(" level",warnThresholdName);
-            //todo
             if (!CollectionUtils.isEmpty(phone)) {
                 List<String> distinctPhone = phone.stream().distinct().collect(Collectors.toList());
                 logger.info("【气体浓度异常短信发送】-----发送内容:" + content + " 发送时间: " + now + " 接收人手机号:" + distinctPhone);

--
Gitblit v1.9.2