From 10bea40159373ac09eeb2f9e1004c9b5047e6565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Tue, 8 Apr 2025 10:29:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8D=E5=90=8C=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E4=B8=AD=E5=BF=83=E9=85=8D=E7=BD=AE=E7=9B=B8=E5=90=8C?= =?UTF-8?q?=E6=8E=A5=E9=A9=B3=E7=AB=99=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/agv_scheduling.py | 34 +++++++++++++------ sf_manufacturing/models/agv_setting.py | 11 +++--- .../wizard/workpiece_delivery_wizard.py | 33 ++++++++++++------ 3 files changed, 52 insertions(+), 26 deletions(-) diff --git a/sf_manufacturing/models/agv_scheduling.py b/sf_manufacturing/models/agv_scheduling.py index cc621727..33522182 100644 --- a/sf_manufacturing/models/agv_scheduling.py +++ b/sf_manufacturing/models/agv_scheduling.py @@ -87,11 +87,12 @@ class AgvScheduling(models.Model): agv_route_type: AGV任务类型 workorders: 工单 """ + scheduling = None _logger.info('创建AGV调度任务\r\n起点为【%s】,任务类型为【%s】,工单为【%s】' % (agv_start_site_name, agv_route_type, workorders)) if not workorders: raise UserError(_('工单不能为空')) - agv_start_site = self.env['sf.agv.site'].sudo().search([('name', '=', agv_start_site_name)], limit=1) - if not agv_start_site: + agv_start_sites = self.env['sf.agv.site'].sudo().search([('name', '=', agv_start_site_name)]) + if not agv_start_sites: raise UserError(_('不存在名称为【%s】的接驳站,请先创建!' % agv_start_site_name)) # 如果存在相同任务类型工单的AGV调度任务,则提示错误 agv_scheduling = self.sudo().search([ @@ -107,24 +108,32 @@ class AgvScheduling(models.Model): (','.join(repetitive_workorders.mapped('production_id.name')), agv_scheduling.name) ) + # 如果只有唯一任务路线,则自动赋予终点接驳站跟任务名称 + agv_routes = self.env['sf.agv.task.route'].sudo().search([ + ('route_type', '=', agv_route_type), + ('start_site_id', 'in', agv_start_sites.ids) + ]) vals = { - 'start_site_id': agv_start_site.id, 'agv_route_type': agv_route_type, 'workorder_ids': workorders.ids, # 'workpiece_delivery_ids': deliveries.mapped('id') if deliveries else [], 'task_create_time': fields.Datetime.now() } - # 如果只有唯一任务路线,则自动赋予终点接驳站跟任务名称 - agv_routes = self.env['sf.agv.task.route'].sudo().search([ - ('route_type', '=', agv_route_type), - ('start_site_id', '=', agv_start_site.id) - ]) if not agv_routes: raise UserError(_('不存在起点为【%s】的【%s】任务路线,请先创建!' % (agv_start_site_name, agv_route_type))) + # 如果路线中包含起点与终点相同的接驳站,则不创建AGV调度任务 + if agv_routes.filtered(lambda r: r.start_site_id.name == r.end_site_id.name): + return True + # 配送类型相同的接驳站为同一个,取第一个即可 + vals.update({ + 'start_site_id': agv_routes[0].start_site_id.id, + }) idle_route = None if len(agv_routes) == 1: idle_route = agv_routes[0] - vals.update({'end_site_id': idle_route.end_site_id.id, 'agv_route_id': idle_route.id}) + vals.update({ + 'end_site_id': idle_route.end_site_id.id, 'agv_route_id': idle_route.id + }) else: # 判断终点接驳站是否为空闲 idle_routes = agv_routes.filtered(lambda r: r.end_site_id.state == '空闲') @@ -132,7 +141,10 @@ class AgvScheduling(models.Model): # 将空闲的路线按照终点接驳站名称排序 idle_routes = sorted(idle_routes, key=lambda r: r.end_site_id.name) idle_route = idle_routes[0] - vals.update({'end_site_id': idle_route.end_site_id.id, 'agv_route_id': idle_route.id}) + vals.update({ + 'end_site_id': idle_route.end_site_id.id, 'agv_route_id': idle_route.id + }) + try: scheduling = self.env['sf.agv.scheduling'].sudo().create(vals) # 触发空闲接驳站状态更新,触发新任务下发 @@ -142,7 +154,7 @@ class AgvScheduling(models.Model): except Exception as e: _logger.error('添加AGV调度任务失败: %s', e) raise UserError(_('添加AGV调度任务失败: %s', e)) - + return scheduling def on_site_state_change(self, agv_site_id, agv_site_state): diff --git a/sf_manufacturing/models/agv_setting.py b/sf_manufacturing/models/agv_setting.py index 820ed539..d33ea9b4 100644 --- a/sf_manufacturing/models/agv_setting.py +++ b/sf_manufacturing/models/agv_setting.py @@ -24,7 +24,7 @@ class AgvSetting(models.Model): # name必须唯一 _sql_constraints = [ - ('name_uniq', 'unique (name)', '站点编号必须唯一!'), + ('name_uniq', 'unique (name, workcenter_id)', '同一工作中心的站点编号必须唯一!'), ] # def update_site_state(self): @@ -68,11 +68,12 @@ class AgvSetting(models.Model): """ if isinstance(agv_site_state_arr, dict): for agv_site_name, is_occupy in agv_site_state_arr.items(): - agv_site = self.env['sf.agv.site'].sudo().search([('name', '=', agv_site_name)]) - if agv_site: - agv_site.state = is_occupy + agv_sites = self.env['sf.agv.site'].sudo().search([('name', '=', agv_site_name)]) + if agv_sites: + agv_sites.state = is_occupy if notify: - self.env['sf.agv.scheduling'].on_site_state_change(agv_site.id, agv_site.state) + for agv_site in agv_sites: + self.env['sf.agv.scheduling'].on_site_state_change(agv_site.id, agv_site.state) else: _logger.error("更新失败:接驳站站点错误!%s" % agv_site_name) raise UserError("更新失败:接驳站站点错误!") diff --git a/sf_manufacturing/wizard/workpiece_delivery_wizard.py b/sf_manufacturing/wizard/workpiece_delivery_wizard.py index c41a7619..b100325e 100644 --- a/sf_manufacturing/wizard/workpiece_delivery_wizard.py +++ b/sf_manufacturing/wizard/workpiece_delivery_wizard.py @@ -117,17 +117,30 @@ class WorkpieceDeliveryWizard(models.TransientModel): item.button_finish() # 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'}, + if isinstance(scheduling, bool) and scheduling is True: + return{ + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'target': 'new', + 'params': { + 'message': f'解除装夹成功', + 'type': 'success', + 'sticky': False, + 'next': {'type': 'ir.actions.act_window_close'}, + } + } + else: + 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(f'{self.delivery_type}任务下发失败:{e}') from e