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('不存在此样本信息,请重新核对!')
-
展示的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);
});
因为没有往深了研究,但是按照原生的写法,这样是可以完成扫码枪的监听的,而且需求也比较简单,有兴趣的同学可以研究研究。企业版中也有一个扫码的模块,那个功能很多并且页面也很好看。
这篇文章仅供参考,因为扫码的这个需求不是很重要所以只是简单记录一下。
浙公网安备 33010602011771号