|
@@ -303,6 +303,10 @@ class MainWindow(QMainWindow):
|
|
|
self.is_processing_scan = False # 是否正在处理扫码任务
|
|
self.is_processing_scan = False # 是否正在处理扫码任务
|
|
|
self.scan_timer = QTimer() # 定时器用于间隔执行
|
|
self.scan_timer = QTimer() # 定时器用于间隔执行
|
|
|
self.scan_timer.timeout.connect(self.process_next_scan)
|
|
self.scan_timer.timeout.connect(self.process_next_scan)
|
|
|
|
|
+ self.current_scan_plate = None # 当前等待发送2001的车牌
|
|
|
|
|
+ self.wait_timeout_timer = QTimer() # 等待超时定时器
|
|
|
|
|
+ self.wait_timeout_timer.setSingleShot(True) # 单次触发
|
|
|
|
|
+ self.wait_timeout_timer.timeout.connect(self.on_wait_timeout)
|
|
|
|
|
|
|
|
# WebSocket相关
|
|
# WebSocket相关
|
|
|
self.ws_client = None
|
|
self.ws_client = None
|
|
@@ -608,11 +612,19 @@ class MainWindow(QMainWindow):
|
|
|
# 外部WebSocket发来的开车命令
|
|
# 外部WebSocket发来的开车命令
|
|
|
car_plate = data.get('value', '')
|
|
car_plate = data.get('value', '')
|
|
|
if car_plate:
|
|
if car_plate:
|
|
|
- self.add_log(f"📤 收到外部WebSocket开车命令,车辆: {car_plate}")
|
|
|
|
|
- # 发送2001指令
|
|
|
|
|
- self.send_cmd_to_vehicle(car_plate, "2001")
|
|
|
|
|
- # 继续处理下一辆车
|
|
|
|
|
- self.process_next_scan()
|
|
|
|
|
|
|
+ # 检查是否是当前等待的车牌
|
|
|
|
|
+ if car_plate == self.current_scan_plate:
|
|
|
|
|
+ self.add_log(f"📤 收到外部WebSocket开车命令,车辆: {car_plate}")
|
|
|
|
|
+ # 停止超时定时器
|
|
|
|
|
+ self.wait_timeout_timer.stop()
|
|
|
|
|
+ # 发送2001指令
|
|
|
|
|
+ self.send_cmd_to_vehicle(car_plate, "2001")
|
|
|
|
|
+ # 清空当前车牌
|
|
|
|
|
+ self.current_scan_plate = None
|
|
|
|
|
+ # 继续处理下一辆车
|
|
|
|
|
+ self.process_next_scan()
|
|
|
|
|
+ else:
|
|
|
|
|
+ self.add_log(f"⚠️ 收到开车命令但车辆 {car_plate} 不在等待列表中(当前等待: {self.current_scan_plate})")
|
|
|
else:
|
|
else:
|
|
|
self.add_log(f"⚠️ 收到开车命令但车牌为空")
|
|
self.add_log(f"⚠️ 收到开车命令但车牌为空")
|
|
|
|
|
|
|
@@ -640,6 +652,8 @@ class MainWindow(QMainWindow):
|
|
|
# 初始化队列
|
|
# 初始化队列
|
|
|
self.scan_task_queue = scan_vehicles.copy()
|
|
self.scan_task_queue = scan_vehicles.copy()
|
|
|
self.is_processing_scan = True
|
|
self.is_processing_scan = True
|
|
|
|
|
+ self.current_scan_plate = None
|
|
|
|
|
+ self.wait_timeout_timer.stop() # 重置超时定时器
|
|
|
|
|
|
|
|
self.add_log(f"🚀 开始扫码任务,共 {len(scan_vehicles)} 辆车")
|
|
self.add_log(f"🚀 开始扫码任务,共 {len(scan_vehicles)} 辆车")
|
|
|
self.add_log(f"📋 车辆列表: {', '.join(scan_vehicles)}")
|
|
self.add_log(f"📋 车辆列表: {', '.join(scan_vehicles)}")
|
|
@@ -656,6 +670,7 @@ class MainWindow(QMainWindow):
|
|
|
self.scan_task_queue = []
|
|
self.scan_task_queue = []
|
|
|
self.current_scan_plate = None
|
|
self.current_scan_plate = None
|
|
|
self.scan_timer.stop()
|
|
self.scan_timer.stop()
|
|
|
|
|
+ self.wait_timeout_timer.stop()
|
|
|
return
|
|
return
|
|
|
|
|
|
|
|
if not self.scan_task_queue:
|
|
if not self.scan_task_queue:
|
|
@@ -665,6 +680,7 @@ class MainWindow(QMainWindow):
|
|
|
self.statusBar().showMessage("扫码任务全部完成")
|
|
self.statusBar().showMessage("扫码任务全部完成")
|
|
|
self.scan_timer.stop()
|
|
self.scan_timer.stop()
|
|
|
self.current_scan_plate = None
|
|
self.current_scan_plate = None
|
|
|
|
|
+ self.wait_timeout_timer.stop()
|
|
|
return
|
|
return
|
|
|
|
|
|
|
|
# 取出第一个车辆
|
|
# 取出第一个车辆
|
|
@@ -675,18 +691,40 @@ class MainWindow(QMainWindow):
|
|
|
# 执行测试发车(标记为来自扫码任务)
|
|
# 执行测试发车(标记为来自扫码任务)
|
|
|
self.on_test_drive(car_plate, from_scan=True)
|
|
self.on_test_drive(car_plate, from_scan=True)
|
|
|
|
|
|
|
|
- # 启动定时器,1分钟后发送指令2001,然后处理下一辆
|
|
|
|
|
- # 使用 QTimer.singleShot 单次定时器,传入当前车牌
|
|
|
|
|
- self.add_log(f"⏳ 等待外部WebSocket通知发送2001指令到: {car_plate}")
|
|
|
|
|
|
|
+ # 等待外部WebSocket通知发送2001指令
|
|
|
|
|
+ self.add_log(f"⏳ 等待外部WebSocket通知发送2001指令到: {car_plate},超时时间2分钟")
|
|
|
|
|
+
|
|
|
|
|
+ # 启动超时定时器(2分钟)
|
|
|
|
|
+ self.wait_timeout_timer.start(120000) # 2分钟 = 120000毫秒
|
|
|
|
|
|
|
|
- def send_2001_and_next(self, car_plate):
|
|
|
|
|
- """发送2001指令给指定车辆,然后继续处理下一个"""
|
|
|
|
|
- self.add_log(f"📤 发送指令 2001 到车辆: {car_plate}")
|
|
|
|
|
- self.send_cmd_to_vehicle(car_plate, "2001")
|
|
|
|
|
|
|
+ def on_wait_timeout(self):
|
|
|
|
|
+ """等待超时处理"""
|
|
|
|
|
+ if not self.current_scan_plate:
|
|
|
|
|
+ return
|
|
|
|
|
|
|
|
- # 发送完指令后,继续处理下一辆(立即执行,不再等待)
|
|
|
|
|
|
|
+ car_plate = self.current_scan_plate
|
|
|
|
|
+ self.add_log(f"⏰ 等待超时(2分钟),未收到 {car_plate} 的WebSocket通知")
|
|
|
|
|
+
|
|
|
|
|
+ # 取消该车辆的扫码勾选
|
|
|
|
|
+ for row in range(self.table.rowCount()):
|
|
|
|
|
+ plate_item = self.table.item(row, 3)
|
|
|
|
|
+ if plate_item and plate_item.text() == car_plate:
|
|
|
|
|
+ scan_checkbox = self.table.cellWidget(row, 1)
|
|
|
|
|
+ if scan_checkbox:
|
|
|
|
|
+ scan_checkbox.setChecked(False)
|
|
|
|
|
+ self.car_scan_state[car_plate] = False
|
|
|
|
|
+ self.add_log(f"❌ 已取消 {car_plate} 的扫码勾选(超时)")
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
|
|
+ # 清空当前车牌
|
|
|
|
|
+ self.current_scan_plate = None
|
|
|
|
|
+
|
|
|
|
|
+ # 继续处理下一辆
|
|
|
|
|
+ self.add_log(f"⏭️ 继续处理下一辆车...")
|
|
|
self.process_next_scan()
|
|
self.process_next_scan()
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
def check_scan_complete(self):
|
|
def check_scan_complete(self):
|
|
|
"""检查扫码任务是否完成"""
|
|
"""检查扫码任务是否完成"""
|
|
|
if not self.scan_task_queue and self.is_processing_scan:
|
|
if not self.scan_task_queue and self.is_processing_scan:
|
|
@@ -1141,6 +1179,7 @@ class MainWindow(QMainWindow):
|
|
|
|
|
|
|
|
# 停止扫码任务
|
|
# 停止扫码任务
|
|
|
self.scan_timer.stop()
|
|
self.scan_timer.stop()
|
|
|
|
|
+ self.wait_timeout_timer.stop() # 停止超时定时器
|
|
|
self.is_processing_scan = False
|
|
self.is_processing_scan = False
|
|
|
self.scan_task_queue = []
|
|
self.scan_task_queue = []
|
|
|
self.current_scan_plate = None
|
|
self.current_scan_plate = None
|