add(更新opcua客户端、振捣频率按钮、管片任务数据刷新)

This commit is contained in:
2026-01-16 18:37:21 +08:00
parent 360cb13b73
commit 88dfc53b9d
13 changed files with 567 additions and 234 deletions

View File

@ -11,6 +11,7 @@ from .widgets.mixer_widget import MixerWidget
from .widgets.conveyor_system_widget import ConveyorSystemWidget
from .widgets.task_widget import TaskWidget
from .widgets.plan_widget import PlanWidget
from .widgets.frequency_button_group import FrequencyButtonGroup
from .widgets.hopper_widget import HopperWidget
from .widgets.arc_progress_widget import ArcProgressWidget
from .widgets.production_progress_widget import ProductionProgressWidget
@ -24,6 +25,8 @@ from utils.image_paths import ImagePaths
from .widgets.segment_details_dialog import SegmentDetailsDialog
from .widgets.dispatch_details_dialog import DispatchDetailsDialog
from busisness.models import ArtifactInfoModel
class MainWindow(QWidget):
# 定义“即将关闭”的信号
@ -37,6 +40,11 @@ class MainWindow(QWidget):
self.setupLayout() # 设置布局
self.connectSignalToSlot()
# 保存管片任务信息的字典 task1: ArtifactInfoModel1.... (用于显示管片任务详情)
self.artifact_dict = {}
# 当前点击/选中的 管片任务详情对应的任务名(task1\task2\task3) (用于刷新选中的管片任务详情)
self.current_selected_segment_detail_name = None
# 安装事件过滤器,处理计划方量的 QLineEdit的失去焦点事件
self.installEventFilter(self)
@ -102,10 +110,11 @@ class MainWindow(QWidget):
self.conveyor_system_widget = ConveyorSystemWidget(self) # 左侧: 传送带系统
self.segment_task_widget = TaskWidget("管片任务", self) # 左侧:管片任务
self.dispatch_task_widget = TaskWidget("派单任务", self) # 右侧:派单任务
self.frequency_button_group = FrequencyButtonGroup(self) # 右侧:振捣频率按钮组(220hz/230hz/240hz)
self.plan_table_widget = PlanWidget(self) # 右侧: 计划表单
# self.status_monitor = StatusMonitorWidget() # 状态监控部件
self.hopper_widget = HopperWidget() # 中间1料斗部件
self.arc_progress = ArcProgressWidget() # 中间2弧形进度部件
self.arc_progress = ArcProgressWidget() # 中间2弧形进度部件 (模具车)
self.production_progress = ProductionProgressWidget() # 中间3: 生产进度部件
# self.system_button_widget = SystemButtonWidget() # 系统控制按钮
self.vibration_video = VibrationVideoWidget() # 振捣视频控件 (右侧)
@ -113,17 +122,15 @@ class MainWindow(QWidget):
def initSubWidgets(self):
# 初始化派单任务的 任务id
self.dispatch_task_widget.set_task_id("task1", "PD0001")
self.dispatch_task_widget.set_task_id("task2", "PD0002")
self.dispatch_task_widget.set_task_id("task3", "PD0003")
# self.dispatch_task_widget.set_task_id("task1", "PD0001")
# self.dispatch_task_widget.set_task_id("task2", "PD0002")
# self.dispatch_task_widget.set_task_id("task3", "PD0003")
# 初始化 管片任务 和 派单任务显示的数据
self.update_segment_tasks()
self.update_dispatch_tasks()
# self._init_segment_tasks()
self._init_dispatch_tasks()
def update_segment_tasks(self):
"""从数据库中读取管片任务数据并更新到UI"""
def convert_to_ampm(time_str: str) -> str:
def convert_to_ampm(self, time_str: str) -> str:
"""
将时间转换为"hh:mmAM/PM"形式(如03:22PM)
Args:
@ -148,24 +155,27 @@ class MainWindow(QWidget):
# 所有格式都不匹配时,返回占位符
return "--:--"
def _init_segment_tasks(self):
"""从数据库中读取管片任务数据并更新到UI"""
try:
from busisness.blls import ArtifactBll
artifact_dal = ArtifactBll()
artifacts = artifact_dal.get_artifact_task() # 获取管片任务数据
# 遍历数据并更新UI
for i, artifact in enumerate(artifacts):
# 更新任务ID和方量到管片任务
self.segment_task_widget.set_task_id(f"task{i + 1}", artifact.MouldCode)
self.segment_task_widget.set_task_volume(f"task{i + 1}", artifact.BetonVolume)
if artifact.BeginTime: # 更新时间
for i, artifact in enumerate(artifacts, 1):
if artifact.MouldCode: # 更新模具号
self.segment_task_widget.set_task_id(f"task{i}", artifact.MouldCode)
if artifact.BetonVolume: # 更新方量
self.segment_task_widget.set_task_volume(f"task{i}", artifact.BetonVolume)
if artifact.BeginTime: # 更新时间 (管片任务的开始时间)
# print("artifact.BeginTime: ", artifact.BeginTime)
self.segment_task_widget.set_task_time(f"task{i + 1}", convert_to_ampm(artifact.BeginTime))
self.segment_task_widget.set_task_time(f"task{i}", self.convert_to_ampm(artifact.BeginTime))
self.SetSegmentTaskDetails(f"task{i}", artifact) # 设置管片任务详情信息
except Exception as e:
print(f"更新管片任务数据失败: {e}")
def update_dispatch_tasks(self):
def _init_dispatch_tasks(self):
"""从数据库中读取派单任务数据并更新到UI"""
try:
from busisness.blls import PDRecordBll
@ -173,9 +183,13 @@ class MainWindow(QWidget):
pdrecords = pdrecord_dal.get_PD_record() # 获取派单任务数据
# 遍历数据并更新UI
for i, record in enumerate(pdrecords):
# 更新方量到派单任务widget
self.dispatch_task_widget.set_task_volume(f"task{i + 1}", record.BetonVolume)
for i, record in enumerate(pdrecords, 1):
if record.MouldCode: # 更新模具号
self.dispatch_task_widget.set_task_id(f"task{i}", record.MouldCode)
if record.BetonVolume: # 更新方量
self.dispatch_task_widget.set_task_volume(f"task{i}", record.BetonVolume)
if record.CreateTime: # 更新时间 (派单任务的创建时间)
self.dispatch_task_widget.set_task_time(f"task{i}", self.convert_to_ampm(record.CreateTime))
except Exception as e:
print(f"更新派单任务数据失败: {e}")
@ -199,6 +213,7 @@ class MainWindow(QWidget):
# self.dispatch_task_widget.move(629, 384)
self.update_dispatch_task_position() # 更新派单任务坐标
self.update_plan_table_position() # 更新计划表单坐标
self.update_frequency_button_group_position() # 更新振捣频率选择按钮坐标
# 中间的垂直子布局
sub_v_layout = QVBoxLayout()
@ -273,13 +288,37 @@ class MainWindow(QWidget):
def handleSegmentTaskDetails(self, segment_task_name:str):
# 管片任务名 task1、task2、task3 (分别对应第一条管片任务、 第二条管片任务...)
print("main_window: handleSegmentTaskDetails", segment_task_name)
# print("main_window: handleSegmentTaskDetails", segment_task_name)
if not hasattr(self, "segment_details_dialog"):
self.segment_details_dialog = SegmentDetailsDialog(self)
artifact_info:ArtifactInfoModel = self.artifact_dict.get(segment_task_name)
# 更新管片任务详情按钮弹窗的显示
self.updateSegmentTaskDetailsDialog(artifact_info)
# 显示管片任务详情对话框
segment_details_dialog = SegmentDetailsDialog(self)
# 这里可以设置对话框显示的内容 如 set_segment_id
# segment_details_dialog.set_segment_id("9999999999")
segment_details_dialog.show()
self.segment_details_dialog.show()
# 更新选中的管片任务详情对应的任务名
self.current_selected_segment_detail_name = segment_task_name
def updateSegmentTaskDetailsDialog(self, artifact_info:ArtifactInfoModel):
if artifact_info and hasattr(self, "segment_details_dialog"):
# 这里设置管片详情对话框显示的内容 如 set_segment_id
self.segment_details_dialog.set_segment_id(artifact_info.ArtifactActionID) # 管片ID
# 设置管片详情界面的左边一列
self.segment_details_dialog.set_left_value(0, artifact_info.ArtifactID) # 管片编号
self.segment_details_dialog.set_left_value(1, artifact_info.ArtifactIDVice1) # 管片副标识
self.segment_details_dialog.set_left_value(2, artifact_info.ProduceRingNumber) # 生产环号
self.segment_details_dialog.set_left_value(3, artifact_info.MouldCode) # 模具编号
self.segment_details_dialog.set_left_value(4, artifact_info.SkeletonID) # 骨架编号
self.segment_details_dialog.set_left_value(5, artifact_info.RingTypeCode) # 环类型编号
self.segment_details_dialog.set_left_value(6, artifact_info.SizeSpecification) # 尺寸规格
# 设置管片详情界面的右边一列
self.segment_details_dialog.set_right_value(0, artifact_info.BlockNumber) # 分块号
self.segment_details_dialog.set_right_value(1, artifact_info.HoleRingMarking) # 出洞环标记
self.segment_details_dialog.set_right_value(2, artifact_info.GroutingPipeMarking) # 注浆管标记
self.segment_details_dialog.set_right_value(3, artifact_info.PolypropyleneFiberMarking) # 聚丙烯纤维标记
self.segment_details_dialog.set_right_value(4, artifact_info.BetonVolume) # 浇筑方量
self.segment_details_dialog.set_right_value(5, artifact_info.BetonTaskID) # 任务单号
self.segment_details_dialog.set_right_value(6, artifact_info.BuriedDepth) # 埋深
def handleDispatchTaskDetails(self, dispatch_task_name:str):
# 派单任务名 task1、task2、task3 (分别对应第一条派单任务、 第二条派单任务...)
@ -320,11 +359,17 @@ class MainWindow(QWidget):
# 更新 计划表单widget的坐标
def update_plan_table_position(self):
# 方法1获取料斗控件左上角坐标相对于父控件
arc_pos = self.hopper_widget.pos()
hopper_pos = self.hopper_widget.pos()
# print(f"料斗控件左上角坐标相对父控件x={arc_pos.x()}, y={arc_pos.y()}")
# x+462, y-249
self.plan_table_widget.move(arc_pos.x()+362, arc_pos.y()+40)
self.plan_table_widget.move(hopper_pos.x()+362, hopper_pos.y()+40)
def update_frequency_button_group_position(self):
# 方法1获取模具车控件左上角坐标相对于父控件
arc_pos = self.arc_progress.pos()
self.frequency_button_group.move(arc_pos.x()+572, arc_pos.y() + 125)
def update_background(self):
"""更新主界面背景图片"""
@ -363,6 +408,7 @@ class MainWindow(QWidget):
self.update_background() # 重新加载背景图片
self.update_dispatch_task_position() # 更新 派单任务的坐标
self.update_plan_table_position() # 更新计划表单坐标
self.update_frequency_button_group_position() # 更新振捣频率按钮坐标
def closeEvent(self, e):
"""窗口关闭时的回调"""
@ -375,6 +421,12 @@ class MainWindow(QWidget):
self.close()
super().keyPressEvent(event)
# ======= 设置管片任务详情接口 ==========
# self.artifact_dict 管片信息的字典
def SetSegmentTaskDetails(self, task_name:str, artifact_info:ArtifactInfoModel):
self.artifact_dict[task_name] = artifact_info
if task_name == self.current_selected_segment_detail_name:
self.updateSegmentTaskDetailsDialog(artifact_info) # 刷新管片任务详情按钮弹窗
if __name__ == "__main__":
import sys