diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 3384ab4c..a3ad4bcd 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -6,7 +6,7 @@ import os import re import requests from itertools import groupby -from odoo import api, fields, models, _ +from odoo import api, fields, models, SUPERUSER_ID, _ from odoo.exceptions import UserError, ValidationError from odoo.addons.sf_base.commons.common import Common from odoo.tools import float_compare, float_round, float_is_zero, format_datetime @@ -794,6 +794,21 @@ class MrpProduction(models.Model): }) return action + # 返工 + def button_scrap_new(self): + cloud_programming = self._cron_get_programming_state() + return { + 'name': _('报废'), + 'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'res_model': 'sf.production.wizard', + 'target': 'new', + 'context': { + 'default_production_id': self.id, + 'default_programming_state': cloud_programming['programming_state'] + } + } + # 返工 def button_rework(self): cloud_programming = None @@ -923,39 +938,64 @@ class MrpProduction(models.Model): 重新生成制造订单 """ if self.is_scrap is True: - sale_order = self.env['sale.order'].sudo().search([('name', '=', productions.origin)]) - values = self.env['mrp.production'].create_production1_values(self.production_id) + sale_order = self.env['sale.order'].sudo().search([('name', '=', self.origin)]) + values = self.env['mrp.production'].create_production1_values(self) productions = self.env['mrp.production'].with_user(SUPERUSER_ID).sudo().with_company( - self.production_id.company_id).create( + self.company_id).create( values) # self.env['stock.move'].sudo().create(productions._get_moves_raw_values()) self.env['stock.move'].sudo().create(productions._get_moves_finished_values()) - productions._create_workorder(item) - productions.filtered(lambda p: (not p.orderpoint_id and p.move_raw_ids) or \ - ( - p.move_dest_ids.procure_method != 'make_to_order' and - not p.move_raw_ids and not p.workorder_ids)).action_confirm() - for production_item in productions: - process_parameter_workorder = self.env['mrp.workorder'].search( - [('surface_technics_parameters_id', '!=', False), ('production_id', '=', production_item.id), - ('is_subcontract', '=', True)]) - if process_parameter_workorder: - is_pick = False - consecutive_workorders = [] - m = 0 - sorted_workorders = sorted(process_parameter_workorder, key=lambda w: w.id) - for i in range(len(sorted_workorders) - 1): - if m == 0: - is_pick = False - if sorted_workorders[i].supplier_id.id == sorted_workorders[i + 1].supplier_id.id and \ - sorted_workorders[i].is_subcontract == sorted_workorders[i + 1].is_subcontract and \ - sorted_workorders[i].id == sorted_workorders[i + 1].id - 1: - if sorted_workorders[i] not in consecutive_workorders: - consecutive_workorders.append(sorted_workorders[i]) - consecutive_workorders.append(sorted_workorders[i + 1]) - m += 1 - continue - else: + productions.programming_no = self.programming_no + scarp_process_parameter_workorder = self.env['mrp.workorder'].search( + [('surface_technics_parameters_id', '!=', False), ('production_id', '=', self.id), + ('is_subcontract', '=', True)]) + if scarp_process_parameter_workorder: + production_programming = self.env['mrp.production'].search( + [('programming_no', '=', self.production_id.programming_no)], order='name asc') + production_list = [production.name for production in production_programming] + purchase_orders = self.env['purchase.order'].search([('origin', '=', ','.join(production_list))]) + for purchase_item in purchase_orders.order_line: + for process_item in scarp_process_parameter_workorder: + if purchase_item.product_id.categ_type == '表面工艺': + if purchase_item.product_id.server_product_process_parameters_id == process_item.surface_technics_parameters_id: + print(purchase_orders.find(productions.name)) + if purchase_orders.find(productions.name) == -1: + purchase_orders.origin += productions.name + if item['is_reprogramming'] is False: + productions._create_workorder(item) + productions.programming_state = '已编程' + for production_item in productions: + process_parameter_workorder = self.env['mrp.workorder'].search( + [('surface_technics_parameters_id', '!=', False), ('production_id', '=', production_item.id), + ('is_subcontract', '=', True)]) + if process_parameter_workorder: + is_pick = False + consecutive_workorders = [] + m = 0 + sorted_workorders = sorted(process_parameter_workorder, key=lambda w: w.id) + for i in range(len(sorted_workorders) - 1): + if m == 0: + is_pick = False + if sorted_workorders[i].supplier_id.id == sorted_workorders[i + 1].supplier_id.id and \ + sorted_workorders[i].is_subcontract == sorted_workorders[i + 1].is_subcontract and \ + sorted_workorders[i].id == sorted_workorders[i + 1].id - 1: + if sorted_workorders[i] not in consecutive_workorders: + consecutive_workorders.append(sorted_workorders[i]) + consecutive_workorders.append(sorted_workorders[i + 1]) + m += 1 + continue + else: + if m == len(consecutive_workorders) - 1 and m != 0: + self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, + production_item) + if sorted_workorders[i] in consecutive_workorders: + is_pick = True + consecutive_workorders = [] + m = 0 + # 当前面的连续工序生成对应的外协出入库单再生成当前工序的外协出入库单 + if is_pick is False: + self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], + production_item) if m == len(consecutive_workorders) - 1 and m != 0: self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production_item) @@ -963,25 +1003,22 @@ class MrpProduction(models.Model): is_pick = True consecutive_workorders = [] m = 0 - # 当前面的连续工序生成对应的外协出入库单再生成当前工序的外协出入库单 - if is_pick is False: - self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], - production_item) if m == len(consecutive_workorders) - 1 and m != 0: self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production_item) - 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_item) - if is_pick is False and m == 0: - if len(sorted_workorders) == 1: - self.env['stock.picking'].create_outcontract_picking(sorted_workorders, production_item) - else: - self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], production_item) + if is_pick is False and m == 0: + if len(sorted_workorders) == 1: + self.env['stock.picking'].create_outcontract_picking(sorted_workorders, production_item) + else: + self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], + production_item) + else: + productions.programming_state = '编程中' + productions.filtered(lambda p: (not p.orderpoint_id and p.move_raw_ids) or \ + ( + p.move_dest_ids.procure_method != 'make_to_order' and + not p.move_raw_ids and not p.workorder_ids)).action_confirm() for production in productions: origin_production = production.move_dest_ids and production.move_dest_ids[ 0].raw_material_production_id or False @@ -1011,9 +1048,8 @@ class MrpProduction(models.Model): workorder_duration += workorder.duration_expected if sale_order: - sale_order.mrp_production_ids |= productions - # sale_order.write({'schedule_status': 'to schedule'}) - self.env['sf.production.plan'].sudo().with_company(self.production_id.company_id).create({ + # sale_order.mrp_production_ids |= productions + self.env['sf.production.plan'].sudo().with_company(self.company_id).create({ 'name': productions.name, 'order_deadline': sale_order.deadline_of_delivery, 'production_id': productions.id, @@ -1026,7 +1062,7 @@ class MrpProduction(models.Model): return productions # 在之前的销售单上重新生成制造订单 - def create_production1_values(self, production, sale_order): + def create_production1_values(self, production): production_values_str = {'origin': production.origin, 'product_id': production.product_id.id, 'product_description_variants': production.product_description_variants, @@ -1038,7 +1074,8 @@ class MrpProduction(models.Model): 'date_deadline': production.date_deadline, 'date_planned_start': production.date_planned_start, 'date_planned_finished': production.date_planned_finished, - 'procurement_group_id': sale_order.id, + # 'procurement_group_id': self.env["procurement.group"].create( + # {'name': production.name}).id, 'propagate_cancel': production.propagate_cancel, 'orderpoint_id': production.orderpoint_id.id, 'picking_type_id': production.picking_type_id.id, diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml index 5825cb9f..b1c1ff1e 100644 --- a/sf_manufacturing/views/mrp_production_addional_change.xml +++ b/sf_manufacturing/views/mrp_production_addional_change.xml @@ -128,7 +128,7 @@ attrs="{'invisible': ['|',('state', '!=', 'rework'),('programming_state', '!=', '已编程未下发')]}"/> - diff --git a/sf_manufacturing/wizard/production_wizard.py b/sf_manufacturing/wizard/production_wizard.py index 28a43419..35f3fa01 100644 --- a/sf_manufacturing/wizard/production_wizard.py +++ b/sf_manufacturing/wizard/production_wizard.py @@ -13,56 +13,73 @@ class ProductionWizard(models.TransientModel): production_id = fields.Many2one('mrp.production', string='制造订单号') is_reprogramming = fields.Boolean(string='申请重新编程', default=True) is_remanufacture = fields.Boolean(string='重新生成制造订单', default=True) + programming_state = fields.Selection( + [('待编程', '待编程'), ('编程中', '编程中'), ('已编程', '已编程'), ('已编程未下发', '已编程未下发'), + ('已下发', '已下发')], + string='编程状态') def confirm(self): - if self.is_reprogramming is True: - self.production_id.update_programming_state() + self.production_id.action_cancel() + self.production_id.detection_result_ids.write({'handle_result': '已处理'}) + self.production_id.write({'state': 'cancel', 'scrap_ids': [(0, 0, { + 'name': self.env['ir.sequence'].next_by_code('stock.scrap') or _('New'), + 'product_id': self.production_id.product_id.id, + 'scrap_qty': 1, + 'lot_id': self.production_id.move_line_raw_ids.lot_id.id, + 'location_id': self.production_id.move_raw_ids.filtered(lambda x: x.state not in ( + 'done', + 'cancel')) and self.production_id.location_src_id.id or self.production_id.location_dest_id.id, + 'scrap_location_id': self.env['stock.scrap']._get_default_scrap_location_id(), + 'state': 'done'})]}) if self.is_remanufacture is True: - ret = {'programming_list': []} - scrap_cnc = self.production_id.workorder_ids.filtered(lambda crw: crw.routing_type == 'CNC加工').cnc_ids - scrap_cmm = self.production_id.workorder_ids.filtered(lambda cm: cm.routing_type == 'CNC加工').cmm_ids - for item_line in scrap_cnc: - vals = { - 'sequence_number': item_line.sequence_number, - 'program_name': item_line.program_name, - 'cutting_tool_name': item_line.cutting_tool_name, - 'cutting_tool_no': item_line.cutting_tool_no, - 'processing_type': item_line.processing_type, - 'margin_x_y': item_line.margin_x_y, - 'margin_z': item_line.margin_z, - 'depth_of_processing_z': item_line.depth_of_processing_z, - 'cutting_tool_extension_length': item_line.cutting_tool_extension_length, - 'estimated_processing_time': item_line.estimated_processing_time, - 'cutting_tool_handle_type': item_line.cutting_tool_handle_type, - 'ftp_path': item_line.program_path, - 'processing_panel': item_line.workorder_id.processing_panel, - 'program_create_date': datetime.strftime(item_line.program_create_date, - '%Y-%m-%d %H:%M:%S'), - 'remark': item_line.remark - } - ret['programming_list'].append(vals) - for cmm_line in scrap_cmm: - vals = { - 'sequence_number': cmm_line.sequence_number, - 'program_name': cmm_line.program_name, - 'ftp_path': cmm_line.program_path, - 'processing_panel': item_line.workorder_id.processing_panel, - 'program_create_date': datetime.strftime( - cmm_line.program_create_date, - '%Y-%m-%d %H:%M:%S') - } - ret['programming_list'].append(vals) + ret = {'programming_list': [], 'is_reprogramming': self.is_reprogramming} + if self.is_reprogramming is True: + self.production_id.update_programming_state() + else: + scrap_cnc = self.production_id.workorder_ids.filtered(lambda crw: crw.routing_type == 'CNC加工').cnc_ids + scrap_cmm = self.production_id.workorder_ids.filtered(lambda cm: cm.routing_type == 'CNC加工').cmm_ids + for item_line in scrap_cnc: + vals = { + 'sequence_number': item_line.sequence_number, + 'program_name': item_line.program_name, + 'cutting_tool_name': item_line.cutting_tool_name, + 'cutting_tool_no': item_line.cutting_tool_no, + 'processing_type': item_line.processing_type, + 'margin_x_y': item_line.margin_x_y, + 'margin_z': item_line.margin_z, + 'depth_of_processing_z': item_line.depth_of_processing_z, + 'cutting_tool_extension_length': item_line.cutting_tool_extension_length, + 'estimated_processing_time': item_line.estimated_processing_time, + 'cutting_tool_handle_type': item_line.cutting_tool_handle_type, + 'ftp_path': item_line.program_path, + 'processing_panel': item_line.workorder_id.processing_panel, + 'program_create_date': datetime.strftime(item_line.program_create_date, + '%Y-%m-%d %H:%M:%S'), + 'remark': item_line.remark + } + ret['programming_list'].append(vals) + for cmm_line in scrap_cmm: + vals = { + 'sequence_number': cmm_line.sequence_number, + 'program_name': cmm_line.program_name, + 'ftp_path': cmm_line.program_path, + 'processing_panel': item_line.workorder_id.processing_panel, + 'program_create_date': datetime.strftime( + cmm_line.program_create_date, + '%Y-%m-%d %H:%M:%S') + } + ret['programming_list'].append(vals) new_production = self.production_id.recreateManufacturing(ret) if self.is_reprogramming is False: - for panel in new_production.product_id.model_processing_panel: + for panel in new_production.product_id.model_processing_panel.split(','): scrap_cnc_workorder = max( self.production_id.workorder_ids.filtered( lambda - scn: scn.processing_panel == panel.name and scn.cnc_worksheet and scn.routing_type == 'CNC加工'), + scn: scn.processing_panel == panel and scn.routing_type == 'CNC加工'), key=lambda w: w.create_date) scrap_pre_workorder = max(self.production_id.workorder_ids.filtered( lambda - pr: pr.processing_panel == panel.name and pr.processing_drawing and pr.routing_type == '装夹预调'), + pr: pr.processing_panel == panel and pr.routing_type == '装夹预调'), key=lambda w1: w1.create_date) new_cnc_workorder = new_production.workorder_ids.filtered( lambda @@ -71,16 +88,3 @@ class ProductionWizard(models.TransientModel): new_pre_workorder = new_production.workorder_ids.filtered(lambda p: p.routing_type == '装夹预调' and p.processing_panel == panel) new_pre_workorder.write({'processing_drawing': scrap_pre_workorder.processing_drawing}) - - -if new_pre_workorder: - self.production_id.action_cancel() - self.production_id.detection_result_ids.write({'handle_result': '已处理'}) - self.production_id.write({'state': 'cancel', 'scrap_ids': [(0, 0, { - 'name': self.env['ir.sequence'].next_by_code('stock.scrap') or _('New'), - 'product_id': self.production_id.product_id.id, - 'scrap_qty': 1, - 'lot_id': self.production_id.move_line_raw_ids.lot_id.id, - 'location_id': self.production_id.move_raw_ids.filtered(lambda x: x.state not in ( - 'done', 'cancel')) and self.production_id.location_src_id.id or self.production_id.location_dest_id.id, - 'scrap_location_id': self.env['stock.scrap']._get_default_scrap_location_id(), 'state': 'done'})]}) diff --git a/sf_manufacturing/wizard/production_wizard_views.xml b/sf_manufacturing/wizard/production_wizard_views.xml index 5ce6d43a..9c4dc190 100644 --- a/sf_manufacturing/wizard/production_wizard_views.xml +++ b/sf_manufacturing/wizard/production_wizard_views.xml @@ -7,13 +7,16 @@