# -*- coding: utf-8 -*- # Part of YiZuo. See LICENSE file for full copyright and licensing details. import logging from odoo.exceptions import UserError, ValidationError from datetime import datetime from odoo import models, api, fields, _ class WorkpieceDeliveryWizard(models.TransientModel): _name = 'sf.workpiece.delivery.wizard' _description = '工件配送' delivery_ids = fields.Many2many('sf.workpiece.delivery', string='配送') rfid_code = fields.Char('rfid码') workorder_id = fields.Many2one('mrp.workorder', string='工单') production_ids = fields.Many2many('mrp.production', string='制造订单号') destination_production_line_id = fields.Many2one('sf.production.line', '目的生产线') route_id = fields.Many2one('sf.agv.task.route', '任务路线', domain=[('route_type', 'in', ['上产线', '下产线'])]) feeder_station_start_id = fields.Many2one('sf.agv.site', '起点接驳站') feeder_station_destination_id = fields.Many2one('sf.agv.site', '目的接驳站') type = fields.Selection( [('上产线', '上产线'), ('下产线', '下产线'), ('运送空料架', '运送空料架')], string='类型') def confirm(self): if self.type != '运送空料架': if not self.route_id: raise UserError('请选择路线') if self.workorder_id: self.workorder_id.workpiece_delivery_ids[0]._delivery_avg() 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: self.delivery_ids._delivery_avg() def recognize_production(self): # production_ids = [] # delivery_ids = [] # aa = self.production_ids.workorder_ids.filtered( # lambda b: b.routing_type == "装夹预调").workpiece_delivery_ids.filtered( # lambda c: c.rfid_code == self.rfid_code) # logging.info('aa:%s' % aa) if len(self.production_ids) == 4: raise UserError('只能配送四个制造订单') else: if self.rfid_code: wd = self.env['sf.workpiece.delivery'].search( [('type', '=', self.delivery_ids[0].type), ('rfid_code', '=', self.rfid_code), ('status', '=', self.delivery_ids[0].status)]) if wd: if wd.production_line_id.id == self.delivery_ids[0].production_line_id.id: # production_ids.append(wd.production_id) # delivery_ids.append(wd.id) # 将对象添加到对应的同模型且是多对多类型里 self.production_ids |= wd.production_id self.delivery_ids |= wd self.rfid_code = False # self.production_ids = [(6, 0, production_ids)] # self.delivery_ids = [(6, 0, delivery_ids)] else: raise UserError('该rfid对应的制造订单号为%s的目的生产线不一致' % wd.production_id.name) return { 'name': _('确认'), 'type': 'ir.actions.act_window', 'view_mode': 'form', 'res_model': 'sf.workpiece.delivery.wizard', 'target': 'new', 'context': { 'default_delivery_ids': [(6, 0, self.delivery_ids.ids)], 'default_production_ids': [(6, 0, self.production_ids.ids)], 'default_route_id': self.delivery_ids[0].route_id.id, 'default_type': self.delivery_ids[0].type }} @api.onchange('route_id') def onchange_route(self): if self.route_id: self.feeder_station_start_id = self.route_id.start_site_id.id self.feeder_station_destination_id = self.route_id.end_site_id.id