Darker
2025-03-03 a25fffe157ee044e65318998827398941e7a42a4
1.修改添加报警记录的方法
2.添加获取最后一次添加的事件id的方法
已修改3个文件
80 ■■■■■ 文件已修改
SourceCode/Bond/Servo/AlarmDlg.cpp 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/AlarmManager.cpp 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/AlarmManager.h 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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!");
                        }
SourceCode/Bond/Servo/AlarmManager.cpp
@@ -184,10 +184,14 @@
}
// 添加报警信息
bool AlarmManager::addAlarm(const AlarmData& alarmData) {
bool AlarmManager::addAlarm(const AlarmData& alarmData, int& alarmEventId) {
    if (!m_pDB) {
        return false;
    }
    #if 0
        // 开始事务
        m_pDB->executeQuery("BEGIN TRANSACTION;");
    // 构建插入查询
    std::ostringstream query;
@@ -202,7 +206,47 @@
    // 使用锁保护多线程安全
    std::lock_guard<std::mutex> lock(m_mutex);
    return m_pDB->executeQuery(query.str());
        // 执行插入查询
        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);
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);
    /**
     * 查询所有报警数据
@@ -207,6 +209,12 @@
    std::string getUnitNameById(int deviceId, int unitId);
    /**
    * 获取最近插入的 alarm_event_id
    * @return 失败返回-1,成功返回最近插入的 alarm_event_id
    */
    int getLastInsertId();
    /**
     * 读取报警文件
     * @param filename 文件名
     * @return 成功返回true,失败返回false
@@ -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;
};