diff --git a/sf_machine_connect/views/default_delivery.xml b/sf_machine_connect/views/default_delivery.xml index 62f1fcdc..b0890981 100644 --- a/sf_machine_connect/views/default_delivery.xml +++ b/sf_machine_connect/views/default_delivery.xml @@ -10,6 +10,7 @@ + diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index feb37787..8f2e5719 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -597,6 +597,7 @@ class CNCprocessing(models.Model): cnc_id = fields.Many2one('ir.attachment') sequence_number = fields.Char('序号') program_name = fields.Char('程序名') + functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型') cutting_tool_name = fields.Char('刀具名称') cutting_tool_no = fields.Char('刀号') processing_type = fields.Char('加工类型') diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index 97447936..f5995b86 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -1,9 +1,12 @@ # -*- coding: utf-8 -*- import re +import json +import requests from datetime import timedelta -from odoo import fields, models, api from odoo import SUPERUSER_ID +from odoo import fields, models, api from odoo.exceptions import ValidationError +from odoo.addons.sf_base.commons.common import Common class FunctionalCuttingToolEntity(models.Model): @@ -174,6 +177,34 @@ class FunctionalCuttingToolEntity(models.Model): ('coarse_middle_thin', '=', self.coarse_middle_thin)] return result + # ==========刀具组接口========== + def _register_functional_tool_groups(self, obj): + create_url = '/AutoDeviceApi/FeedBackOut' + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(obj, token, sf_secret_key) + strurl = sf_sync_config['sf_url'] + create_url + val = { + 'ToolName': obj.name, + 'GroupName': obj.tool_groups_id.name, + 'ToolId': obj.code + } + kw = json.dumps(val, ensure_ascii=False) + r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers) + ret = r.json() + if r == 200: + return "刀具组发送成功" + else: + raise ValidationError("刀具组发送失败") + + @api.model_create_multi + def create(self, vals): + obj = super(FunctionalCuttingToolEntity, self).create(vals) + # 调用刀具组接口 + self._register_functional_tool_groups(obj) + return obj + class FunctionalToolWarning(models.Model): _name = 'sf.functional.tool.warning' @@ -240,7 +271,7 @@ class FunctionalToolWarning(models.Model): class StockMoveLine(models.Model): _inherit = 'stock.move.line' _description = '功能刀具出入库记录' - _order = 'install_tool_time desc' + _order = 'date desc' functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称') functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', store=True, @@ -710,8 +741,39 @@ class CAMWorkOrderProgramKnifePlan(models.Model): 'applicant': None, 'sf_functional_tool_assembly_id': None}) - def create_cam_work_plan(self, **kw): - pass + def create_cam_work_plan(self, cnc_processing): + """ + 根据传入的工单信息,查询是否有需要的功能刀具,如果没有则生成CAM工单程序用刀计划 + """ + status = False + if cnc_processing.functional_tool_type_id and cnc_processing.cutting_tool_name: + functional_tools = self.env['sf.real.time.distribution.of.functional.tools'].sudo().search( + [('sf_cutting_tool_type_id', '=', cnc_processing.functional_tool_type_id.id), + ('name', '=', cnc_processing.cutting_tool_name)]) + if functional_tools: + for functional_tool in functional_tools: + if functional_tool.on_tool_stock_num == 0: + self.env['sf.cnc.processing'].register_cnc_processing(cnc_processing) + if functional_tool.tool_stock_num == 0 and functional_tool.side_shelf_num == 0: + status = True + else: + status = True + if status: + self.env['sf.cam.work.order.program.knife.plan'].sudo().create({ + 'name': cnc_processing.workorder_id.production_id.name, + 'cam_procedure_code': cnc_processing.program_name, + 'filename': cnc_processing.cnc_id.name, + 'functional_tool_type_id': cnc_processing.functional_tool_type_id.id, + 'functional_tool_name': cnc_processing.cutting_tool_name, + 'cam_cutter_spacing_code': cnc_processing.cutting_tool_no, + 'process_type': cnc_processing.processing_type, + 'margin_x_y': float(cnc_processing.margin_x_y), + 'margin_z': float(cnc_processing.margin_z), + 'finish_depth': float(cnc_processing.depth_of_processing_z), + 'extension_length': float(cnc_processing.cutting_tool_extension_length), + 'shank_model': cnc_processing.cutting_tool_handle_type, + 'estimated_processing_time': cnc_processing.estimated_processing_time, + }) class FunctionalToolAssembly(models.Model): diff --git a/sf_tool_management/models/mrp_workorder.py b/sf_tool_management/models/mrp_workorder.py new file mode 100644 index 00000000..63dd1029 --- /dev/null +++ b/sf_tool_management/models/mrp_workorder.py @@ -0,0 +1,38 @@ +import json +import requests +from odoo import fields, models, api +from odoo.exceptions import ValidationError +from odoo.addons.sf_base.commons.common import Common + + +class CNCprocessing(models.Model): + _inherit = 'sf.cnc.processing' + _description = 'CNC加工用刀检测' + + # ==========MES装刀指令接口========== + def register_cnc_processing(self, cnc_processing): + create_url = '/AutoDeviceApi/FeedBackOut' + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + strurl = sf_sync_config['sf_url'] + create_url + val = { + 'DeviceId': cnc_processing.workorder_id.machine_tool_name, + 'RfidCode': None, + 'ToolId': cnc_processing.cutting_tool_no + } + kw = json.dumps(val, ensure_ascii=False) + r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers) + ret = r.json() + if r == 200: + return "MES装刀指令发送成功" + else: + raise ValidationError("MES装刀指令发送失败") + + @api.model_create_multi + def create(self, vals): + obj = super(CNCprocessing, self).create(vals) + # 调用CAM工单程序用刀计划创建方法 + self.env['sf.cam.work.order.program.knife.plan'].create_cam_work_plan(obj) + return obj