#ifndef __THREADWRITEDBMANAGER_H__ #define __THREADWRITEDBMANAGER_H__ /** * @file ThreadWriteDBManager.h * @author your name (you@domain.com) * @brief * @version 0.1 * @date 2025-07-19 * * @copyright Copyright (c) 2025 * * 处理报警信息 */ #include "FromWebAPI.h" #include "GlobalVariable.h" #include "SystemConfigStruct.h" #include "spdlog/spdlog.h" #include #include #include #include #include /** 写数据库线程,服务写入数据库都由这里写入 1、报警信息列表分为两种,一种是静音、过载、反相、噪音等单个录音通道的报警信息,一种是一致性报警需要 两个通道的关联的报警信息,这两种分别写入数据库,不相关联。 2、录音文件也会从这里写数据库 3、这个线程回定时删除数据库超时的录音和报警记录 4、这个线程会定时删除超过时长的报警文件和录音文件 */ #define WriteDB ThreadWriteDBManager::instance() class ThreadWriteDBManager { ThreadWriteDBManager() = default; ThreadWriteDBManager(const ThreadWriteDBManager&) = delete; ThreadWriteDBManager& operator=(const ThreadWriteDBManager&) = delete; public: ~ThreadWriteDBManager(); static ThreadWriteDBManager& instance() { static ThreadWriteDBManager instance; return instance; } /* 线程工作函数 */ void thread_task(); /* 停止线程 */ void thread_stop(); void thread_stop_block(); /* 获取线程状态 */ EThreadState getThreadState() const { return m_threadState; } /* 添加报警内容 */ void addAlarmInfo(const AlarmInfo_t& alarmInfo); void addAlarmInfo(const std::list& listAlarm); /* 添加一致性报警信息,键为主通道信息,值为次通道信息 */ void addAlarmInfo(const AlarmInfo_t& mainAlarm, const AlarmInfo_t& subAlarm); /* 录音文件写入数据库,isNewFile = true 是插入数据库,= false是更新数据库 */ void addRecordFileInfo(std::list& listRecordFile, bool isNewFile); private: /* 线程工作函数 */ void task(); /* 初始化数据 */ bool initData(); /* 清理数据 */ void clearData(); /* 普通报警写入数据库 */ void alarmInfoToDB(); /* 一致性报警写入数据库 */ void consistencyAlarmInfoToDB(); /* 录音文件写数据库 */ void recordFileInfoToDB(); /* 处理文件路径,去掉前面的本地路径,只保留服务自己创建的文件夹及之后的路径 */ inline bool processFilePath(QString& strFilePath); /* 定时删除报警文件和录音文件,文件路径从数据库中获取,十分钟检查一次 注意: 这个函数需要在删除数据库记录之前执行,删除文件路径是从数据库中读取的 */ void deleteTimeoutFile(); /* 删除录音文件 */ void deleteTimeoutRecordFile(); /* 删除报警文件 */ void deleteTimeoutAlarmFile(); /* 删除超过时长的数据库记录信息,10分钟检查一次 */ void deleteTimeoutRecordInfo(); private: std::shared_ptr m_logger = nullptr; /* 线程基础信息 */ std::atomic_bool m_isRunning = false; /* 线程运行标志位 */ std::atomic_bool m_isStop = false; /* 线程停止标志位 */ EThreadState m_threadState = EThreadState::State_None; /* 线程状态 */ FromWebAPI m_fromWebAPI; QString m_strRootPath; /* 本地存储的根目录,不带有服务创建的文件夹 */ DatabaseConfig_t m_dbConfig; /* 数据库配置 */ QDateTime m_currentTime; /* 当前时间,给需要使用当前时间的函数使用 */ /* ---------------------------- 报警信息 ---------------------------- */ /* 存储一般的报警信息 */ std::mutex m_mutexListAlarm; /* 报警信息列表的互斥锁 */ std::list m_listAlarm; /* 报警信息列表 */ /* 存储一致性报警信息 */ std::mutex m_mutexListAlarmConsistency; /* 一致性报警信息列表的互斥锁 */ /* 一致性报警信息列表,键是主通道信息,值是次通道信息 */ std::list> m_listAlarmConsistency; /* ---------------------------- 录音文件信息 ---------------------------- */ /* 存储录音文件信息 */ std::mutex m_mutexListRecordFile; /* 录音文件信息列表的互斥锁 */ std::list m_listRecordFileInsert; /* 录音文件写入列表 */ std::list m_listRecordFileUpdate; /* 录音文件更新列表 */ // std::atomic_bool m_isRecordFileInsert = false; /* 录音文件信息是否是插入数据库 */ /* ---------------------------- 数据库日志 ---------------------------- */ QDateTime m_lastProcessLogTime; /* 上次处理日志的时间 */ QDateTime m_lastDeleteFileTime; /* 上次删除报警文件的时间 */ }; #endif // __THREADWRITEDBMANAGER_H__