feat: 添加运行模式选择功能,更新配置加载逻辑以支持单机模式和接口模式
This commit is contained in:
parent
1a5fa1a95b
commit
507a345d43
BIN
db/jtDB.db
BIN
db/jtDB.db
Binary file not shown.
@ -108,6 +108,29 @@ class MainWindowUI(QMainWindow):
|
|||||||
self.task_label.setAlignment(Qt.AlignLeft)
|
self.task_label.setAlignment(Qt.AlignLeft)
|
||||||
self.task_label.setStyleSheet("font-weight: bold; color: #333333;")
|
self.task_label.setStyleSheet("font-weight: bold; color: #333333;")
|
||||||
self.task_layout.addWidget(self.task_label)
|
self.task_layout.addWidget(self.task_label)
|
||||||
|
|
||||||
|
|
||||||
|
# 订单行
|
||||||
|
self.order_layout = QHBoxLayout()
|
||||||
|
self.order_layout.setAlignment(Qt.AlignLeft) # 设置整个布局左对齐
|
||||||
|
|
||||||
|
self.order_label = QLabel("工程号")
|
||||||
|
self.order_label.setFont(QFont("微软雅黑", 12, QFont.Bold))
|
||||||
|
self.order_label.setFixedHeight(30)
|
||||||
|
self.order_label.setStyleSheet("padding: 0 5px; color: #333333;")
|
||||||
|
|
||||||
|
self.order_edit = QLineEdit()
|
||||||
|
self.order_edit.setFixedHeight(30)
|
||||||
|
self.order_edit.setFixedWidth(150)
|
||||||
|
self.order_edit.setReadOnly(False)
|
||||||
|
self.order_edit.setFont(QFont("微软雅黑", 12))
|
||||||
|
self.order_edit.setText("") # 设置默认订单号
|
||||||
|
self.order_edit.setStyleSheet("background-color: #f9f9f9; border: 1px solid #cccccc; border-radius: 3px; padding: 2px 5px;")
|
||||||
|
|
||||||
|
self.order_layout.addWidget(self.order_label)
|
||||||
|
self.order_layout.addWidget(self.order_edit)
|
||||||
|
self.order_layout.addStretch() # 添加弹性空间,将组件推到左侧
|
||||||
|
self.task_layout.addLayout(self.order_layout)
|
||||||
|
|
||||||
# 任务表格 - 使用合并单元格实现一级二级标题
|
# 任务表格 - 使用合并单元格实现一级二级标题
|
||||||
self.task_table = QTableWidget(3, 4) # 3行4列:一级标题行、二级标题行、数据行
|
self.task_table = QTableWidget(3, 4) # 3行4列:一级标题行、二级标题行、数据行
|
||||||
@ -148,24 +171,6 @@ class MainWindowUI(QMainWindow):
|
|||||||
self.task_table.setRowHeight(2, 30) # 数据行高
|
self.task_table.setRowHeight(2, 30) # 数据行高
|
||||||
self.task_layout.addWidget(self.task_table)
|
self.task_layout.addWidget(self.task_table)
|
||||||
|
|
||||||
# 订单行
|
|
||||||
self.order_layout = QHBoxLayout()
|
|
||||||
self.order_label = QLabel("工程号")
|
|
||||||
self.order_label.setFont(QFont("微软雅黑", 12, QFont.Bold))
|
|
||||||
self.order_label.setFixedHeight(35)
|
|
||||||
self.order_label.setStyleSheet("padding: 0 5px; color: #333333;")
|
|
||||||
|
|
||||||
self.order_edit = QLineEdit()
|
|
||||||
self.order_edit.setFixedHeight(35)
|
|
||||||
self.order_edit.setReadOnly(False)
|
|
||||||
self.order_edit.setFont(QFont("微软雅黑", 12))
|
|
||||||
self.order_edit.setText("ORD-2025-001") # 设置默认订单号
|
|
||||||
self.order_edit.setStyleSheet("background-color: #f9f9f9; border: 1px solid #cccccc; border-radius: 3px; padding: 2px 5px;")
|
|
||||||
|
|
||||||
self.order_layout.addWidget(self.order_label)
|
|
||||||
self.order_layout.addWidget(self.order_edit)
|
|
||||||
self.task_layout.addLayout(self.order_layout)
|
|
||||||
|
|
||||||
self.left_layout.addWidget(self.task_frame)
|
self.left_layout.addWidget(self.task_frame)
|
||||||
|
|
||||||
# 上料区 - 使用QFrame包裹,添加边框
|
# 上料区 - 使用QFrame包裹,添加边框
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
from PySide6.QtWidgets import (
|
from PySide6.QtWidgets import (
|
||||||
QWidget, QLabel, QLineEdit, QPushButton, QComboBox, QGridLayout, QHBoxLayout, QVBoxLayout,
|
QWidget, QLabel, QLineEdit, QPushButton, QComboBox, QGridLayout, QHBoxLayout, QVBoxLayout,
|
||||||
QTabWidget, QFrame, QFormLayout, QGroupBox, QRadioButton, QSpacerItem, QSizePolicy,
|
QTabWidget, QFrame, QFormLayout, QGroupBox, QRadioButton, QSpacerItem, QSizePolicy,
|
||||||
QTableWidget, QTableWidgetItem, QHeaderView, QSlider, QCheckBox
|
QTableWidget, QTableWidgetItem, QHeaderView, QSlider, QCheckBox, QButtonGroup
|
||||||
)
|
)
|
||||||
from PySide6.QtGui import QFont, QBrush, QColor
|
from PySide6.QtGui import QFont, QBrush, QColor
|
||||||
from PySide6.QtCore import Qt, Signal, QSize
|
from PySide6.QtCore import Qt, Signal, QSize
|
||||||
@ -233,6 +233,34 @@ class SettingsUI(QWidget):
|
|||||||
self.db_type_group.setLayout(self.db_type_layout)
|
self.db_type_group.setLayout(self.db_type_layout)
|
||||||
self.database_layout.addWidget(self.db_type_group)
|
self.database_layout.addWidget(self.db_type_group)
|
||||||
|
|
||||||
|
# 添加运行模式选择组
|
||||||
|
self.mode_group = QGroupBox("运行模式")
|
||||||
|
self.mode_group.setFont(self.normal_font)
|
||||||
|
self.mode_layout = QHBoxLayout()
|
||||||
|
|
||||||
|
# 创建单选按钮组
|
||||||
|
self.mode_button_group = QButtonGroup(self)
|
||||||
|
|
||||||
|
# 创建单机模式单选按钮
|
||||||
|
self.standalone_mode_radio = QRadioButton("单机模式")
|
||||||
|
self.standalone_mode_radio.setFont(self.normal_font)
|
||||||
|
self.standalone_mode_radio.setChecked(True) # 默认选中单机模式
|
||||||
|
self.mode_button_group.addButton(self.standalone_mode_radio, 1)
|
||||||
|
|
||||||
|
# 创建接口模式单选按钮
|
||||||
|
self.api_mode_radio = QRadioButton("接口模式")
|
||||||
|
self.api_mode_radio.setFont(self.normal_font)
|
||||||
|
self.mode_button_group.addButton(self.api_mode_radio, 2)
|
||||||
|
|
||||||
|
# 添加单选按钮到布局
|
||||||
|
self.mode_layout.addWidget(QLabel("选择运行模式:"))
|
||||||
|
self.mode_layout.addWidget(self.standalone_mode_radio)
|
||||||
|
self.mode_layout.addWidget(self.api_mode_radio)
|
||||||
|
self.mode_layout.addStretch(1)
|
||||||
|
|
||||||
|
self.mode_group.setLayout(self.mode_layout)
|
||||||
|
self.database_layout.addWidget(self.mode_group)
|
||||||
|
|
||||||
# 数据库连接设置
|
# 数据库连接设置
|
||||||
self.db_conn_group = QGroupBox("连接设置")
|
self.db_conn_group = QGroupBox("连接设置")
|
||||||
self.db_conn_group.setFont(self.normal_font)
|
self.db_conn_group.setFont(self.normal_font)
|
||||||
|
|||||||
56
utils/app_mode.py
Normal file
56
utils/app_mode.py
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import logging
|
||||||
|
from utils.config_loader import ConfigLoader
|
||||||
|
|
||||||
|
class AppMode:
|
||||||
|
"""
|
||||||
|
应用运行模式工具类,用于判断当前系统是单机模式还是接口模式
|
||||||
|
"""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_mode():
|
||||||
|
"""
|
||||||
|
获取当前应用运行模式
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 'standalone'(单机模式) 或 'api'(接口模式)
|
||||||
|
"""
|
||||||
|
config_loader = ConfigLoader.get_instance()
|
||||||
|
return config_loader.get_app_mode()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def set_mode(mode):
|
||||||
|
"""
|
||||||
|
设置应用运行模式
|
||||||
|
|
||||||
|
Args:
|
||||||
|
mode: 'standalone'(单机模式) 或 'api'(接口模式)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: 是否设置成功
|
||||||
|
"""
|
||||||
|
config_loader = ConfigLoader.get_instance()
|
||||||
|
result = config_loader.set_app_mode(mode)
|
||||||
|
logging.info(f"应用运行模式已设置为: {mode}")
|
||||||
|
return result
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def is_standalone():
|
||||||
|
"""
|
||||||
|
检查是否为单机模式
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True表示单机模式,False表示接口模式
|
||||||
|
"""
|
||||||
|
config_loader = ConfigLoader.get_instance()
|
||||||
|
return config_loader.is_standalone_mode()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def is_api():
|
||||||
|
"""
|
||||||
|
检查是否为接口模式
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True表示接口模式,False表示单机模式
|
||||||
|
"""
|
||||||
|
config_loader = ConfigLoader.get_instance()
|
||||||
|
return config_loader.is_api_mode()
|
||||||
@ -45,7 +45,8 @@ class ConfigLoader:
|
|||||||
"enable_serial_ports": False,
|
"enable_serial_ports": False,
|
||||||
"enable_keyboard_listener": False,
|
"enable_keyboard_listener": False,
|
||||||
"enable_camera": False
|
"enable_camera": False
|
||||||
}
|
},
|
||||||
|
"mode": "standalone" # 默认为单机模式
|
||||||
},
|
},
|
||||||
"database": {
|
"database": {
|
||||||
"current": "sqlite",
|
"current": "sqlite",
|
||||||
@ -104,7 +105,8 @@ class ConfigLoader:
|
|||||||
"enable_serial_ports": False,
|
"enable_serial_ports": False,
|
||||||
"enable_keyboard_listener": False,
|
"enable_keyboard_listener": False,
|
||||||
"enable_camera": False
|
"enable_camera": False
|
||||||
}
|
},
|
||||||
|
"mode": "standalone" # 默认为单机模式
|
||||||
},
|
},
|
||||||
"database": {
|
"database": {
|
||||||
"current": "sqlite",
|
"current": "sqlite",
|
||||||
@ -179,6 +181,12 @@ class ConfigLoader:
|
|||||||
if db_config.get('default') == 'pgsql':
|
if db_config.get('default') == 'pgsql':
|
||||||
db_config['default'] = 'postgresql'
|
db_config['default'] = 'postgresql'
|
||||||
self.save_config()
|
self.save_config()
|
||||||
|
|
||||||
|
# 检查并添加运行模式配置
|
||||||
|
if 'app' in self.config and 'mode' not in self.config['app']:
|
||||||
|
logging.info("添加运行模式配置...")
|
||||||
|
self.config['app']['mode'] = 'standalone'
|
||||||
|
self.save_config()
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"升级配置文件结构失败: {e}")
|
logging.error(f"升级配置文件结构失败: {e}")
|
||||||
@ -240,6 +248,49 @@ class ConfigLoader:
|
|||||||
|
|
||||||
# 保存配置
|
# 保存配置
|
||||||
return self.save_config()
|
return self.save_config()
|
||||||
|
|
||||||
|
def get_app_mode(self):
|
||||||
|
"""
|
||||||
|
获取应用运行模式
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 'standalone'(单机模式) 或 'api'(接口模式)
|
||||||
|
"""
|
||||||
|
return self.get_value('app.mode', 'standalone')
|
||||||
|
|
||||||
|
def set_app_mode(self, mode):
|
||||||
|
"""
|
||||||
|
设置应用运行模式
|
||||||
|
|
||||||
|
Args:
|
||||||
|
mode: 'standalone'(单机模式) 或 'api'(接口模式)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: 是否设置成功
|
||||||
|
"""
|
||||||
|
if mode not in ['standalone', 'api']:
|
||||||
|
logging.error(f"无效的运行模式: {mode},必须是 'standalone' 或 'api'")
|
||||||
|
return False
|
||||||
|
|
||||||
|
return self.set_value('app.mode', mode)
|
||||||
|
|
||||||
|
def is_standalone_mode(self):
|
||||||
|
"""
|
||||||
|
检查是否为单机模式
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True表示单机模式,False表示接口模式
|
||||||
|
"""
|
||||||
|
return self.get_app_mode() == 'standalone'
|
||||||
|
|
||||||
|
def is_api_mode(self):
|
||||||
|
"""
|
||||||
|
检查是否为接口模式
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True表示接口模式,False表示单机模式
|
||||||
|
"""
|
||||||
|
return self.get_app_mode() == 'api'
|
||||||
|
|
||||||
def get_config(self, key):
|
def get_config(self, key):
|
||||||
"""
|
"""
|
||||||
@ -249,51 +300,44 @@ class ConfigLoader:
|
|||||||
key: 配置键,例如'mdz', 'cz'等
|
key: 配置键,例如'mdz', 'cz'等
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
dict: 配置值,未找到则返回None
|
dict: 配置数据
|
||||||
"""
|
"""
|
||||||
if 'serial' not in self.config:
|
serial_config = self.config.get('serial', {})
|
||||||
self.config['serial'] = {}
|
return serial_config.get(key, {})
|
||||||
|
|
||||||
if key not in self.config['serial']:
|
|
||||||
return None
|
|
||||||
|
|
||||||
return self.config['serial'][key]
|
|
||||||
|
|
||||||
def set_config(self, key, config_data):
|
def set_config(self, key, config_data):
|
||||||
"""
|
"""
|
||||||
设置serial配置下的指定配置
|
设置serial配置下的指定配置
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
key: 配置键,例如'mdz', 'cz'等
|
key: 配置键,例如'mdz', 'cz'等
|
||||||
config_data: 要设置的配置数据
|
config_data: 配置数据
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
bool: 是否设置成功
|
bool: 是否设置成功
|
||||||
"""
|
"""
|
||||||
if 'serial' not in self.config:
|
if 'serial' not in self.config:
|
||||||
self.config['serial'] = {}
|
self.config['serial'] = {}
|
||||||
|
|
||||||
self.config['serial'][key] = config_data
|
|
||||||
# 这里不保存配置,等待调用save_config方法时一并保存
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
self.config['serial'][key] = config_data
|
||||||
|
return self.save_config()
|
||||||
|
|
||||||
def get_database_config(self, db_type=None):
|
def get_database_config(self, db_type=None):
|
||||||
"""
|
"""
|
||||||
获取指定类型的数据库配置
|
获取数据库配置
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
db_type: 数据库类型,如'sqlite', 'postgresql', 'mysql'等,不指定则使用默认配置
|
db_type: 数据库类型,如果为None则返回当前使用的数据库配置
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
dict: 数据库配置
|
dict: 数据库配置
|
||||||
"""
|
"""
|
||||||
# 如果未指定数据库类型,使用当前设置的类型
|
db_config = self.config.get('database', {})
|
||||||
|
db_sources = db_config.get('sources', {})
|
||||||
|
|
||||||
|
# 如果未指定数据库类型,则使用当前配置的数据库类型
|
||||||
if db_type is None:
|
if db_type is None:
|
||||||
db_type = self.get_value('database.default', 'sqlite')
|
db_type = db_config.get('current', 'sqlite')
|
||||||
|
|
||||||
# 处理pgsql和postgresql兼容
|
# 返回指定类型的数据库配置
|
||||||
if db_type == 'pgsql':
|
return db_sources.get(db_type, {})
|
||||||
db_type = 'postgresql'
|
|
||||||
|
|
||||||
# 获取数据库配置
|
|
||||||
return self.get_value(f'database.sources.{db_type}', {})
|
|
||||||
@ -1,4 +1,5 @@
|
|||||||
from PySide6.QtWidgets import QMessageBox, QVBoxLayout
|
from PySide6.QtWidgets import QMessageBox, QVBoxLayout
|
||||||
|
from PySide6.QtCore import Qt
|
||||||
import logging
|
import logging
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
@ -7,6 +8,7 @@ from utils.sql_utils import SQLUtils
|
|||||||
from widgets.inspection_settings_widget import InspectionSettingsWidget
|
from widgets.inspection_settings_widget import InspectionSettingsWidget
|
||||||
from widgets.pallet_type_settings_widget import PalletTypeSettingsWidget
|
from widgets.pallet_type_settings_widget import PalletTypeSettingsWidget
|
||||||
from utils.config_loader import ConfigLoader
|
from utils.config_loader import ConfigLoader
|
||||||
|
from utils.app_mode import AppMode
|
||||||
|
|
||||||
class SettingsWidget(SettingsUI):
|
class SettingsWidget(SettingsUI):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
@ -64,6 +66,9 @@ class SettingsWidget(SettingsUI):
|
|||||||
# 初始化数据库类型UI状态
|
# 初始化数据库类型UI状态
|
||||||
self.load_db_config()
|
self.load_db_config()
|
||||||
|
|
||||||
|
# 初始化运行模式状态
|
||||||
|
self.load_app_mode()
|
||||||
|
|
||||||
logging.info("SettingsWidget初始化完成")
|
logging.info("SettingsWidget初始化完成")
|
||||||
|
|
||||||
def connect_signals(self):
|
def connect_signals(self):
|
||||||
@ -86,6 +91,43 @@ class SettingsWidget(SettingsUI):
|
|||||||
# 返回按钮
|
# 返回按钮
|
||||||
if hasattr(self, 'back_button'):
|
if hasattr(self, 'back_button'):
|
||||||
self.back_button.clicked.connect(self.back_to_main)
|
self.back_button.clicked.connect(self.back_to_main)
|
||||||
|
|
||||||
|
# 运行模式单选按钮
|
||||||
|
self.standalone_mode_radio.toggled.connect(self.on_app_mode_changed)
|
||||||
|
self.api_mode_radio.toggled.connect(self.on_app_mode_changed)
|
||||||
|
|
||||||
|
def load_app_mode(self):
|
||||||
|
"""加载应用运行模式设置"""
|
||||||
|
try:
|
||||||
|
# 获取当前运行模式
|
||||||
|
current_mode = AppMode.get_mode()
|
||||||
|
|
||||||
|
# 设置对应的单选按钮
|
||||||
|
if current_mode == 'api':
|
||||||
|
self.api_mode_radio.setChecked(True)
|
||||||
|
else: # 默认为standalone
|
||||||
|
self.standalone_mode_radio.setChecked(True)
|
||||||
|
|
||||||
|
logging.info(f"已加载应用运行模式: {current_mode}")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"加载应用运行模式失败: {e}")
|
||||||
|
# 默认选择单机模式
|
||||||
|
self.standalone_mode_radio.setChecked(True)
|
||||||
|
|
||||||
|
def on_app_mode_changed(self, checked):
|
||||||
|
"""处理运行模式变更"""
|
||||||
|
if not checked: # 忽略未选中状态的信号
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
if self.standalone_mode_radio.isChecked():
|
||||||
|
AppMode.set_mode('standalone')
|
||||||
|
logging.info("已将应用运行模式设置为: 单机模式")
|
||||||
|
elif self.api_mode_radio.isChecked():
|
||||||
|
AppMode.set_mode('api')
|
||||||
|
logging.info("已将应用运行模式设置为: 接口模式")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"设置应用运行模式失败: {e}")
|
||||||
|
|
||||||
def load_db_config(self):
|
def load_db_config(self):
|
||||||
"""加载数据库配置"""
|
"""加载数据库配置"""
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user