From 9a157125ba0c61db47871bd770bd1679f0cded99 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Mon, 22 Apr 2024 22:30:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96agv=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=8F=8A=E5=AF=B9=E5=BA=94=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/__manifest__.py | 1 + sf_manufacturing/controllers/controllers.py | 22 +++--- sf_manufacturing/controllers/workpiece.py | 2 +- sf_manufacturing/models/__init__.py | 1 + sf_manufacturing/models/agv_setting.py | 35 +++++++++ sf_manufacturing/models/mrp_workorder.py | 67 ++++++++++-------- sf_manufacturing/models/product_template.py | 4 +- sf_manufacturing/security/img.png | Bin 0 -> 14518 bytes sf_manufacturing/security/ir.model.access.csv | 5 +- sf_manufacturing/views/agv_setting_views.xml | 59 +++++++++++++++ sf_manufacturing/views/mrp_workorder_view.xml | 39 +++++----- .../wizard/workpiece_delivery_views.xml | 14 ++-- .../wizard/workpiece_delivery_wizard.py | 3 +- sf_mrs_connect/models/res_config_setting.py | 31 ++------ sf_mrs_connect/security/ir.model.access.csv | 1 - .../views/res_config_settings_views.xml | 42 ++++------- sf_sale/models/quick_easy_order.py | 4 +- sf_sale/models/quick_easy_order_old.py | 4 +- sf_sale/security/ir.model.access.csv | 4 +- sf_sale/views/quick_easy_order_view.xml | 10 +-- 20 files changed, 213 insertions(+), 135 deletions(-) create mode 100644 sf_manufacturing/models/agv_setting.py create mode 100644 sf_manufacturing/security/img.png create mode 100644 sf_manufacturing/views/agv_setting_views.xml diff --git a/sf_manufacturing/__manifest__.py b/sf_manufacturing/__manifest__.py index 6a122097..1c49c88b 100644 --- a/sf_manufacturing/__manifest__.py +++ b/sf_manufacturing/__manifest__.py @@ -24,6 +24,7 @@ 'views/mrp_workcenter_views.xml', 'views/mrp_workorder_view.xml', 'views/model_type_view.xml', + 'views/agv_setting_views.xml', 'views/sf_maintenance_equipment.xml', ], diff --git a/sf_manufacturing/controllers/controllers.py b/sf_manufacturing/controllers/controllers.py index 2cb6c2df..b9cef58e 100644 --- a/sf_manufacturing/controllers/controllers.py +++ b/sf_manufacturing/controllers/controllers.py @@ -431,12 +431,12 @@ class Manufacturing_Connect(http.Controller): if 'DeviceId' in ret: logging.info('DeviceId:%s' % ret['DeviceId']) workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search( - [('feeder_station_destination', '=', ret['DeviceId'])]) + [('feeder_station_start_id.name', '=', ret['DeviceId']), + ('status', '=', '待配送')], limit=1, order='id asc') if workpiece_delivery: for wd in workpiece_delivery: - logging.info('wd.workorder_id:%s' % wd.workorder_id.name) + logging.info('wd.production_id:%s' % wd.production_id.name) if wd.workorder_id.state == 'done' and wd.production_id.production_line_state == '待上产线': - logging.info('wd.production_id:%s' % wd.production_id.name) logging.info('wd.production_line_state:%s' % wd.production_id.production_line_state) wd.production_id.write({'production_line_state': '已上产线'}) wd.write({'production_line_state': '已上产线'}) @@ -466,20 +466,20 @@ class Manufacturing_Connect(http.Controller): if 'DeviceId' in ret: logging.info('DeviceId:%s' % ret['DeviceId']) workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search( - [('feeder_station_destination', '=', ret['DeviceId'])]) + [('feeder_station_destination_id.name', '=', ret['DeviceId']), + ('status', '=', '待配送')], limit=1, order='id asc') if workpiece_delivery: for wd in workpiece_delivery: - logging.info('wd.workorder_id:%s' % wd.workorder_id.name) + logging.info('wd.production_id:%s' % wd.production_id.name) if wd.workorder_id.state == 'done' and wd.production_id.production_line_state == '已上产线': - logging.info('wd.production_id:%s' % wd.production_id.name) logging.info('wd.production_line_state:%s' % wd.production_id.production_line_state) - workpiece_delivery_off=request.env['sf.workpiece.delivery'].create({ + workpiece_delivery_off = request.env['sf.workpiece.delivery'].sudo().create({ 'production_id': wd.production_id.id, - 'feeder_station_start': ret['DeviceId'], - 'feeder_station_destination': '', - 'workorder_id': workpiece_delivery.workorder_id, + 'feeder_station_start_id': workpiece_delivery.feeder_station_start_id.id, + 'feeder_station_destination_id': '', + 'workorder_id': workpiece_delivery.workorder_id.id, 'workpiece_code': workpiece_delivery.workpiece_code, - 'production_line_id': workpiece_delivery.production_line_id, + 'production_line_id': workpiece_delivery.production_line_id.id, 'task_delivery_time': datetime.now(), 'production_line_state': '已下产线' }) diff --git a/sf_manufacturing/controllers/workpiece.py b/sf_manufacturing/controllers/workpiece.py index e2f60421..fcdcf606 100644 --- a/sf_manufacturing/controllers/workpiece.py +++ b/sf_manufacturing/controllers/workpiece.py @@ -25,7 +25,7 @@ class Workpiece(http.Controller): if 'method' in ret: if ret['method'] == 'end': workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search( - [('production_id.name', '=', ret['reqCode'])]) + [('production_id.name', '=', ret['reqCode']), ('agv_task_code'), '=', ret['taskCode']]) if workpiece_delivery: workpiece_delivery.write({'status': '已配送', 'task_completion_time': ret['reqTime']}) else: diff --git a/sf_manufacturing/models/__init__.py b/sf_manufacturing/models/__init__.py index 3ca83b27..3de23ef3 100644 --- a/sf_manufacturing/models/__init__.py +++ b/sf_manufacturing/models/__init__.py @@ -8,3 +8,4 @@ from . import mrp_routing_workcenter from . import stock from . import res_user from . import production_line_base +from . import agv_setting diff --git a/sf_manufacturing/models/agv_setting.py b/sf_manufacturing/models/agv_setting.py new file mode 100644 index 00000000..22c486d1 --- /dev/null +++ b/sf_manufacturing/models/agv_setting.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +from odoo import fields, models + + +class AgvSetting(models.Model): + _name = 'sf.agv.site' + _description = 'agv站点' + + number = fields.Integer('序号') + name = fields.Char('位置编号') + owning_region = fields.Char('所属区域') + state = fields.Selection([ + ('占用', '占用'), + ('空闲', '空闲')], string='状态') + divide_the_work = fields.Char('主要分工') + + +class AgvTaskRoute(models.Model): + _name = 'sf.agv.task.route' + _description = 'agv任务路线' + + name = fields.Char('名称') + type = fields.Selection([ + ('F01', '搬运'), ], string='类型', default="F01") + start_site_id = fields.Many2one('sf.agv.site', '起点接驳站位置编号') + end_site_id = fields.Many2one('sf.agv.site', '终点接驳站位置编号') + destination_production_line_id = fields.Many2one('sf.production.line', '目的生产线') + priority = fields.Selection([ + ('0', '正常'), + ('1', '低'), + ('2', '中'), + ('3', '高'), + ('4', '紧急'), + ], string='优先级', default='0') + active = fields.Boolean('有效', default=True) diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 14471baf..32dbb220 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -397,8 +397,8 @@ class ResMrpWorkOrder(models.Model): def button_workpiece_delivery(self): if self.routing_type == '装夹预调': for item in self.workpiece_delivery_ids: - if not item.feeder_station_start: - raise UserError('【工件配送】明细中请输入起点接驳站') + if not item.route_id: + raise UserError('【工件配送】明细中请选择【任务路线】') # if not item.workpiece_code: # raise UserError('请对【同运工件】进行扫描') else: @@ -1079,8 +1079,9 @@ class WorkPieceDelivery(models.Model): store=True) plan_start_processing_time = fields.Datetime('计划开始加工时间', readonly=True) workpiece_code = fields.Char('同运工件编码') - feeder_station_start = fields.Char('起点接驳站') - feeder_station_destination = fields.Char('目的接驳站') + route_id = fields.Many2one('sf.agv.task.route', '任务路线') + feeder_station_start_id = fields.Many2one('sf.agv.site', '起点接驳站') + feeder_station_destination_id = fields.Many2one('sf.agv.site', '目的接驳站') task_delivery_time = fields.Datetime('任务下发时间') task_completion_time = fields.Datetime('任务完成时间') delivery_duration = fields.Float('配送时长', compute='_compute_delivery_duration') @@ -1092,41 +1093,49 @@ class WorkPieceDelivery(models.Model): string='上/下产线', default='待上产线') cnc_program_down_state = fields.Selection([('待下发', '待下发'), ('已下发', '已下发')], string='CNC程序下发状态', default='待下发') + agv_task_code = fields.Char('agv任务单号') + + @api.onchange('route_id') + def onchage_route(self): + if self.route_id: + self.feeder_station_start_id = self.route_id.start_site_id + self.feeder_station_destination_id = self.route_id.end_site_id # 工件配送 def button_delivery(self): if self.cnc_program_down_state == '待下发': - if self.status == '待下发': - return { - 'name': _('确认'), - 'type': 'ir.actions.act_window', - 'view_mode': 'form', - 'res_model': 'sf.workpiece.delivery.wizard', - 'target': 'new', - 'context': { - 'default_delivery_id': self.id, - }} + if self.route_id: + if self.status == '待下发': + return { + 'name': _('确认'), + 'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'res_model': 'sf.workpiece.delivery.wizard', + 'target': 'new', + 'context': { + 'default_delivery_id': self.id, + }} + else: + raise UserError('状态为【待下发】的工件记录可进行配送') else: - raise UserError('状态为【待下发】的工件记录可进行配送') + raise UserError('请选择任务路线再进行配送') else: raise UserError(_("该制造订单还未下发CNC程序单,无法进行工件配送")) # 配送至avg小车 def _delivery_avg(self): config = self.env['res.config.settings'].get_values() - site_production_line = False - if self.production_line_state == '待上产线': - site_production_line = [('production_line_status', '=', '已上产线')] - elif self.production_line_state == '已下产线': - site_production_line = [('production_line_status', '=', '已下产线')] - agv_site = self.env['res.agv.site'].search(site_production_line, order="number asc") positionCode_Arr = [] - if agv_site: - for item in agv_site: - positionCode_Arr.append({ - 'positionCode': item.content, - 'code': item.type - }) + if self.feeder_station_start_id: + positionCode_Arr.append({ + 'positionCode': self.feeder_station_start_id.name, + 'code': '00' + }) + if self.feeder_station_destination_id: + positionCode_Arr.append({ + 'positionCode': self.feeder_station_destination_id.name, + 'code': '00' + }) res = {'reqCode': self.production_id.name, 'reqTime': '', 'clientCode': '', 'tokenCode': '', 'taskTyp': 'F01', 'ctnrTyp': '', 'ctnrCode': '', 'wbCode': config['wbcode'], 'positionCodePath': positionCode_Arr, @@ -1137,14 +1146,14 @@ class WorkPieceDelivery(models.Model): config['agv_rcs_url'] = 'http://172.16.10.114:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask' logging.info('AGV请求路径:%s' % config['agv_rcs_url']) logging.info('AGV-json:%s' % res) - headers = {'Content-Type': 'application/json'} ret = requests.post((config['agv_rcs_url']), json=res, headers=headers) 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': '待配送'}) + self.write( + {'task_delivery_time': fields.Datetime.now(), 'status': '待配送', 'agv_task_code': ret['data']}) else: raise UserError(ret['message']) except Exception as e: diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index 16ea429a..d766629c 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -7,8 +7,8 @@ import os from odoo import models, fields, api, _ from odoo.exceptions import ValidationError from odoo.modules import get_resource_path -from OCC.Extend.DataExchange import read_step_file -from OCC.Extend.DataExchange import write_stl_file +# from OCC.Extend.DataExchange import read_step_file +# from OCC.Extend.DataExchange import write_stl_file class ResProductMo(models.Model): diff --git a/sf_manufacturing/security/img.png b/sf_manufacturing/security/img.png new file mode 100644 index 0000000000000000000000000000000000000000..130affd59bc6f1ecbd54ac13e43bf35709c13318 GIT binary patch literal 14518 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 literal 0 HcmV?d00001 diff --git a/sf_manufacturing/security/ir.model.access.csv b/sf_manufacturing/security/ir.model.access.csv index 8272af30..e8c2449c 100644 --- a/sf_manufacturing/security/ir.model.access.csv +++ b/sf_manufacturing/security/ir.model.access.csv @@ -129,4 +129,7 @@ access_sf_cmm_program_group_plan_dispatch,sf_cmm_program_group_plan_dispatch,mod access_mrp_workcenter_productivity,mrp.workcenter.productivity,mrp.model_mrp_workcenter_productivity,sf_base.group_plan_dispatch,1,0,0,0 access_maintenance_equipment_tool_group_plan_dispatch,maintenance.equipment.tool,sf_manufacturing.model_maintenance_equipment_tool,sf_base.group_plan_dispatch,1,0,0,0 -access_sf_workpiece_delivery_group_plan_dispatch,sf.workpiece.delivery,sf_manufacturing.model_sf_workpiece_delivery,sf_base.group_plan_dispatch,1,0,0,0 \ No newline at end of file +access_sf_workpiece_delivery_group_plan_dispatch,sf.workpiece.delivery,sf_manufacturing.model_sf_workpiece_delivery,sf_base.group_plan_dispatch,1,0,0,0 + +access_sf_agv_site_group_sf_order_user,sf_agv_site_group_sf_order_user,model_sf_agv_site,sf_base.group_sf_order_user,1,1,1,0 +access_sf_agv_task_route_group_sf_order_user,sf_agv_task_route_group_sf_order_user,model_sf_agv_task_route,sf_base.group_sf_order_user,1,1,1,0 \ No newline at end of file diff --git a/sf_manufacturing/views/agv_setting_views.xml b/sf_manufacturing/views/agv_setting_views.xml new file mode 100644 index 00000000..dea85e6a --- /dev/null +++ b/sf_manufacturing/views/agv_setting_views.xml @@ -0,0 +1,59 @@ + + + + + + agv站点 + sf.agv.site + + + + + + + + + + + + + AGV站点 + sf.agv.site + tree + + + + + + + AGV任务路线 + sf.agv.task.route + + + + + + + + + + + + + + AGV任务路线 + sf.agv.task.route + tree + + + + + \ No newline at end of file diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml index 65fbd973..0cc541e7 100644 --- a/sf_manufacturing/views/mrp_workorder_view.xml +++ b/sf_manufacturing/views/mrp_workorder_view.xml @@ -210,12 +210,12 @@ - - - - - - + + + + + + @@ -425,8 +425,9 @@ - - + + + @@ -526,7 +527,8 @@ - + @@ -557,7 +559,7 @@ 工件配送 sf.workpiece.delivery - +
@@ -567,12 +569,13 @@ decoration-danger="status == '待配送'"/> - - - - - - + + + + + + +
@@ -585,10 +588,10 @@ - + - + diff --git a/sf_manufacturing/wizard/workpiece_delivery_views.xml b/sf_manufacturing/wizard/workpiece_delivery_views.xml index 49e80d52..34625878 100644 --- a/sf_manufacturing/wizard/workpiece_delivery_views.xml +++ b/sf_manufacturing/wizard/workpiece_delivery_views.xml @@ -5,14 +5,18 @@ sf.workpiece.delivery.wizard
- - - + + + + +
- 是否确定配送? + + 确认上述信息正确无误.
-
diff --git a/sf_manufacturing/wizard/workpiece_delivery_wizard.py b/sf_manufacturing/wizard/workpiece_delivery_wizard.py index 7101410d..1de3e84c 100644 --- a/sf_manufacturing/wizard/workpiece_delivery_wizard.py +++ b/sf_manufacturing/wizard/workpiece_delivery_wizard.py @@ -11,10 +11,11 @@ class WorkpieceDeliveryWizard(models.TransientModel): delivery_id = fields.Many2one('sf.workpiece.delivery', string='配送') workorder_id = fields.Many2one('mrp.workorder', string='工单') + route_id = fields.Many2one('sf.agv.task.route', '任务路线') + is_ok = fields.Boolean('确认上述信息正确无误.') def confirm(self): 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 3f109cbe..ef2d93d8 100644 --- a/sf_mrs_connect/models/res_config_setting.py +++ b/sf_mrs_connect/models/res_config_setting.py @@ -15,6 +15,8 @@ class ResConfigSettings(models.TransientModel): sf_url = fields.Char(string='访问地址', default='https://sf.cs.jikimo.com') agv_rcs_url = fields.Char(string='avg_rcs访问地址', default='http://172.16.10.114:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask') + center_control_url = fields.Char(string='中控访问地址', + default='http://172.16.21.50:8001') wbcode = fields.Char('地码') agv_code = fields.Char(string='agv编号') task_type_no = fields.Char('任务单类型编号') @@ -99,7 +101,7 @@ class ResConfigSettings(models.TransientModel): agv_rcs_url = config.get_param('agv_rcs_url', default='') wbcode = config.get_param('wbcode', default='') agv_code = config.get_param('agv_code', default='') - task_type_no = config.get_param('task_type_no', default='') + center_control_url = config.get_param('center_control_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='') @@ -112,7 +114,7 @@ class ResConfigSettings(models.TransientModel): agv_rcs_url=agv_rcs_url, wbcode=wbcode, agv_code=agv_code, - task_type_no=task_type_no, + center_control_url=center_control_url, ftp_host=ftp_host, ftp_port=ftp_port, ftp_user=ftp_user, @@ -129,31 +131,8 @@ class ResConfigSettings(models.TransientModel): ir_config.set_param("agv_rcs_url", self.agv_rcs_url or "") ir_config.set_param("wbcode", self.wbcode or "") ir_config.set_param("agv_code", self.agv_code or "") - ir_config.set_param("task_type_no", self.task_type_no or "") + ir_config.set_param("center_control_url", self.center_control_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 "") ir_config.set_param("ftp_password", self.ftp_password or "") - - -class ResAgvSite(models.Model): - _name = 'res.agv.site' - _description = 'agv站点' - - number = fields.Integer('编号') - type = fields.Selection([('00', '位置编号'), ('01', '库区编号'), ('02', '货架编号')], '类型') - content = fields.Char('内容') - site_prop = fields.Selection([('上产线', '上产线'), ('下产线', '下产线')], '属性') - state_status = fields.Selection([('占用', '占用'), ('空闲', '空闲')], '状态') - # remark = fields.Char - active = fields.Boolean('有效', default=True) - - # @api.model - # def create(self, vals): - # if vals.get('number', 'new') == 'new': - # vals['number'] = self.env['ir.sequence'].next_by_code('res.agv.site') or '/' - # return super(ResAgvSite, self).create(vals) - - def unlink(self): - for item in self: - item.active == True diff --git a/sf_mrs_connect/security/ir.model.access.csv b/sf_mrs_connect/security/ir.model.access.csv index f512ec84..0ed43a62 100644 --- a/sf_mrs_connect/security/ir.model.access.csv +++ b/sf_mrs_connect/security/ir.model.access.csv @@ -1,6 +1,5 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_sf_static_resource_datasync,sf_static_resource_datasync,model_sf_static_resource_datasync,base.group_user,1,1,1,1 -access_res_agv_site,access_res_agv_site,model_res_agv_site,base.group_system,1,1,1,1 diff --git a/sf_mrs_connect/views/res_config_settings_views.xml b/sf_mrs_connect/views/res_config_settings_views.xml index 0a60df0a..0d1ccc3e 100644 --- a/sf_mrs_connect/views/res_config_settings_views.xml +++ b/sf_mrs_connect/views/res_config_settings_views.xml @@ -1,28 +1,6 @@ - - agv站点集合 - res.agv.site - - - - - - - - - - - - 站点集合 - res.agv.site - tree - - - - res.config.settings.view.form.inherit.sf_sync res.config.settings @@ -106,10 +84,6 @@