odoo使用扫码枪

odoo原生有一个扫码枪的模块叫做“barcodes”,这个模块中定义了一个类“'barcodes.barcode_events_mixin”,简单的处理扫码事件使用起来还是很方便的。

简单说一下使用过程:首先安装“barcodes”这个模块,在自己的模型中继承“'barcodes.barcode_events_mixin”,然后再扫码的form视图增加widget来进行监听,这个监听有点类似onchange,当监听到扫码事件就会触发模型中的方法

小编做的这个需求比较简单:就是在一个form视图上,扫码枪扫面产品的二维码,获取到产品关联的信息,在form上展示出来。

创建模型

class YiSampleCollectionEnterInfo(models.TransientModel):
    _name = 'sample.collection.enter.info'
    _description = '样本检测录入信息'
    # 这里继承原生barcodes中的一个类
    _inherit = ['barcodes.barcode_events_mixin']
 
    now_date = fields.Datetime(
        string='当前时间',
    )
    .......
    # 方法
    def on_barcode_scanned(self, barcode):
        sample_id = self.env['yi.sample.collection.data'].sudo().search([('QR_code', '=', barcode)])
        if sample_id:
            for rec in self:
                rec.with_context(barcode_flag=True).write({
                    'now_date': fields.Datetime.now(),
                    'project_name': sample_id.project_name.name,
                    'subject_id': sample_id.subject_id,
                    'sample_type_id': sample_id.sample_type_id.sample_type,
                    'inspection_platform_id': sample_id.inspection_platform_id.platform_name,
                    'project_type_id': sample_id.project_type_id.project_type,
                    'project_name_code_id': sample_id.project_name_code_id.code_container,
                    'sample_receive_date': sample_id.sample_receive_date,
                    'experiment_step_code': sample_id.experiment_step_code,
                    'original_sample_code': sample_id.original_sample_code,
                   
                })
                self.env.user.notify_success(message='查询成功!')
        else:
            raise ValidationError('不存在此样本信息,请重新核对!')

  

 

  1. 展示的form视图

action:
<record id="action_yi_sample_collection_enter_info" model="ir.actions.act_window">
        <field name="name">信息录入</field>
        <field name="type">ir.actions.act_window</field>
        <field name="res_model">sample.collection.enter.info</field>
        <field name="view_mode">form</field>
        <field name="target">new</field>
    </record>
view:
<record id="yi_sample_collection_enter_info_form_view" model="ir.ui.view">
        <field name="name">yi_sample_collection_enter_info_form_view</field>
        <field name="model">yi.sample.collection.enter.info</field>
        <field name="arch" type="xml">
            <form delete="0" edit="0" create="0">
                <sheet>
                    // 这里是重要的,类似给form增加一个onchage,就是按照原生这么写的
                    <field name="_barcode_scanned" widget="samplecollection_barcode_handler"/>
                    <group>
                        <field name="now_date" string="获取时间" readonly="1"/>
                    </group>
                    <group string="">
                        <group>
                            <field name="project_name" readonly="1"/>
                            <field name="sample_type_id" readonly="1"/>
                        </group>
                        <group>
                            <field name="subject_id" readonly="1"/>
                            <field name="inspection_platform_id" readonly="1"/>  
                        </group>
                    </group>
                    <group>
                        <group>
                            <field name="original_sample_code" readonly="1"/>
                            <field name="hospital_sources" readonly="1"/>  
                        </group>
                        <group>
                            <field name="regional_sources" readonly="1"/>
                            <field name="patient_name" readonly="1"/>
                            <field name="patient_age" readonly="1"/>
                        </group>
                    </group>
                    <group>
                        <group>
                            <field name="sample_collection_date" readonly="1"/>
                        </group>
                        <group>
                            <field name="sample_collection_container" readonly="1"/>
                        </group>
                    </group>
                    <footer>
                        <button string="Cancel" class="btn-secondary" special="cancel"/>
                        <button name="sample_data_empty" string="清理" type="button" />
                    </footer>
                </sheet>
            </form>
        </field>
    </record>

  

  1. 编写JS进行监听并调用方法

odoo.define('projectmanage.SampleCollectionBarcodeHandler', function (require) {
    "use strict";
 
    var field_registry = require('web.field_registry');
    var AbstractField = require('web.AbstractField');
    var FormController = require('web.FormController');
    var AbstractAction = require('web.AbstractAction');
 
 
    FormController.include({
        _barcodeSaleAddRecordId: function (barcode, activeBarcode) {
            if (!activeBarcode.handle) {
                return $.Deferred().reject();
            }
            // var record = this.model.get(activeBarcode.handle);
            // if (record.data.state != 'draft') {
            //     this.do_warn("销售订单", '只能对草稿状态的单据增加明细');
            //     return $.Deferred().reject();
            // }
            return this._barcodeAddX2MQuantity(barcode, activeBarcode);
        }
    })
 
    var SampleCollectionBarcodeHandler = AbstractField.extend({
        init: function () {
            this._super.apply(this, arguments);
 
            this.trigger_up('activeBarcode', {
                name: this.name,
                // fieldName: ['project_name', 'subject_id'],
                // quantity: 'product_uom_qty',
                setQuantityWithKeypress: true,
                commands: {
                    // 'O-CMD.MAIN-MENU': _.bind(this.do_action, this, 'stock_barcode.stock_barcode_action_main_menu', {clear_breadcrumbs: true}),
                    barcode: '_barcodeSaleAddRecordId',
                }
            });
        },
    });
 
 
 
    field_registry.add('samplecollection_barcode_handler', SampleCollectionBarcodeHandler);
 
});

  

因为没有往深了研究,但是按照原生的写法,这样是可以完成扫码枪的监听的,而且需求也比较简单,有兴趣的同学可以研究研究。企业版中也有一个扫码的模块,那个功能很多并且页面也很好看。

这篇文章仅供参考,因为扫码的这个需求不是很重要所以只是简单记录一下。

posted @ 2023-09-08 18:38  CrossPython  阅读(263)  评论(0编辑  收藏  举报