1.优化同一个产品多个制造订单的编程单合并到一张编程单和一个模型库至cloud

This commit is contained in:
jinling.yang
2024-05-12 21:33:43 +08:00
parent d3677b9c89
commit 9dccee84c4
3 changed files with 67 additions and 47 deletions

View File

@@ -3,6 +3,7 @@ import base64
import logging
import re
import requests
from itertools import groupby
from odoo import api, fields, models, _
from odoo.exceptions import UserError
from odoo.addons.sf_base.commons.common import Common
@@ -154,7 +155,7 @@ class MrpProduction(models.Model):
production.maintenance_count = len(production.request_ids)
# cnc程序获取
def fetchCNC(self):
def fetchCNC(self, production_names):
cnc = self.env['mrp.production'].search([('id', '=', self.id)])
quick_order = self.env['quick.easy.order'].search(
[('name', '=', cnc.product_id.default_code.rsplit('-', 1)[0])])
@@ -167,8 +168,9 @@ class MrpProduction(models.Model):
programme_way = 'manual operation'
try:
res = {
'production_no': cnc.name,
'production_no': production_names,
'machine_tool_code': '',
'product_name': cnc.product_id.name,
'model_code': cnc.product_id.model_code,
'material_code': self.env['sf.production.materials'].search(
[('id', '=', cnc.product_id.materials_id.id)]).materials_no,
@@ -267,16 +269,18 @@ class MrpProduction(models.Model):
# 其他规则限制: 默认只分配给工作中心状态为非故障的工作中心;
def _create_workorder3(self):
# production_names = [production.name for production in self if production.product_id.categ_id.type == '成品']
# programming_no = None
# product_first = None
# 根据product_id对self进行分组
grouped_product_ids = {k: list(g) for k, g in groupby(self, key=lambda x: x.product_id.id)}
# 初始化一个字典来存储每个product_id对应的生产订单名称列表
product_id_to_production_names = {}
# 对于每个product_id获取其所有生产订单的名称
for product_id, productions in grouped_product_ids.items():
# 为同一个product_id创建一个生产订单名称列表
product_id_to_production_names[product_id] = [production.name for production in productions]
for production in self:
if not production.bom_id or not production.product_id:
continue
workorders_values = []
# if product_first is None:
# product_first = production.product_id
product_qty = production.product_uom_id._compute_quantity(production.product_qty,
production.bom_id.product_uom_id)
exploded_boms, dummy = production.bom_id.explode(production.product_id,
@@ -300,15 +304,20 @@ class MrpProduction(models.Model):
'state': 'pending',
}]
if production.product_id.categ_id.type == '成品':
production.fetchCNC()
# 第二期同一个产品多个制造订单对应一个编程单和模型库
# if programming_no is None:
# production.fetchCNC(production_names)
# programming_no = production.programming_no
# else:
# if production.product_id == product_first:
# if not production.programming_no:
# production.write({'programming_no': programming_no, 'programming_state': '编程中'})
if production.product_id.id in product_id_to_production_names:
# 同一个产品多个制造订单对应一个编程单和模型库
# 只调用一次fetchCNC并将所有生产订单的名称作为字符串传递
if not production.programming_no:
production_programming = self.search(
[('product_id.id', '=', production.product_id.id), ('origin', '=', production.origin)],
limit=1, order='id asc')
logging.info('production_programming1:%s' % production_programming.programming_no)
if not production_programming.programming_no:
production.fetchCNC(', '.join(product_id_to_production_names[production.product_id.id]))
else:
logging.info('production_programming2:%s' % production_programming.programming_no)
production.write({'programming_no': production_programming.programming_no,
'programming_state': '编程中'})
# 根据加工面板的面数及对应的工序模板生成工单
i = 0
processing_panel_len = len(production.product_id.model_processing_panel.split(','))
@@ -414,6 +423,7 @@ class MrpProduction(models.Model):
self.env['stock.picking'].create_outcontract_picking(sorted_workorders, production)
else:
self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], production)
for workorder in production.workorder_ids:
workorder.duration_expected = workorder._get_duration_expected()