对相同产品的数量行进行分组和求和

时间:2019-09-05 13:42:47

标签: odoo odoo-12

我具有此功能,它可以过滤所有选定MO的原材料行,然后创建一个以树形视图显示的报告。

但是我有一个问题,同一产品可能会有分配行。所以我的目标是将所有这些行分组并显示出来,然后与合计数量显示在一行中。

有人可以帮我吗?

class RawMaterialReport(models.Model):
    _name = 'raw.material.report'
    _description = 'Raw Material Report'

    product_id = fields.Many2one('product.product', string='Product', required=False)
    code = fields.Char(string='Code', required=True, readonly=True)
    total_qty = fields.Float(string='Total Qty', digits=(6, 2), readonly=True)
    virtual_qty = fields.Float(string='Forcasted Qty', digits=(6, 2), readonly=True)
    origin = fields.Char(string='Origin', required=True, readonly=True)
    production_id = fields.Many2one('mrp.production')


@api.multi
def open_raw_materials(self):
    self.search([]).unlink()
    mrp_productions = self._context.get('active_ids')
    mrp_production = self.env['mrp.production'].browse(mrp_productions)
    products_without_default_code = mrp_production.mapped('move_raw_ids').filtered(
        lambda x: not x.product_id.default_code
    )

    raws = mrp_production.mapped('move_raw_ids').sorted(
        key=lambda r: r.product_id.default_code
    )

    for r in raws:
        vals = {
            'product_id': r.product_id.id,
            'code': r.product_id.default_code,
            'total_qty': r.product_id.qty_available,
            'virtual_qty': r.product_id.virtual_available,
            'origin': r.reference,
            'production_id': r.raw_material_production_id.id,
        }
        self.create(vals)

1 个答案:

答案 0 :(得分:1)

与其直接创建记录,不如将它们保存在按产品ID分组的字典中,并且一旦发现所有准备就绪的产品都有一条记录,就对其求和 数量。

@api.multi
def open_raw_materials(self):
    self.search([]).unlink()
    mrp_productions = self._context.get('active_ids')
    mrp_production = self.env['mrp.production'].browse(mrp_productions)
    products_without_default_code = mrp_production.mapped('move_raw_ids').filtered(
        lambda x: not x.product_id.default_code
    )

    raws = mrp_production.mapped('move_raw_ids').sorted(
        key=lambda r: r.product_id.default_code
    )

    # to group by product
    recs = {}
    for r in raws:
        product_id = self.product_id.id
        if product_id in recs:
            # here just update the quantities or any other fields you want to sum
            recs[product_id]['product_uom_qty'] += self.product_id.product_uom_qty 
        else:
            # keep the record in recs
            recs[product_id] = {
                'product_id': r.product_id.id,
                'code': r.product_id.default_code,
                'total_qty': r.product_id.product_uom_qty,
                'virtual_qty': r.product_id.virtual_available,
                'origin': r.reference,
                'production_id': r.raw_material_production_id.id,
            }
    for vals in recs.values():
        # create records this will create a record by product
        self.create(vals)