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 | 63 +++++++++++++++++++++++++++++++
1 files changed, 62 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 b5678e4..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
@@ -6,6 +6,7 @@
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
+import cn.iocoder.yudao.module.mes.controller.admin.dv.telemetry.vo.MesDvTelemetryCheckSummaryRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.dv.telemetry.vo.MesDvTelemetryDeviceRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.dv.telemetry.vo.MesDvTelemetryLatestReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.dv.telemetry.vo.MesDvTelemetryPageReqVO;
@@ -17,6 +18,8 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.LinkedHashMap;
@@ -35,6 +38,8 @@
@Slf4j
public class MesDvTelemetryServiceImpl implements MesDvTelemetryService {
+ static final long MAX_FUTURE_SKEW_MINUTES = 5;
+
@Resource
private MesDvTelemetryMapper telemetryMapper;
@Resource
@@ -50,12 +55,52 @@
// 鍙栨渶杩戜竴鎵规暟鎹紝鎸夎澶�+淇″彿鍘婚噸淇濈暀鏈�鏂帮紝鐢ㄤ簬瀹炴椂鐩戞帶瑙嗗浘
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);
}
return new ArrayList<>(latestMap.values());
+ }
+
+ @Override
+ public List<MesDvTelemetryCheckSummaryRespVO> getCheckSummary(MesDvTelemetryLatestReqVO reqVO) {
+ List<MesDvTelemetryDO> list = getLatestTelemetry(reqVO);
+ Map<String, MesDvTelemetryCheckSummaryRespVO> deviceMap = new LinkedHashMap<>();
+ for (MesDvTelemetryDO row : list) {
+ String key = StrUtil.blankToDefault(row.getTbDeviceId(), "");
+ MesDvTelemetryCheckSummaryRespVO vo = deviceMap.get(key);
+ if (vo == null) {
+ vo = new MesDvTelemetryCheckSummaryRespVO();
+ vo.setTbDeviceId(row.getTbDeviceId());
+ vo.setDeviceName(row.getDeviceName());
+ vo.setTotalCount(0);
+ vo.setNormalCount(0);
+ vo.setAnomalyCount(0);
+ deviceMap.put(key, vo);
+ }
+ vo.setTotalCount(vo.getTotalCount() + 1);
+ if (Boolean.TRUE.equals(row.getWhetherAnomaly())) {
+ vo.setAnomalyCount(vo.getAnomalyCount() + 1);
+ } else {
+ vo.setNormalCount(vo.getNormalCount() + 1);
+ }
+ }
+ List<MesDvTelemetryCheckSummaryRespVO> result = new ArrayList<>(deviceMap.values());
+ for (MesDvTelemetryCheckSummaryRespVO vo : result) {
+ if (vo.getTotalCount() != null && vo.getTotalCount() > 0) {
+ BigDecimal rate = BigDecimal.valueOf(vo.getAnomalyCount() * 100.0 / vo.getTotalCount());
+ vo.setAnomalyRate(rate.setScale(1, RoundingMode.HALF_UP));
+ } else {
+ vo.setAnomalyRate(BigDecimal.ZERO);
+ }
+ }
+ return result;
}
@Override
@@ -111,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()
@@ -166,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