# -*- coding: utf-8 -*- # Part of YiZuo. See LICENSE file for full copyright and licensing details. import logging from odoo.exceptions import UserError, ValidationError from collections import defaultdict, namedtuple from odoo.addons.stock.models.stock_rule import ProcurementException from datetime import datetime from odoo import models, api, fields, _ class ProductionWizard(models.TransientModel): _name = 'sf.production.wizard' _description = '制造订单向导' mrp_production_id = fields.Many2one('mrp.production', string='制造订单号') reprogramming_num = fields.Integer('重新编程次数', default=0) is_reprogramming = fields.Boolean(string='申请重新编程', default=False) is_remanufacture = fields.Boolean(string='重新生成制造订单', default=True) programming_states = fields.Selection( [('待编程', '待编程'), ('编程中', '编程中'), ('已编程', '已编程'), ('已编程未下发', '已编程未下发'), ('已下发', '已下发')], string='编程状态') @api.onchange('is_remanufacture') def _onchange_is_reprogramming(self): if self.is_remanufacture is False: self.is_reprogramming = False def confirm(self): self.mrp_production_id.detection_result_ids.write({'handle_result': '已处理'}) self.mrp_production_id.write({'state': 'cancel', 'scrap_ids': [(0, 0, { 'name': self.env['ir.sequence'].next_by_code('stock.scrap') or _('New'), 'product_id': self.mrp_production_id.product_id.id, 'scrap_qty': 1, 'origin': self.mrp_production_id.origin, 'date_done': fields.datetime.now(), 'lot_id': self.env['stock.move.line'].search( [('move_id', '=', self.mrp_production_id.move_raw_ids[0].id)]).lot_id.id, 'location_id': self.mrp_production_id.move_raw_ids.filtered(lambda x: x.state not in ( 'done', 'cancel')) and self.mrp_production_id.location_src_id.id or self.mrp_production_id.location_dest_id.id, 'scrap_location_id': self.env['stock.scrap']._get_default_scrap_location_id(), 'state': 'done'})]}) self.mrp_production_id.action_cancel() # 解绑rfid_code mrp_workorder_list = self.mrp_production_id.workorder_ids.filtered(lambda kw: kw.rfid_code) for workorder in mrp_workorder_list: rfid_code = workorder.rfid_code workorder.filtered(lambda wo: wo.routing_type == '装夹预调' and wo.rfid_code and wo.state != 'rework').write( {'rfid_code_old': rfid_code, 'rfid_code': False}) workorder.filtered(lambda wo: (wo.routing_type != '装夹预调' and (wo.rfid_code_old or wo.rfid_code) and wo.state != 'rework')).write( {'rfid_code_old': False, 'rfid_code': False}) if self.is_remanufacture is True: ret = {'programming_list': [], 'is_reprogramming': self.is_reprogramming} if self.is_reprogramming is True: self.mrp_production_id.update_programming_state(trigger_time=datetime.now().strftime('%Y-%m-%d %H:%M:%S')) new_production = self.mrp_production_id.recreateManufacturing(ret) self.mrp_production_id.write({'remanufacture_production_id': new_production.id})