| SourceCode/Bond/BondEq/BondEq.vcxproj | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/BondEq/BondEqDlg.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/BondEq/CPageAlarm.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/BondEq/DBManager/AlarmManager.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/BondEq/DBManager/AlarmManager.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/BondEq/stdafx.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
SourceCode/Bond/BondEq/BondEq.vcxproj
@@ -220,6 +220,7 @@ <ClInclude Include="Common.h" /> <ClInclude Include="Configuration.h" /> <ClInclude Include="CPanelProject.h" /> <ClInclude Include="DBManager\AlarmManager.h" /> <ClInclude Include="DBManager\AxisManager.h" /> <ClInclude Include="DBManager\SystemLogManager.h" /> <ClInclude Include="DBManager\UserManager.h" /> @@ -294,6 +295,7 @@ <ClCompile Include="CProjectPageRemoteEqs.cpp" /> <ClCompile Include="Configuration.cpp" /> <ClCompile Include="CPanelProject.cpp" /> <ClCompile Include="DBManager\AlarmManager.cpp" /> <ClCompile Include="DBManager\AxisManager.cpp" /> <ClCompile Include="DBManager\SystemLogManager.cpp" /> <ClCompile Include="DBManager\UserManager.cpp" /> SourceCode/Bond/BondEq/BondEqDlg.cpp
@@ -229,6 +229,22 @@ return FALSE; } // åå§åæ¥è¦æ¨¡å AlarmManager& alarmManager = AlarmManager::getInstance(); alarmManager.setDatabase(db.get()); try { if (!alarmManager.initializeAlarmTable()) { AfxMessageBox("åå§åæ¥è¦æ¨¡å失败ï¼"); return FALSE; } } catch (const std::exception& ex) { CString errorMsg; errorMsg.Format(_T("åå§åæ¥è¦æ¨¡å失败ï¼%s"), CString(ex.what())); AfxMessageBox(errorMsg, MB_ICONERROR); return FALSE; } // è®¾ç½®é æ¹æä»¶å¤¹è·¯å¾ RecipeManager& recipeManager = RecipeManager::getInstance(); std::string strRecipePath = CToolUnits::getCurrentExePath() + _T("\\Recipe"); SourceCode/Bond/BondEq/CPageAlarm.cpp
@@ -158,6 +158,8 @@ CAlarmMonitor* pMonitor = (CAlarmMonitor*)theApp.m_model.getBonder().GetComponent("è¦åä¿¡æ¯"); pMonitor->Lock(); #if 0 std::map<int, CAlarm*>& alarmings = pMonitor->getAlarmingMap(); std::list< CAlarm*>& alarms = pMonitor->getAlarmRecords(); @@ -167,6 +169,20 @@ for (auto item : alarms) { AddAlarm(pMonitor, item); } #else // è·åæ¥è¦æ°æ® auto vecData = AlarmManager::getInstance().getAllAlarms(); // å¡«å æ°æ® CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM); for (auto item : vecData) { pListCtrl->InsertItem(0, _T("")); pListCtrl->SetItemText(0, 1, item[0].c_str()); pListCtrl->SetItemText(0, 2, item[1].c_str()); pListCtrl->SetItemText(0, 3, item[2].c_str()); pListCtrl->SetItemText(0, 4, item[3].c_str()); } #endif // 0 pMonitor->Unlock(); } @@ -186,6 +202,12 @@ if (pAlarm->getOffTime() > 0) { pListCtrl->SetItemText(0, 4, CToolUnits::timeToString2(pAlarm->getOffTime()).c_str()); } AlarmManager::getInstance().addAlarm( std::to_string(pAlarm->getId()).c_str(), pMonitor->getAlarmText(pAlarm->getId()), CToolUnits::timeToString2(pAlarm->getOnTime()).c_str(), CToolUnits::timeToString2(pAlarm->getOffTime()).c_str()); } void CPageAlarm::UpdateAlarm(CAlarmMonitor* pMonitor, CAlarm* pAlarm) @@ -198,6 +220,12 @@ if (pListCtrl->GetItemData(i) == (DWORD_PTR)pAlarm) { if (pAlarm->getOffTime() > 0) { pListCtrl->SetItemText(i, 4, CToolUnits::timeToString2(pAlarm->getOffTime()).c_str()); AlarmManager::getInstance().updateAlarmEndTime( std::to_string(pAlarm->getId()).c_str(), pMonitor->getAlarmText(pAlarm->getId()), CToolUnits::timeToString2(pAlarm->getOnTime()).c_str(), CToolUnits::timeToString2(pAlarm->getOffTime()).c_str()); } } } @@ -208,7 +236,9 @@ CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM); for (int i = 0; i < pListCtrl->GetItemCount(); i++) { CAlarm* pAlarm = (CAlarm*)pListCtrl->GetItemData(i); pAlarm->release(); if (pAlarm != nullptr) { pAlarm->release(); } } return CDialogEx::DestroyWindow(); SourceCode/Bond/BondEq/DBManager/AlarmManager.cpp
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,232 @@ #include "stdafx.h" #include <sstream> #include <iostream> #include <stdexcept> #include <ctime> // éææååå§å std::mutex AlarmManager::m_mutex; // è·ååä¾å®ä¾ AlarmManager& AlarmManager::getInstance() { static AlarmManager instance; return instance; } // æé 彿° AlarmManager::AlarmManager() : m_pDB(nullptr) {} // ææå½æ° AlarmManager::~AlarmManager() { m_pDB = nullptr; } // è®¾ç½®æ°æ®åºè¿æ¥ void AlarmManager::setDatabase(BL::Database* db) { std::lock_guard<std::mutex> lock(m_mutex); m_pDB = db; } // åå§åæ¥è¦è¡¨ bool AlarmManager::initializeAlarmTable() { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } const std::string createTableQuery = R"( CREATE TABLE IF NOT EXISTS alarms ( id TEXT NOT NULL, description TEXT NOT NULL, start_time DATETIME NOT NULL, end_time DATETIME NOT NULL ) )"; return m_pDB->executeQuery(createTableQuery); } // æ·»å æ¥è¦ bool AlarmManager::addAlarm(const std::string& id, 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, description, start_time, end_time) VALUES (" << "'" << id << "', " << "'" << 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, 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, 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, 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, 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, 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, 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& 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, description, start_time, end_time FROM alarms WHERE 1=1"; 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& 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 (!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& 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 description = '" << description << "'" << " AND start_time = '" << startTime << "'"; return m_pDB->executeQuery(query.str()); } // æ¸ çæ§æ¥è¦æ°æ® void AlarmManager::cleanOldAlarms(int daysToKeep) { 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')"; m_pDB->executeQuery(query.str()); } SourceCode/Bond/BondEq/DBManager/AlarmManager.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,142 @@ #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 initializeAlarmTable(); /** * æ·»å æ¥è¦ * @param id æ¥è¦ID * @param description æ¥è¦æè¿° * @param startTime æ¥è¦å¼å§æ¶é´ * @param endTime æ¥è¦ç»ææ¶é´ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool addAlarm(const std::string& id, 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 description æ¥è¦æè¿°çç鿡件 * @param startTime èµ·å§æ¶é´ç鿡件 * @param endTime ç»ææ¶é´ç鿡件 * @param pageNumber 页ç * @param pageSize æ¯é¡µçè®°å½æ° * @return å å«çéåæ¥è¦æ°æ®çäºç»´å符串åé */ std::vector<std::vector<std::string>> getFilteredAlarms( const std::string& description, const std::string& startTime, const std::string& endTime, int pageNumber, int pageSize); /** * è·åç¬¦åæ¡ä»¶çæ¥è¦æ»æ° * @param description æ¥è¦æè¿°çç鿡件 * @param startTime èµ·å§æ¶é´ç鿡件 * @param endTime ç»ææ¶é´ç鿡件 * @return ç¬¦åæ¡ä»¶çæ¥è¦æ»æ° */ int getTotalAlarmCount( 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& description, const std::string& startTime, const std::string& newEndTime); /** * æ¸ çæ§æ¥è¦ * @param daysToKeep ä¿ççå¤©æ° */ void cleanOldAlarms(int daysToKeep = 30); 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/BondEq/stdafx.h
@@ -51,6 +51,7 @@ #include "UserManager.h" #include "RecipeManager.h" #include "SystemLogManager.h" #include "AlarmManager.h" // æ§ä»¶æ ·å¼ static UINT g_nGridFixCellColor = RGB(144, 200, 246);