141 lines
5.1 KiB
Python
141 lines
5.1 KiB
Python
import sqlite3
|
||
from datetime import datetime
|
||
from PySide6.QtCore import QMutex
|
||
|
||
"""
|
||
sqlite消息数据库管理: db/messages.db
|
||
"""
|
||
|
||
class DBHelper:
|
||
_instance = None # 单例模式
|
||
_mutex = QMutex()
|
||
|
||
def __new__(cls, db_name="db/messages.db"):
|
||
"""消息数据库连接管理器"""
|
||
cls._mutex.lock()
|
||
try:
|
||
if not cls._instance:
|
||
cls._instance = super().__new__(cls)
|
||
cls._instance.db_name = db_name
|
||
cls._instance._init_db()
|
||
finally:
|
||
cls._mutex.unlock()
|
||
return cls._instance
|
||
|
||
def _init_db(self):
|
||
"""创建消息表"""
|
||
conn = sqlite3.connect(self.db_name)
|
||
cursor = conn.cursor()
|
||
# 创建消息表:id(主键)、内容、类型(1=系统消息,2=预警)、是否处理、创建时间
|
||
cursor.execute('''
|
||
CREATE TABLE IF NOT EXISTS messages (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
content TEXT NOT NULL,
|
||
message_type INTEGER NOT NULL, -- 1: normal, 2: warning
|
||
is_processed INTEGER NOT NULL DEFAULT 0, -- 为1表示已经解决/已经处理
|
||
create_time TEXT NOT NULL, -- 创建时间
|
||
last_modified TEXT NOT NULL -- 最后修改时间(新增/更新时都会变)
|
||
)
|
||
''')
|
||
conn.commit()
|
||
conn.close()
|
||
|
||
def insert_message(self, content, message_type, is_processed=0):
|
||
"""插入消息: create_time和last_modified一开始都设为当前时间"""
|
||
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||
conn = sqlite3.connect(self.db_name)
|
||
cursor = conn.cursor()
|
||
cursor.execute('''
|
||
INSERT INTO messages (content, message_type, is_processed, create_time, last_modified)
|
||
VALUES (?, ?, ?, ?, ?)
|
||
''', (content, message_type, is_processed, current_time, current_time))
|
||
conn.commit()
|
||
conn.close()
|
||
|
||
def update_processed_status(self, content, message_type, is_processed=1):
|
||
"""更新is_processed状态, 同时更新last_modified为当前时间"""
|
||
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||
conn = sqlite3.connect(self.db_name)
|
||
cursor = conn.cursor()
|
||
cursor.execute('''
|
||
UPDATE messages
|
||
SET is_processed = ?, last_modified = ?
|
||
WHERE content = ? AND message_type = ?
|
||
''', (is_processed, current_time, content, message_type)) # 更新last_modified
|
||
conn.commit()
|
||
conn.close()
|
||
|
||
def get_latest_messages(self, message_type, limit=16):
|
||
"""查询最新limit条消息, 包含last_modified字段"""
|
||
conn = sqlite3.connect(self.db_name)
|
||
cursor = conn.cursor()
|
||
# 按创建时间倒序(确保取最新的消息),返回时包含last_modified
|
||
cursor.execute('''
|
||
SELECT content, is_processed, create_time, last_modified
|
||
FROM messages
|
||
WHERE message_type = ?
|
||
ORDER BY create_time DESC
|
||
LIMIT ?
|
||
''', (message_type, limit))
|
||
messages = cursor.fetchall() # 结果:[(content, is_processed, create_time, last_modified), ...]
|
||
conn.close()
|
||
return messages[::-1] # 反转后按时间正序排列
|
||
|
||
def clean_expired_messages(self, days_to_keep=30):
|
||
"""删除超过指定天数(默认30天, 一个月)的过期消息,并压缩数据库"""
|
||
from datetime import datetime, timedelta
|
||
# 计算过期时间(当前时间 - days_to_keep天)
|
||
expire_time = (datetime.now() - timedelta(days=days_to_keep)).strftime("%Y-%m-%d %H:%M:%S")
|
||
|
||
conn = sqlite3.connect(self.db_name)
|
||
cursor = conn.cursor()
|
||
# 删除过期消息
|
||
cursor.execute('''
|
||
DELETE FROM messages
|
||
WHERE create_time < ?
|
||
''', (expire_time,))
|
||
conn.commit()
|
||
# 压缩数据库,释放删除后的空闲空间
|
||
cursor.execute("VACUUM")
|
||
conn.commit()
|
||
conn.close()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
"""测试用例:向数据库插入测试消息"""
|
||
import time
|
||
|
||
# 创建DBHelper实例(会自动创建数据库和表)
|
||
db = DBHelper()
|
||
|
||
# # 插入系统状态消息(message_type=1)
|
||
# db.insert_message(
|
||
# content="开始自动智能浇筑系统",
|
||
# message_type=1, # 系统消息
|
||
# is_processed=False
|
||
# )
|
||
# time.sleep(1)
|
||
# db.insert_message(
|
||
# content="智能浇筑系统启动成功",
|
||
# message_type=1,
|
||
# is_processed=False
|
||
# )
|
||
# time.sleep(1)
|
||
# db.insert_message(
|
||
# content="上料斗载荷达到80%",
|
||
# message_type=1, # 系统消息
|
||
# is_processed=True # 已处理
|
||
# )
|
||
|
||
# 插入预警消息(message_type=2)
|
||
db.insert_message(
|
||
content="振动频率异常",
|
||
message_type=2, # 预警消息
|
||
is_processed=False # 未处理
|
||
)
|
||
time.sleep(1)
|
||
db.insert_message(
|
||
content="料斗重量超出阈值",
|
||
message_type=2, # 预警消息
|
||
is_processed=True # 已处理
|
||
) |