| SourceCode/Bond/Servo/AlarmManager.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/AlarmManager.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/Servo.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/Servo.vcxproj | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/Servo.vcxproj.filters | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/ServoDlg.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/stdafx.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
SourceCode/Bond/Servo/AlarmManager.cpp
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,289 @@ #include "stdafx.h" #include "AlarmManager.h" #include <sstream> #include <iostream> #include <stdexcept> #include <ctime> // 常é const std::string DATABASE_FILE = R"(AlarmManager.db)"; // éææååå§å std::mutex AlarmManager::m_mutex; // è·ååä¾å®ä¾ AlarmManager& AlarmManager::getInstance() { static AlarmManager instance; return instance; } // æé 彿° AlarmManager::AlarmManager() { m_pDB = new BL::SQLiteDatabase(); } // ææå½æ° AlarmManager::~AlarmManager() { if (m_pDB != nullptr) { delete m_pDB; m_pDB = nullptr; } } // è®¾ç½®æ°æ®åºè¿æ¥ void AlarmManager::setDatabase(BL::Database* db) { std::lock_guard<std::mutex> lock(m_mutex); m_pDB = db; } // åå§åæ¥è¦è¡¨ bool AlarmManager::initAlarmTable() { char path[MAX_PATH]; GetModuleFileName(NULL, path, MAX_PATH); std::string exePath(path); std::string dbFileDir = exePath.substr(0, exePath.find_last_of("\\/")) + "\\DB"; if (!CreateDirectory(dbFileDir.c_str(), NULL) && ERROR_ALREADY_EXISTS != GetLastError()) { throw std::runtime_error("Failed to create database directory."); } std::string dbFilePath = dbFileDir + "\\" + DATABASE_FILE; if (!m_pDB->connect(dbFilePath, true)) { throw std::runtime_error("Failed to connect to database."); } const std::string createTableQuery = R"( CREATE TABLE IF NOT EXISTS alarms ( id TEXT NOT NULL, device_name TEXT NOT NULL, description TEXT NOT NULL, start_time DATETIME NOT NULL, end_time DATETIME NOT NULL ) )"; return m_pDB->executeQuery(createTableQuery); } // 鿝æ¥è¦è¡¨ void AlarmManager::termAlarmTable() { if (m_pDB != nullptr) { m_pDB->disconnect(); } } // 鿝æ¥è¦è¡¨ bool AlarmManager::destroyAlarmTable() { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } const std::string dropTableQuery = "DROP TABLE IF EXISTS alarms"; return m_pDB->executeQuery(dropTableQuery); } // æ·»å æ¥è¦ bool AlarmManager::addAlarm(const std::string& id, const std::string& deviceName, const std::string& description, const std::string& startTime, const std::string& endTime) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "INSERT INTO alarms (id, device_name, description, start_time, end_time) VALUES (" << "'" << id << "', " << "'" << deviceName << "', " << "'" << description << "', " << "'" << startTime << "', " << "'" << endTime << "')"; std::lock_guard<std::mutex> lock(m_mutex); return m_pDB->executeQuery(query.str()); } // æ¥è¯¢æææ¥è¦æ°æ® std::vector<std::vector<std::string>> AlarmManager::getAllAlarms() { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } const std::string query = "SELECT id, device_name, description, start_time, end_time FROM alarms"; return m_pDB->fetchResults(query); } // æ ¹æ®æ¥è¦IDæ¥è¯¢æ¥è¦ std::vector<std::vector<std::string>> AlarmManager::getAlarmsById(const std::string& id) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT id, device_name, description, start_time, end_time FROM alarms WHERE id = '" << id << "'"; return m_pDB->fetchResults(query.str()); } // æ ¹æ®æè¿°æ¥è¯¢æ¥è¦ std::vector<std::vector<std::string>> AlarmManager::getAlarmsByDescription(const std::string& description) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT id, device_name, description, start_time, end_time FROM alarms WHERE description LIKE '%" << description << "%'"; return m_pDB->fetchResults(query.str()); } // æ ¹æ®æ¶é´èå´æ¥è¯¢æ¥è¦ std::vector<std::vector<std::string>> AlarmManager::getAlarmsByTimeRange( const std::string& startTime, const std::string& endTime) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT id, device_name, description, start_time, end_time FROM alarms WHERE 1=1"; if (!startTime.empty()) { query << " AND start_time >= '" << startTime << "'"; } if (!endTime.empty()) { query << " AND end_time <= '" << endTime << "'"; } return m_pDB->fetchResults(query.str()); } // æ ¹æ®IDãå¼å§æ¶é´åç»ææ¶é´æ¥è¯¢æ¥è¦ std::vector<std::vector<std::string>> AlarmManager::getAlarmsByIdAndTimeRange( const std::string& id, const std::string& startTime, const std::string& endTime) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT id, device_name, description, start_time, end_time FROM alarms WHERE id = '" << id << "'"; if (!startTime.empty()) { query << " AND start_time >= '" << startTime << "'"; } if (!endTime.empty()) { query << " AND end_time <= '" << endTime << "'"; } return m_pDB->fetchResults(query.str()); } // å页æ¥è¯¢æ¥è¦æ°æ® std::vector<std::vector<std::string>> AlarmManager::getAlarms(int startPosition, int count) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT id, device_name, description, start_time, end_time FROM alarms LIMIT " << count << " OFFSET " << startPosition; return m_pDB->fetchResults(query.str()); } // çéæ¥è¦æ°æ® std::vector<std::vector<std::string>> AlarmManager::getFilteredAlarms( const std::string& id, const std::string& deviceName, const std::string& description, const std::string& startTime, const std::string& endTime, int pageNumber, int pageSize) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT id, device_name, description, start_time, end_time FROM alarms WHERE 1=1"; if (!id.empty()) { query << " AND id = '" << id << "'"; } if (!deviceName.empty()) { query << " AND device_name LIKE '%" << deviceName << "%'"; } if (!description.empty()) { query << " AND description LIKE '%" << description << "%'"; } if (!startTime.empty()) { query << " AND start_time >= '" << startTime << "'"; } if (!endTime.empty()) { query << " AND end_time <= '" << endTime << "'"; } int offset = (pageNumber - 1) * pageSize; query << " ORDER BY start_time DESC LIMIT " << pageSize << " OFFSET " << offset; return m_pDB->fetchResults(query.str()); } // è·åç¬¦åæ¡ä»¶çæ¥è¦æ»æ° int AlarmManager::getTotalAlarmCount( const std::string& id, const std::string& deviceName, const std::string& description, const std::string& startTime, const std::string& endTime) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT COUNT(*) FROM alarms WHERE 1=1"; if (!id.empty()) { query << " AND id = '" << id << "'"; } if (!deviceName.empty()) { query << " AND device_name LIKE '%" << deviceName << "%'"; } if (!description.empty()) { query << " AND description LIKE '%" << description << "%'"; } if (!startTime.empty()) { query << " AND start_time >= '" << startTime << "'"; } if (!endTime.empty()) { query << " AND end_time <= '" << endTime << "'"; } auto results = m_pDB->fetchResults(query.str()); return (!results.empty() && !results[0].empty()) ? std::stoi(results[0][0]) : 0; } // æ´æ°æ¥è¦çç»ææ¶é´ bool AlarmManager::updateAlarmEndTime(const std::string& id, const std::string& deviceName, const std::string& description, const std::string& startTime, const std::string& newEndTime) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "UPDATE alarms SET end_time = '" << newEndTime << "'" << " WHERE id = '" << id << "'" << " AND device_name = '" << deviceName << "'" << " AND description = '" << description << "'" << " AND start_time = '" << startTime << "'"; return m_pDB->executeQuery(query.str()); } // æ¸ çæ§æ¥è¦æ°æ® void AlarmManager::cleanOldAlarms(int daysToKeep, const std::string& deviceName) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "DELETE FROM alarms WHERE end_time < datetime('now', '-" << daysToKeep << " days')"; if (!deviceName.empty()) { query << " AND device_name = '" << deviceName << "'"; } m_pDB->executeQuery(query.str()); } SourceCode/Bond/Servo/AlarmManager.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,163 @@ #ifndef ALARM_MANAGER_H #define ALARM_MANAGER_H #include <string> #include <vector> #include <mutex> #include "Database.h" class AlarmManager { public: /** * è·ååä¾å®ä¾ * @return AlarmManagerå®ä¾çå¼ç¨ */ static AlarmManager& getInstance(); /** * è®¾ç½®æ°æ®åºè¿æ¥ * @param db æ°æ®åºè¿æ¥çæé */ void setDatabase(BL::Database* db); /** * åå§åæ¥è¦è¡¨ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool initAlarmTable(); /** * 鿝æ¥è¦è¡¨ */ void termAlarmTable(); /** * 鿝æ¥è¦è¡¨ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool destroyAlarmTable(); /** * æ·»å æ¥è¦ * @param id æ¥è¦ID * @param deviceName 设å¤åç§° * @param description æ¥è¦æè¿° * @param startTime æ¥è¦å¼å§æ¶é´ * @param endTime æ¥è¦ç»ææ¶é´ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool addAlarm(const std::string& id, const std::string& deviceName, const std::string& description, const std::string& startTime, const std::string& endTime); /** * æ¥è¯¢æææ¥è¦æ°æ® * @return å å«æææ¥è¦æ°æ®çäºç»´å符串åé */ std::vector<std::vector<std::string>> getAllAlarms(); /** * æ ¹æ®æ¥è¦IDæ¥è¯¢æ¥è¦ * @param id æ¥è¦ID * @return å å«çéåæ¥è¦æ°æ®çäºç»´å符串åé */ std::vector<std::vector<std::string>> getAlarmsById(const std::string& id); /** * æ ¹æ®æè¿°æ¥è¯¢æ¥è¦ * @param description æ¥è¦æè¿°çç鿡件 * @return å å«çéåæ¥è¦æ°æ®çäºç»´å符串åé */ std::vector<std::vector<std::string>> getAlarmsByDescription(const std::string& description); /** * æ ¹æ®æ¶é´èå´æ¥è¯¢æ¥è¦ * @param startTime èµ·å§æ¶é´ * @param endTime ç»ææ¶é´ * @return å 嫿¥è¯¢ç»æçäºç»´å符串åé */ std::vector<std::vector<std::string>> getAlarmsByTimeRange( const std::string& startTime, const std::string& endTime); /** * æ ¹æ®IDåæ¶é´èå´æ¥è¯¢æ¥è¦ * @param id æ¥è¦ID * @param startTime èµ·å§æ¶é´ * @param endTime ç»ææ¶é´ * @return å 嫿¥è¯¢ç»æçäºç»´å符串åé */ std::vector<std::vector<std::string>> getAlarmsByIdAndTimeRange( const std::string& id, const std::string& startTime, const std::string& endTime); /** * è·åæ¥è¦æ°æ® * @param startPosition èµ·å§ä½ç½® * @param count è·åçè®°å½æ°é * @return å 嫿¥è¦æ°æ®çäºç»´å符串åé */ std::vector<std::vector<std::string>> getAlarms(int startPosition, int count); /** * è·åçéåçæ¥è¦æ°æ® * @param id æ¥è¦IDçç鿡件 * @param deviceName 设å¤åç§°çç鿡件 * @param description æ¥è¦æè¿°çç鿡件 * @param startTime èµ·å§æ¶é´ç鿡件 * @param endTime ç»ææ¶é´ç鿡件 * @param pageNumber 页ç * @param pageSize æ¯é¡µçè®°å½æ° * @return å å«çéåæ¥è¦æ°æ®çäºç»´å符串åé */ std::vector<std::vector<std::string>> getFilteredAlarms( const std::string& id, const std::string& deviceName, const std::string& description, const std::string& startTime, const std::string& endTime, int pageNumber, int pageSize); /** * è·åç¬¦åæ¡ä»¶çæ¥è¦æ»æ° * @param id æ¥è¦IDçç鿡件 * @param deviceName 设å¤åç§°çç鿡件 * @param description æ¥è¦æè¿°çç鿡件 * @param startTime èµ·å§æ¶é´ç鿡件 * @param endTime ç»ææ¶é´ç鿡件 * @return ç¬¦åæ¡ä»¶çæ¥è¦æ»æ° */ int getTotalAlarmCount( const std::string& id, const std::string& deviceName, const std::string& description, const std::string& startTime, const std::string& endTime); /** * æ´æ°æ¥è¦ç»ææ¶é´ * @param id æ¥è¦ID * @param description æ¥è¦æè¿° * @param startTime æ¥è¦å¼å§æ¶é´ * @param newEndTime æ°çæ¥è¦ç»ææ¶é´ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool updateAlarmEndTime(const std::string& id, const std::string& deviceName, const std::string& description, const std::string& startTime, const std::string& newEndTime); /** * æ¸ çæ§æ¥è¦ * @param daysToKeep ä¿ççå¤©æ° * @param deviceName 设å¤åç§° */ void cleanOldAlarms(int daysToKeep = 30, const std::string& deviceName = ""); private: AlarmManager(); ~AlarmManager(); // ç¦æ¢æ·è´åèµå¼ AlarmManager(const AlarmManager&) = delete; AlarmManager& operator=(const AlarmManager&) = delete; BL::Database* m_pDB; static std::mutex m_mutex; }; #endif // ALARM_MANAGER_H SourceCode/Bond/Servo/Servo.cpp
@@ -6,6 +6,7 @@ #include "Servo.h" #include "ServoDlg.h" #include "ServoGraph.h" #include "AlarmManager.h" // 声æå ¨å±åéï¼ç¨äºç®¡ç GDI+ åå§å ULONG_PTR g_diplusToken; @@ -101,6 +102,21 @@ InitGDIPlus(); // åå§åæ¥è¦ç®¡çå¨ try { if (!AlarmManager::getInstance().initAlarmTable()) { AfxMessageBox("åå§åæ¥è¦ç®¡çå¨å¤±è´¥ï¼"); return FALSE; } } catch (const std::exception& ex) { CString errorMsg; errorMsg.Format(_T("åå§åæ¥è¦ç®¡çå¨å¤±è´¥ï¼%s"), CString(ex.what())); AfxMessageBox(errorMsg, MB_ICONERROR); return FALSE; } CServoDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); @@ -140,6 +156,9 @@ // æ¸ ç GDI+ TermGDIPlus(); // 鿝æ¥è¦è¡¨ AlarmManager::getInstance().termAlarmTable(); return CWinApp::ExitInstance(); } SourceCode/Bond/Servo/Servo.vcxproj
@@ -115,6 +115,7 @@ <Optimization>Disabled</Optimization> <PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <SDLCheck>true</SDLCheck> <AdditionalIncludeDirectories>.;..;..\DatabaseSDK\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <SubSystem>Windows</SubSystem> @@ -168,6 +169,7 @@ <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <SDLCheck>true</SDLCheck> <AdditionalIncludeDirectories>.;..;..\DatabaseSDK\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <SubSystem>Windows</SubSystem> @@ -190,6 +192,7 @@ <Text Include="ReadMe.txt" /> </ItemGroup> <ItemGroup> <ClInclude Include="AlarmManager.h" /> <ClInclude Include="BlButton.h" /> <ClInclude Include="Common.h" /> <ClInclude Include="Configuration.h" /> @@ -209,6 +212,7 @@ <ClInclude Include="targetver.h" /> </ItemGroup> <ItemGroup> <ClCompile Include="AlarmManager.cpp" /> <ClCompile Include="BlButton.cpp" /> <ClCompile Include="Configuration.cpp" /> <ClCompile Include="Context.cpp" /> SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -69,6 +69,9 @@ <ClInclude Include="SecsTestDlg.h"> <Filter>头æä»¶</Filter> </ClInclude> <ClInclude Include="AlarmManager.h"> <Filter>头æä»¶</Filter> </ClInclude> </ItemGroup> <ItemGroup> <ClCompile Include="Servo.cpp"> @@ -113,6 +116,9 @@ <ClCompile Include="SecsTestDlg.cpp"> <Filter>æºæä»¶</Filter> </ClCompile> <ClCompile Include="AlarmManager.cpp"> <Filter>æºæä»¶</Filter> </ClCompile> </ItemGroup> <ItemGroup> <ResourceCompile Include="Servo.rc"> SourceCode/Bond/Servo/ServoDlg.cpp
@@ -9,6 +9,7 @@ #include "Common.h" #include "Log.h" #include "SecsTestDlg.h" #include "AlarmManager.h" #include <chrono> #include <thread> #include <cmath> SourceCode/Bond/Servo/stdafx.h
@@ -33,10 +33,32 @@ #include <afxcontrolbars.h> // åè½åºåæ§ä»¶æ¡ç MFC æ¯æ // GDI+ #include <gdiplus.h> using namespace Gdiplus; // æ°æ®åºæ¨¡å #include "..\DatabaseSDK\include\Database.h" #include "..\DatabaseSDK\include\MySQLDatabase.h" #include "..\DatabaseSDK\include\SQLiteDatabase.h" #if defined(_WIN64) #if defined(_DEBUG) #pragma comment(lib, "..\\DatabaseSDK\\lib\\x64\\Debug\\DatabaseEx.lib") #else #pragma comment(lib, "..\\DatabaseSDK\\lib\\x64\\Release\\DatabaseEx.lib") #endif #else #if defined(_DEBUG) #pragma comment(lib, "..\\DatabaseSDK\\lib\\Win32\\Debug\\DatabaseEx.lib") #else #pragma comment(lib, "..\\DatabaseSDK\\lib\\Win32\\Release\\DatabaseEx.lib") #endif #endif #include "..\RxWindows1.0\include\RxWindowsLib.h" #include "..\HSMSSDK\Include\HSMSSDK.h"