修复不同产品调拨单合并的bug

This commit is contained in:
胡尧
2024-11-21 09:26:23 +08:00
parent a7ed317b09
commit a1807e05db
2 changed files with 39 additions and 38 deletions

View File

@@ -1386,9 +1386,9 @@ class MrpProduction(models.Model):
@api.model_create_multi @api.model_create_multi
def create(self, vals_list): def create(self, vals_list):
""" """
重载创建制造订单的方法,单制造订单只创建一个采购组,用于后续单据的创建 重载创建制造订单的方法,单制造订单,同一成品只创建一个采购组,用于后续单据的创建
""" """
group_id = None product_group_id = {}
for vals in vals_list: for vals in vals_list:
if not vals.get('name', False) or vals['name'] == _('New'): if not vals.get('name', False) or vals['name'] == _('New'):
picking_type_id = vals.get('picking_type_id') picking_type_id = vals.get('picking_type_id')
@@ -1399,9 +1399,13 @@ class MrpProduction(models.Model):
if not vals.get('procurement_group_id'): if not vals.get('procurement_group_id'):
product_id = self.env['product.product'].browse(vals['product_id']) product_id = self.env['product.product'].browse(vals['product_id'])
if product_id.product_tmpl_id.single_manufacturing: if product_id.product_tmpl_id.single_manufacturing:
procurement_group_vals = self._prepare_procurement_group_vals(vals) if product_id.id not in product_group_id.keys():
group_id = self.env["procurement.group"].create(procurement_group_vals).id if not group_id else group_id procurement_group_vals = self._prepare_procurement_group_vals(vals)
vals['procurement_group_id'] = group_id group_id = self.env["procurement.group"].create(procurement_group_vals).id
vals['procurement_group_id'] = group_id
product_group_id[product_id.id] = group_id
else:
vals['procurement_group_id'] = product_group_id[product_id.id]
return super(MrpProduction, self).create(vals_list) return super(MrpProduction, self).create(vals_list)
@api.depends('procurement_group_id.stock_move_ids.created_purchase_line_id.order_id', 'procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id') @api.depends('procurement_group_id.stock_move_ids.created_purchase_line_id.order_id', 'procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id')
@@ -1409,7 +1413,7 @@ class MrpProduction(models.Model):
for production in self: for production in self:
# 找到来源的第一张制造订单的采购组 # 找到来源的第一张制造订单的采购组
if production.product_id.product_tmpl_id.single_manufacturing == True: if production.product_id.product_tmpl_id.single_manufacturing == True:
first_production = self.env['mrp.production'].search([('origin', '=', production.origin)], limit=1, order='id asc') first_production = self.env['mrp.production'].search([('origin', '=', production.origin), ('product_id', '=', production.product_id.id)], limit=1, order='id asc')
production.purchase_order_count = len(first_production.procurement_group_id.stock_move_ids.created_purchase_line_id.order_id | production.purchase_order_count = len(first_production.procurement_group_id.stock_move_ids.created_purchase_line_id.order_id |
first_production.procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id) first_production.procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id)
else: else:
@@ -1420,7 +1424,7 @@ class MrpProduction(models.Model):
def _compute_picking_ids(self): def _compute_picking_ids(self):
for order in self: for order in self:
if order.product_id.product_tmpl_id.single_manufacturing == True: if order.product_id.product_tmpl_id.single_manufacturing == True:
first_order = self.env['mrp.production'].search([('origin', '=', order.origin)], limit=1, order='id asc') first_order = self.env['mrp.production'].search([('origin', '=', order.origin), ('product_id', '=', order.product_id.id)], limit=1, order='id asc')
order.picking_ids = self.env['stock.picking'].search([ order.picking_ids = self.env['stock.picking'].search([
('group_id', '=', first_order.procurement_group_id.id), ('group_id', '!=', False), ('group_id', '=', first_order.procurement_group_id.id), ('group_id', '!=', False),
]) ])

View File

@@ -125,36 +125,30 @@ class StockRule(models.Model):
product = self.env['product.product'].search( product = self.env['product.product'].search(
[("id", '=', item[0].product_id.id)]) [("id", '=', item[0].product_id.id)])
# 如果产品是坯料,则根据作业类型来设置采购组 product_tmpl = self.env['product.template'].search(
if product.categ_id.name == '坯料': ["&", ("id", '=', product.product_tmpl_id.id), ('single_manufacturing', "!=", False)])
if item[1]['picking_type_id'].name in ['生产发料', '内部调拨']: if product_tmpl:
item[0][7]['group_id'] = procurements[0][0][7]['group_id'] if num > 1:
list2.append(item) for no in range(1, num + 1):
else: Procurement = namedtuple('Procurement', ['product_id', 'product_qty',
product_tmpl = self.env['product.template'].search( 'product_uom', 'location_id', 'name', 'origin',
["&", ("id", '=', product.product_tmpl_id.id), ('single_manufacturing', "!=", False)]) 'company_id',
if product_tmpl: 'values'])
if num > 1: s = Procurement(product_id=item[0].product_id, product_qty=1.0, product_uom=item[0].product_uom,
for no in range(1, num + 1): location_id=item[0].location_id,
Procurement = namedtuple('Procurement', ['product_id', 'product_qty', name=item[0].name,
'product_uom', 'location_id', 'name', 'origin', origin=item[0].origin,
'company_id', company_id=item[0].company_id,
'values']) values=item[0].values,
s = Procurement(product_id=item[0].product_id, product_qty=1.0, product_uom=item[0].product_uom, )
location_id=item[0].location_id, item1 = list(item)
name=item[0].name, item1[0] = s
origin=item[0].origin,
company_id=item[0].company_id,
values=item[0].values,
)
item1 = list(item)
item1[0] = s
list2.append(tuple(item1)) list2.append(tuple(item1))
else:
list2.append(item)
else: else:
list2.append(item) list2.append(item)
else:
list2.append(item)
for procurement, rule in list2: for procurement, rule in list2:
procure_method = rule.procure_method procure_method = rule.procure_method
@@ -214,9 +208,12 @@ class StockRule(models.Model):
'''创建制造订单''' '''创建制造订单'''
productions = self.env['mrp.production'].with_user(SUPERUSER_ID).sudo().with_company(company_id).create( productions = self.env['mrp.production'].with_user(SUPERUSER_ID).sudo().with_company(company_id).create(
productions_values) productions_values)
# 将这一批制造订单的采购组设置为不同的采购组 # 将这一批制造订单的采购组根据成品设置为不同的采购组
product_group_id = {}
for index, production in enumerate(productions): for index, production in enumerate(productions):
if index > 0: if production.product_id.id not in product_group_id.keys():
product_group_id[production.product_id.id] = production.procurement_group_id.id
else:
productions_values[index].update({'name': production.name}) productions_values[index].update({'name': production.name})
procurement_group_vals = production._prepare_procurement_group_vals(productions_values[index]) procurement_group_vals = production._prepare_procurement_group_vals(productions_values[index])
production.procurement_group_id = self.env["procurement.group"].create(procurement_group_vals).id production.procurement_group_id = self.env["procurement.group"].create(procurement_group_vals).id
@@ -968,11 +965,11 @@ class ReStockMove(models.Model):
def _single_manufactuing_mo_generate_origin(self, res): def _single_manufactuing_mo_generate_origin(self, res):
""" """
单件制造订单的完成move单据修改来源为制造订单 单个制造订单的完成move单据修改来源为该制造订单关联的销售订单下所有成品相同的制造订单
""" """
if self[0].origin and self.picking_type_id.name in ['生产发料', '内部调拨']: if self[0].origin and self.picking_type_id.name in ['生产发料', '内部调拨']:
production = self.env['mrp.production'].search([('name', '=', self[0].origin)], limit=1, order='id asc') production = self.env['mrp.production'].search([('name', '=', self[0].origin)], limit=1, order='id asc')
productions = self.env['mrp.production'].search([('origin', '=', production.origin)]) productions = self.env['mrp.production'].search([('origin', '=', production.origin), ('product_id', '=', production.product_id.id)])
res['origin'] = ','.join(productions.mapped('name')) res['origin'] = ','.join(productions.mapped('name'))
return res return res