From f57a9de2dbe69e7f867b39c25abdab58b401a2df Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期六, 07 十一月 2026 16:01:32 +0800
Subject: [PATCH] fix(mes): 过滤异常未来遥测时间

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/telemetry/MesDvTelemetryServiceImpl.java |   25 ++++++++++++++++++++++++-
 1 files changed, 24 insertions(+), 1 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/telemetry/MesDvTelemetryServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/telemetry/MesDvTelemetryServiceImpl.java
index d50642f..20b5705 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/telemetry/MesDvTelemetryServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/telemetry/MesDvTelemetryServiceImpl.java
@@ -38,6 +38,8 @@
 @Slf4j
 public class MesDvTelemetryServiceImpl implements MesDvTelemetryService {
 
+    static final long MAX_FUTURE_SKEW_MINUTES = 5;
+
     @Resource
     private MesDvTelemetryMapper telemetryMapper;
     @Resource
@@ -53,7 +55,12 @@
         // 鍙栨渶杩戜竴鎵规暟鎹紝鎸夎澶�+淇″彿鍘婚噸淇濈暀鏈�鏂帮紝鐢ㄤ簬瀹炴椂鐩戞帶瑙嗗浘
         List<MesDvTelemetryDO> list = telemetryMapper.selectLatest(reqVO, 5000);
         Map<String, MesDvTelemetryDO> latestMap = new LinkedHashMap<>();
+        LocalDateTime queryTime = LocalDateTime.now();
         for (MesDvTelemetryDO row : list) {
+            // 鍙岄噸闃叉姢锛氬嵆浣挎暟鎹簱涓凡鏈夋湭鏉ユ椂闂寸殑鑴忔暟鎹紝涔熶笉鑳戒綔涓哄疄鏃舵暟鎹繑鍥�
+            if (!isAcceptableTelemetryTime(row.getTelemetryDataTime(), queryTime)) {
+                continue;
+            }
             String key = StrUtil.blankToDefault(row.getTbDeviceId(), "")
                     + ":" + StrUtil.blankToDefault(row.getParamKeyName(), "");
             latestMap.putIfAbsent(key, row);
@@ -149,10 +156,17 @@
                 continue;
             }
             MesDvTelemetryDO data = convert((Map<?, ?>) rowObj);
+            if (!isAcceptableTelemetryTime(data.getTelemetryDataTime(), pullTime)) {
+                log.warn("[pullTelemetry][蹇界暐寮傚父閬ユ祴鏃堕棿锛宒eviceId({})锛宼elemetryDataTime({})锛宲ullTime({})]",
+                        data.getTbDeviceId(), data.getTelemetryDataTime(), pullTime);
+                continue;
+            }
             data.setPullTime(pullTime);
             saveList.add(data);
         }
-        telemetryMapper.insertBatch(saveList);
+        if (CollUtil.isNotEmpty(saveList)) {
+            telemetryMapper.insertBatch(saveList);
+        }
         // 6. 杩斿洖缁熻
         result.setRecordCount(saveList.size());
         result.setDeviceCount((int) saveList.stream()
@@ -204,4 +218,13 @@
         }
     }
 
+    /**
+     * 閬ユ祴鏃堕棿蹇呴』瀛樺湪锛屼笖涓嶈兘鏄庢樉鏅氫簬鏈鎷夊彇/鏌ヨ鏃堕棿銆�
+     * 淇濈暀 5 鍒嗛挓瀹瑰樊锛屽吋瀹硅澶囨椂閽熶笌搴旂敤鏈嶅姟鍣ㄤ箣闂寸殑杞诲井鍋忓樊銆�
+     */
+    static boolean isAcceptableTelemetryTime(LocalDateTime telemetryTime, LocalDateTime referenceTime) {
+        return telemetryTime != null && referenceTime != null
+                && !telemetryTime.isAfter(referenceTime.plusMinutes(MAX_FUTURE_SKEW_MINUTES));
+    }
+
 }

--
Gitblit v1.9.3