diff --git a/sf_base/models/tool_base_new.py b/sf_base/models/tool_base_new.py index 7977ed80..98eea36c 100644 --- a/sf_base/models/tool_base_new.py +++ b/sf_base/models/tool_base_new.py @@ -331,7 +331,7 @@ class ToolInventory(models.Model): work_material = fields.Selection([('钢', '钢'), ('铝', '铝')], string='加工材料') life_span = fields.Float('寿命(min)') - tool_groups_id = fields.Many2one('sf.tool.groups', string='刀具组') + tool_groups_id = fields.Many2one('sf.tool.groups', string='刀具组', required=True) active = fields.Boolean('已归档', default=True) diff --git a/sf_base/views/tool_views.xml b/sf_base/views/tool_views.xml index 1e82b8c2..fff58007 100644 --- a/sf_base/views/tool_views.xml +++ b/sf_base/views/tool_views.xml @@ -555,9 +555,9 @@ sf.tool.inventory - + - + diff --git a/sf_machine_connect/views/compensation.xml b/sf_machine_connect/views/compensation.xml index 016f3821..07173c17 100644 --- a/sf_machine_connect/views/compensation.xml +++ b/sf_machine_connect/views/compensation.xml @@ -5,39 +5,46 @@ mrp.workorder - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index aa1ffae0..15a77160 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -531,46 +531,63 @@ class MrpProduction(models.Model): def _reset_work_order_sequence(self): for rec in self: sequence_list = {} + # 产品模型类型 model_type_id = rec.product_id.product_model_type_id + # 产品加工面板 + model_processing_panel = rec.product_id.model_processing_panel if model_type_id: - tmpl_num = 1 - # 成品工序 - product_routing_tmpl_ids = model_type_id.product_routing_tmpl_ids - if product_routing_tmpl_ids: - for tmpl_id in product_routing_tmpl_ids: - sequence_list.update({tmpl_id.route_workcenter_id.name: tmpl_num}) - tmpl_num += 1 - # 表面工艺工序 - # 模型类型的表面工艺工序模版 - surface_tmpl_ids = model_type_id.surface_technics_routing_tmpl_ids - # 产品选择的表面工艺 - model_process_parameters_ids = rec.product_id.model_process_parameters_ids - process_dict = {} - if model_process_parameters_ids: - for process_parameters_id in model_process_parameters_ids: - process_id = process_parameters_id.process_id - for surface_tmpl_id in surface_tmpl_ids: - if process_id == surface_tmpl_id.route_workcenter_id.surface_technics_id: - surface_tmpl_name = surface_tmpl_id.route_workcenter_id.name - process_dict.update({int(process_id.category_id.code): '%s-%s' % ( - surface_tmpl_name, process_parameters_id.name)}) - process_list = sorted(process_dict.keys()) - for process_num in process_list: - sequence_list.update({process_dict.get(process_num): tmpl_num}) - tmpl_num += 1 - # 坯料工序 - tmpl_num = 1 - embryo_routing_tmpl_ids = model_type_id.embryo_routing_tmpl_ids - if embryo_routing_tmpl_ids: - for tmpl_id in embryo_routing_tmpl_ids: - sequence_list.update({tmpl_id.route_workcenter_id.name: tmpl_num}) + if model_processing_panel: + tmpl_num = 1 + panel_list = model_processing_panel.split(',') + for panel in panel_list: + panel_sequence_list = {} + # 成品工序 + product_routing_tmpl_ids = model_type_id.product_routing_tmpl_ids + if product_routing_tmpl_ids: + for tmpl_id in product_routing_tmpl_ids: + panel_sequence_list.update({tmpl_id.route_workcenter_id.name: tmpl_num}) + tmpl_num += 1 + sequence_list.update({panel: panel_sequence_list}) + # 表面工艺工序 + # 模型类型的表面工艺工序模版 + surface_tmpl_ids = model_type_id.surface_technics_routing_tmpl_ids + # 产品选择的表面工艺 + model_process_parameters_ids = rec.product_id.model_process_parameters_ids + process_dict = {} + if model_process_parameters_ids: + for process_parameters_id in model_process_parameters_ids: + process_id = process_parameters_id.process_id + for surface_tmpl_id in surface_tmpl_ids: + if process_id == surface_tmpl_id.route_workcenter_id.surface_technics_id: + surface_tmpl_name = surface_tmpl_id.route_workcenter_id.name + process_dict.update({int(process_id.category_id.code): '%s-%s' % ( + surface_tmpl_name, process_parameters_id.name)}) + process_list = sorted(process_dict.keys()) + for process_num in process_list: + sequence_list.update({process_dict.get(process_num): tmpl_num}) tmpl_num += 1 + # 坯料工序 + tmpl_num = 1 + embryo_routing_tmpl_ids = model_type_id.embryo_routing_tmpl_ids + if embryo_routing_tmpl_ids: + for tmpl_id in embryo_routing_tmpl_ids: + sequence_list.update({tmpl_id.route_workcenter_id.name: tmpl_num}) + tmpl_num += 1 + else: + raise ValidationError('该产品【加工面板】为空!') + else: raise ValidationError('该产品没有选择【模版类型】!') for work in rec.workorder_ids: if sequence_list.get(work.name): work.sequence = sequence_list[work.name] + elif sequence_list.get(work.processing_panel): + processing_panel = sequence_list.get(work.processing_panel) + if processing_panel.get(work.name): + work.sequence = processing_panel[work.name] + else: + raise ValidationError('工序【%s】在产品选择的模版类型中不存在!' % work.name) else: raise ValidationError('工序【%s】在产品选择的模版类型中不存在!' % work.name) # if work.name == '获取CNC加工程序': diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index b5ed8334..8cc7b1f9 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -1090,8 +1090,15 @@ class ResMrpWorkOrder(models.Model): r = r.json() result = json.loads(r['result']) if result['status'] == 1: - self.write({'is_send_program_again': True}) - self.production_id.write({'work_state': '编程中', 'programming_state': '编程中'}) + productions = self.env['mrp.production'].search( + [('programming_no', '=', self.production_id.programming_no), ('programming_state', '=', '已编程')]) + if productions: + workorder = productions.workorder_ids.filtered( + lambda ap: ap.routing_type in ['装夹预调', 'CNC加工'] and ap.state not in ['done', 'cancel', + 'progress']) + if workorder: + workorder.write({'is_send_program_again': True}) + productions.write({'work_state': '编程中', 'programming_state': '编程中'}) else: raise UserError(result['message']) except Exception as e: diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml index 55dbbe33..e1d0d28c 100644 --- a/sf_manufacturing/views/mrp_production_addional_change.xml +++ b/sf_manufacturing/views/mrp_production_addional_change.xml @@ -62,16 +62,17 @@ - - - progress,pending_cam,pending_processing,pending_era_cam,completed,done + + + + progress,pending_cam,pending_processing,pending_era_cam,completed,done - + - + @@ -281,7 +282,7 @@ + groups="sf_base.group_sf_mrp_user" confirm="是否确认开始?"/> + groups="sf_base.group_sf_mrp_user" + confirm="是否确认完成?"/> - - - - + + + + + groups="sf_base.group_sf_mrp_user" confirm="是否确认完成?"/> + groups="sf_base.group_sf_order_user,sf_base.group_sf_equipment_user" + attrs="{'invisible': ['|', '|', '|',('routing_type','!=','装夹预调'),('state','in',['done', 'cancel', + 'progress']),('cnc_worksheet','=',False),('is_send_program_again','=',True)]}"/> @@ -219,12 +221,12 @@ attrs='{"invisible": [("routing_type","in",("获取CNC加工程序","切割"))]}'/> - - - - - - + + + + + + @@ -530,7 +532,7 @@ - + diff --git a/sf_mrs_connect/controllers/controllers.py b/sf_mrs_connect/controllers/controllers.py index 2ac534a8..5102efdb 100644 --- a/sf_mrs_connect/controllers/controllers.py +++ b/sf_mrs_connect/controllers/controllers.py @@ -72,7 +72,8 @@ class Sf_Mrs_Connect(http.Controller): panel_file_path = os.path.join(program_path_tmp_panel, file) logging.info('panel_file_path:%s' % panel_file_path) cnc_workorder.write( - {'cnc_ids': cnc_workorder.cnc_ids.sudo()._json_cnc_processing(panel, ret), + {'is_send_program_again': False, + 'cnc_ids': cnc_workorder.cnc_ids.sudo()._json_cnc_processing(panel, ret), 'cmm_ids': cnc_workorder.cmm_ids.sudo()._json_cmm_program(panel, ret), 'cnc_worksheet': base64.b64encode(open(panel_file_path, 'rb').read())}) pre_workorder = production.workorder_ids.filtered( @@ -80,7 +81,8 @@ class Sf_Mrs_Connect(http.Controller): 'cancel'] and ap.processing_panel == panel) if pre_workorder: pre_workorder.write( - {'processing_drawing': base64.b64encode(open(panel_file_path, 'rb').read())}) + {'is_send_program_again': False, + 'processing_drawing': base64.b64encode(open(panel_file_path, 'rb').read())}) productions.write({'programming_state': '已编程', 'work_state': '已编程'}) cnc_program_ids = [item.id for item in productions] workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search( diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index 8daf1488..61156536 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -581,6 +581,15 @@ class FunctionalToolAssembly(models.Model): active = fields.Boolean(string='已归档', default=True) + def action_open_reference1(self): + self.ensure_one() + return { + 'res_model': self._name, + 'type': 'ir.actions.act_window', + 'views': [[False, "form"]], + 'res_id': self.id, + } + def put_start_preset(self): self.search([('start_preset_bool', '=', True)]).write({'start_preset_bool': False}) self.write({ @@ -750,7 +759,8 @@ class FunctionalToolDismantle(models.Model): return 'GNDJ-CJD-%s-%s' % (datetime, num) functional_tool_id = fields.Many2one('sf.functional.cutting.tool.entity', '功能刀具', required=True, - domain=[('functional_tool_status', '!=', '已拆除')]) + domain=[('functional_tool_status', '!=', '已拆除'), + ('current_location', '=', '刀具房')]) tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', store=True, compute='_compute_functional_tool_num') tool_groups_id = fields.Many2one('sf.tool.groups', '刀具组', compute='_compute_functional_tool_num', store=True) @@ -1028,7 +1038,7 @@ class ProductProduct(models.Model): 'product_id': self.id, 'lot_id': lot_id.id, 'move_id': stock_move_id.id, - 'destination_location_id': shelf_location_id.id, + 'destination_location_id': shelf_location_id.id if shelf_location_id else False, 'install_tool_time': fields.Datetime.now(), 'qty_done': 1.0, 'state': 'done', diff --git a/sf_tool_management/models/functional_tool.py b/sf_tool_management/models/functional_tool.py index 45f52f4f..18f0a466 100644 --- a/sf_tool_management/models/functional_tool.py +++ b/sf_tool_management/models/functional_tool.py @@ -387,6 +387,22 @@ class StockMoveLine(models.Model): names = categories._search([], order=order, access_rights_uid=SUPERUSER_ID) return categories.browse(names) + def action_open_reference1(self): + self.ensure_one() + if self.functional_tool_name_id: + action = self.functional_tool_name_id.action_open_reference1() + return action + elif self.move_id: + action = self.move_id.action_open_reference() + if action['res_model'] != 'stock.move': + return action + return { + 'res_model': self._name, + 'type': 'ir.actions.act_window', + 'views': [[False, "form"]], + 'res_id': self.id, + } + class RealTimeDistributionOfFunctionalTools(models.Model): _name = 'sf.real.time.distribution.of.functional.tools' diff --git a/sf_tool_management/views/functional_tool_views.xml b/sf_tool_management/views/functional_tool_views.xml index 6d812368..6fde82a0 100644 --- a/sf_tool_management/views/functional_tool_views.xml +++ b/sf_tool_management/views/functional_tool_views.xml @@ -477,7 +477,8 @@ 功能刀具出入库记录 stock.move.line - +