113 lines
4.0 KiB
Python
113 lines
4.0 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
import unittest
|
||
|
import time
|
||
|
import logging
|
||
|
|
||
|
from odoo.tests import common, Form
|
||
|
|
||
|
_logger = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
class TestMrpSerialMassProducePerformance(common.TransactionCase):
|
||
|
|
||
|
@unittest.skip
|
||
|
def test_smp_performance(self):
|
||
|
|
||
|
total_quantity = 1000
|
||
|
quantity = 1
|
||
|
|
||
|
raw_materials_count = 10
|
||
|
trackings = [
|
||
|
'none',
|
||
|
# 'lot',
|
||
|
# 'serial'
|
||
|
]
|
||
|
|
||
|
_logger.info('setting up environment')
|
||
|
|
||
|
raw_materials = []
|
||
|
for i in range(raw_materials_count):
|
||
|
raw_materials.append(self.env['product.product'].create({
|
||
|
'name': '@raw_material#' + str(i + 1),
|
||
|
'type': 'product',
|
||
|
'tracking': trackings[i % len(trackings)]
|
||
|
}))
|
||
|
finished = self.env['product.product'].create({
|
||
|
'name': '@finished',
|
||
|
'type': 'product',
|
||
|
'tracking': 'serial',
|
||
|
})
|
||
|
bom = self.env['mrp.bom'].create({
|
||
|
'product_id': finished.id,
|
||
|
'product_tmpl_id': finished.product_tmpl_id.id,
|
||
|
'product_uom_id': finished.uom_id.id,
|
||
|
'product_qty': 1.0,
|
||
|
'type': 'normal',
|
||
|
'consumption': 'flexible',
|
||
|
'bom_line_ids': [(0, 0, {'product_id': p[0]['id'], 'product_qty': 1}) for p in raw_materials]
|
||
|
})
|
||
|
|
||
|
form = Form(self.env['mrp.production'])
|
||
|
form.product_id = finished
|
||
|
form.bom_id = bom
|
||
|
form.product_qty = total_quantity
|
||
|
|
||
|
mo = form.save()
|
||
|
|
||
|
mo.action_confirm()
|
||
|
|
||
|
for i in range(raw_materials_count):
|
||
|
if raw_materials[i].tracking == 'none':
|
||
|
self.env['stock.quant'].with_context(inventory_mode=True).create({
|
||
|
'product_id': raw_materials[i].id,
|
||
|
'inventory_quantity': total_quantity,
|
||
|
'location_id': mo.location_src_id.id,
|
||
|
})._apply_inventory()
|
||
|
elif raw_materials[i].tracking == 'lot':
|
||
|
qty = total_quantity
|
||
|
while qty > 0:
|
||
|
lot = self.env['stock.lot'].create({
|
||
|
'product_id': raw_materials[i].id,
|
||
|
'company_id': self.env.company.id,
|
||
|
})
|
||
|
self.env['stock.quant'].with_context(inventory_mode=True).create({
|
||
|
'product_id': raw_materials[i].id,
|
||
|
'inventory_quantity': 10,
|
||
|
'location_id': mo.location_src_id.id,
|
||
|
'lot_id': lot.id,
|
||
|
})._apply_inventory()
|
||
|
qty -= 10
|
||
|
else:
|
||
|
for _ in range(total_quantity):
|
||
|
lot = self.env['stock.lot'].create({
|
||
|
'product_id': raw_materials[i].id,
|
||
|
'company_id': self.env.company.id,
|
||
|
})
|
||
|
self.env['stock.quant'].with_context(inventory_mode=True).create({
|
||
|
'product_id': raw_materials[i].id,
|
||
|
'inventory_quantity': 1,
|
||
|
'location_id': mo.location_src_id.id,
|
||
|
'lot_id': lot.id,
|
||
|
})._apply_inventory()
|
||
|
|
||
|
mo.action_assign()
|
||
|
|
||
|
action = mo.action_serial_mass_produce_wizard()
|
||
|
wizard = Form(self.env['stock.assign.serial'].with_context(**action['context']))
|
||
|
wizard.next_serial_number = "sn#1"
|
||
|
wizard.next_serial_count = quantity
|
||
|
action = wizard.save().generate_serial_numbers_production()
|
||
|
wizard = Form(self.env['stock.assign.serial'].browse(action['res_id']))
|
||
|
wizard = wizard.save()
|
||
|
|
||
|
_logger.info('generating serial numbers')
|
||
|
start = time.perf_counter()
|
||
|
if quantity == total_quantity:
|
||
|
wizard.apply()
|
||
|
else:
|
||
|
wizard.create_backorder()
|
||
|
end = time.perf_counter()
|
||
|
_logger.info('time to produce %s/%s: %s', quantity, total_quantity, end - start)
|