From 8add4b5ad10bc9305ce27a05f5dd92089522f834 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Fri, 15 Nov 2024 17:31:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=88=B6=E9=80=A0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_production.py | 42 +++- sf_manufacturing/models/mrp_workorder.py | 27 ++- sf_manufacturing/models/stock.py | 180 ++++++------------ .../views/mrp_production_addional_change.xml | 9 +- .../production_technology_re_adjust_wizard.py | 69 +++---- .../wizard/production_technology_wizard.py | 30 ++- 6 files changed, 177 insertions(+), 180 deletions(-) diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 47f316ad..0fe1a6b2 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -609,35 +609,41 @@ class MrpProduction(models.Model): workorders_values.append( self.env['mrp.workorder'].json_workorder_str('', production, route_embryo)) production.workorder_ids = workorders_values - production.get_subcontract_pick() for workorder in production.workorder_ids: workorder.duration_expected = workorder._get_duration_expected() # 生成采购单 def get_subcontract_purchase(self): - for production in self: + production_all = self.sorted(lambda x: x.id) + for production in production_all: for special in production.technology_design_ids: if special.process_parameters_id.gain_way == '外协': product_id_to_production_names = {} grouped_product_ids = {k: list(g) for k, g in - groupby(special.production_id, key=lambda x: x.product_id.id)} - for product_id, production in grouped_product_ids.items(): - product_id_to_production_names[product_id] = [p.name for p in production] + groupby(production_all, key=lambda x: x.product_id.id)} + for product_id, pd in grouped_product_ids.items(): + product_id_to_production_names[product_id] = [p.name for p in pd] self.env['purchase.order'].get_purchase_order(special.process_parameters_id, special.production_id, product_id_to_production_names) # 外协出入库单处理 - def get_subcontract_pick(self): - for production in self: + def get_subcontract_pick_purchase(self): + production_all = self.sorted(lambda x: x.id) + product_id_to_production_names = {} + grouped_product_ids = {k: list(g) for k, g in + groupby(production_all, key=lambda x: x.product_id.id)} + for product_id, pd in grouped_product_ids.items(): + product_id_to_production_names[product_id] = [p.name for p in pd] + for production in production_all: process_parameter_workorder = self.env['mrp.workorder'].search( [('surface_technics_parameters_id', '!=', False), ('production_id', '=', production.id), - ('is_subcontract', '=', True)]) + ('is_subcontract', '=', True)], order='sequence asc') if process_parameter_workorder: is_pick = False consecutive_workorders = [] m = 0 - sorted_workorders = sorted(process_parameter_workorder, key=lambda w: w.id) + sorted_workorders = sorted(process_parameter_workorder, key=lambda w: w.sequence) for i in range(len(sorted_workorders) - 1): if m == 0: is_pick = False @@ -653,6 +659,9 @@ class MrpProduction(models.Model): if m == len(consecutive_workorders) - 1 and m != 0: self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production) + self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, + production, + product_id_to_production_names) if sorted_workorders[i] in consecutive_workorders: is_pick = True consecutive_workorders = [] @@ -661,20 +670,35 @@ class MrpProduction(models.Model): if is_pick is False: self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], production) + self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, + production, + product_id_to_production_names) if m == len(consecutive_workorders) - 1 and m != 0: self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production) + self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, + production, + product_id_to_production_names) if sorted_workorders[i] in consecutive_workorders: is_pick = True consecutive_workorders = [] m = 0 if m == len(consecutive_workorders) - 1 and m != 0: self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production) + self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, + production, + product_id_to_production_names) if is_pick is False and m == 0: if len(sorted_workorders) == 1: self.env['stock.picking'].create_outcontract_picking(sorted_workorders, production) + self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, + production, + product_id_to_production_names) else: self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], production) + self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, + production, + product_id_to_production_names) # 工单排序 def _reset_work_order_sequence1(self, k): diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index b5abdf98..0ed8b4b0 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -182,10 +182,13 @@ class ResMrpWorkOrder(models.Model): def _compute_surface_technics_purchase_ids(self): for order in self: if order.routing_type == '表面工艺': - production_programming = self.env['mrp.production'].search( - [('origin', '=', order.production_id.origin)], order='name asc') - production_no_remanufacture = production_programming.filtered(lambda a: a.is_remanufacture is False) + if order.production_id.production_type == '自动化产线加工': + domain = [('programming_no', '=', order.production_id.programming_no)] + else: + domain = [('origin', '=', order.production_id.origin)] + production_programming = self.env['mrp.production'].search(domain, order='name asc') production_list = [production.name for production in production_programming] + production_no_remanufacture = production_programming.filtered(lambda a: a.is_remanufacture is False) technology_design = self.env['sf.technology.design'].search( [('process_parameters_id', '=', order.surface_technics_parameters_id.id), ('production_id', '=', order.production_id.id)]) @@ -205,8 +208,12 @@ class ResMrpWorkOrder(models.Model): def action_view_surface_technics_purchase(self): self.ensure_one() - production_programming = self.env['mrp.production'].search( - [('origin', '=', self.production_id.origin)], order='name asc') + if self.routing_type == '表面工艺': + if self.production_id.production_type == '自动化产线加工': + domain = [('programming_no', '=', self.production_id.programming_no)] + else: + domain = [('origin', '=', self.production_id.origin)] + production_programming = self.env['mrp.production'].search(domain, order='name asc') production_list = [production.name for production in production_programming] technology_design = self.env['sf.technology.design'].search( [('process_parameters_id', '=', self.surface_technics_parameters_id.id), @@ -702,6 +709,7 @@ class ResMrpWorkOrder(models.Model): 'operation_id': False, 'name': route.route_id.name, 'processing_panel': route.panel, + 'sequence': route.sequence, 'quality_point_ids': route.route_id.quality_point_ids, 'routing_type': route.route_id.routing_type, 'workcenter_id': self.env['mrp.routing.workcenter'].get_workcenter(route.route_id.workcenter_ids.ids, @@ -750,6 +758,7 @@ class ResMrpWorkOrder(models.Model): 'operation_id': False, 'name': route.process_parameters_id.display_name, 'processing_panel': '', + 'sequence': route.sequence, 'routing_type': '表面工艺', 'surface_technics_parameters_id': route.process_parameters_id.id, 'work_state': '', @@ -932,7 +941,7 @@ class ResMrpWorkOrder(models.Model): if (workorder.sequence == 1 and not workorder.blocked_by_workorder_ids) or ( workorder.blocked_by_workorder_ids.state in ('done', 'cancel')) or ( previous_workorder.state in ( - 'done', 'cancel') and not workorder.blocked_by_workorder_ids): + 'done', 'cancel') and not workorder.blocked_by_workorder_ids): workorder.state = 'ready' continue if workorder.production_id.schedule_state == '未排' and workorder.state in ('waiting', 'ready'): @@ -1012,7 +1021,7 @@ class ResMrpWorkOrder(models.Model): 'done', 'rework', 'cancel']: if workorder.production_id.is_rework is False: - if re_work or cnc_workorder or unclamp_workorder : + if re_work or cnc_workorder or unclamp_workorder: workorder.state = 'ready' # if (re_work or cnc_workorder) and workorder.production_id.is_rework is False: # workorder.state = 'ready' @@ -1220,8 +1229,8 @@ class ResMrpWorkOrder(models.Model): # if record.is_rework is False: # if not record.material_center_point: # raise UserError("坯料中心点为空,请检查") - # if record.X_deviation_angle <= 0: - # raise UserError("X偏差角度小于等于0,请检查!本次计算的X偏差角度为:%s" % record.X_deviation_angle) + # if record.X_deviation_angle <= 0: + # raise UserError("X偏差角度小于等于0,请检查!本次计算的X偏差角度为:%s" % record.X_deviation_angle) record.process_state = '待加工' # record.write({'process_state': '待加工'}) record.production_id.process_state = '待加工' diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 0283df22..cd06db48 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -299,130 +299,74 @@ class StockRule(models.Model): ('origin', '=', production_item.origin)], limit=1, order='id asc') if production_item.product_id.id in product_id_to_production_names: - if production_item.product_id.model_process_parameters_ids: - is_purchase = False - sorted_process_parameters = sorted(production_item.product_id.model_process_parameters_ids, - key=lambda w: w.id) - - consecutive_process_parameters = [] - m = 0 - for i in range(len(sorted_process_parameters) - 1): - if m == 0: - is_purchase = False - if self.env['product.template']._get_process_parameters_product( - sorted_process_parameters[i]).partner_id == self.env[ - 'product.template']._get_process_parameters_product(sorted_process_parameters[ - i + 1]).partner_id and \ - sorted_process_parameters[i].gain_way == '外协': - if sorted_process_parameters[i] not in consecutive_process_parameters: - consecutive_process_parameters.append(sorted_process_parameters[i]) - consecutive_process_parameters.append(sorted_process_parameters[i + 1]) - m += 1 - continue + # 同一个产品多个制造订单对应一个编程单和模型库 + # 只调用一次fetchCNC,并将所有生产订单的名称作为字符串传递 + if not production_item.programming_no and production.production_type == '自动化产线加工': + if not production_programming.programming_no: + production_item.fetchCNC( + ', '.join(product_id_to_production_names[production_item.product_id.id])) + else: + production_item.write({'programming_no': production_programming.programming_no, + 'programming_state': '编程中'}) + if not technology_design_values: + if production_item.product_id.categ_id.type == '成品': + production_item.product_id.model_processing_panel = 'ZM,FM' + # 根据加工面板的面数及成品工序模板生成工序设计 + i = 0 + for k in (production_item.product_id.model_processing_panel.split(',')): + # 新增的成品工序模版暂未添加,后续添加 + if production_item.production_type == '自动化产线加工': + model = 'sf.product.model.type.routing.sort' else: - if m == len(consecutive_process_parameters) - 1 and m != 0: - self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, - production_item, - product_id_to_production_names) - if sorted_process_parameters[i] in consecutive_process_parameters: - is_purchase = True - consecutive_process_parameters = [] - m = 0 - # 当前面的连续外协采购单生成再生成当前外协采购单 - if is_purchase is False: - self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, - production_item, - product_id_to_production_names) - if m == len(consecutive_process_parameters) - 1 and m != 0: - self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, - production_item, - product_id_to_production_names) - if sorted_process_parameters[i] in consecutive_process_parameters: - is_purchase = True - consecutive_process_parameters = [] - m = 0 - if m == len(consecutive_process_parameters) - 1 and m != 0: - self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, - production_item, - product_id_to_production_names) - if is_purchase is False and m == 0: - if len(sorted_process_parameters) == 1: - self.env['purchase.order'].get_purchase_order(sorted_process_parameters, - production_item, - product_id_to_production_names) - else: - self.env['purchase.order'].get_purchase_order(sorted_process_parameters[i], - production_item, - product_id_to_production_names) - if not technology_design_values: - if production.product_id.categ_id.type == '成品': - production.product_id.model_processing_panel = 'ZM,FM' - # 根据加工面板的面数及成品工序模板生成工序设计 - i = 0 - for k in (production.product_id.model_processing_panel.split(',')): - # 新增的成品工序模版暂未添加,后续添加 - if production.production_type == '自动化产线加工': - model = 'sf.product.model.type.routing.sort' - else: - model = 'sf.product.model.type.routing.sort' - product_routing_workcenter = self.env[model].search( - [('product_model_type_id', '=', production.product_id.product_model_type_id.id)], - order='sequence asc' - ) - for route in product_routing_workcenter: - i += 1 - technology_design_values.append( - self.env['sf.technology.design'].json_technology_design_str(k, route, i, False)) - elif production.product_id.categ_id.type == '坯料': - embryo_routing_workcenter = self.env['sf.embryo.model.type.routing.sort'].search( - [('embryo_model_type_id', '=', production.product_id.embryo_model_type_id.id)], + model = 'sf.product.model.type.routing.sort' + product_routing_workcenter = self.env[model].search( + [('product_model_type_id', '=', production_item.product_id.product_model_type_id.id)], order='sequence asc' ) - for route_embryo in embryo_routing_workcenter: + for route in product_routing_workcenter: i += 1 technology_design_values.append( - self.env['sf.technology.design'].json_technology_design_str(False, route_embryo, i, - False)) - surface_technics_arr = [] - route_workcenter_arr = [] - for item in production.product_id.product_model_type_id.surface_technics_routing_tmpl_ids: - if item.route_workcenter_id.surface_technics_id.id: - for process_param in production.product_id.model_process_parameters_ids: - if item.route_workcenter_id.surface_technics_id == process_param.process_id: - surface_technics_arr.append( - item.route_workcenter_id.surface_technics_id.id) - route_workcenter_arr.append(item.route_workcenter_id.id) - if surface_technics_arr: - production_process = self.env['sf.production.process'].search( - [('id', 'in', surface_technics_arr)], - order='sequence asc' - ) - for p in production_process: - logging.info('production_process:%s' % p.name) - process_parameter = production.product_id.model_process_parameters_ids.filtered( - lambda pm: pm.process_id.id == p.id) - if process_parameter: - i += 1 - route_production_process = self.env[ - 'mrp.routing.workcenter'].search( - [('surface_technics_id', '=', p.id), - ('id', 'in', route_workcenter_arr)]) - technology_design_values.append( - self.env['sf.technology.design'].json_technology_design_str(False, - route_production_process, - i, - process_parameter)) + self.env['sf.technology.design'].json_technology_design_str(k, route, i, False)) + elif production.product_id.categ_id.type == '坯料': + embryo_routing_workcenter = self.env['sf.embryo.model.type.routing.sort'].search( + [('embryo_model_type_id', '=', production_item.product_id.embryo_model_type_id.id)], + order='sequence asc' + ) + for route_embryo in embryo_routing_workcenter: + i += 1 + technology_design_values.append( + self.env['sf.technology.design'].json_technology_design_str(False, route_embryo, i, + False)) + surface_technics_arr = [] + route_workcenter_arr = [] + for item in production_item.product_id.product_model_type_id.surface_technics_routing_tmpl_ids: + if item.route_workcenter_id.surface_technics_id.id: + for process_param in production_item.product_id.model_process_parameters_ids: + if item.route_workcenter_id.surface_technics_id == process_param.process_id: + surface_technics_arr.append( + item.route_workcenter_id.surface_technics_id.id) + route_workcenter_arr.append(item.route_workcenter_id.id) + if surface_technics_arr: + production_process = self.env['sf.production.process'].search( + [('id', 'in', surface_technics_arr)], + order='sequence asc' + ) + for p in production_process: + logging.info('production_process:%s' % p.name) + process_parameter = production_item.product_id.model_process_parameters_ids.filtered( + lambda pm: pm.process_id.id == p.id) + if process_parameter: + i += 1 + route_production_process = self.env[ + 'mrp.routing.workcenter'].search( + [('surface_technics_id', '=', p.id), + ('id', 'in', route_workcenter_arr)]) + technology_design_values.append( + self.env['sf.technology.design'].json_technology_design_str(False, + route_production_process, + i, + process_parameter)) productions.technology_design_ids = technology_design_values - - # 同一个产品多个制造订单对应一个编程单和模型库 - # 只调用一次fetchCNC,并将所有生产订单的名称作为字符串传递 - # if not production_item.programming_no and production.production_type == '自动化产线加工': - # if not production_programming.programming_no: - # production_item.fetchCNC( - # ', '.join(product_id_to_production_names[production_item.product_id.id])) - # else: - # production_item.write({'programming_no': production_programming.programming_no, - # 'programming_state': '编程中'}) return True diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml index 46d90fdd..d50c600b 100644 --- a/sf_manufacturing/views/mrp_production_addional_change.xml +++ b/sf_manufacturing/views/mrp_production_addional_change.xml @@ -347,16 +347,17 @@ - + + - + - +