#ifndef ALARM_MANAGER_H #define ALARM_MANAGER_H #include #include #include #include #include "Database.h" struct AlarmInfo { std::string strUnitID; std::string strUnitNo; int nAlarmLevel; int nAlarmCode; int nAlarmID; std::string strAlarmText; std::string strDescription; }; struct AlarmData { int nId; // 错误码 int nSeverityLevel; // 报警等级 int nDeviceId; // 设备ID int nUnitId; // 单元ID std::string strDeviceName; // 设备名称 std::string strUnitName; // 单元名称 std::string strDescription; // 描述 std::string strStartTime; // 开始时间 std::string strEndTime; // 结束时间 }; using AlarmInfoMap = std::unordered_map; using AlarmDataMap = std::unordered_map; class AlarmManager { public: /** * 获取单例实例 * @return AlarmManager实例的引用 */ static AlarmManager& getInstance(); /** * 初始化报警表 * @return 成功返回true,失败返回false */ bool initAlarmTable(); /** * 销毁报警表 */ void termAlarmTable(); /** * 销毁报警表 * @return 成功返回true,失败返回false */ bool destroyAlarmTable(); /** * 插入模拟数据 */ void insertMockData(); /** * 添加报警 * @param alarmData 报警数据的结构体 * @param alarmEventId 最近插入的 alarm_event_id * @return 成功返回true,失败返回false */ bool addAlarm(const AlarmData& alarmData, int& alarmEventId); /** * 查询所有报警数据 * @return 包含所有报警数据的结构体 */ std::vector getAllAlarms(); /** * 根据报警ID查询报警 * @param id 报警ID * @return 包含筛选后报警数据的结构体 */ std::vector getAlarmsById(const std::string& id); /** * 根据描述查询报警 * @param description 报警描述的筛选条件 * @return 包含筛选后报警数据的结构体 */ std::vector getAlarmsByDescription(const std::string& description); /** * 根据时间范围查询报警 * @param startTime 起始时间 * @param endTime 结束时间 * @return 包含查询结果的报警数据 */ std::vector getAlarmsByTimeRange(const std::string& startTime, const std::string& endTime); /** * 根据ID和时间范围查询报警 * @param id 报警ID * @param startTime 起始时间 * @param endTime 结束时间 * @return 包含查询结果的报警数据 */ std::vector getAlarmsByIdAndTimeRange(const std::string& id, const std::string& startTime, const std::string& endTime); /** * 获取报警数据 * @param startPosition 起始位置 * @param count 获取的记录数量 * @return 包含查询结果的报警数据 */ std::vector getAlarms(int startPosition, int count); std::vector getActiveAlarms(int recentHours = 12); /** * 筛选报警数据 * @param keyword 关键字筛选条件 * @param startTime 起始时间筛选条件 * @param endTime 结束时间筛选条件 * @param pageNumber 页码 * @param pageSize 每页记录数 * @return 包含筛选后报警数据的结构体 */ std::vector getFilteredAlarms(const std::string& keyword, const std::string& startTime, const std::string& endTime, int pageNumber, int pageSize); /** * 获取符合条件的报警总数 * @param keyword 关键字筛选条件 * @param startTime 起始时间筛选条件 * @param endTime 结束时间筛选条件 * @return 符合条件的报警总数 */ int getTotalAlarmCount(const std::string& keyword, const std::string& startTime, const std::string& endTime); /** * 更新报警结束时间 * @param id 报警ID * @param severityLevel 报警等级筛选条件 * @param deviceId 设备ID * @param unitId 单元ID * @param description 报警描述 * @param startTime 报警开始时间 * @param newEndTime 新的报警结束时间 * @return 成功返回true,失败返回false */ bool updateAlarmEndTime( const std::string& id, const std::string& severityLevel, const std::string& deviceId, const std::string& unitId, const std::string& description, const std::string& startTime, const std::string& newEndTime); /** * 清理旧报警 * @param daysToKeep 保留的天数 * @param deviceId 设备ID * @param unitId 单元ID */ void cleanOldAlarms(int daysToKeep = 30, const std::string& deviceId = "", const std::string& unitId = ""); /** * 通过设备ID获取设备名称 * @param deviceId 设备ID * @return 成功返回设备名称,失败返回空 */ std::string getDeviceNameById(int deviceId); /** * 通过设备ID和单元ID获取单元名称 * @param deviceId 设备ID * @param unitId 单元ID * @return 成功返回单元名称,失败返回空 */ std::string getUnitNameById(int deviceId, int unitId); /** * 获取最近插入的 alarm_event_id * @return 失败返回-1,成功返回最近插入的 alarm_event_id */ int getLastInsertId(); /** * 通过事件id解除报警(更新结束时间) * @param alarmEventId 事件ID * @param endTime 结束时间 * @return 成功返回true,失败返回false */ bool clearAlarmByEventId(int alarmEventId, const std::string& endTime); /** * 通过多个属性查找并解除报警(更新结束时间) * @param nId 报警ID * @param nSeverityLevel 报警等级 * @param nDeviceId 设备ID * @param nUnitId 单元ID * @param strDescription 描述 * @param endTime 结束时间 * @return 成功返回true,失败返回false */ bool clearAlarmByAttributes(int nId, int nDeviceId, int nUnitId, const std::string& endTime); /** * 读取报警文件 * @param filename 文件名 * @return 成功返回true,失败返回false */ bool readAlarmFile(const std::string& filename); /** * 保存报警文件 * @param filename 文件名 * @return 成功返回true,失败返回false */ bool saveAlarmFile(const std::string& filename); /** * 通过报警ID查询报警信息 * @param nAlarmID 报警ID * @return 报警信息的指针 */ const AlarmInfo* getAlarmInfoByID(int nAlarmID) const; /** * 通过多个报警ID查询对应的报警信息 * @param alarmIDs 多个报警ID * @return 返回多个报警信息 */ std::vector getAlarmsInfoByIDs(const std::vector& alarmIDs) const; private: AlarmManager(); ~AlarmManager(); // 禁止拷贝和赋值 AlarmManager(const AlarmManager&) = delete; AlarmManager& operator=(const AlarmManager&) = delete; BL::Database* m_pDB; AlarmInfoMap m_mapAlarm; AlarmDataMap m_mapCache; static std::mutex m_mutex; }; #endif // ALARM_MANAGER_H