Odoo 制造拣货 - 显示数量大于零的批处理 0

标签 odoo odoo-10 odoo-11 odoo-12

我在制造领料操作中添加了批处理数量字段。它完美地反射(reflect)了相对于位置的手数。现在的问题是我不想展示没有产品的批处理,即 0 数量。我如何实现这一点?

这是我要进行更改的屏幕截图。 enter image description here

这是模型代码(stock_move_line.py):

class StockMoveLine(models.Model):
    _name = "stock.move.line"
    _description = "Product Moves (Stock Move Line)"
    _rec_name = "product_id"
    _order = "result_package_id desc, id"
    lot_id = fields.Many2one('stock.production.lot', 'Lot/Serial Number123')
    x_lot_qty = fields.Float(compute="fetch_lot_wrt_location", 
                       name="Lot Quantity", 
                       store=True,
                       readonly=True, 
                       digits=(12,3))
    
    @api.onchange('lot_id','location_id')
    def fetch_lot_wrt_location(self):
        self.x_lot_qty = 0.0
        for row in self:
            quants = self.env['stock.quant'].search([('lot_id.id','=',row.lot_id.id)])
            for quant in quants:
                if row.location_id.display_name == quant.location_id.display_name:
                    row.x_lot_qty = quant.quantity
    

这里是 View (stock_move_views.xml):

<field name="lot_id" 
            attrs="{'readonly': ['&amp;', ('package_level_id', '!=', False), ('parent.picking_type_entire_packs', '=', True)]}" 
            invisible="not context.get('show_lots_m2o')" 
            domain="[('product_id', '=', parent.product_id)]" 
            groups="stock.group_production_lot" 
            context="{'default_product_id': parent.product_id, 'active_picking_id': picking_id}"/>
<field name="x_lot_qty" 
            attrs="{'readonly': ['&amp;', ('package_level_id', '!=', False), ('parent.picking_type_entire_packs', '=', True)]}" 
            invisible="not context.get('show_lots_m2o')" 
            domain="[('product_id', '=', parent.product_id)]" 
            groups="stock.group_production_lot" 
            context="{'default_product_id': parent.product_id, 'active_picking_id': picking_id}"/>

我确实通过域属性应用了过滤器,但它不起作用。如何限制数量为0的批号。

更新: 我尝试了以下解决方案: 我创建了一个新的动态选择字段并尝试填充相对于位置不为空的地段,下面是代码:

@api.onchange('location_id')
def _fetch_non_empty_lots(self):
    lots = []
    for row in self:
        quants = self.env['stock.quant'].search([('location_id.id','=',row.location_id.id), ('product_id.id', '=', row.product_id.id), ('quantity', '>', 0)])
        for quant in quants:
            lots.append(quant)
            
    return lots

x_lot_id = fields.Selection(selection="_fetch_non_empty_lots", name="Non Empty Lots")

但是现在当我选择一个新的位置时,我得到以下错误:

Odoo Server Error
Traceback (most recent call last):
  File "C:\virtual_odoo12\Scripts\odoo\http.py", line 656, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "C:\virtual_odoo12\Scripts\odoo\http.py", line 314, in _handle_exception
    raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
  File "C:\virtual_odoo12\Scripts\odoo\tools\pycompat.py", line 87, in reraise
    raise value
  File "C:\virtual_odoo12\Scripts\odoo\http.py", line 698, in dispatch
    result = self._call_function(**self.params)
  File "C:\virtual_odoo12\Scripts\odoo\http.py", line 346, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "C:\virtual_odoo12\Scripts\odoo\service\model.py", line 97, in wrapper
    return f(dbname, *args, **kwargs)
  File "C:\virtual_odoo12\Scripts\odoo\http.py", line 339, in checked_call
    result = self.endpoint(*a, **kw)
  File "C:\virtual_odoo12\Scripts\odoo\http.py", line 941, in __call__
    return self.method(*args, **kw)
  File "C:\virtual_odoo12\Scripts\odoo\http.py", line 519, in response_wrap
    response = f(*args, **kw)
  File "c:\virtual_odoo12\scripts\addons\web\controllers\main.py", line 962, in call_kw
    return self._call_kw(model, method, args, kwargs)
  File "c:\virtual_odoo12\scripts\addons\web\controllers\main.py", line 954, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
  File "C:\virtual_odoo12\Scripts\odoo\api.py", line 759, in call_kw
    return _call_kw_multi(method, model, args, kwargs)
  File "C:\virtual_odoo12\Scripts\odoo\api.py", line 746, in _call_kw_multi
    result = method(recs, *args, **kwargs)
  File "C:\virtual_odoo12\Scripts\odoo\models.py", line 5524, in onchange
    record._onchange_eval(name, field_onchange[name], result)
  File "C:\virtual_odoo12\Scripts\odoo\models.py", line 5369, in _onchange_eval
    process(method_res)
  File "C:\virtual_odoo12\Scripts\odoo\models.py", line 5355, in process
    if res.get('value'):
AttributeError: 'list' object has no attribute 'get'

更新 2: 我没有修改现有的下拉列表,而是创建了一个动态下拉列表。选择位置后,下拉列表中会填充数量大于 0 的批号。但是,我面临一个基本问题/错误:

AttributeError: 'list' object has no attribute 'get'

这是模型选择字段和填充它的代码:

@api.onchange('location_id')
def _fetch_non_empty_lots(self):
        quants = self.env['stock.quant'].search([('location_id.id','=',self.location_id.id), 
                        ('product_id.id', '=', self.product_id.id), 
                        ('quantity', '>', 0)])
        return {str(quant.lot_id.id) :str.title(quant.lot_id.display_name) for quant in quants} 

## declare field    

x_lot_id = fields.Selection(selection="_fetch_non_empty_lots", name="Non Empty Lots")

当列表为空时,没有错误。当有非空地段时,我得到了错误。我需要一些帮助。

最佳答案

Odoo在库存生产批处理模型中定义了一个产品数量字段,您可以在域中使用该字段来过滤批处理,您需要将store设置为True使其可搜索。如果您需要定义一个新字段,则使用相同的逻辑并在批处理模型中定义它以在 lot_id 字段域中使用。

你得到那个错误是因为 Odoo 期望一个 dictionary它得到了一个列表。

The method may return a dictionary for changing field domains and pop up a warning message, like in the old API.

在最后两个示例中,您将选择属性设置为字符串,但 selection 属性指定了该字段的可能值。它以成对列表(valuestring)、模型方法或方法名称的形式给出。您可以在 website_customer 中找到示例模块。

编辑:(从 onchange 方法返回域)

该方法可能会返回一个用于更改字段域的字典,并弹出一条警告消息,就像在旧的 API 中一样:

return {
    'domain': {'other_id': [('partner_id', '=', partner_id)]},
    'warning': {'title': "Warning", 'message': "What is this?"},
}

关于Odoo 制造拣货 - 显示数量大于零的批处理 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64982123/

相关文章:

PayPal退款交易授权问题

odoo-10 - odoo 10 如何创建片段 Javascript 选项

python - 如何从 Odoo 10 中的自定义模块修改 noupdate ="1"XML 记录?

python-3.x - Odoo 11 重写复制功能以添加额外字段

xml - 为什么这些规则在 Odoo 11 中会有这种行为?

python - 如何在 Odoo 中创建分为不同月数的可编辑 ListView ?

crm - 想要在保存记录时使字段只读,openerp

python - 如何通过模块向many2one添加字段

javascript - 如何根据 Xml 中的条件使字段不可见。奥杜 14

exception - 如何在 Odoo 10 中引发自定义异常?