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 +++++++++++++++++++++++++++++++++++++--------
SourceCode/Bond/Servo/AlarmDlg.cpp | 3 +
SourceCode/Bond/Servo/AlarmManager.h | 15 ++++++-
3 files changed, 88 insertions(+), 20 deletions(-)
diff --git a/SourceCode/Bond/Servo/AlarmDlg.cpp b/SourceCode/Bond/Servo/AlarmDlg.cpp
index b627915..24721b8 100644
--- a/SourceCode/Bond/Servo/AlarmDlg.cpp
+++ b/SourceCode/Bond/Servo/AlarmDlg.cpp
@@ -80,7 +80,8 @@
}
// 娣诲姞鏂扮殑 Alarm 鏁版嵁
- bool result = alarmManager.addAlarm(alarmData);
+ int alarmEventId = 0;
+ bool result = alarmManager.addAlarm(alarmData, alarmEventId);
if (result) {
LOGI("<CAlarmDlg> Alarm added successfully!");
}
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;
}
diff --git a/SourceCode/Bond/Servo/AlarmManager.h b/SourceCode/Bond/Servo/AlarmManager.h
index 523ca3f..c046c93 100644
--- a/SourceCode/Bond/Servo/AlarmManager.h
+++ b/SourceCode/Bond/Servo/AlarmManager.h
@@ -29,7 +29,8 @@
std::string strEndTime; // 结束时间
};
-using AlarmMap = std::unordered_map<int, AlarmInfo>;
+using AlarmInfoMap = std::unordered_map<int, AlarmInfo>;
+using AlarmDataMap = std::unordered_map<int, AlarmData>;
class AlarmManager {
public:
@@ -70,9 +71,10 @@
/**
* 添加报警
* @param alarmData 报警数据的结构体
+ * @param alarmEventId 最近插入的 alarm_event_id
* @return 成功返回true,失败返回false
*/
- bool addAlarm(const AlarmData& alarmData);
+ bool addAlarm(const AlarmData& alarmData, int& alarmEventId);
/**
* 查询所有报警数据
@@ -206,6 +208,12 @@
*/
std::string getUnitNameById(int deviceId, int unitId);
+ /**
+ * 获取最近插入的 alarm_event_id
+ * @return 失败返回-1,成功返回最近插入的 alarm_event_id
+ */
+ int getLastInsertId();
+
/**
* 读取报警文件
* @param filename 文件名
@@ -243,7 +251,8 @@
AlarmManager& operator=(const AlarmManager&) = delete;
BL::Database* m_pDB;
- AlarmMap m_mapAlarm;
+ AlarmInfoMap m_mapAlarm;
+ AlarmDataMap m_mapCache;
static std::mutex m_mutex;
};
--
Gitblit v1.9.3