Odoo 10条码扫描触发维修工单计时启动按钮问题求助
解决Odoo 10扫描条码后自动启动计时器的问题
我之前在Odoo 10里处理过类似的场景,你遇到的核心问题是:后端Python代码调用toggle_start只是更新了数据库中的工单状态,但前端计时器的启动逻辑是绑定在按钮的点击事件上的——后端操作不会触发这个前端JS事件,所以必须用前端代码模拟真实的按钮点击动作,才能让计时器正常启动。
下面是具体的实现步骤:
1. 编写自定义JS逻辑
在你的自定义模块目录下,创建static/src/js文件夹,新建一个比如maintenance_barcode_handler.js的文件,代码如下:
odoo.define('your_module_name.maintenance_barcode', function (require) { "use strict"; var FormController = require('web.FormController'); // 扩展表单控制器的条码扫描方法 FormController.include({ on_barcode_scanned: function (barcode) { // 先执行系统默认的条码扫描逻辑 this._super(barcode); // 仅针对维修工单模型执行后续操作(替换成你实际的模型名) if (this.modelName === 'maintenance.request') { // 定位到start_btn按钮(根据你视图中按钮的实际属性调整选择器) var startButton = this.$el.find('button[name="start_btn"]'); // 检查按钮存在且处于可点击状态 if (startButton.length > 0 && !startButton.prop('disabled')) { // 模拟真实的鼠标点击事件 startButton.trigger('click'); } } }, }); return FormController; });
2. 将JS文件加载到视图中
在模块的views目录下,创建或修改一个继承维修工单表单视图的XML文件,添加JS引用:
<odoo> <data> <!-- 继承维修工单的表单视图,替换成你实际要修改的视图ID --> <record id="inherit_maintenance_request_form" model="ir.ui.view"> <field name="name">maintenance.request.form.inherit.barcode</field> <field name="model">maintenance.request</field> <field name="inherit_id" ref="maintenance.view_maintenance_request_form"/> <field name="arch" type="xml"> <!-- 在视图头部插入JS文件引用 --> <xpath expr="//head" position="inside"> <script type="text/javascript" src="/your_module_name/static/src/js/maintenance_barcode_handler.js"></script> </xpath> </field> </record> </data> </odoo>
3. 关键注意事项
- 把代码中的
your_module_name替换成你实际的自定义模块名称。 - 确认按钮的选择器正确:如果你的按钮不是用
name="start_btn"定义的,比如用了特定class,要调整find方法的参数(比如.o_button_start)。 - 若需要验证扫描的条码是否属于当前打开的工单,可以在JS中添加校验逻辑:
var currentRecord = this.model.get(this.handle); if (currentRecord.data.barcode_field_name === barcode) { // 再执行按钮点击逻辑 } - 完成代码编写后,重启Odoo服务、升级模块,并清除浏览器缓存再测试。
这样处理后,扫描条码触发on_barcode_scanned事件时,JS会自动定位并点击启动按钮,完全模拟手动点击的效果,计时器就能正常启动了。
内容的提问来源于stack exchange,提问作者imad
相关产品推荐
相关产品推荐

