243 lines
8.4 KiB
Python
243 lines
8.4 KiB
Python
"""
|
|
消息树形控件
|
|
用于显示和管理消息
|
|
"""
|
|
from PyQt5.QtWidgets import (
|
|
QWidget, QVBoxLayout, QHBoxLayout, QTreeWidget, QTreeWidgetItem,
|
|
QPushButton, QLineEdit, QLabel, QMessageBox, QSplitter,
|
|
QGroupBox, QFormLayout, QTextEdit, QListWidget, QComboBox
|
|
)
|
|
from PyQt5.QtCore import Qt, pyqtSignal
|
|
|
|
from controllers.message_controller import MessageController
|
|
from models.message import Message
|
|
from utils.logger import get_logger
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
class MessageManagementWidget(QWidget):
|
|
"""消息管理控件"""
|
|
|
|
message_selected = pyqtSignal(Message)
|
|
|
|
def __init__(self, controller: MessageController):
|
|
super().__init__()
|
|
self.controller = controller
|
|
self.current_message = None
|
|
|
|
self.init_ui()
|
|
self.load_messages()
|
|
|
|
def init_ui(self):
|
|
"""初始化UI"""
|
|
main_layout = QHBoxLayout(self)
|
|
|
|
# 创建分割器
|
|
splitter = QSplitter(Qt.Horizontal)
|
|
main_layout.addWidget(splitter)
|
|
|
|
# 左侧:树形结构
|
|
left_widget = QWidget()
|
|
left_layout = QVBoxLayout(left_widget)
|
|
|
|
# 搜索区域
|
|
search_layout = QHBoxLayout()
|
|
self.search_input = QLineEdit()
|
|
self.search_input.setPlaceholderText("搜索消息...")
|
|
self.search_btn = QPushButton("搜索")
|
|
self.search_btn.clicked.connect(self.on_search)
|
|
search_layout.addWidget(self.search_input)
|
|
search_layout.addWidget(self.search_btn)
|
|
left_layout.addLayout(search_layout)
|
|
|
|
# 消息树
|
|
self.message_tree = QTreeWidget()
|
|
self.message_tree.setHeaderLabels(["名称", "系统", "类型", "版本"])
|
|
self.message_tree.setColumnWidth(0, 200)
|
|
self.message_tree.itemClicked.connect(self.on_message_clicked)
|
|
left_layout.addWidget(self.message_tree)
|
|
|
|
# 操作按钮
|
|
btn_layout = QHBoxLayout()
|
|
self.add_btn = QPushButton("新建")
|
|
self.add_btn.clicked.connect(self.on_add_message)
|
|
self.edit_btn = QPushButton("编辑")
|
|
self.edit_btn.clicked.connect(self.on_edit_message)
|
|
self.delete_btn = QPushButton("删除")
|
|
self.delete_btn.clicked.connect(self.on_delete_message)
|
|
self.refresh_btn = QPushButton("刷新")
|
|
self.refresh_btn.clicked.connect(self.load_messages)
|
|
|
|
btn_layout.addWidget(self.add_btn)
|
|
btn_layout.addWidget(self.edit_btn)
|
|
btn_layout.addWidget(self.delete_btn)
|
|
btn_layout.addWidget(self.refresh_btn)
|
|
btn_layout.addStretch()
|
|
|
|
left_layout.addLayout(btn_layout)
|
|
|
|
# 右侧:消息详情
|
|
right_widget = QWidget()
|
|
right_layout = QVBoxLayout(right_widget)
|
|
|
|
detail_group = QGroupBox("消息详情")
|
|
detail_layout = QVBoxLayout(detail_group)
|
|
|
|
# 基本信息
|
|
info_layout = QFormLayout()
|
|
self.full_name_label = QLabel("-")
|
|
self.system_name_label = QLabel("-")
|
|
self.message_type_label = QLabel("-")
|
|
self.version_label = QLabel("-")
|
|
self.protocol_label = QLabel("-")
|
|
self.serialization_label = QLabel("-")
|
|
|
|
info_layout.addRow("完整名称:", self.full_name_label)
|
|
info_layout.addRow("系统名:", self.system_name_label)
|
|
info_layout.addRow("消息类型:", self.message_type_label)
|
|
info_layout.addRow("版本:", self.version_label)
|
|
info_layout.addRow("协议:", self.protocol_label)
|
|
info_layout.addRow("序列化:", self.serialization_label)
|
|
|
|
detail_layout.addLayout(info_layout)
|
|
|
|
# 描述
|
|
desc_label = QLabel("描述:")
|
|
detail_layout.addWidget(desc_label)
|
|
self.description_text = QTextEdit()
|
|
self.description_text.setReadOnly(True)
|
|
self.description_text.setMaximumHeight(80)
|
|
detail_layout.addWidget(self.description_text)
|
|
|
|
# 字段列表
|
|
fields_label = QLabel("包含字段:")
|
|
detail_layout.addWidget(fields_label)
|
|
self.fields_list = QListWidget()
|
|
detail_layout.addWidget(self.fields_list)
|
|
|
|
right_layout.addWidget(detail_group)
|
|
|
|
# 添加到分割器
|
|
splitter.addWidget(left_widget)
|
|
splitter.addWidget(right_widget)
|
|
splitter.setStretchFactor(0, 1)
|
|
splitter.setStretchFactor(1, 1)
|
|
|
|
def load_messages(self):
|
|
"""加载消息列表"""
|
|
self.message_tree.clear()
|
|
|
|
messages, total = self.controller.get_all_messages(page=1, page_size=1000)
|
|
|
|
# 按系统分组
|
|
system_items = {}
|
|
|
|
for message in messages:
|
|
# 获取或创建系统节点
|
|
if message.system_name not in system_items:
|
|
system_item = QTreeWidgetItem(self.message_tree)
|
|
system_item.setText(0, message.system_name)
|
|
system_item.setData(0, Qt.UserRole, None)
|
|
system_items[message.system_name] = system_item
|
|
|
|
# 创建消息节点
|
|
message_item = QTreeWidgetItem(system_items[message.system_name])
|
|
message_item.setText(0, message.full_name)
|
|
message_item.setText(1, message.system_name)
|
|
message_item.setText(2, message.message_type)
|
|
message_item.setText(3, message.version)
|
|
message_item.setData(0, Qt.UserRole, message)
|
|
|
|
self.message_tree.expandAll()
|
|
logger.info(f"Loaded {total} messages")
|
|
|
|
def on_message_clicked(self, item: QTreeWidgetItem, column: int):
|
|
"""消息被点击"""
|
|
message = item.data(0, Qt.UserRole)
|
|
if message:
|
|
self.current_message = message
|
|
self.display_message_details(message)
|
|
self.message_selected.emit(message)
|
|
|
|
def display_message_details(self, message: Message):
|
|
"""显示消息详情"""
|
|
self.full_name_label.setText(message.full_name)
|
|
self.system_name_label.setText(message.system_name)
|
|
self.message_type_label.setText(message.message_type)
|
|
self.version_label.setText(message.version)
|
|
self.protocol_label.setText(message.protocol.value)
|
|
self.serialization_label.setText(message.serialization.value)
|
|
self.description_text.setText(message.description or "")
|
|
|
|
# 显示字段列表
|
|
self.fields_list.clear()
|
|
for field in message.fields:
|
|
self.fields_list.addItem(f"{field.full_name} ({field.type.value})")
|
|
|
|
def on_add_message(self):
|
|
"""新建消息"""
|
|
from ui.dialogs.message_dialog import MessageDialog
|
|
|
|
dialog = MessageDialog(self)
|
|
if dialog.exec_():
|
|
self.load_messages()
|
|
|
|
def on_edit_message(self):
|
|
"""编辑消息"""
|
|
if not self.current_message:
|
|
QMessageBox.warning(self, "警告", "请先选择要编辑的消息")
|
|
return
|
|
|
|
from ui.dialogs.message_dialog import MessageDialog
|
|
|
|
dialog = MessageDialog(self, self.current_message)
|
|
if dialog.exec_():
|
|
self.load_messages()
|
|
|
|
def on_delete_message(self):
|
|
"""删除消息"""
|
|
if not self.current_message:
|
|
QMessageBox.warning(self, "警告", "请先选择要删除的消息")
|
|
return
|
|
|
|
reply = QMessageBox.question(
|
|
self,
|
|
"确认删除",
|
|
f"确定要删除消息 '{self.current_message.full_name}' 吗?",
|
|
QMessageBox.Yes | QMessageBox.No
|
|
)
|
|
|
|
if reply == QMessageBox.Yes:
|
|
success, msg = self.controller.delete_message(self.current_message.id)
|
|
if success:
|
|
QMessageBox.information(self, "成功", msg)
|
|
self.load_messages()
|
|
else:
|
|
QMessageBox.warning(self, "失败", msg)
|
|
|
|
def on_search(self):
|
|
"""搜索消息"""
|
|
search_text = self.search_input.text().strip()
|
|
if not search_text:
|
|
self.load_messages()
|
|
return
|
|
|
|
search_params = {
|
|
'system_name': search_text,
|
|
'page': 1,
|
|
'page_size': 1000
|
|
}
|
|
|
|
messages, total = self.controller.search_messages(search_params)
|
|
|
|
# 更新树形显示
|
|
self.message_tree.clear()
|
|
for message in messages:
|
|
message_item = QTreeWidgetItem(self.message_tree)
|
|
message_item.setText(0, message.full_name)
|
|
message_item.setText(1, message.system_name)
|
|
message_item.setText(2, message.message_type)
|
|
message_item.setText(3, message.version)
|
|
message_item.setData(0, Qt.UserRole, message)
|