From 11260184c3c930d0d9ccd6b65e905c7828efd3cf Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期五, 12 九月 2025 09:44:02 +0800
Subject: [PATCH] 1. 优化报警的查询功能 2. 插入设备表数据和单元表数据 3. 修复报警查询失败的问题
---
SourceCode/Bond/Servo/AlarmManager.cpp | 138 ++++++++++++++++++++--------------
SourceCode/Bond/Servo/PageAlarm.cpp | 6
SourceCode/Bond/Servo/AlarmManager.h | 48 +++---------
3 files changed, 95 insertions(+), 97 deletions(-)
diff --git a/SourceCode/Bond/Servo/AlarmManager.cpp b/SourceCode/Bond/Servo/AlarmManager.cpp
index 0ed76e5..2143f34 100644
--- a/SourceCode/Bond/Servo/AlarmManager.cpp
+++ b/SourceCode/Bond/Servo/AlarmManager.cpp
@@ -1,4 +1,5 @@
#include "stdafx.h"
+#include "Common.h"
#include "AlarmManager.h"
#include <sstream>
#include <fstream>
@@ -88,7 +89,53 @@
FOREIGN KEY (unit_id) REFERENCES units(unit_id)
)
)";
- return m_pDB->executeQuery(createAlarmsTableQuery);
+ if (!m_pDB->executeQuery(createAlarmsTableQuery)) {
+ return false;
+ }
+
+ // 设备列表 (ID -> 名称)
+ std::vector<std::pair<int, std::string>> devices = {
+ {EQ_ID_LOADPORT1, EQ_NAME_LOADPORT1},
+ {EQ_ID_LOADPORT2, EQ_NAME_LOADPORT2},
+ {EQ_ID_LOADPORT3, EQ_NAME_LOADPORT3},
+ {EQ_ID_LOADPORT4, EQ_NAME_LOADPORT4},
+ {EQ_ID_ARM_TRAY1, EQ_NAME_ARM_TRAY1},
+ {EQ_ID_ARM_TRAY2, EQ_NAME_ARM_TRAY2},
+ {EQ_ID_ALIGNER, EQ_NAME_ALIGNER},
+ {EQ_ID_FLIPER, EQ_NAME_FLIPER},
+ {EQ_ID_VACUUMBAKE, EQ_NAME_VACUUMBAKE},
+ {EQ_ID_Bonder1, EQ_NAME_BONDER1},
+ {EQ_ID_Bonder2, EQ_NAME_BONDER2},
+ {EQ_ID_BAKE_COOLING, EQ_NAME_BAKE_COOLING},
+ {EQ_ID_MEASUREMENT, EQ_NAME_MEASUREMENT},
+ {EQ_ID_EFEM, EQ_NAME_EFEM},
+ {EQ_ID_ARM, EQ_NAME_ARM},
+ {EQ_ID_OPERATOR_REMOVE, EQ_NAME_OPERATOR_REMOVE}
+ };
+
+ // 插入 devices 和对应的默认 unit
+ for (const auto& dev : devices) {
+ int nDeviceId = dev.first;
+ const std::string& strDeviceName = dev.second;
+
+ // 插入设备
+ std::ostringstream ossDev;
+ ossDev << "INSERT OR IGNORE INTO devices (device_id, device_name) VALUES("
+ << nDeviceId << ", '" << strDeviceName << "')";
+ if (!m_pDB->executeQuery(ossDev.str())) {
+ return false;
+ }
+
+ // 插入默认单元 (unit_id = 0, unit_name = device_name)
+ std::ostringstream ossUnit;
+ ossUnit << "INSERT OR IGNORE INTO units (device_id, unit_id, unit_name) VALUES("
+ << nDeviceId << ", 0, '" << strDeviceName << "')";
+ if (!m_pDB->executeQuery(ossUnit.str())) {
+ return false;
+ }
+ }
+
+ return true;
}
// 销毁报警表
@@ -487,17 +534,7 @@
}
// 筛选报警数据
-std::vector<AlarmData> AlarmManager::getFilteredAlarms(
- const std::string& id,
- const std::string& severityLevel,
- const std::string& deviceName,
- const std::string& unitName,
- const std::string& description,
- const std::string& startTime,
- const std::string& endTime,
- int pageNumber,
- int pageSize) {
-
+std::vector<AlarmData> AlarmManager::getFilteredAlarms(const std::string& keyword, const std::string& startTime, const std::string& endTime, int pageNumber, int pageSize) {
if (!m_pDB) {
return {};
}
@@ -507,25 +544,20 @@
SELECT a.id, a.severity_level, a.device_id, a.unit_id, d.device_name, u.unit_name, a.description, a.start_time, a.end_time
FROM alarms a
JOIN devices d ON a.device_id = d.device_id
- JOIN units u ON a.device_id = u.device_id AND a.unit_id = u.unit_id
+ JOIN units u ON a.device_id = u.device_id AND a.unit_id = u.unit_id
WHERE 1=1)";
- // 传入的过滤条件
- if (!id.empty()) {
- query << " AND a.id = '" << id << "'";
+ // 统一关键字模糊查询
+ if (!keyword.empty()) {
+ query << " AND ("
+ << "a.id LIKE '%" << keyword << "%' OR "
+ << "a.severity_level LIKE '%" << keyword << "%' OR "
+ << "d.device_name LIKE '%" << keyword << "%' OR "
+ << "u.unit_name LIKE '%" << keyword << "%' OR "
+ << "a.description LIKE '%" << keyword << "%')";
}
- if (!severityLevel.empty()) {
- query << " AND a.severity_level = '" << severityLevel << "'";
- }
- if (!deviceName.empty()) {
- query << " AND d.device_name LIKE '%" << deviceName << "%'";
- }
- if (!unitName.empty()) {
- query << " AND u.unit_name LIKE '%" << unitName << "%'";
- }
- if (!description.empty()) {
- query << " AND a.description LIKE '%" << description << "%'";
- }
+
+ // 时间条件
if (!startTime.empty()) {
query << " AND a.start_time >= '" << startTime << "'";
}
@@ -534,9 +566,10 @@
}
// 分页设置
- int offset = (pageNumber - 1) * pageSize;
- query << " ORDER BY a.start_time DESC LIMIT " << pageSize << " OFFSET " << offset;
+ int nOffset = (pageNumber - 1) * pageSize;
+ query << " ORDER BY a.start_time DESC LIMIT " << pageSize << " OFFSET " << nOffset;
+ // 查询
auto results = m_pDB->fetchResults(query.str());
// 遍历查询结果,填充 AlarmData 结构体
@@ -560,41 +593,30 @@
}
// 获取符合条件的报警总数
-int AlarmManager::getTotalAlarmCount(
- const std::string& id,
- const std::string& severityLevel,
- const std::string& deviceName,
- const std::string& unitName,
- const std::string& description,
- const std::string& startTime,
- const std::string& endTime) {
-
+int AlarmManager::getTotalAlarmCount(const std::string& keyword, const std::string& startTime, const std::string& endTime) {
if (!m_pDB) {
return 0;
}
std::ostringstream query;
- query << "SELECT COUNT(*) FROM alarms a "
- << "JOIN devices d ON a.device_id = d.device_id "
- << "JOIN units u ON a.device_id = u.device_id AND a.unit_id = u.unit_id "
- << "WHERE 1=1";
+ query << R"(
+ SELECT COUNT(*)
+ FROM alarms a
+ JOIN devices d ON a.device_id = d.device_id
+ JOIN units u ON a.device_id = u.device_id AND a.unit_id = u.unit_id
+ WHERE 1=1)";
- // 添加过滤条件
- if (!id.empty()) {
- query << " AND a.id = '" << id << "'";
+ // 统一关键字模糊查询
+ if (!keyword.empty()) {
+ query << " AND ("
+ << "a.id LIKE '%" << keyword << "%' OR "
+ << "a.severity_level LIKE '%" << keyword << "%' OR "
+ << "d.device_name LIKE '%" << keyword << "%' OR "
+ << "u.unit_name LIKE '%" << keyword << "%' OR "
+ << "a.description LIKE '%" << keyword << "%')";
}
- if (!severityLevel.empty()) {
- query << " AND a.severity_level = '" << severityLevel << "'";
- }
- if (!deviceName.empty()) {
- query << " AND d.device_name LIKE '%" << deviceName << "%'";
- }
- if (!unitName.empty()) {
- query << " AND u.unit_name LIKE '%" << unitName << "%'";
- }
- if (!description.empty()) {
- query << " AND a.description LIKE '%" << description << "%'";
- }
+
+ // 时间条件
if (!startTime.empty()) {
query << " AND a.start_time >= '" << startTime << "'";
}
diff --git a/SourceCode/Bond/Servo/AlarmManager.h b/SourceCode/Bond/Servo/AlarmManager.h
index cbe1bb9..d98fce9 100644
--- a/SourceCode/Bond/Servo/AlarmManager.h
+++ b/SourceCode/Bond/Servo/AlarmManager.h
@@ -115,49 +115,25 @@
*/
std::vector<AlarmData> getAlarms(int startPosition, int count);
- /**
- * 获取筛选后的报警数据
- * @param id 报警ID的筛选条件
- * @param severityLevel 报警等级筛选条件
- * @param deviceName 设备名称的筛选条件
- * @param unitName 单元名称的筛选条件
- * @param description 报警描述的筛选条件
- * @param startTime 起始时间筛选条件
- * @param endTime 结束时间筛选条件
- * @param pageNumber 页码
- * @param pageSize 每页的记录数
- * @return 包含查询结果的报警数据
- */
- std::vector<AlarmData> getFilteredAlarms(
- const std::string& id,
- const std::string& severityLevel,
- const std::string& deviceName,
- const std::string& unitName,
- const std::string& description,
- const std::string& startTime,
- const std::string& endTime,
- int pageNumber,
- int pageSize);
+ /**
+ * 筛选报警数据
+ * @param keyword 关键字筛选条件
+ * @param startTime 起始时间筛选条件
+ * @param endTime 结束时间筛选条件
+ * @param pageNumber 页码
+ * @param pageSize 每页记录数
+ * @return 包含筛选后报警数据的结构体
+ */
+ std::vector<AlarmData> getFilteredAlarms(const std::string& keyword, const std::string& startTime, const std::string& endTime, int pageNumber, int pageSize);
/**
* 获取符合条件的报警总数
- * @param id 报警ID的筛选条件
- * @param severityLevel 报警等级筛选条件
- * @param deviceName 设备名称的筛选条件
- * @param unitName 单元名称的筛选条件
- * @param description 报警描述的筛选条件
+ * @param keyword 关键字筛选条件
* @param startTime 起始时间筛选条件
* @param endTime 结束时间筛选条件
* @return 符合条件的报警总数
*/
- int getTotalAlarmCount(
- const std::string& id,
- const std::string& severityLevel,
- const std::string& deviceName,
- const std::string& unitName,
- const std::string& description,
- const std::string& startTime,
- const std::string& endTime);
+ int getTotalAlarmCount(const std::string& keyword, const std::string& startTime, const std::string& endTime);
/**
* 更新报警结束时间
diff --git a/SourceCode/Bond/Servo/PageAlarm.cpp b/SourceCode/Bond/Servo/PageAlarm.cpp
index 8113dad..6146eaa 100644
--- a/SourceCode/Bond/Servo/PageAlarm.cpp
+++ b/SourceCode/Bond/Servo/PageAlarm.cpp
@@ -140,7 +140,7 @@
void CPageAlarm::UpdatePageData()
{
// 鏍规嵁杩囨护鏉′欢鍔犺浇鏁版嵁锛屾彁渚涙弿杩板拰鏃堕棿鑼冨洿鏌ヨ
- auto vecData = AlarmManager::getInstance().getFilteredAlarms("", "", m_strDeviceName, m_strUnitName, m_strKeyword, m_szTimeStart, m_szTimeEnd, m_nCurPage, PAGE_SIZE);
+ auto vecData = AlarmManager::getInstance().getFilteredAlarms(m_strKeyword, m_szTimeStart, m_szTimeEnd, m_nCurPage, PAGE_SIZE);
// 濉厖鏁版嵁鍒版帶浠�
CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
@@ -297,7 +297,7 @@
// 璁$畻鎬婚〉鏁�
- int totalRecords = AlarmManager::getInstance().getTotalAlarmCount("", "", m_strDeviceName, m_strUnitName, m_strKeyword, m_szTimeStart, m_szTimeEnd);
+ int totalRecords = AlarmManager::getInstance().getTotalAlarmCount(m_strKeyword, m_szTimeStart, m_szTimeEnd);
m_nTotalPages = (totalRecords + PAGE_SIZE - 1) / PAGE_SIZE;
m_nCurPage = 1;
@@ -426,7 +426,7 @@
}
// 璁$畻鎬婚〉鏁�
- int totalRecords = AlarmManager::getInstance().getTotalAlarmCount("", "", m_strDeviceName, m_strUnitName, m_strKeyword, m_szTimeStart, m_szTimeEnd);
+ int totalRecords = AlarmManager::getInstance().getTotalAlarmCount(m_strKeyword, m_szTimeStart, m_szTimeEnd);
m_nTotalPages = (totalRecords + PAGE_SIZE - 1) / PAGE_SIZE;
m_nCurPage = 1;
--
Gitblit v1.9.3