From b24355dd67a7aa959ef729e9bfc6dbc0375055bf Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Mon, 11 Mar 2024 17:30:32 +0800 Subject: [PATCH 1/7] =?UTF-8?q?1.=E4=BC=98=E5=8C=96=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=202.=E4=BC=98=E5=8C=96agv=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=B8=94=E6=96=B0=E5=A2=9Eagv=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=85=8D=E7=BD=AE=203.=E4=BC=98=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E4=BB=B6=E9=85=8D=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_base/security/ir.model.access.csv | 6 ++- .../product_template_management_view.xml | 4 +- sf_manufacturing/controllers/__init__.py | 1 + sf_manufacturing/controllers/workpiece.py | 40 +++++++++++++++++++ sf_manufacturing/models/mrp_workorder.py | 31 +++++++++++++- sf_manufacturing/views/mrp_workorder_view.xml | 2 +- .../wizard/workpiece_delivery_views.xml | 2 + .../wizard/workpiece_delivery_wizard.py | 6 ++- sf_mrs_connect/models/res_config_setting.py | 10 ++++- .../views/res_config_settings_views.xml | 19 ++++++++- 10 files changed, 111 insertions(+), 10 deletions(-) create mode 100644 sf_manufacturing/controllers/workpiece.py diff --git a/sf_base/security/ir.model.access.csv b/sf_base/security/ir.model.access.csv index ac0c1880..16922c1b 100644 --- a/sf_base/security/ir.model.access.csv +++ b/sf_base/security/ir.model.access.csv @@ -74,10 +74,14 @@ access_sf_cutting_speed_admin,sf_cutting_speed_admin,model_sf_cutting_speed,base access_sf_cutting_speed_group_purchase_director,sf_cutting_speed_group_purchase_director,model_sf_cutting_speed,sf_base.group_purchase_director,1,1,1,0 access_sf_cutting_speed_group_sale_director,sf_cutting_speed_group_sale_director,model_sf_cutting_speed,sf_base.group_sale_director,1,1,1,0 access_sf_cutting_speed_group_plan_director,sf_cutting_speed_group_plan_director,model_sf_cutting_speed,sf_base.group_plan_director,1,1,1,0 +access_sf_cutting_speed_group_quality_director,sf_cutting_speed_group_quality_director,model_sf_cutting_speed,sf_base.group_quality_director,1,1,1,0 +access_sf_cutting_speed_group_quality,sf_cutting_speed_group_quality,model_sf_cutting_speed,sf_base.group_quality,1,1,1,0 access_sf_feed_per_tooth_group_purchase_director,sf_feed_per_tooth_group_purchase_director,model_sf_feed_per_tooth,sf_base.group_purchase_director,1,1,0,0 access_sf_feed_per_tooth_group_sale_director,sf_feed_per_tooth_group_sale_director,model_sf_feed_per_tooth,sf_base.group_sale_director,1,1,0,0 access_sf_feed_per_tooth_group_plan_director,sf_feed_per_tooth_group_plan_director,model_sf_feed_per_tooth,sf_base.group_plan_director,1,1,0,0 access_sf_feed_per_tooth_group_sale_salemanager,sf_feed_per_tooth_group_sale_salemanager,model_sf_feed_per_tooth,sf_base.group_sale_salemanager,1,0,0,0 +access_sf_feed_per_tooth_group_quality,sf_feed_per_tooth_group_quality,model_sf_feed_per_tooth,sf_base.group_quality,1,1,1,0 +access_sf_feed_per_tooth_group_quality_director,sf_feed_per_tooth_group_quality_director,model_sf_feed_per_tooth,sf_base.group_quality_director,1,1,1,0 access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,0 access_sf_feed_per_tooth_admin,sf_feed_per_tooth_admin,model_sf_feed_per_tooth,base.group_system,1,1,1,0 access_sf_ramping_angle,sf_ramping_angle,model_sf_ramping_angle,base.group_user,1,1,1,1 @@ -141,9 +145,7 @@ access_sf_cutting_width_depth,sf_cutting_width_depth,model_sf_cutting_width_dept access_sf_cutting_width_depth_group_purchase,sf_cutting_width_depth_group_purchase,model_sf_cutting_width_depth,sf_base.group_purchase,1,0,0,0 access_maintenance_equipment_image,maintenance_equipment_image,model_maintenance_equipment_image,base.group_user,1,1,1,1 access_purchase_order_group_purchase,access_purchase_order_group_purchase,purchase.model_purchase_order,sf_base.group_purchase,1,1,1,0 -access_purchase_order_group_purchase_director,access_purchase_order_group_purchase_director,purchase.model_purchase_order,sf_base.group_purchase_director,1,1,1,0 access_purchase_order_line_group_purchase,access_purchase_order_line_group_purchase,purchase.model_purchase_order_line,sf_base.group_purchase,1,1,1,0 -access_purchase_order_line_group_purchase_director,access_purchase_order_line_group_purchase_director,purchase.model_purchase_order_line,sf_base.group_purchase_director,1,1,1,0 access_spindle_taper_type,spindle_taper_type,model_spindle_taper_type,base.group_user,1,1,1,1 access_sf_tool_groups_group_plan_dispatch,sf_tool_groups,model_sf_tool_groups,sf_base.group_plan_dispatch,1,0,0,0 access_sf_tool_groups_group_sf_tool_user,sf_tool_groups,model_sf_tool_groups,sf_base.group_sf_tool_user,1,1,1,1 diff --git a/sf_dlm_management/views/product_template_management_view.xml b/sf_dlm_management/views/product_template_management_view.xml index 1c56ad77..12daff40 100644 --- a/sf_dlm_management/views/product_template_management_view.xml +++ b/sf_dlm_management/views/product_template_management_view.xml @@ -90,7 +90,7 @@ - + product.template.only.form.inherit.sf product.template @@ -104,7 +104,7 @@ - + product.template.only.form.inherit.sf product.template diff --git a/sf_manufacturing/controllers/__init__.py b/sf_manufacturing/controllers/__init__.py index e046e49f..4d20cb33 100644 --- a/sf_manufacturing/controllers/__init__.py +++ b/sf_manufacturing/controllers/__init__.py @@ -1 +1,2 @@ from . import controllers +from . import workpiece diff --git a/sf_manufacturing/controllers/workpiece.py b/sf_manufacturing/controllers/workpiece.py new file mode 100644 index 00000000..e2f60421 --- /dev/null +++ b/sf_manufacturing/controllers/workpiece.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +import logging +import json +from odoo import http +from odoo.http import request + + +class Workpiece(http.Controller): + + @http.route('/agvApi/backfeed', type='json', auth='none', methods=['GET', 'POST'], csrf=False, + cors="*") + def backfeed(self, **kw): + """ + agv小车反馈工单(工件)结果 + :param kw: + :return: + """ + logging.info('backfeed:%s' % kw) + try: + res = {'Succeed': True} + datas = request.httprequest.data + ret = json.loads(datas) + logging.info('backfeed-ret:%s' % ret) + if 'reqCode' in ret: + if 'method' in ret: + if ret['method'] == 'end': + workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search( + [('production_id.name', '=', ret['reqCode'])]) + if workpiece_delivery: + workpiece_delivery.write({'status': '已配送', 'task_completion_time': ret['reqTime']}) + else: + res = {'Succeed': False, 'ErrorCode': 203, 'Error': '该reqCode暂未查到对应的工件配送记录'} + else: + res = {'Succeed': False, 'ErrorCode': 204, 'Error': '未传method字段'} + else: + res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传reqCode字段'} + except Exception as e: + res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} + logging.info('backfeed error:%s' % e) + return json.JSONEncoder().encode(res) diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index a7408be8..76039065 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -235,7 +235,16 @@ class ResMrpWorkOrder(models.Model): # if not item.workpiece_code: # raise UserError('请对【同运工件】进行扫描') else: - item.write({'task_delivery_time': fields.Datetime.now(), 'status': '待配送'}) + if item.status == '待下发': + return { + 'name': _('确认'), + 'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'res_model': 'sf.workpiece.delivery.wizard', + 'target': 'new', + 'context': { + 'default_workorder_id': self.id, + }} # 拼接工单对象属性值 def json_workorder_str(self, k, production, route): @@ -897,7 +906,25 @@ class WorkPieceDelivery(models.Model): # 配送至avg小车 def _delivery_avg(self): - self.write({'task_delivery_time': fields.Datetime.now(), 'status': '待配送'}) + res = {'reqCode': self.production_id.name, 'reqTime': '', 'clientCode': '', 'tokenCode': '', + 'taskTyp': 'F01', 'ctnrTyp': '', 'ctnrCode': '', 'wbCode': '', 'positionCodePath': [], 'podCode': '', + 'podDir': '', 'materialLot': '', 'priority': '', 'taskCode': '', 'agvCode': '', 'materialLot': '', + 'data': ''} + config = self.env['res.config.settings'].get_values() + try: + logging.info('config-AGV请求路径:%s' % config['agv_rcms_url']) + logging.info('config-json:%s' % res) + ret = requests.post((config['agv_rcms_url']), json=res) + ret = ret.json() + logging.info('config-ret:%s' % ret) + if ret['code'] == 0: + if self.production_id.name == ret['reqCode']: + self.write({'task_delivery_time': fields.Datetime.now(), 'status': '待配送'}) + else: + raise UserError(ret['message']) + except Exception as e: + logging.info('config-e:%s' % e) + raise UserError("工件配送请求agv失败") @api.depends('production_id.production_line_id') def _compute_production_line_id(self): diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml index db40cfeb..0bcf69d5 100644 --- a/sf_manufacturing/views/mrp_workorder_view.xml +++ b/sf_manufacturing/views/mrp_workorder_view.xml @@ -539,7 +539,7 @@
-
+ +
是否确定配送?
diff --git a/sf_manufacturing/wizard/workpiece_delivery_wizard.py b/sf_manufacturing/wizard/workpiece_delivery_wizard.py index d990e307..7101410d 100644 --- a/sf_manufacturing/wizard/workpiece_delivery_wizard.py +++ b/sf_manufacturing/wizard/workpiece_delivery_wizard.py @@ -10,7 +10,11 @@ class WorkpieceDeliveryWizard(models.TransientModel): _description = '工件配送' delivery_id = fields.Many2one('sf.workpiece.delivery', string='配送') + workorder_id = fields.Many2one('mrp.workorder', string='工单') def confirm(self): - self.delivery_id._delivery_avg() + if self.workorder_id: + self.workorder_id.workpiece_delivery_ids._delivery_avg() + else: + self.delivery_id._delivery_avg() diff --git a/sf_mrs_connect/models/res_config_setting.py b/sf_mrs_connect/models/res_config_setting.py index 60020f66..3b96a7de 100644 --- a/sf_mrs_connect/models/res_config_setting.py +++ b/sf_mrs_connect/models/res_config_setting.py @@ -13,7 +13,9 @@ class ResConfigSettings(models.TransientModel): token = fields.Char(string='TOKEN', default='b811ac06-3f00-11ed-9aed-0242ac110003') sf_secret_key = fields.Char(string='密钥', default='wBmxej38OkErKhD6') sf_url = fields.Char(string='访问地址', default='https://sf.cs.jikimo.com') - agv_url = fields.Char(string='avg访问地址', default='http://IP:PORT/rcms/services/rest') + agv_rcms_url = fields.Char(string='avg_rcms访问地址', + default='http://IP:PORT/rcms/services/rest/hikRpcService/genAgvSchedulingTask') + agv_rcs_url = fields.Char(string='avg_rcs访问地址', default='http://IP:PORT/xxx/agv/agvCallbackService/agvCallback') model_parser_url = fields.Char('特征识别路径') ftp_host = fields.Char(string='FTP的ip') ftp_port = fields.Char(string='FTP端口') @@ -90,6 +92,8 @@ class ResConfigSettings(models.TransientModel): token = config.get_param('token', default='') sf_secret_key = config.get_param('sf_secret_key', default='') sf_url = config.get_param('sf_url', default='') + agv_rcms_url = config.get_param('agv_rcms_url', default='') + agv_rcs_url = config.get_param('agv_rcs_url', default='') ftp_host = config.get_param('ftp_host', default='') ftp_port = config.get_param('ftp_port', default='') ftp_user = config.get_param('ftp_user', default='') @@ -99,6 +103,8 @@ class ResConfigSettings(models.TransientModel): token=token, sf_secret_key=sf_secret_key, sf_url=sf_url, + agv_rcms_url=agv_rcms_url, + agv_rcs_url=agv_rcs_url, ftp_host=ftp_host, ftp_port=ftp_port, ftp_user=ftp_user, @@ -112,6 +118,8 @@ class ResConfigSettings(models.TransientModel): ir_config.set_param("token", self.token or "") ir_config.set_param("sf_secret_key", self.sf_secret_key or "") ir_config.set_param("sf_url", self.sf_url or "") + ir_config.set_param("agv_rcms_url", self.agv_rcms_url or "") + ir_config.set_param("agv_rcs_url", self.agv_rcs_url or "") ir_config.set_param("ftp_host", self.ftp_host or "") ir_config.set_param("ftp_port", self.ftp_port or "") ir_config.set_param("ftp_user", self.ftp_user or "") diff --git a/sf_mrs_connect/views/res_config_settings_views.xml b/sf_mrs_connect/views/res_config_settings_views.xml index 08812f23..b879b1f8 100644 --- a/sf_mrs_connect/views/res_config_settings_views.xml +++ b/sf_mrs_connect/views/res_config_settings_views.xml @@ -74,9 +74,26 @@ +
+

AGV参数配置

+
+
+
+
+
+
+
+
+
+
+
+
- \ No newline at end of file From 0c44bba5f2b8314d4895b043fb9416c01c5a5b21 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Tue, 12 Mar 2024 17:32:40 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=88=80=E5=85=B7?= =?UTF-8?q?=E4=BA=A7=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_base/models/tool_base_new.py | 23 +- sf_base/models/tool_other_features.py | 3 +- sf_base/views/tool_basic_param.xml | 289 +++++++++++------- sf_base/views/tool_views.xml | 8 +- .../product_template_management_view.xml | 6 +- sf_manufacturing/models/product_template.py | 58 ++-- sf_sale/models/auto_quatotion_common.py | 2 +- sf_sale/models/quick_easy_order.py | 4 +- sf_sale/models/sale_order.py | 4 +- 9 files changed, 238 insertions(+), 159 deletions(-) diff --git a/sf_base/models/tool_base_new.py b/sf_base/models/tool_base_new.py index 03a3678b..7e87e3df 100644 --- a/sf_base/models/tool_base_new.py +++ b/sf_base/models/tool_base_new.py @@ -1,9 +1,6 @@ # -*- coding: utf-8 -*- -import json -import requests +from datetime import date from odoo import fields, models, api -from odoo.exceptions import ValidationError -from odoo.addons.sf_base.commons.common import Common class CuttingToolMaterial(models.Model): @@ -113,6 +110,24 @@ class CuttingToolModel(models.Model): feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(整体式刀具)') feed_per_tooth_ids_3 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(刀片)') material_model_id = fields.Many2one('sf.materials.model', '材料型号') + + @api.onchange('cutting_tool_material_id') + def _get_code(self): + if self.is_cloud is False: + today = date.today().strftime("%Y%m%d") + today_code = 'T-DJWL-%s-%s' % (self.cutting_tool_material_id.code, today) + cutting_tool_model = self.search( + [('code', 'ilike', today_code), ('is_cloud', '=', False), + ('active', 'in', [True, False])], + limit=1, + order="id desc") + if not cutting_tool_model: + num = "%03d" % 1 + else: + m = int(today_code[-3:]) + 1 + num = "%03d" % m + return "%s%s" % (today_code, num) + # 适用夹头型号可以多选 # chuck_ids = fields.Many2many( # 'sf.cutting_tool.standard.library', diff --git a/sf_base/models/tool_other_features.py b/sf_base/models/tool_other_features.py index 7ad32bc2..ee83735b 100644 --- a/sf_base/models/tool_other_features.py +++ b/sf_base/models/tool_other_features.py @@ -10,6 +10,7 @@ class ToolMaterialsBasicParameters(models.Model): standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具标准库') cutting_tool_type = fields.Char(related='standard_library_id.cutting_tool_type', string='刀具物料类型', store=True) + is_cloud = fields.Boolean(related='standard_library_id.is_cloud', string='云端数据') # 整体式刀具参数 total_length = fields.Float('总长度(mm)') @@ -170,8 +171,6 @@ class FeedPerTooth(models.Model): feed_per_tooth = fields.Char('每齿走刀量 (mm/z)', size=20) active = fields.Boolean(string='有效', default=True) - - # @api.depends('product_template_id') # def _compute_product_template_id(self): # if self.product_template_id is not None: diff --git a/sf_base/views/tool_basic_param.xml b/sf_base/views/tool_basic_param.xml index 616905ca..f73bf71c 100644 --- a/sf_base/views/tool_basic_param.xml +++ b/sf_base/views/tool_basic_param.xml @@ -1,132 +1,189 @@ - - - sf.tool.materials.basic.parameters.tree - sf.tool.materials.basic.parameters - - - - - - - - - - - - - - - - - - - - - + + + sf.tool.materials.basic.parameters.tree + sf.tool.materials.basic.parameters + + + + + + + + + + + + + + + + + + + + + - - sf.tool.materials.basic.parameters.tree - sf.tool.materials.basic.parameters - - - - - - - - - - - - - - - - - - - - - - - - + + sf.tool.materials.basic.parameters.tree + sf.tool.materials.basic.parameters + + + + + + + + + + + + + + + + + + + + + + + + - sf.tool.materials.basic.parameters.tree - sf.tool.materials.basic.parameters - - - - - - - - - - - - - - - - - - - - - - + sf.tool.materials.basic.parameters.tree + sf.tool.materials.basic.parameters + + + + + + + + + + + + + + + + + + + + + + - sf.tool.materials.basic.parameters.tree - sf.tool.materials.basic.parameters - - - - - - - - - - - - - - - - - - - - - + sf.tool.materials.basic.parameters.tree + sf.tool.materials.basic.parameters + + + + + + + + + + + + + + + + + + + + + - - sf.tool.materials.basic.parameters.search - sf.tool.materials.basic.parameters - - - - - - + + sf.tool.materials.basic.parameters.search + sf.tool.materials.basic.parameters + + + + + + - - 基础参数 - sf.tool.materials.basic.parameters - tree + + sf.tool.materials.basic.parameters.form + sf.tool.materials.basic.parameters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - [] - - + + 基础参数 + sf.tool.materials.basic.parameters + form + {'default_cutting_tool_type': cutting_tool_type} + [] + + diff --git a/sf_base/views/tool_views.xml b/sf_base/views/tool_views.xml index d1c0c510..a9604773 100644 --- a/sf_base/views/tool_views.xml +++ b/sf_base/views/tool_views.xml @@ -123,7 +123,7 @@
+ options="{'zoom': true, 'preview_image':'image_128'}" required="1"/>

@@ -133,9 +133,9 @@ - - - + + +