diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 2258062f..81580db7 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -1,3 +1,5 @@ +import re + import logging import base64 import urllib.parse @@ -823,25 +825,33 @@ class SfWorkOrderBarcodes(models.Model): workorder = self.env['mrp.workorder'].browse(self.ids) # workorder = self.env['mrp.workorder'].search( # [('routing_type', '=', '装夹预调'), ('production_id', '=', self.production_id.id)]) + # workorder_old = self.env['mrp.workorder'].search([('rfid_code', '=', barcode)]) + # if workorder_old: + # raise UserError('该托盘已绑定工件,请先解除绑定!!!') if workorder: if workorder.routing_type == '装夹预调': - stock_move_line = self.env['stock.move.line'].search([('lot_name', '=', barcode)]) - if stock_move_line.product_id.categ_type == '夹具': - workorder.write({ - 'tray_serial_number': stock_move_line.lot_name, - 'tray_product_id': stock_move_line.product_id.id, - 'tray_brand_id': stock_move_line.product_id.brand_id.id, - 'tray_type_id': stock_move_line.product_id.fixture_material_id.id, - 'tray_model_id': stock_move_line.product_id.fixture_model_id.id - }) - workorder.button_start() - # return { - # 'type': 'ir.actions.act_window', - # 'res_model': 'mrp.workorder', - # 'view_mode': 'form', - # 'domain': [('id', 'in', workorder.id)], - # 'target': 'current' - # } + if workorder.state in ['progress', 'done']: + work_state = {'progress': '进行中', 'done': '已完工'} + raise UserError('该工单%s,不能重新绑定托盘' % work_state.get(workorder.state)) + lots = self.env['stock.lot'].sudo().search([('rfid', '=', barcode)]) + if lots: + for lot in lots: + if lot.product_id.categ_type == '夹具': + val = { + 'tray_serial_number': lot.name, + 'tray_product_id': lot.product_id.id, + 'tray_brand_id': lot.product_id.brand_id.id, + 'tray_type_id': lot.product_id.fixture_material_id.id, + 'tray_model_id': lot.product_id.fixture_model_id.id, + 'rfid_code': barcode + } + workorder.write(val) + self.write(val) + workorder_rfid = self.env['mrp.workorder'].search( + [('production_id', '=', workorder.production_id.id)]) + if workorder_rfid: + for item in workorder_rfid: + item.write({'rfid_code': barcode}) else: embryo_stock_lot = self.env['stock.lot'].search([('name', '=', barcode)]) if embryo_stock_lot: @@ -875,6 +885,56 @@ class SfWorkOrderBarcodes(models.Model): for item in workorder_rfid: if item.state == "progress": item.write({'rfid_code': barcode}) + raise UserError('该托盘信息不存在!!!') + # stock_move_line = self.env['stock.move.line'].search([('lot_name', '=', barcode)]) + # if stock_move_line.product_id.categ_type == '夹具': + # workorder.write({ + # 'tray_serial_number': stock_move_line.lot_name, + # 'tray_product_id': stock_move_line.product_id.id, + # 'tray_brand_id': stock_move_line.product_id.brand_id.id, + # 'tray_type_id': stock_move_line.product_id.fixture_material_id.id, + # 'tray_model_id': stock_move_line.product_id.fixture_model_id.id + # }) + # workorder.button_start() + # # return { + # # 'type': 'ir.actions.act_window', + # # 'res_model': 'mrp.workorder', + # # 'view_mode': 'form', + # # 'domain': [('id', 'in', workorder.id)], + # # 'target': 'current' + # # } + # else: + # embryo_stock_lot = self.env['stock.lot'].search([('name', '=', barcode)]) + # if embryo_stock_lot: + # embryo_stock_move_line = self.env['stock.move.line'].search( + # [('product_id', '=', embryo_stock_lot.product_id.id), + # ('reference', '=', workorder.production_id.name), + # ('lot_id', '=', embryo_stock_lot.id), + # ('product_category_name', '=', '坯料')]) + # if embryo_stock_move_line: + # bom_production = self.env['mrp.production'].search( + # [('product_id', '=', embryo_stock_lot.product_id.id), + # ('origin', '=', workorder.production_id.name)], limit=1, order='id asc') + # workpiece_delivery = self.env['sf.workpiece.delivery'].search( + # [('workorder_id', '=', workorder.id)], limit=1, order='id asc') + # if workpiece_delivery: + # embryo_workpiece_code = workpiece_delivery.workpiece_code + # if bom_production: + # if workpiece_delivery.workpiece_code and bom_production.name not in \ + # workpiece_delivery.workpiece_code: + # embryo_workpiece_code = workpiece_delivery.workpiece_code + ',' + \ + # bom_production.name + # if not workpiece_delivery.workpiece_code: + # embryo_workpiece_code = bom_production.name + # workpiece_delivery.write({'workpiece_code': embryo_workpiece_code}) + # else: + # raise UserError('工件生产线不一致,请重新确认') + # else: + # workorder_rfid = self.env['mrp.workorder'].search( + # [('production_id', '=', workorder.production_id.id)]) + # if workorder_rfid: + # for item in workorder_rfid: + # item.write({'rfid_code': barcode}) class WorkPieceDelivery(models.Model): diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index ddc2ee6d..f3cba150 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -6,11 +6,10 @@ import os from odoo import models, fields, api, _ from odoo.exceptions import ValidationError from odoo.modules import get_resource_path +from OCC.Extend.DataExchange import read_step_file +from OCC.Extend.DataExchange import write_stl_file -# from OCC.Extend.DataExchange import read_step_file -# from OCC.Extend.DataExchange import write_stl_file - class ResProductMo(models.Model): _inherit = 'product.template' @@ -107,7 +106,10 @@ class ResProductMo(models.Model): @api.onchange('cutting_tool_model_id') def _onchange_cutting_tool_model_id(self): - self.specification_id = False + for item in self: + if item: + item.specification_id = False + item.cutting_tool_chuck_id = item.cutting_tool_model_id.chuck_id @api.onchange('cutting_tool_material_id') def _onchange_cutting_tool_material_id(self): @@ -310,7 +312,6 @@ class ResProductMo(models.Model): self.cutting_tool_is_safety_lock = self.specification_id.is_safe_lock self.cutting_tool_fit_nut_model = self.specification_id.nut self.cutting_tool_wrench = self.specification_id.spanner - self.cutting_tool_chuck_id = self.specification_id.chuck_id.id self.cutting_tool_jump_accuracy = self.specification_id.diameter_slip_accuracy self.cutting_tool_taper_shank_model = self.specification_id.taper_shank_model self.cutting_tool_cooling_type = self.specification_id.cooling_model diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index dc2fff9d..80a334ce 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -266,6 +266,21 @@ class ProductionLot(models.Model): _name = 'stock.lot' _inherit = ['stock.lot', 'printing.utils'] + rfid = fields.Char('Rfid', readonly=True) + product_specification = fields.Char('规格', compute='_compute_product_specification', store=True) + + @api.depends('product_id') + def _compute_product_specification(self): + for stock in self: + if stock: + if stock.product_id: + if stock.product_id.categ_id.name in '刀具': + stock.product_specification = stock.product_id.specification_id.name + elif stock.product_id.categ_id.name in '夹具': + stock.product_specification = stock.product_id.specification_fixture_id.name + else: + stock.product_specification = stock.product_id.default_code + @api.model def generate_lot_names1(self, display_name, first_lot, count): """Generate `lot_names` from a string.""" @@ -308,7 +323,7 @@ class ProductionLot(models.Model): if not last_serial: return "%s-%s%03d" % (product.cutting_tool_model_id.code[:-12], now, 1) else: - return "%s-%s%03d" % (product.cutting_tool_model_id.code[:-12], now, int(last_serial.name[-3:]) + 2) + return "%s-%s%03d" % (product.cutting_tool_model_id.code[:-12], now, int(last_serial.name[-3:]) + 1) else: raise ValidationError('该刀具物料产品的型号字段为空,请补充完整!!!') @@ -363,7 +378,7 @@ class ProductionLot(models.Model): # port = 9100 # 可以根据实际情况修改 # 获取默认打印机配置 - printer_config = self.env['printer.configuration'].search([('model', '=', self._name)], limit=1) + printer_config = self.env['printer.configuration'].sudo().search([('model', '=', self._name)], limit=1) if not printer_config: raise UserError('请先配置打印机') host = printer_config.printer_id.ip_address diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml index 0ae0d95f..6ba78573 100644 --- a/sf_manufacturing/views/mrp_production_addional_change.xml +++ b/sf_manufacturing/views/mrp_production_addional_change.xml @@ -422,7 +422,8 @@
规格: - + +
[] diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml index 7fb05ae1..9a747791 100644 --- a/sf_manufacturing/views/mrp_workorder_view.xml +++ b/sf_manufacturing/views/mrp_workorder_view.xml @@ -180,10 +180,10 @@ attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/> - - @@ -238,6 +238,7 @@ + @@ -246,7 +247,6 @@ - diff --git a/sf_manufacturing/views/stock_lot_views.xml b/sf_manufacturing/views/stock_lot_views.xml index bd04005c..aef50e55 100644 --- a/sf_manufacturing/views/stock_lot_views.xml +++ b/sf_manufacturing/views/stock_lot_views.xml @@ -13,6 +13,12 @@