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)