Skip to content

Latest commit

 

History

History

demo_sale_scan_barcode

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

odoo 實作 scan barcode

建議觀看影片, 因為 scanner 會看的更清楚:smile:

Youtube Tutorial - odoo - 實作 scan barcode

建議在閱讀這篇文章之前, 請先確保了解看過以下的文章 (因為都有連貫的關係)

odoo 手把手建立第一個 addons

odoo 搭配 scanner,

主要介紹 odoo 中如何實作 scan barcode.

說明

首先是 __manifest__.py 的部份, 記得要加上 barcodes

......

'depends': [......, 'barcodes'],
......

接著看 models/models.py

......

class SaleOrderBarcodes(models.Model):
    _name = "sale.order"
    _inherit = ["sale.order", "barcodes.barcode_events_mixin"]

    _barcode_scanned = fields.Char(string='Barcode', help="Here you can provide the barcode for the product")

    @api.multi
    def on_barcode_scanned(self, barcode):
        product_obj = self.env['product.product'].search([('barcode', '=', barcode)], limit=1)
        val = {
            'product_id': product_obj,
            'product_uom_qty': 1,
            'price_unit': product_obj.lst_price
        }
        self.order_line = [(0, 0, val)]

_inherit 必須繼承 barcodes.barcode_events_mixin,

然後要定義 _barcode_scanned,

資料庫中是不會有 _barcode_scanned 的欄位, 因為 BarcodeEventsMixin 是 AbstractModel,

如果不了解甚麼是 AbstractModel, 請參考 odoo 手把手教學 - AbstractModel.

也需要實作 on_barcode_scanned, 當 scanner 掃描到 barcode 時, 就會去觸發這個 method.

實作的邏輯很簡單,

就是使用所掃描到的 barcode 去 product.product 中尋找對應的產品,

如果有, 就自動增加到 sale order line 中.

如果不知道如何增加 One2many M2X record,

可參考 odoo 手把手教學 - 使用 python 增加取代 One2many M2X record

barcode_events_mixin.py 可參考原始碼中的 addons/barcodes/models/barcode_events_mixin.py

......
class BarcodeEventsMixin(models.AbstractModel):
    """ Mixin class for objects reacting when a barcode is scanned in their form views
        which contains `<field name="_barcode_scanned" widget="barcode_handler"/>`.
        Models using this mixin must implement the method on_barcode_scanned. It works
        like an onchange and receives the scanned barcode in parameter.
    """

    _name = 'barcodes.barcode_events_mixin'
    _description = 'Barcode Event Mixin'

    _barcode_scanned = fields.Char("Barcode Scanned", help="Value of the last barcode scanned.", store=False)

    @api.onchange('_barcode_scanned')
    def _on_barcode_scanned(self):
        barcode = self._barcode_scanned
        if barcode:
            self._barcode_scanned = ""
            return self.on_barcode_scanned(barcode)

    def on_barcode_scanned(self, barcode):
        raise NotImplementedError("In order to use barcodes.barcode_events_mixin, method on_barcode_scanned must be implemented")

views 的部份可參考 views/view.xml

<?xml version="1.0"?>
<odoo>
    <record id="view_order_form_scan_barcode" model="ir.ui.view">
        <field name="name">sale.order.form.scan.barcode</field>
        <field name="model">sale.order</field>
        <field name="inherit_id" ref="sale.view_order_form"/>
        <field name="arch" type="xml">
            <field name="partner_id"  position="after">
                <!-- invisible="1" -->
                <field name="_barcode_scanned" widget="barcode_handler"/>
            </field>
        </field>
    </record>
</odoo>

這邊主要是加上 <field name="_barcode_scanned" widget="barcode_handler"/>,

也可以選擇將它隱藏起來, 是不影響工作的.

將 addons 裝起來之後, 先到 Product Variants 設定 barcode,

alt tag

範例 barcode

alt tag

記住一定要進入編輯 (Edit) 狀態, 否則會出現錯誤:exclamation::exclamation:

alt tag

也請記得要 focus 在當下的 odoo 畫面 (否則系統會抓不到):exclamation::exclamation:

scanner 掃到條碼後, 就會將對應的產品帶入 sale order line 中.

這邊建議觀看影片, 會比較清楚:smile:

scanner 其實也是將 barcode 或是 qrcode 內的資料讀取出來而已

alt tag