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('不存在此样本信息,请重新核对!')
-
展示的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>
-
编写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); });
因为没有往深了研究,但是按照原生的写法,这样是可以完成扫码枪的监听的,而且需求也比较简单,有兴趣的同学可以研究研究。企业版中也有一个扫码的模块,那个功能很多并且页面也很好看。
这篇文章仅供参考,因为扫码的这个需求不是很重要所以只是简单记录一下。
标签:扫码,code,name,barcode,odoo,sample,使用,id From: https://www.cnblogs.com/pythonClub/p/17688323.html