From a25fffe157ee044e65318998827398941e7a42a4 Mon Sep 17 00:00:00 2001
From: Darker <mr.darker@163.com>
Date: 星期一, 03 三月 2025 18:13:48 +0800
Subject: [PATCH] 1.修改添加报警记录的方法 2.添加获取最后一次添加的事件id的方法

---
 SourceCode/Bond/Servo/AlarmManager.cpp |   90 +++++++++++++++++++++++++++++++++++++--------
 1 files changed, 74 insertions(+), 16 deletions(-)

diff --git a/SourceCode/Bond/Servo/AlarmManager.cpp b/SourceCode/Bond/Servo/AlarmManager.cpp
index efc66b8..73ce376 100644
--- a/SourceCode/Bond/Servo/AlarmManager.cpp
+++ b/SourceCode/Bond/Servo/AlarmManager.cpp
@@ -184,25 +184,69 @@
 }
 
 // 添加报警信息
-bool AlarmManager::addAlarm(const AlarmData& alarmData) {
+bool AlarmManager::addAlarm(const AlarmData& alarmData, int& alarmEventId) {
     if (!m_pDB) {
         return false;
     }
 
-    // 构建插入查询
-    std::ostringstream query;
-    query << "INSERT INTO alarms (id, severity_level, device_id, unit_id, description, start_time, end_time) VALUES ("
-        << alarmData.nId << ", "              // 错误码
-        << alarmData.nSeverityLevel << ", "   // 报警等级
-        << alarmData.nDeviceId << ", "        // 设备ID
-        << alarmData.nUnitId << ", '"         // 单元ID
-        << alarmData.strDescription << "', '" // 描述
-        << alarmData.strStartTime << "', '"   // 开始时间
-        << alarmData.strEndTime << "')";      // 结束时间
-
-    // 使用锁保护多线程安全
-    std::lock_guard<std::mutex> lock(m_mutex);
-    return m_pDB->executeQuery(query.str());
+    #if 0
+        // 开始事务
+        m_pDB->executeQuery("BEGIN TRANSACTION;");
+    
+        // 构建插入查询
+        std::ostringstream query;
+        query << "INSERT INTO alarms (id, severity_level, device_id, unit_id, description, start_time, end_time) VALUES ("
+            << alarmData.nId << ", "              // 错误码
+            << alarmData.nSeverityLevel << ", "   // 报警等级
+            << alarmData.nDeviceId << ", "        // 设备ID
+            << alarmData.nUnitId << ", '"         // 单元ID
+            << alarmData.strDescription << "', '" // 描述
+            << alarmData.strStartTime << "', '"   // 开始时间
+            << alarmData.strEndTime << "')";      // 结束时间
+    
+        // 使用锁保护多线程安全
+        std::lock_guard<std::mutex> lock(m_mutex);
+    
+        // 执行插入查询
+        bool result = m_pDB->executeQuery(query.str());
+        if (result) {
+            alarmEventId = getLastInsertId();
+            m_alarmCache[alarmEventId] = alarmData;
+        }
+    
+        // 提交事务
+        m_pDB->executeQuery("COMMIT;");
+    
+        return result;
+    #else
+        // 构建插入查询并使用 RETURNING 获取插入后的 alarm_event_id
+        std::ostringstream query;
+        query << "INSERT INTO alarms (id, severity_level, device_id, unit_id, description, start_time, end_time) "
+            << "VALUES (" << alarmData.nId << ", " << alarmData.nSeverityLevel << ", " << alarmData.nDeviceId << ", "
+            << alarmData.nUnitId << ", '" << alarmData.strDescription << "', '" << alarmData.strStartTime << "', '"
+            << alarmData.strEndTime << "') RETURNING alarm_event_id;";
+    
+        // 使用锁保护多线程安全
+        std::lock_guard<std::mutex> lock(m_mutex);
+    
+        // 执行查询并获取结果
+        auto results = m_pDB->fetchResults(query.str());
+        if (!results.empty() && !results[0].empty()) {
+            try {
+                // 提取并转换 alarm_event_id
+                alarmEventId = std::stoi(results[0][0]);
+                // 将插入的报警数据添加到缓存
+                m_mapCache[alarmEventId] = alarmData;
+                return true;
+            }
+            catch (const std::exception& e) {
+                std::cerr << "Error parsing alarm_event_id: " << e.what() << std::endl;
+                return false;
+            }
+        }
+    
+        return false;
+    #endif
 }
 
 // 查询所有报警数据
@@ -636,6 +680,20 @@
     return result[0][0];  // 返回查询到的单元名称
 }
 
+// 获取最近插入的 alarm_event_id
+int AlarmManager::getLastInsertId() {
+    std::string query = "SELECT last_insert_rowid();";
+    auto results = m_pDB->fetchResults(query);
+
+    if (results.empty() || results[0].empty()) {
+        return -1;
+    }
+
+    // 从查询结果中获取最后插入的 ID
+    int lastInsertId = std::stoi(results[0][0]);
+    return lastInsertId;
+}
+
 // 读取报警文件
 bool AlarmManager::readAlarmFile(const std::string& filename) {
     std::ifstream file(filename);
@@ -731,7 +789,7 @@
         auto it = m_mapAlarm.find(alarmID);
         if (it != m_mapAlarm.end()) {
             alarms.push_back(it->second);
-        }
+        } 
         else {
             std::cerr << "未找到 AlarmID: " << alarmID << std::endl;
         }

--
Gitblit v1.9.3