这是使用PyQT5作为UI的首次提交,将后端和UI合并到1个工程中,统一使用了Python,没有使用JS和HTML
This commit is contained in:
137
UI/models/monitor_model.py
Normal file
137
UI/models/monitor_model.py
Normal file
@@ -0,0 +1,137 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
监控模型,处理试验安排与监控相关的数据
|
||||
"""
|
||||
|
||||
from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal, QVariant, pyqtSlot
|
||||
import sqlite3
|
||||
import os
|
||||
import json
|
||||
import ast
|
||||
|
||||
|
||||
class MonitorModel(QObject):
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self._monitor_data = []
|
||||
self._filtered_data = [] # 仅包含dutDirectionMode==2的数据
|
||||
self._load_data()
|
||||
|
||||
# 信号定义
|
||||
dataChanged = pyqtSignal()
|
||||
|
||||
def _load_data(self):
|
||||
"""从数据库加载数据"""
|
||||
try:
|
||||
# 连接数据库
|
||||
db_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'dtmgtDb.db')
|
||||
if os.path.exists(db_path):
|
||||
conn = sqlite3.connect(db_path)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# 查询 dutList 表中的试验数据
|
||||
cursor.execute("""
|
||||
SELECT SN, name, project, projectType, phase, weeks, stationAssigned,
|
||||
itemOnGoing, itemsFinished, status, testReq, inspector, id,
|
||||
description, deadLine, createdate, workOrder, direction_codes
|
||||
FROM dutList
|
||||
""")
|
||||
|
||||
rows = cursor.fetchall()
|
||||
self._monitor_data = []
|
||||
|
||||
for row in rows:
|
||||
# 解析direction_codes字段获取dutDirectionMode
|
||||
direction_codes = row[17] if row[17] else ""
|
||||
dut_direction_mode = 0
|
||||
|
||||
# 解析类似"[33, 35, 36]"的字符串
|
||||
if direction_codes and direction_codes.startswith('[') and direction_codes.endswith(']'):
|
||||
try:
|
||||
# 使用ast.literal_eval安全地解析列表
|
||||
codes_list = ast.literal_eval(direction_codes)
|
||||
if isinstance(codes_list, list) and len(codes_list) > 0:
|
||||
dut_direction_mode = codes_list[0] # 取第一个元素作为dutDirectionMode
|
||||
except:
|
||||
# 如果解析失败,尝试其他方式
|
||||
try:
|
||||
# 移除方括号并分割
|
||||
codes_str = direction_codes.strip('[]')
|
||||
codes_list = [int(code.strip()) for code in codes_str.split(',') if code.strip().isdigit()]
|
||||
if len(codes_list) > 0:
|
||||
dut_direction_mode = codes_list[0]
|
||||
except:
|
||||
dut_direction_mode = 0
|
||||
elif direction_codes.isdigit():
|
||||
# 如果是纯数字
|
||||
dut_direction_mode = int(direction_codes)
|
||||
|
||||
monitor = {
|
||||
"id": row[12] if row[12] is not None else 0,
|
||||
"name": row[1] if row[1] else "",
|
||||
"status": row[9] if row[9] else "",
|
||||
"dutDirectionMode": dut_direction_mode,
|
||||
"project": row[2] if row[2] else "",
|
||||
"SN": row[0] if row[0] else "",
|
||||
"description": row[13] if row[13] else ""
|
||||
}
|
||||
self._monitor_data.append(monitor)
|
||||
|
||||
conn.close()
|
||||
else:
|
||||
# 如果数据库不存在,使用示例数据
|
||||
self._monitor_data = [
|
||||
{"id": 1, "name": "测试1", "dutDirectionMode": 2, "status": "运行中", "project": "项目A"},
|
||||
{"id": 2, "name": "测试2", "dutDirectionMode": 1, "status": "待开始", "project": "项目B"},
|
||||
{"id": 3, "name": "测试3", "dutDirectionMode": 2, "status": "已完成", "project": "项目C"}
|
||||
]
|
||||
|
||||
# 过滤数据,只保留dutDirectionMode==2的记录
|
||||
self._filtered_data = [item for item in self._monitor_data if item.get("dutDirectionMode") == 2]
|
||||
self.dataChanged.emit()
|
||||
|
||||
except Exception as e:
|
||||
print(f"加载监控数据时出错: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
# 出错时使用默认数据
|
||||
self._monitor_data = []
|
||||
self._filtered_data = []
|
||||
|
||||
@pyqtProperty('QVariant', notify=dataChanged)
|
||||
def monitorData(self):
|
||||
"""返回所有监控数据"""
|
||||
return self._monitor_data
|
||||
|
||||
@pyqtProperty('QVariant', notify=dataChanged)
|
||||
def filteredMonitorData(self):
|
||||
"""返回过滤后的监控数据(仅dutDirectionMode==2)"""
|
||||
return self._filtered_data
|
||||
|
||||
@pyqtSlot(int, result='QVariant')
|
||||
def getMonitorById(self, monitor_id):
|
||||
"""根据ID获取监控信息"""
|
||||
for monitor in self._monitor_data:
|
||||
if monitor.get("id") == monitor_id:
|
||||
return monitor
|
||||
return None
|
||||
|
||||
@pyqtSlot(result=int)
|
||||
def getMonitorCount(self):
|
||||
"""获取监控总数"""
|
||||
return len(self._monitor_data)
|
||||
|
||||
@pyqtSlot(result=int)
|
||||
def getFilteredMonitorCount(self):
|
||||
"""获取过滤后的监控总数"""
|
||||
return len(self._filtered_data)
|
||||
|
||||
def get_filtered_monitors(self):
|
||||
"""获取过滤后的监控列表(供视图直接调用)"""
|
||||
return self._filtered_data
|
||||
|
||||
def get_all_monitors(self):
|
||||
"""获取所有监控列表(供视图直接调用)"""
|
||||
return self._monitor_data
|
||||
Reference in New Issue
Block a user