From 6f3a7881019d06381934c1e20fb1a017c9de0899 Mon Sep 17 00:00:00 2001 From: mgw <1392924357@qq.com> Date: Thu, 24 Oct 2024 15:32:15 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=B0=86=E6=89=AB=E6=8F=8Frfid=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E5=B9=B6=E5=BC=80=E5=90=AF=E8=A3=85=E5=A4=B9=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E5=86=99=E6=88=90widget=E5=BD=A2=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/__manifest__.py | 2 + sf_manufacturing/static/src/js/qr.js | 115 ++++++++++++++++++ sf_manufacturing/static/src/xml/qr.xml | 12 ++ sf_manufacturing/views/mrp_workorder_view.xml | 7 +- 4 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 sf_manufacturing/static/src/js/qr.js create mode 100644 sf_manufacturing/static/src/xml/qr.xml diff --git a/sf_manufacturing/__manifest__.py b/sf_manufacturing/__manifest__.py index 35501367..71f4027a 100644 --- a/sf_manufacturing/__manifest__.py +++ b/sf_manufacturing/__manifest__.py @@ -45,6 +45,8 @@ 'sf_manufacturing/static/src/scss/kanban_change.scss', 'sf_manufacturing/static/src/xml/button_show_on_tree.xml', 'sf_manufacturing/static/src/js/workpiece_delivery_wizard_confirm.js', + 'sf_manufacturing/static/src/js/qr.js', + 'sf_manufacturing/static/src/xml/qr.xml', ] }, diff --git a/sf_manufacturing/static/src/js/qr.js b/sf_manufacturing/static/src/js/qr.js new file mode 100644 index 00000000..ec148933 --- /dev/null +++ b/sf_manufacturing/static/src/js/qr.js @@ -0,0 +1,115 @@ +/** @odoo-module **/ +import { registry } from '@web/core/registry'; +import { Component } from '@odoo/owl'; + +class QRCodeWidget extends Component { + // 初始化组件 + setup() { + console.log('QRCodeWidget setup'); + this.qrCodeValue = ''; // 初始化为空字符串,用于存储条码 + this.inputBuffer = ''; // 存储临时输入的字符 + this.inputTimer = null; // 定时器 + + // 显式绑定上下文 + this.onGlobalKeyDown = this.onGlobalKeyDown.bind(this); + window.addEventListener('keydown', this.onGlobalKeyDown); + } + + // 清理事件监听器,防止内存泄漏 + willUnmount() { + window.removeEventListener('keydown', this.onGlobalKeyDown); + if (this.inputTimer) { + clearTimeout(this.inputTimer); + } + } + + // 全局键盘事件监听器 + onGlobalKeyDown(event) { + + // 如果是Tab键,表示扫码输入结束 + if (event.key === 'Tab') { + this.qrCodeValue = this.inputBuffer; // 完整条码赋值 + console.log('完整条码:', this.qrCodeValue); + this.onQRCodeChange(this.qrCodeValue); // 调用父组件的 onQRCodeChange 方法 + this.inputBuffer = ''; // 清空临时缓冲区 + event.preventDefault(); // 阻止Tab键的默认行为 + return; + } + + // 只处理可打印字符 + if (event.key.length === 1) { + this.inputBuffer += event.key; // 添加到缓冲区 + // console.log('当前缓冲区:', this.inputBuffer); + + // 清除之前的定时器,重新开始计时 + if (this.inputTimer) { + clearTimeout(this.inputTimer); + } + + // 启动一个定时器,如果500ms内没有新的输入,则认为条码输入完成 + this.inputTimer = setTimeout(() => { + this.qrCodeValue = this.inputBuffer; + // console.log('定时器触发,完整条码:', this.qrCodeValue); + this.inputBuffer = ''; // 清空缓冲区 + }, 500); // 可以根据需要调整时间 + } + + } + + // 处理二维码输入变更 + async onQRCodeChange(qrCodeValue) { + console.log('onQRCodeChange二维码输入变更', qrCodeValue); // 检查二维码的输入是否被捕获 + + if (qrCodeValue) { + // console.log('二维码输入变更'); + try { + // 发起 RPC 请求 + const result = await this.env.services.rpc('/web/dataset/call_kw', { + model: 'mrp.workorder', + method: 'search_read', + args: [ + [['rfid_code', '=', qrCodeValue]], // 查询条件 + ['id'] // 返回的字段 + ], + kwargs: {} + }); + + if (result.length > 0) { + console.log('该二维码对应的工单存在!'); + } else { + console.log('未找到对应的工单。'); + + const routingTypeField = document.querySelector('[name="routing_type"]'); + if (routingTypeField) { + let fieldValue = routingTypeField.querySelector('span').getAttribute('raw-value'); + console.log('Routing Type Value:', fieldValue); + // 清理多余的引号 + fieldValue = fieldValue ? fieldValue.replace(/["]+/g, '') : null; + console.log(fieldValue); + + if (fieldValue && fieldValue === '装夹预调') { + // console.log('routing_type 为装夹预调'); + + // 检查 RFID 值 + if (!qrCodeValue || qrCodeValue.length <= 3) return; + + // 查找 name="button_start" 按钮并触发点击事件 + const startButton = document.querySelector('[name="button_start"]'); + if (startButton) { + startButton.click(); + } + } + } + } + } catch (error) { + console.error('查询工单时出错:', error); + } + } + } + + // 返回模板名称 + static template = 'sf_manufacturing.QRCodeWidgetTemplate'; +} + +// 将自定义字段注册到字段注册表 +registry.category('fields').add('qrcode_widget', QRCodeWidget); diff --git a/sf_manufacturing/static/src/xml/qr.xml b/sf_manufacturing/static/src/xml/qr.xml new file mode 100644 index 00000000..415c0cd8 --- /dev/null +++ b/sf_manufacturing/static/src/xml/qr.xml @@ -0,0 +1,12 @@ + + + + + + +
+ +
+
+
+ diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml index 1398dc8a..79b4e97a 100644 --- a/sf_manufacturing/views/mrp_workorder_view.xml +++ b/sf_manufacturing/views/mrp_workorder_view.xml @@ -125,9 +125,9 @@ mrp.workorder - -