diff --git a/agv_app/static/js/running.js b/agv_app/static/js/running.js index 713b62d..b666260 100644 --- a/agv_app/static/js/running.js +++ b/agv_app/static/js/running.js @@ -244,6 +244,18 @@ createApp({ body: JSON.stringify({ qr: 'SKIP' }) }) }, + async rescanQr() { + this.showQrModal = false + this.qrValue = '' + this.qrSubmitting = true + await fetch(API + '/api/mission/manual-qr', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ qr: 'RESCAN' }) + }) + // 4秒后允许弹窗重新出现(后端重试扫码约3秒) + setTimeout(() => { this.qrSubmitting = false }, 4000) + }, onAgvPreviewError(e) { e.target.style.display = 'none' }, diff --git a/agv_app/templates/running.html b/agv_app/templates/running.html index 29a200c..1252be8 100644 --- a/agv_app/templates/running.html +++ b/agv_app/templates/running.html @@ -204,6 +204,7 @@

所有姿态均未识别到二维码,请手动输入:

@@ -239,6 +240,6 @@ - + \ No newline at end of file diff --git a/agv_app/utils/mission_executor.py b/agv_app/utils/mission_executor.py index 805002b..1fd8858 100644 --- a/agv_app/utils/mission_executor.py +++ b/agv_app/utils/mission_executor.py @@ -738,22 +738,35 @@ class MissionExecutorV3: return None def _request_manual_qr(self) -> Optional[str]: - """暂停任务,等待手动输入(不超时,必须输入才能继续;stop 时解除)""" - self.status = MissionStatus.WAITING_QR - self.report["status"] = "waiting_qr" - self.report["step"] = "等待手动输入二维码" - self._log(" ⌨️ 弹窗等待手动输入二维码(不可跳过)...") + """暂停任务,等待手动输入(支持重新扫描)""" + while True: + self.status = MissionStatus.WAITING_QR + self.report["status"] = "waiting_qr" + self.report["step"] = "等待手动输入二维码" + self._log(" ⌨️ 弹窗等待手动输入二维码...") - self._qr_event.clear() - self._qr_event.wait() # 无限等待,直到 set_manual_qr 或 stop() 触发 - self.status = MissionStatus.RUNNING - self.report["status"] = "running" - if self._qr_value: - self._log(f" ✏️ 手动输入: {self._qr_value}") - return self._qr_value - else: - self._log(f" ⚠️ 任务已停止") - return None + self._qr_event.clear() + self._qr_event.wait() # 无限等待,直到 set_manual_qr 或 stop() 触发 + + if self._qr_value == 'RESCAN': + self.status = MissionStatus.RUNNING + self.report["status"] = "running" + self._log(" 🔄 用户点击重新扫描,重试...") + qr = self._decode_qr_from_arm() + if qr: + self._log(f" ✅ 重新扫描成功: {qr}") + return qr + self._log(" ❌ 重新扫描仍未识别到二维码") + continue # 继续弹窗 + + self.status = MissionStatus.RUNNING + self.report["status"] = "running" + if self._qr_value: + self._log(f" ✏️ 手动输入: {self._qr_value}") + return self._qr_value + else: + self._log(f" ⚠️ 任务已停止") + return None def set_manual_qr(self, value: str): self._qr_value = value.strip()