From 562a2d566b65155dce9408cc1efa2e5480a6208c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 4 Mar 2026 08:35:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=20PointMonitorInfo=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A7=E5=80=BC=E8=BF=BD=E8=B8=AA=E5=92=8C?= =?UTF-8?q?=E5=80=BC=E5=8F=98=E5=8C=96=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/event.rs | 15 +++++++++++++++ src/telemetry.rs | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/src/event.rs b/src/event.rs index 0e6af8a..93a85f0 100644 --- a/src/event.rs +++ b/src/event.rs @@ -131,6 +131,18 @@ impl EventManager { }; if let Some(point_id) = point_id { + // 从缓存中读取旧值 + let monitor_data = connection_manager.get_point_monitor_data_read_guard().await; + let old_monitor_info = monitor_data.get(&point_id); + + let (old_value, old_timestamp, value_changed) = if let Some(old_info) = old_monitor_info { + let changed = old_info.value != payload.value || + old_info.timestamp != payload.timestamp; + (old_info.value.clone(), old_info.timestamp, changed) + } else { + (None, None, false) + }; + let monitor = crate::telemetry::PointMonitorInfo { protocol: payload.protocol.clone(), source_id, @@ -142,6 +154,9 @@ impl EventManager { value: payload.value.clone(), value_type: payload.value_type.clone(), value_text: payload.value_text.clone(), + old_value, + old_timestamp, + value_changed, }; if let Err(e) = connection_manager.update_point_monitor_data(monitor.clone()).await { diff --git a/src/telemetry.rs b/src/telemetry.rs index 0dca3b2..fc1f211 100644 --- a/src/telemetry.rs +++ b/src/telemetry.rs @@ -43,6 +43,7 @@ impl PointQuality { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "kind", content = "value", rename_all = "snake_case")] +#[derive(PartialEq)] pub enum DataValue { Null, Bool(bool), @@ -85,6 +86,9 @@ pub struct PointMonitorInfo { pub value: Option, pub value_type: Option, pub value_text: Option, + pub old_value: Option, + pub old_timestamp: Option>, + pub value_changed: bool, } impl PointMonitorInfo {