jiateng_ws/widgets/inspection_settings_widget.py

384 lines
15 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import logging
import json
from PySide6.QtWidgets import QMessageBox, QLabel
from PySide6.QtCore import QObject, Signal
from PySide6.QtCore import Qt
from ui.inspection_settings_ui import InspectionSettingsUI
from utils.inspection_config_manager import InspectionConfigManager
from dao.inspection_dao import InspectionDAO
class InspectionSettingsWidget(InspectionSettingsUI):
"""检验设置部件"""
# 定义信号
signal_configs_changed = Signal() # 配置变更信号
def __init__(self, parent=None):
super().__init__(parent)
self.parent = parent
# 添加一个明显的标签,方便测试
self.test_label = QLabel("检验配置已加载", self)
self.test_label.setStyleSheet("color: green; font-size: 16px; font-weight: bold; background-color: #e0f7e0; padding: 5px; border-radius: 5px;")
self.test_label.setAlignment(Qt.AlignCenter)
self.main_layout.insertWidget(0, self.test_label)
# 初始化检验配置管理器
self.inspection_manager = InspectionConfigManager.get_instance()
# 保存配置ID
self.config_ids = [None] * 6
# 连接信号和槽
self.connect_signals()
# 加载配置
self.load_configs()
def connect_signals(self):
"""连接信号和槽"""
# 保存按钮
self.save_button.clicked.connect(self.save_configs)
# 重置按钮
self.reset_button.clicked.connect(self.load_configs)
# 数据类型下拉框
for i in range(6):
position = i + 1
combo = self.findChild(QObject, f"data_type_combo_{position}")
if combo:
combo.currentIndexChanged.connect(lambda idx, pos=position: self.update_form_by_data_type(pos))
def load_configs(self):
"""加载检验配置"""
try:
# 设置表单禁用,避免加载过程中的错误操作
self.set_form_enabled(False)
# 重新加载配置
self.inspection_manager.reload_configs()
# 获取所有配置(包括禁用的)
configs = self.inspection_manager.get_configs(include_disabled=True)
# 添加详细日志用于调试
logging.info(f"加载检验配置成功,共 {len(configs)} 项: {[c.get('name', 'unknown') for c in configs]}")
self.test_label.setText(f"检验配置已加载({len(configs)}项)")
# 清空当前配置ID
self.config_ids = [None] * 6
# 按位置加载配置
for config in configs:
position = config.get('position')
if 1 <= position <= 6:
self.config_ids[position - 1] = config.get('id')
self.load_config_to_form(position, config)
# 恢复表单可用
self.set_form_enabled(True)
logging.info("已加载检验配置")
except Exception as e:
logging.error(f"加载检验配置失败: {str(e)}")
self.test_label.setText(f"加载检验配置失败: {str(e)}")
self.test_label.setStyleSheet("color: red; font-size: 16px; font-weight: bold; background-color: #ffe0e0; padding: 5px; border-radius: 5px;")
QMessageBox.critical(self, "错误", f"加载检验配置失败: {str(e)}")
# 恢复表单可用
self.set_form_enabled(True)
def load_config_to_form(self, position, config):
"""将配置加载到表单
Args:
position: 位置序号 (1-6)
config: 配置数据
"""
# 获取分组
group = self.config_groups[position - 1]
# 设置启用状态
group.setChecked(config.get('enabled', False))
# 设置表单值
# 名称
name_input = self.findChild(QObject, f"name_input_{position}")
if name_input:
name_input.setText(config.get('name', ''))
# 显示名称
display_name_input = self.findChild(QObject, f"display_name_input_{position}")
if display_name_input:
display_name_input.setText(config.get('display_name', ''))
# 数据类型
data_type_combo = self.findChild(QObject, f"data_type_combo_{position}")
if data_type_combo:
data_type = config.get('data_type', 'text')
index = data_type_combo.findData(data_type)
if index >= 0:
data_type_combo.setCurrentIndex(index)
# 单位
unit_input = self.findChild(QObject, f"unit_input_{position}")
if unit_input:
unit_input.setText(config.get('unit', ''))
# 最小值
min_value_spin = self.findChild(QObject, f"min_value_spin_{position}")
if min_value_spin:
min_value = config.get('min_value')
if min_value is not None:
min_value_spin.setValue(float(min_value))
else:
min_value_spin.setValue(0)
# 最大值
max_value_spin = self.findChild(QObject, f"max_value_spin_{position}")
if max_value_spin:
max_value = config.get('max_value')
if max_value is not None:
max_value_spin.setValue(float(max_value))
else:
max_value_spin.setValue(100)
# 枚举值
enum_values_input = self.findChild(QObject, f"enum_values_input_{position}")
if enum_values_input:
enum_values = config.get('enum_values')
if enum_values:
if isinstance(enum_values, list):
enum_values_input.setText(','.join(enum_values))
elif isinstance(enum_values, str):
try:
values = json.loads(enum_values)
if isinstance(values, list):
enum_values_input.setText(','.join(values))
else:
enum_values_input.setText(str(enum_values))
except:
enum_values_input.setText(str(enum_values))
else:
enum_values_input.setText('')
# 是否必填
required_check = self.findChild(QObject, f"required_check_{position}")
if required_check:
required_check.setChecked(config.get('required', False))
# 根据数据类型更新表单
self.update_form_by_data_type(position)
def update_form_by_data_type(self, position):
"""根据数据类型更新表单项的可用性
Args:
position: 位置序号 (1-6)
"""
# 获取数据类型
data_type_combo = self.findChild(QObject, f"data_type_combo_{position}")
if not data_type_combo:
return
data_type = data_type_combo.currentData()
# 获取相关控件
unit_input = self.findChild(QObject, f"unit_input_{position}")
min_value_spin = self.findChild(QObject, f"min_value_spin_{position}")
max_value_spin = self.findChild(QObject, f"max_value_spin_{position}")
enum_values_input = self.findChild(QObject, f"enum_values_input_{position}")
# 根据数据类型设置控件可用性
if data_type == 'number':
# 数值类型:启用单位、最小值、最大值,禁用枚举值
if unit_input:
unit_input.setEnabled(True)
if min_value_spin:
min_value_spin.setEnabled(True)
if max_value_spin:
max_value_spin.setEnabled(True)
if enum_values_input:
enum_values_input.setEnabled(False)
enum_values_input.setText('')
elif data_type == 'enum':
# 枚举类型:禁用单位、最小值、最大值,启用枚举值
if unit_input:
unit_input.setEnabled(False)
unit_input.setText('')
if min_value_spin:
min_value_spin.setEnabled(False)
min_value_spin.setValue(0)
if max_value_spin:
max_value_spin.setEnabled(False)
max_value_spin.setValue(0)
if enum_values_input:
enum_values_input.setEnabled(True)
else: # text 或其他
# 文本类型:禁用所有特殊字段
if unit_input:
unit_input.setEnabled(False)
unit_input.setText('')
if min_value_spin:
min_value_spin.setEnabled(False)
min_value_spin.setValue(0)
if max_value_spin:
max_value_spin.setEnabled(False)
max_value_spin.setValue(0)
if enum_values_input:
enum_values_input.setEnabled(False)
enum_values_input.setText('')
def get_form_data(self, position):
"""获取表单数据
Args:
position: 位置序号 (1-6)
Returns:
dict: 表单数据
"""
# 获取分组
group = self.config_groups[position - 1]
# 获取控件
name_input = self.findChild(QObject, f"name_input_{position}")
display_name_input = self.findChild(QObject, f"display_name_input_{position}")
data_type_combo = self.findChild(QObject, f"data_type_combo_{position}")
unit_input = self.findChild(QObject, f"unit_input_{position}")
min_value_spin = self.findChild(QObject, f"min_value_spin_{position}")
max_value_spin = self.findChild(QObject, f"max_value_spin_{position}")
enum_values_input = self.findChild(QObject, f"enum_values_input_{position}")
required_check = self.findChild(QObject, f"required_check_{position}")
# 获取数据
enabled = group.isChecked()
name = name_input.text() if name_input else ''
display_name = display_name_input.text() if display_name_input else ''
data_type = data_type_combo.currentData() if data_type_combo else 'text'
unit = unit_input.text() if unit_input and data_type == 'number' else ''
min_value = min_value_spin.value() if min_value_spin and data_type == 'number' else None
max_value = max_value_spin.value() if max_value_spin and data_type == 'number' else None
# 处理枚举值
enum_values = None
if enum_values_input and data_type == 'enum':
enum_text = enum_values_input.text().strip()
if enum_text:
enum_values = [v.strip() for v in enum_text.split(',') if v.strip()]
required = required_check.isChecked() if required_check else False
# 构建数据
data = {
'position': position,
'name': name,
'display_name': display_name,
'enabled': enabled,
'data_type': data_type,
'required': required,
'sort_order': position
}
# 根据数据类型添加特定字段
if data_type == 'number':
data['min_value'] = min_value
data['max_value'] = max_value
data['unit'] = unit
elif data_type == 'enum':
data['enum_values'] = enum_values
return data
def validate_form(self):
"""验证表单数据
Returns:
bool: 验证是否通过
"""
# 检查是否至少启用一个检验项
enabled_count = 0
for group in self.config_groups:
if group.isChecked():
enabled_count += 1
if enabled_count == 0:
QMessageBox.warning(self, "验证失败", "请至少启用一个检验项目!")
return False
# 检查每个启用的检验项是否填写了必要信息
for i in range(6):
position = i + 1
group = self.config_groups[i]
if group.isChecked():
# 获取控件
name_input = self.findChild(QObject, f"name_input_{position}")
display_name_input = self.findChild(QObject, f"display_name_input_{position}")
data_type_combo = self.findChild(QObject, f"data_type_combo_{position}")
enum_values_input = self.findChild(QObject, f"enum_values_input_{position}")
# 验证名称和显示名称
if not name_input.text().strip():
QMessageBox.warning(self, "验证失败", f"检验项目 {position} 的项目名称不能为空!")
return False
if not display_name_input.text().strip():
QMessageBox.warning(self, "验证失败", f"检验项目 {position} 的显示名称不能为空!")
return False
# 验证枚举类型的枚举值
data_type = data_type_combo.currentData()
if data_type == 'enum' and not enum_values_input.text().strip():
QMessageBox.warning(self, "验证失败", f"检验项目 {position} 是枚举类型,枚举值不能为空!")
return False
return True
def save_configs(self):
"""保存检验配置"""
try:
# 验证表单
if not self.validate_form():
return
# 设置表单禁用,避免保存过程中的错误操作
self.set_form_enabled(False)
# 收集更新数据
for i in range(6):
position = i + 1
config_id = self.config_ids[i]
# 获取表单数据
data = self.get_form_data(position)
# 检查配置ID是否存在
if config_id is not None:
# 更新已有配置
result = self.inspection_manager.update_config(config_id, data)
if not result:
raise Exception(f"更新检验项目 {position} 失败")
else:
# 新建配置不应该进入这个分支因为默认已经创建了6个配置
logging.warning(f"检验项目 {position} 不存在,需要在初始化时创建")
# 重新加载配置
self.inspection_manager.reload_configs()
# 恢复表单可用
self.set_form_enabled(True)
# 显示成功消息
QMessageBox.information(self, "保存成功", "检验配置已保存成功!")
# 发送配置变更信号
self.signal_configs_changed.emit()
logging.info("已保存检验配置")
except Exception as e:
logging.error(f"保存检验配置失败: {str(e)}")
QMessageBox.critical(self, "错误", f"保存检验配置失败: {str(e)}")
# 恢复表单可用
self.set_form_enabled(True)