You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:17:58