from itertools import groupby from odoo import models, api from odoo.tools.misc import OrderedSet class MrpProduction(models.Model): _inherit = 'mrp.production' @api.model_create_multi def create(self, vals_list): """ 生成编程单 """ productions = super().create(vals_list) if not productions: return self.browse() # 定义变量存储编程单 grouped_product_programming_no = {} # 定义产品拼接成的制造订单名称 grouped_product_production_name = {} # 查出所有的制造订单,为了适配通过补货生成的制造订单 all_productions = self.env['mrp.production'].search([('origin', '=', productions[0].origin)]) # 将不同产品的制造订单进行分组 grouped_product_productions = {k: list(g) for k, g in groupby(all_productions, key=lambda x: x.product_id.id)} for product_id, grouped_productions in grouped_product_productions.items(): # 产品对应的编程单号 if product_id not in grouped_product_programming_no: # 使用列表推导式获取非空的programming_no programming_nos = [p.programming_no for p in grouped_productions if p.programming_no if p.programming_no is not False] if programming_nos: grouped_product_programming_no[product_id] = programming_nos[0] grouped_product_production_name[product_id] = ','.join(list(map(lambda p:p.name, grouped_productions))) # 同一个产品的制造订单只请求一次CNC编程 for production in productions: if not production.programming_no and production.production_type in ['自动化产线加工','人工线下加工']: if production.product_id.id not in grouped_product_programming_no: production.fetchCNC(grouped_product_production_name[production.product_id.id]) grouped_product_programming_no[production.product_id.id] = production.programming_no else: production.write({ 'programming_no': grouped_product_programming_no[production.product_id.id], 'programming_state': '编程中' }) return productions