From a673630fd36ec2eda80a325a12418627a409f3b9 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Mon, 3 Jun 2024 15:36:19 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BC=98=E5=8C=96=E5=B7=A5=E4=BB=B6=E9=85=8D?= =?UTF-8?q?=E9=80=81=E8=B6=85=E6=97=B6=E6=8F=90=E7=A4=BA2.=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=B7=A5=E4=BB=B6=E4=B8=8A=E4=B8=8B=E7=BA=BF=E6=8E=A5?= =?UTF-8?q?=E5=8F=A33.=E4=BC=98=E5=8C=96=E7=BC=96=E7=A8=8B=E5=8D=95?= =?UTF-8?q?=E4=B8=8B=E5=8F=91=E8=87=B3cnc=E5=B7=A5=E5=8D=95=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=B0=86=E7=A8=8B=E5=BA=8F=E5=8D=95pdf=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B9=9F=E4=BC=A0=E7=BB=99=E8=A3=85=E5=A4=B9=E9=A2=84?= =?UTF-8?q?=E8=B0=83=E5=B7=A5=E5=8D=95=E7=9A=84=E5=8A=A0=E5=B7=A5=E5=9B=BE?= =?UTF-8?q?=E7=BA=B8=E5=AD=97=E6=AE=B5=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/controllers/controllers.py | 61 +++++++++++-------- sf_manufacturing/models/agv_setting.py | 36 ++++++----- sf_manufacturing/models/mrp_workorder.py | 38 +++++++----- sf_manufacturing/views/mrp_workorder_view.xml | 6 +- sf_mrs_connect/controllers/controllers.py | 3 + 5 files changed, 86 insertions(+), 58 deletions(-) diff --git a/sf_manufacturing/controllers/controllers.py b/sf_manufacturing/controllers/controllers.py index 0a1f4cb6..6ef8a38e 100644 --- a/sf_manufacturing/controllers/controllers.py +++ b/sf_manufacturing/controllers/controllers.py @@ -166,11 +166,13 @@ class Manufacturing_Connect(http.Controller): if not workorder: res = {'Succeed': False, 'ErrorCode': 202, 'Error': '该工单不存在'} return json.JSONEncoder().encode(res) + logging.info('workorder_state:%s' % workorder.state) if workorder.state != 'ready': res = {'Succeed': False, 'ErrorCode': 202, 'Error': '工单未就绪'} return json.JSONEncoder().encode(res) work_equipment_id = request.env['maintenance.equipment'].sudo().search([('name', '=', equipment_id)], limit=1) + logging.info('work_equipment_id:%s' % work_equipment_id.name) if not work_equipment_id: res = {'Succeed': False, 'ErrorCode': 202, 'Error': '没有找到该加工设备'} return json.JSONEncoder().encode(res) @@ -457,19 +459,21 @@ class Manufacturing_Connect(http.Controller): rfid_code = ret[f'RfidCode{i}'] logging.info('RfidCode:%s' % rfid_code) domain = [ - ('feeder_station_destination_id.name', '=', ret['DeviceId']), - ('workorder_id.rfid_code', '=', rfid_code), - ('status', '=', '已配送'), - ('type', '=', '上产线') + ('rfid_code', '=', rfid_code), + ('routing_type', '=', 'CNC加工') ] - workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(domain, - order='id asc') - if workpiece_delivery: - for wd in workpiece_delivery: - if wd.workorder_id.state == 'done' and wd.production_id.production_line_state == '待上产线': + workorder = request.env['mrp.workorder'].sudo().search(domain, order='id asc') + if workorder: + for order in workorder: + if order.production_id.production_line_state == '待上产线': logging.info( - 'wd.production_line_state:%s' % wd.production_id.production_line_state) - wd.production_id.write({'production_line_state': '已上产线'}) + '制造订单产线状态:%s' % order.production_id.production_line_state) + order.production_id.write({'production_line_state': '已上产线'}) + workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search([ + ('rfid_code', '=', rfid_code), + ('production_id', '=', order.production_id.id)]) + if workpiece_delivery.status == '待下发': + workpiece_delivery.write({'is_manual_work': True}) else: res = {'Succeed': False, 'ErrorCode': 204, 'Error': 'DeviceId为%s没有对应的已配送工件数据' % ret['DeviceId']} @@ -510,19 +514,20 @@ class Manufacturing_Connect(http.Controller): rfid_code = ret[f'RfidCode{i}'] logging.info('RfidCode:%s' % rfid_code) domain = [ - ('workorder_id.rfid_code', '=', rfid_code), - ('status', '=', '待下发'), - ('type', '=', '下产线') + ('rfid_code', '=', rfid_code), + ('routing_type', '=', 'CNC加工') ] - workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(domain, - order='id asc') - if workpiece_delivery: - for wd in workpiece_delivery: - if wd.workorder_id.state == 'done' and wd.production_id.production_line_state == '已上产线': + workorder = request.env['mrp.workorder'].sudo().search(domain, order='id asc') + if workorder: + for order in workorder: + if order.production_id.production_line_state == '已上产线': logging.info( - 'wd.production_line_state:%s' % wd.production_id.production_line_state) - wd.production_id.write({'production_line_state': '已下产线'}) - delivery_Arr.append(wd.id) + '制造订单产线状态:%s' % order.production_id.production_line_state) + order.production_id.write({'production_line_state': '已下产线'}) + workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search([ + ('rfid_code', '=', rfid_code), + ('production_id', '=', order.production_id.id)]) + delivery_Arr.append(workpiece_delivery.id) else: res = {'Succeed': False, 'ErrorCode': 204, 'Error': 'DeviceId为%s没有对应的已配送工件数据' % ret['DeviceId']} @@ -532,10 +537,14 @@ class Manufacturing_Connect(http.Controller): [('id', 'in', delivery_Arr)]) if delivery_workpiece: logging.info('开始向agv下发下产线任务') - is_free = delivery_workpiece._check_avgsite_state() - if is_free is True: - delivery_workpiece._delivery_avg() - logging.info('agv下发下产线任务下发完成') + agv_site = request.env['sf.agv.site'].sudo().search([]) + if agv_site: + has_site = agv_site.update_site_state() + if has_site is True: + is_free = delivery_workpiece._check_avgsite_state() + if is_free is True: + delivery_workpiece._delivery_avg() + logging.info('agv下发下产线任务下发完成') else: res = {'Succeed': False, 'ErrorCode': 203, 'Error': '未传IsComplete字段'} except Exception as e: diff --git a/sf_manufacturing/models/agv_setting.py b/sf_manufacturing/models/agv_setting.py index a6724e25..a0a14d3d 100644 --- a/sf_manufacturing/models/agv_setting.py +++ b/sf_manufacturing/models/agv_setting.py @@ -26,20 +26,28 @@ class AgvSetting(models.Model): timestamp = int(time.time()) center_control_url += str(timestamp) logging.info('工件配送-请求中控地址:%s' % center_control_url) - center_control_r = requests.get(center_control_url, params={}, headers=headers) - ret = center_control_r.json() - logging.info('工件配送-请求中控站点信息:%s' % ret) - self.env['center_control.interface.log'].sudo().create( - {'content': ret, 'name': 'AutoDeviceApi/GetAgvStationState?date=%s' % str(timestamp)}) - if ret['Succeed'] is True: - datas = ret['Datas'] - for item in self: - for da in datas: - if da['DeviceId'] == item.name: - if da['AtHome'] is True: - item.state = '占用' - else: - item.state = '空闲' + try: + center_control_r = requests.get(center_control_url, headers=headers, timeout=60) # 设置超时为60秒 + ret = center_control_r.json() + logging.info('工件配送-请求中控站点信息:%s' % ret) + self.env['center_control.interface.log'].sudo().create( + {'content': ret, 'name': 'AutoDeviceApi/GetAgvStationState?date=%s' % str(timestamp)}) + if ret['Succeed'] is True: + datas = ret['Datas'] + for item in self: + for da in datas: + if da['DeviceId'] == item.name: + if da['AtHome'] is True: + item.state = '占用' + else: + item.state = '空闲' + return True + except requests.exceptions.Timeout: + logging.error('工件配送-请求中控接口超时') + return False + except requests.exceptions.RequestException as e: + logging.error('工件配送-请求中控接口错误: %s', e) + return False class AgvTaskRoute(models.Model): diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index fd93eb4d..07c5e44a 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -159,7 +159,7 @@ class ResMrpWorkOrder(models.Model): ('已完工', '已完工'), ], string='工序状态', default='待装夹', readonly='True') # 加工图纸 - processing_drawing = fields.Binary(string='加工图纸', related='production_id.part_drawing') + processing_drawing = fields.Binary(string='加工图纸') @api.depends('production_id') def _compute_save_name(self): @@ -1326,6 +1326,7 @@ class WorkPieceDelivery(models.Model): status = fields.Selection( [('待下发', '待下发'), ('待配送', '待配送'), ('已配送', '已配送')], string='状态', default='待下发') is_cnc_program_down = fields.Boolean('程序是否下发', default=False) + is_manual_work = fields.Boolean('人工操作', default=False) active = fields.Boolean(string="有效", default=True) @api.model @@ -1393,6 +1394,8 @@ class WorkPieceDelivery(models.Model): is_not_route += 1 # else: # raise UserError('请选择【任务路线】再进行配送') + # if item.production_id.production_line_state == '已下产线' and item.state == '待下发' and item.type == '下产线': + # raise UserError('该制造订单已下产线,无需配送') if production_type != item.type: raise UserError('请选择类型为%s的制造订单进行配送' % production_type) if down_status != item.status: @@ -1446,22 +1449,25 @@ class WorkPieceDelivery(models.Model): is_free = False agv_site = self.env['sf.agv.site'].search([]) if agv_site: - agv_site.update_site_state() - for item in self: - logging.info('工件配送-起点状态:%s-%s' % ( - item.feeder_station_start_id.name, item.feeder_station_start_id.state)) - logging.info('工件配送-终点状态:%s-%s' % ( - item.feeder_station_destination_id.name, item.feeder_station_destination_id.state)) - if item.type in ['上产线', '下产线']: - if ( - item.feeder_station_start_id.state == '占用' and item.feeder_station_destination_id.state == '空闲') or ( - item.feeder_station_start_id.state == '空闲' and item.feeder_station_destination_id.state == '空闲'): - is_free = True + has_site = agv_site.update_site_state() + if has_site is True: + for item in self: + if item.type in ['上产线', '下产线']: + logging.info('工件配送-起点状态:%s-%s' % ( + item.feeder_station_start_id.name, item.feeder_station_start_id.state)) + logging.info('工件配送-终点状态:%s-%s' % ( + item.feeder_station_destination_id.name, item.feeder_station_destination_id.state)) + if ( + item.feeder_station_start_id.state == '占用' and item.feeder_station_destination_id.state == '空闲') or ( + item.feeder_station_start_id.state == '空闲' and item.feeder_station_destination_id.state == '空闲'): + is_free = True + else: + if item.feeder_station_destination_id.state == '空闲': + is_free = True + logging.info('is_free:%s' % is_free) + return is_free else: - if item.feeder_station_destination_id.state == '空闲': - is_free = True - logging.info('is_free:%s' % is_free) - return is_free + raise UserError("接驳站暂未反馈站点实时状态,请稍后再试") # 配送至avg小车 def _delivery_avg(self): diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml index 85e3e5ed..a34dc4cf 100644 --- a/sf_manufacturing/views/mrp_workorder_view.xml +++ b/sf_manufacturing/views/mrp_workorder_view.xml @@ -658,7 +658,9 @@ {'search_default_on_up':1} tree,search - [('type','in',['上产线','下产线']),('workorder_state','=','done')] + + [('type','in',['上产线','下产线']),('workorder_state','=','done'),('is_manual_work','=',false)] + @@ -677,7 +679,7 @@ attrs="{'readonly': [('id', '!=', False)]}" domain="[('route_type', '=', '运送空料架')]" force_save="1"/> - +