From 3575f0c5c9a863a4a629f752b4333cb36b03ab13 Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Thu, 18 Jan 2024 17:33:54 +0800
Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=B7=A5=E5=8D=95=E7=9A=84cnc?=
=?UTF-8?q?=E5=8A=A0=E5=B7=A5=E6=A8=A1=E5=9E=8B=E6=B7=BB=E5=8A=A0=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD=E5=88=80=E5=85=B7=E7=B1=BB=E5=9E=8B=E5=AD=97=E6=AE=B5?=
=?UTF-8?q?=EF=BC=9B2=E3=80=81=E6=B7=BB=E5=8A=A0=E6=A0=B9=E6=8D=AE?=
=?UTF-8?q?=E5=88=80=E5=85=B7=E7=B1=BB=E5=9E=8B=E5=92=8C=E5=88=80=E5=85=B7?=
=?UTF-8?q?=E5=90=8D=E7=A7=B0=E6=A3=80=E7=B4=A2=E7=8E=B0=E6=9C=89=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD=E5=88=80=E5=85=B7=E6=98=AF=E5=90=A6=E6=BB=A1=E8=B6=B3?=
=?UTF-8?q?=E9=9C=80=E6=B1=82=EF=BC=8C=E5=A6=82=E6=9E=9C=E4=B8=8D=E6=BB=A1?=
=?UTF-8?q?=E8=B6=B3=E5=88=99=E5=88=9B=E5=BB=BACAM=E5=B7=A5=E5=8D=95?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=94=A8=E5=88=80=E8=AE=A1=E5=88=92=E8=AE=B0?=
=?UTF-8?q?=E5=BD=95=E7=9A=84=E5=8A=9F=E8=83=BD=E8=AE=B0=E5=BD=95=EF=BC=9B?=
=?UTF-8?q?3=E3=80=81=E6=B7=BB=E5=8A=A0MES=E8=A3=85=E5=88=80=E6=8C=87?=
=?UTF-8?q?=E4=BB=A4=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=A0=B9=E6=8D=AEcnc?=
=?UTF-8?q?=E5=8A=A0=E5=B7=A5=E6=89=80=E9=9C=80=E7=9A=84=E5=88=80=E5=85=B7?=
=?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=92=8C=E5=88=80=E5=85=B7=E5=90=8D=E7=A7=B0?=
=?UTF-8?q?=E6=A3=80=E7=B4=A2=E7=8E=B0=E6=9C=89=E6=9C=BA=E5=BA=8A=E5=86=85?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7=E6=98=AF=E5=90=A6=E6=BB=A1?=
=?UTF-8?q?=E8=B6=B3=E9=9C=80=E6=B1=82=EF=BC=8C=E5=A6=82=E6=9E=9C=E4=B8=8D?=
=?UTF-8?q?=E6=BB=A1=E8=B6=B3=E5=88=99=E5=8F=91=E9=80=81MES=E8=A3=85?=
=?UTF-8?q?=E5=88=80=E6=8C=87=E4=BB=A4=EF=BC=9B4=E3=80=81=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0=E5=88=80=E5=85=B7=E7=BB=84=E6=8E=A5=E5=8F=A3=EF=BC=8C?=
=?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7=E6=97=B6?=
=?UTF-8?q?=E4=BC=A0=E9=80=81=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7=E5=90=8D?=
=?UTF-8?q?=E7=A7=B0=E3=80=81=E7=BC=96=E7=A0=81=E3=80=81=E5=88=80=E5=85=B7?=
=?UTF-8?q?=E7=BB=84=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_machine_connect/views/default_delivery.xml | 1 +
sf_manufacturing/models/mrp_workorder.py | 1 +
sf_tool_management/models/base.py | 70 +++++++++++++++++--
sf_tool_management/models/mrp_workorder.py | 38 ++++++++++
4 files changed, 106 insertions(+), 4 deletions(-)
create mode 100644 sf_tool_management/models/mrp_workorder.py
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