From 668700353f4c20eca45a157ef2eff13462e19d90 Mon Sep 17 00:00:00 2001 From: zhu-mengmeng <15588200382@163.com> Date: Sat, 19 Jul 2025 17:20:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=A1=AE=E4=BF=9D=E6=89=AB=E7=A0=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=B0=B8=E8=BF=9C=E5=9C=A8=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E4=B8=80=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/app_config.json | 2 +- db/jtDB.db | Bin 192512 -> 192512 bytes widgets/main_window.py | 73 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/config/app_config.json b/config/app_config.json index 36bc314..47f9e76 100644 --- a/config/app_config.json +++ b/config/app_config.json @@ -8,7 +8,7 @@ "enable_camera": false }, "base_url": "http://localhost:8085", - "mode": "api" + "mode": "standalone" }, "apis": { "get_tray_info": "/apjt/xcsc/tpda/getByTp_note/", diff --git a/db/jtDB.db b/db/jtDB.db index f4c7d20d93c73dc0a1f938b8a3da925df0141684..2f9433f45e2eb82b4c2428e2b2ab57f9fbd51405 100644 GIT binary patch delta 13266 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 IcTFMw|F3uaApigX diff --git a/widgets/main_window.py b/widgets/main_window.py index 169af08..75532b6 100644 --- a/widgets/main_window.py +++ b/widgets/main_window.py @@ -942,6 +942,44 @@ class MainWindow(MainWindowUI): else: logging.warning("工程号为空") QMessageBox.warning(self, "输入提示", "请输入有效的工程号") + + def test_rapid_scanning(self): + """测试快速连续扫码的场景,确保最新扫码的工程号始终在最后""" + logging.info("开始测试快速连续扫码场景") + + # 模拟扫码工程号A + logging.info("模拟扫码工程号A") + self.order_edit.setText("A") + self.handle_order_enter() + + # 等待一小段时间 + QTimer.singleShot(100, lambda: self._test_scan_b()) + + def _test_scan_b(self): + """测试扫码工程号B""" + logging.info("模拟扫码工程号B") + self.order_edit.setText("B") + self.handle_order_enter() + + # 等待一小段时间后检查结果 + QTimer.singleShot(200, self._check_test_result) + + def _check_test_result(self): + """检查测试结果""" + logging.info("检查快速连续扫码测试结果") + total_rows = self.process_table.rowCount() + if total_rows > 2: + last_gc_note = self.process_table.item(total_rows - 1, 1) + if last_gc_note: + logging.info(f"最后一行的工程号: {last_gc_note.text()}") + if last_gc_note.text() == "B": + logging.info("✅ 测试通过:最新扫码的工程号B正确显示在最后") + else: + logging.error("❌ 测试失败:最新扫码的工程号B没有显示在最后") + else: + logging.error("❌ 测试失败:无法获取最后一行的工程号") + else: + logging.error("❌ 测试失败:表格中没有数据行") def add_new_inspection_row(self, gc_note, order_code): """在微丝产线表格中添加一条新记录,添加到表格末尾 @@ -950,6 +988,12 @@ class MainWindow(MainWindowUI): gc_note: 工程号 order_info: 从接口获取的工程号信息 """ + # 设置当前正在处理的工程号,确保它在重新加载时显示在最后 + self._current_gc_note = gc_note + # 记录添加时间,用于确保最新添加的工程号在最后 + self._current_gc_note_timestamp = time.time() + logging.info(f"设置最新扫码的工程号: {gc_note}, 时间戳: {self._current_gc_note_timestamp}") + try: # 获取启用的检验配置 enabled_configs = self.inspection_manager.get_enabled_configs() @@ -1091,6 +1135,9 @@ class MainWindow(MainWindowUI): finally: # 重新加载数据,确保UI显示正确 self._safe_load_data() + # 清除当前工程号标记和时间戳 + self._current_gc_note = None + self._current_gc_note_timestamp = None def limit_table_rows(self, max_rows): """限制表格最大行数 @@ -1354,9 +1401,29 @@ class MainWindow(MainWindowUI): row_idx = 2 # 使用DAO方法按创建时间排序工程号,确保FIFO顺序(最早创建的在最前面) + # 但是新添加的工程号应该始终显示在最后 from dao.inspection_dao import InspectionDAO inspection_dao = InspectionDAO() + + # 获取当前正在处理的工程号(如果有的话) + current_gc_note = getattr(self, '_current_gc_note', None) + current_timestamp = getattr(self, '_current_gc_note_timestamp', None) + + # 按创建时间排序,但确保新添加的工程号在最后 sorted_gc_notes = inspection_dao.get_orders_by_create_time(list(orders_data.keys())) + logging.info(f"按创建时间排序后的工程号列表: {sorted_gc_notes}") + + # 如果当前有正在处理的工程号,确保它在最后 + if current_gc_note and current_gc_note in sorted_gc_notes: + # 将当前工程号移到列表末尾 + sorted_gc_notes.remove(current_gc_note) + sorted_gc_notes.append(current_gc_note) + logging.info(f"将最新扫码的工程号 {current_gc_note} (时间戳: {current_timestamp}) 移到列表末尾,确保显示在最后") + logging.info(f"调整后的工程号列表: {sorted_gc_notes}") + elif current_gc_note: + logging.info(f"当前正在处理的工程号 {current_gc_note} 不在数据库记录中,可能是新添加的") + else: + logging.info("没有当前正在处理的工程号") for gc_note in sorted_gc_notes: items = orders_data[gc_note] @@ -3251,7 +3318,11 @@ class MainWindow(MainWindowUI): if self.process_table.rowCount() <= 2: # 只有表头行 order_id = self.order_edit.text().strip() if order_id: - self.add_new_inspection_row(order_id) + # 设置当前正在处理的工程号,确保它在重新加载时显示在最后 + self._current_gc_note = order_id + self._current_gc_note_timestamp = time.time() + logging.info(f"在set_inspection_value中设置最新扫码的工程号: {order_id}, 时间戳: {self._current_gc_note_timestamp}") + self.add_new_inspection_row(order_id, self._current_order_code) data_row = 2 # 新添加的行 else: logging.warning("无法添加新行,订单号为空")