diff --git a/sf_manufacturing/controllers/controllers.py b/sf_manufacturing/controllers/controllers.py index 719ac481..48144622 100644 --- a/sf_manufacturing/controllers/controllers.py +++ b/sf_manufacturing/controllers/controllers.py @@ -668,7 +668,7 @@ class Manufacturing_Connect(http.Controller): logging.info('AGVDownProduct error:%s' % e) return json.JSONEncoder().encode(res) - @http.route('/AutoDeviceApi/AgvStationState', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False, + @http.route('/AutoDeviceApi/AgvStationState', type='json', auth='public', methods=['GET', 'POST'], csrf=False, cors="*") def AGVStationState(self, **kw): """ diff --git a/sf_manufacturing/models/agv_scheduling.py b/sf_manufacturing/models/agv_scheduling.py index 488fa0a0..f758abd9 100644 --- a/sf_manufacturing/models/agv_scheduling.py +++ b/sf_manufacturing/models/agv_scheduling.py @@ -270,6 +270,7 @@ class ResMrpWorkOrder(models.Model): """ 获取关联的制造订单下产线的agv任务 """ + self.ensure_one() workorder_ids = self.production_id.workorder_ids cnc_workorder = workorder_ids.filtered( lambda w: w.routing_type == 'CNC加工' and w.state == 'done' and w.processing_panel == self.processing_panel diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index a5e20ff7..2a492932 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -1351,23 +1351,23 @@ class ResMrpWorkOrder(models.Model): return res def button_delivery(self): - production_ids = [] - workorder_ids = [] + # production_ids = [] + # workorder_ids = [] delivery_type = '运送空料架' - max_num = 4 # 最大配送数量 - feeder_station_start_id = False - if len(self) > max_num: - raise UserError('仅限于拆卸1-4个制造订单,请重新选择') - for item in self: - if item.state != 'ready': - raise UserError('请选择状态为【就绪】的工单进行解除装夹') - - production_ids.append(item.production_id.id) - workorder_ids.append(item.id) - if not feeder_station_start_id: - down_product_agv_scheduling = self.get_down_product_agv_scheduling() - if down_product_agv_scheduling: - feeder_station_start_id = down_product_agv_scheduling.end_site_id.id + # max_num = 4 # 最大配送数量 + # feeder_station_start_id = False + # if len(self) > max_num: + # raise UserError('仅限于拆卸1-4个制造订单,请重新选择') + # for item in self: + # if item.state != 'ready': + # raise UserError('请选择状态为【就绪】的工单进行解除装夹') + # + # production_ids.append(item.production_id.id) + # workorder_ids.append(item.id) + # if not feeder_station_start_id: + # down_product_agv_scheduling = item.get_down_product_agv_scheduling() + # if down_product_agv_scheduling: + # feeder_station_start_id = down_product_agv_scheduling.end_site_id.id return { 'name': _('确认'), 'type': 'ir.actions.act_window', @@ -1376,12 +1376,12 @@ class ResMrpWorkOrder(models.Model): 'target': 'new', 'context': { # 'default_delivery_ids': [(6, 0, delivery_ids)], - 'default_production_ids': [(6, 0, production_ids)], + # 'default_production_ids': [(6, 0, production_ids)], 'default_delivery_type': delivery_type, - 'default_workorder_ids': [(6, 0, workorder_ids)], + # 'default_workorder_ids': [(6, 0, workorder_ids)], 'default_workcenter_id': self.env.context.get('default_workcenter_id'), 'default_confirm_button': '确认解除', - 'default_feeder_station_start_id': feeder_station_start_id, + # 'default_feeder_station_start_id': feeder_station_start_id, }} diff --git a/sf_manufacturing/wizard/workpiece_delivery_views.xml b/sf_manufacturing/wizard/workpiece_delivery_views.xml index 699fff53..e895d39e 100644 --- a/sf_manufacturing/wizard/workpiece_delivery_views.xml +++ b/sf_manufacturing/wizard/workpiece_delivery_views.xml @@ -18,8 +18,8 @@ diff --git a/sf_manufacturing/wizard/workpiece_delivery_wizard.py b/sf_manufacturing/wizard/workpiece_delivery_wizard.py index f00ac499..4ee0928c 100644 --- a/sf_manufacturing/wizard/workpiece_delivery_wizard.py +++ b/sf_manufacturing/wizard/workpiece_delivery_wizard.py @@ -1,9 +1,8 @@ # -*- coding: utf-8 -*- # Part of YiZuo. See LICENSE file for full copyright and licensing details. -import json import logging -from odoo.exceptions import UserError, ValidationError from datetime import datetime, date +from odoo.exceptions import UserError from odoo import models, api, fields @@ -79,29 +78,18 @@ class WorkpieceDeliveryWizard(models.TransientModel): 'tag': 'display_notification', 'target': 'new', 'params': { - 'message': '任务下发成功!AGV任务调度编号为【%s】' % scheduling['name'], + 'message': f'任务下发成功!AGV任务调度编号为【{scheduling["name"]}】', 'type': 'success', 'sticky': False, 'next': {'type': 'ir.actions.act_window_close'}, } } + def confirm(self): try: - # if self.workorder_id: - # self.workorder_id.workpiece_delivery_ids[0].agv_scheduling_id() - # else: - # is_not_production_line = 0 - # same_production_line_id = None - # notsame_production_line_arr = [] - # for item in self.production_ids: - # if same_production_line_id is None: - # same_production_line_id = item.production_line_id.id - # if item.production_line_id.id != same_production_line_id: - # notsame_production_line_arr.append(item.name) - # notsame_production_line_str = ','.join(map(str, notsame_production_line_arr)) - # if is_not_production_line >= 1: - # raise UserError('制造订单号为%s的目的生产线不一致' % notsame_production_line_str) - # else: + if not self.workorder_ids: + raise UserError('制造订单不能为空') + scheduling = self.env['sf.agv.scheduling'].add_scheduling( agv_start_site_name=self.feeder_station_start_id.name, agv_route_type=self.delivery_type, @@ -129,10 +117,21 @@ class WorkpieceDeliveryWizard(models.TransientModel): item.button_start() item.button_finish() - return scheduling.read()[0] + # return scheduling.read()[0] + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'target': 'new', + 'params': { + 'message': f'任务下发成功!AGV任务调度编号为【{scheduling.name}】', + 'type': 'success', + 'sticky': False, + 'next': {'type': 'ir.actions.act_window_close'}, + } + } except Exception as e: - logging.info('%s任务下发失败:%s' % (self.delivery_type, e)) - raise UserError('%s任务下发失败:%s' % (self.delivery_type, e)) + logging.info('%s任务下发失败:%s', self.delivery_type, e) + raise UserError(f'{self.delivery_type}任务下发失败:{e}') from e # def recognize_production(self): # # production_ids = [] @@ -185,7 +184,11 @@ class WorkpieceDeliveryWizard(models.TransientModel): # 判断是否是AGV接驳站名称 agv_site = self.env['sf.agv.site'].search([('name', '=', barcode)]) if agv_site: - self.feeder_station_start_id = agv_site.id + if not self.feeder_station_start_id: + self.feeder_station_start_id = agv_site.id + else: + if self.feeder_station_start_id.id != agv_site.id: + raise UserError('起点接驳站不匹配!') return delivery_type = self.env.context.get('default_delivery_type') if delivery_type == '上产线': @@ -205,16 +208,20 @@ class WorkpieceDeliveryWizard(models.TransientModel): if workorder: if (len(self.production_ids) > 0 and workorder.production_line_id.id != self.production_ids[0].production_line_id.id): - raise UserError('该rfid对应的制造订单号为%s的目的生产线不一致' % workorder.production_id.name) + raise UserError(f'该rfid对应的制造订单号为{workorder.production_id.name}的目的生产线不一致') # 将对象添加到对应的同模型且是多对多类型里 self.production_ids |= workorder.production_id self.workorder_ids |= workorder - if not self.feeder_station_start_id: - down_product_agv_scheduling = self.get_down_product_agv_scheduling() - if down_product_agv_scheduling: + down_product_agv_scheduling = self.get_down_product_agv_scheduling() + if down_product_agv_scheduling: + if not self.feeder_station_start_id: self.feeder_station_start_id = down_product_agv_scheduling.end_site_id.id + else: + if self.feeder_station_start_id.id != down_product_agv_scheduling.end_site_id.id: + raise UserError(f'该rfid不在{self.feeder_station_start_id.name}接驳站内') + else: raise UserError('该rfid码对应的工单不存在') return