from odoo import models, fields, api, _ from odoo.exceptions import UserError import logging _logger = logging.getLogger(__name__) class AgvDispatch(models.Model): _name = 'sf.agv.dispatch' _description = 'agv调度' name = fields.Char('任务单号', index=True, copy=False) def _get_agv_route_type_selection(self): return self.env['sf.agv.task.route'].fields_get(['route_type'])['route_type']['selection'] agv_route_type = fields.Selection(selection=_get_agv_route_type_selection, string='任务类型', required=True) agv_route_name = fields.Char('任务路线名称') start_site_id = fields.Many2one('sf.agv.site', '起点接驳站', required=True) end_site_id = fields.Many2one('sf.agv.site', '终点接驳站', tracking=True) site_state = fields.Selection([ ('占用', '占用'), ('空闲', '空闲')], string='终点接驳站状态') state = fields.Selection([ ('待下发', '待下发'), ('配送中', '配送中'), ('已配送', '已配送'), ('已取消', '已取消')], string='状态', default='待下发', tracking=True) productions = fields.Char('制造订单', compute='_compute_productions') workpiece_delivery_ids = fields.One2many('sf.workpiece.delivery', 'agv_dispatch_id', string='工件配送单') delivery_workpieces = fields.Char('配送工件', compute='_compute_delivery_workpieces') @api.depends('workpiece_delivery_ids') def _compute_delivery_workpieces(self): for rec in self: rec.delivery_workpieces = '\\'.join(rec.workpiece_delivery_ids.mapped('name')) task_create_time = fields.Datetime('任务创建时间') task_delivery_time = fields.Datetime('任务下发时间') task_completion_time = fields.Datetime('任务完成时间') task_duration = fields.Char('任务时长', compute='_compute_task_duration') @api.depends('task_completion_time', 'task_delivery_time') def _compute_task_duration(self): for rec in self: if rec.task_completion_time and rec.task_delivery_time: rec.task_duration = str(rec.task_completion_time - rec.task_delivery_time) else: rec.task_duration = '' @api.model_create_multi def create(self, vals_list): # We generate a standard reference for vals in vals_list: vals['name'] = self.env['ir.sequence'].next_by_code('sf.agv.dispatch') or _('New') return super().create(vals_list) def add_queue(self, agv_start_site_id, agv_route_type, production_ids, delivery_ids): """ 根据参数增加AGV调度任务 """ vals = { 'start_site_id': agv_start_site_id, 'agv_route_type': agv_route_type, 'productions': '、'.join(production_ids.mapped('name')), 'workpiece_delivery_ids': delivery_ids or [], 'task_create_time': fields.Datetime.now() } try: dispatch = self.env['sf.agv.dispatch'].sudo().create(vals) except Exception as e: _logger.error('添加AGV调度任务失败: %s', e) raise UserError(e) return dispatch