这次增加了测试结果导出到EXCEL、项目阶段需要安装定义的表格中的name PN来处理

This commit is contained in:
2025-12-14 18:19:29 +08:00
parent 872b181703
commit 5e94d17212
10 changed files with 434 additions and 17 deletions

View File

@@ -13,6 +13,14 @@ from PyQt5.QtWidgets import (
QTextEdit, QPushButton, QLabel, QWidget
)
from PyQt5.QtCore import Qt
import requests
# 尝试导入配置
try:
from config import USE_HTTP_API, HTTP_API_BASE_URL
except ImportError:
USE_HTTP_API = False
HTTP_API_BASE_URL = "http://127.0.0.1:5050"
class DUTFormDialog(QDialog):
@@ -26,12 +34,20 @@ class DUTFormDialog(QDialog):
self.setModal(True)
self.resize(800, 480)
# HTTP API 配置
self.use_http_api = USE_HTTP_API
self.api_base_url = HTTP_API_BASE_URL
# 机台数据缓存
self.machines = []
self.current_machine = None
# 项目阶段数据缓存
self.project_phases = [] # 存储从后端获取的项目阶段列表
self._build_ui()
self._load_machines() # 加载机台数据
self._load_project_phases() # 加载项目阶段数据
self._fill_form(self.dut_form)
self._apply_lock()
@@ -62,7 +78,7 @@ class DUTFormDialog(QDialog):
self.input_testReq = QLineEdit()
self.input_phase = QComboBox()
self.input_phase.setEditable(True)
self.input_phase.addItems(["A Sample", "B Sample", "C Sample", "Work Sample", "阶段1", "阶段2"]) # 示例项
# 项目阶段选项将在 _load_project_phases() 中从后端加载
# 右列控件 - 设备分配(二级选择)
self.input_dtMachine = QComboBox() # 机台选择
@@ -143,6 +159,58 @@ class DUTFormDialog(QDialog):
except Exception as e:
print(f"加载机台数据失败: {e}")
def _load_project_phases(self):
"""从后端加载项目阶段数据"""
try:
# 尝试使用 HTTP API
if self.use_http_api:
try:
url = f"{self.api_base_url}/dbTableAccess"
response = requests.get(
url,
params={"table": "projectPhase"},
timeout=5
)
response.raise_for_status()
result = response.json()
data = result.get("data", [])
if data:
self.project_phases = data
print(f"从 HTTP API 加载了 {len(data)} 个项目阶段")
else:
print("后端返回的项目阶段数据为空")
self.project_phases = []
except Exception as e:
print(f"HTTP API 加载项目阶段失败: {e},回退到 SystemModel")
# 回退到使用 SystemModel
if self.system_model:
self.project_phases = self.system_model.load_project_phases()
else:
self.project_phases = []
else:
# 直接使用 SystemModel
if self.system_model:
self.project_phases = self.system_model.load_project_phases()
else:
self.project_phases = []
# 填充下拉框:显示 name存储 PN 作为 itemData
self.input_phase.clear()
for phase in self.project_phases:
name = phase.get("name", "")
pn = phase.get("PN", "")
if name: # 只添加有名称的项
self.input_phase.addItem(name, pn) # 显示 name数据存储 PN
print(f"项目阶段下拉框已填充 {self.input_phase.count()} 个选项")
except Exception as e:
print(f"加载项目阶段数据失败: {e}")
import traceback
traceback.print_exc()
def _on_machine_changed(self, index):
"""机台选择变化时更新通道列表"""
self.input_station.clear()
@@ -181,13 +249,22 @@ class DUTFormDialog(QDialog):
self.input_SN.setText(str(f.get("SN", "")))
self.input_project.setText(str(f.get("project", "")))
self.input_testReq.setText(str(f.get("testReq", "")))
phase_val = str(f.get("phase", ""))
if phase_val:
idx = self.input_phase.findText(phase_val)
if idx >= 0:
self.input_phase.setCurrentIndex(idx)
else:
self.input_phase.setEditText(phase_val)
# 项目阶段f.get("phase") 存储的是 PN 值,需要匹配 itemData
phase_pn = str(f.get("phase", ""))
if phase_pn:
# 查找匹配的 PN
found = False
for i in range(self.input_phase.count()):
item_pn = self.input_phase.itemData(i)
if item_pn == phase_pn:
self.input_phase.setCurrentIndex(i)
found = True
break
# 如果没有找到匹配项,使用可编辑功能填充
if not found:
self.input_phase.setEditText(phase_pn)
# 设备分配:使用 Model 解析后的 dtMachine 和 station 字段
dtm = f.get("dtMachine", "").strip()
@@ -224,11 +301,16 @@ class DUTFormDialog(QDialog):
def get_form_dict(self):
# 以 dut_form 的结构返回数据
# 项目阶段:优先获取 itemDataPN值如果没有则使用用户输入的文本
phase_pn = self.input_phase.currentData() # 获取当前选中项的 PN
if phase_pn is None: # 如果是用户手动输入的文本
phase_pn = self.input_phase.currentText().strip()
dut_form = {
"SN": self.input_SN.text().strip(),
"project": self.input_project.text().strip(),
"testReq": self.input_testReq.text().strip(),
"phase": self.input_phase.currentText().strip(),
"phase": phase_pn, # 存储 PN 值
"weeks": int(self.input_weeks.text() or 0),
"workOrder": self.input_workOrder.text().strip(),
"inspector": self.input_inspector.text().strip(),