diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index f262d13c..9fa13895 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -10,8 +10,6 @@ from OCC.Extend.DataExchange import read_step_file from OCC.Extend.DataExchange import write_stl_file - - class ResProductMo(models.Model): _inherit = 'product.template' @@ -290,7 +288,7 @@ class ResProductMo(models.Model): self.suitable_machining_method_ids = [(6, 0, [])] if not \ self.cutting_tool_model_id.suitable_machining_method_ids \ else [(6, 0, self.cutting_tool_model_id.suitable_machining_method_ids.ids)] - self.blade_tip_characteristics_id = [(6, 0,[])] if not \ + self.blade_tip_characteristics_id = [(6, 0, [])] if not \ self.cutting_tool_model_id.blade_tip_characteristics_id \ else [(6, 0, self.cutting_tool_model_id.blade_tip_characteristics_id.ids)] @@ -874,3 +872,11 @@ class SfMaintenanceEquipmentTool(models.Model): alarm_value = fields.Char('报警值') used_value = fields.Char('已使用值') code = fields.Char('机床刀位号') + + name = fields.Char('', compute='_compute_name') + + @api.depends('code') + def _compute_name(self): + for record in self: + if record.code: + record.name = record.code diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index 1fb775c3..14f463a0 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- +from datetime import timedelta + from odoo import fields, models, api from odoo import SUPERUSER_ID +from odoo.exceptions import ValidationError # class FunctionalCuttingToolEntity(models.Model): @@ -13,12 +16,41 @@ class FunctionalCuttingToolEntity(models.Model): _description = '功能刀具列表' # code = fields.Char('序列号') + name = fields.Char(related='functional_tool_name_id.name') + functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称', readonly=True) barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) - name = fields.Char(related='barcode_id.name') - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) - mrs_cutting_tool_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具型号') - mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', - group_expand='_read_group_mrs_cutting_tool_type_id', compute_sudo=True) + sf_cutting_tool_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具型号') + sf_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', + group_expand='_read_group_mrs_cutting_tool_type_id', compute_sudo=True) + + functional_tool_diameter = fields.Integer(string='刀具直径(mm)', readonly=True) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) + coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True) + new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) + tool_loading_length = fields.Float(string='装刀长(mm)', readonly=True) + functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True) + effective_length = fields.Float(string='有效长(mm)', readonly=True) + tool_room_num = fields.Integer(string='刀具房数量', readonly=True, ) + line_edge_knife_library_num = fields.Integer(string='线边刀库数量', readonly=True) + machine_knife_library_num = fields.Integer(string='机内刀库数量', readonly=True) + max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) + alarm_value = fields.Integer(string='报警值(min)', readonly=True) + used_value = fields.Integer(string='已使用值(min)', readonly=True) + functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警'), ('已拆除', '已拆除')], + string='状态', store=True, default='正常') + current_location_id = fields.Many2one('stock.location', string='当前位置', readonly=True) + image = fields.Binary('图片', readonly=True) + + @api.depends('current_location_id') + def _compute_location_num(self): + """ + 计算库存位置数量 + """ + for obj in self: + if obj.current_location_id.name in ('组装后', '刀具房'): + obj.tool_room_num = 1 + obj.line_edge_knife_library_num = 0 + obj.machine_knife_library_num = 0 @api.model def _read_group_mrs_cutting_tool_type_id(self, categories, domain, order): @@ -28,64 +60,44 @@ class FunctionalCuttingToolEntity(models.Model): # 整体式刀具型号 cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True, domain=[('cutting_tool_material_id', '=', '整体式刀具')]) - # 刀片型号 cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True, domain=[('cutting_tool_material_id', '=', '刀片')]) - # 刀杆型号 cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True, domain=[('cutting_tool_material_id', '=', '刀杆')]) - # 刀盘型号 cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True, domain=[('cutting_tool_material_id', '=', '刀盘')]) - # 刀柄型号 cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True, domain=[('cutting_tool_material_id', '=', '刀柄')]) - # 夹头型号 cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True, domain=[('cutting_tool_material_id', '=', '夹头')]) - diameter = fields.Float('直径(mm)') - tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')], - string='刀具等级') - machining_accuracy = fields.Float('加工精度(mm)') - tool_length = fields.Float('装刀长(mm)') - blade_number = fields.Integer('刃数') - integral_blade_length = fields.Float('整体刃长(mm)') - effective_blade_length = fields.Float('有效刃长(mm)') - max_life = fields.Float('最大寿命值') - is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀') - applicable_range = fields.Char('适用范围') - image = fields.Binary('图片') + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) + L_D_number = fields.Float(string='L/D值(mm)', readonly=True) + hiding_length = fields.Float(string='避空长(mm)', readonly=True) + cut_time = fields.Integer(string='已切削时间(min)', readonly=True) + cut_length = fields.Float(string='已切削长度(mm)', readonly=True) + cut_number = fields.Integer(string='已切削次数', readonly=True) - suitable_machining_method_ids = fields.Many2many('maintenance.equipment.image', - 'rel_machining_product_template_tool_entity', '适合加工方式', - domain=[('type', '=', '加工能力')], - related='cutting_tool_integral_model_id.suitable_machining_method_ids') - - blade_tip_characteristics_id = fields.Many2many('maintenance.equipment.image', - 'rel_blade_tip_product_template_tool_entity', '刀尖特征', - domain=[('type', '=', '刀尖特征')], - related='cutting_tool_integral_model_id.blade_tip_characteristics_id') - - handle_type_ids = fields.Many2many('maintenance.equipment.image', - 'rel_handle_product_template_tool_entity', '柄部类型', - domain=[('type', '=', '柄部类型')], - related='cutting_tool_integral_model_id.handle_type_ids') - - cutting_direction_ids = fields.Many2many('maintenance.equipment.image', - 'rel_cutting_product_template_tool_entity', '走刀方向', - domain=[('type', '=', '走刀方向')], - related='cutting_tool_integral_model_id.cutting_direction_ids') - - suitable_coolant_ids = fields.Many2many('maintenance.equipment.image', - 'rel_coolant_product_template_tool_entity', '适合冷却液', - domain=[('type', '=', '冷却液')], - related='cutting_tool_integral_model_id.suitable_coolant_ids') + suitable_machining_method_ids = fields.Many2many( + 'maintenance.equipment.image', 'rel_machining_product_template_tool_entity', '适合加工方式', + domain=[('type', '=', '加工能力')], related='cutting_tool_integral_model_id.suitable_machining_method_ids') + blade_tip_characteristics_id = fields.Many2many( + 'maintenance.equipment.image', 'rel_blade_tip_product_template_tool_entity', '刀尖特征', + domain=[('type', '=', '刀尖特征')], related='cutting_tool_integral_model_id.blade_tip_characteristics_id') + handle_type_ids = fields.Many2many( + 'maintenance.equipment.image', 'rel_handle_product_template_tool_entity', '柄部类型', + domain=[('type', '=', '柄部类型')], related='cutting_tool_integral_model_id.handle_type_ids') + cutting_direction_ids = fields.Many2many( + 'maintenance.equipment.image', 'rel_cutting_product_template_tool_entity', '走刀方向', + domain=[('type', '=', '走刀方向')], related='cutting_tool_integral_model_id.cutting_direction_ids') + suitable_coolant_ids = fields.Many2many( + 'maintenance.equipment.image', 'rel_coolant_product_template_tool_entity', '适合冷却液', + domain=[('type', '=', '冷却液')], related='cutting_tool_integral_model_id.suitable_coolant_ids') def _get_functional_tool_model_ids(self, functional_tool_model_code): functional_tool_model_ids = [] @@ -94,110 +106,49 @@ class FunctionalCuttingToolEntity(models.Model): functional_tool_model_ids.append(functional_tool_model.id) return [(6, 0, functional_tool_model_ids)] + def open_functional_tool_warning(self): + action = self.env.ref('sf_tool_management.action_sf_functional_tool_warning') + result = action.read()[0] + result['domain'] = [('functional_tool_name_id', '=', self.functional_tool_name_id.id)] + return result + class FunctionalToolWarning(models.Model): _name = 'sf.functional.tool.warning' _description = '功能刀具预警' - functional_cutting_tool_id = fields.Many2one('sf.functional.cutting.tool.entity', '功能刀具', readonly=True) - functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True) - - # code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code') - barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True, - related='functional_cutting_tool_id.barcode_id') - name = fields.Char('名称', invisible=True, readonly=True, related='functional_cutting_tool_id.name') - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True, - related='functional_cutting_tool_id.functional_tool_name_id') - mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True, - related='functional_cutting_tool_id.mrs_cutting_tool_type_id') - - # 整体式刀具型号 - cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '整体式刀具')], - related='functional_cutting_tool_id.cutting_tool_integral_model_id') - - # 刀片型号 - cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀片')], - related='functional_cutting_tool_id.cutting_tool_blade_model_id') - - # 刀杆型号 - cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀杆')], - related='functional_cutting_tool_id.cutting_tool_cutterbar_model_id') - - # 刀盘型号 - cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀盘')], - related='functional_cutting_tool_id.cutting_tool_cutterpad_model_id') - - # 刀柄型号 - cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀柄')], - related='functional_cutting_tool_id.cutting_tool_cutterhandle_model_id') - - # 夹头型号 - cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '夹头')], - related='functional_cutting_tool_id.cutting_tool_cutterhead_model_id') - - diameter = fields.Float('直径(mm)', readonly=True, related='functional_cutting_tool_id.diameter') - tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')], - string='刀具等级', readonly=True, compute='_compute_functional_cutting_tool_id') - machining_accuracy = fields.Float('加工精度(mm)', readonly=True, - related='functional_cutting_tool_id.machining_accuracy') - - # tool_length = fields.Float('装刀长', readonly=True, related='functional_cutting_tool_id.tool_length') - - tool_length = fields.Float('装刀长(mm)', readonly=True, related='functional_cutting_tool_id.tool_length') - blade_number = fields.Integer('刃数', readonly=True, related='functional_cutting_tool_id.blade_number') - integral_blade_length = fields.Float('整体刃长(mm)', readonly=True, - related='functional_cutting_tool_id.integral_blade_length') - effective_blade_length = fields.Float('有效刃长(mm)', readonly=True, - related='functional_cutting_tool_id.effective_blade_length') - max_life = fields.Float('最大寿命值', readonly=True, related='functional_cutting_tool_id.max_life') - is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀', readonly=True, - compute='_compute_functional_cutting_tool_id') - applicable_range = fields.Char('适用范围', readonly=True, related='functional_cutting_tool_id.applicable_range') - - image = fields.Binary('图片', readonly=True, related='functional_cutting_tool_id.image') - install_tool_time = fields.Datetime("装刀时间", readonly=True, - related='functional_tool_assembly_id.tool_loading_time') - - @api.depends('functional_cutting_tool_id') - def _compute_functional_cutting_tool_id(self): - if self.functional_cutting_tool_id: - self.tool_grade = self.functional_cutting_tool_id.tool_grade - self.is_standard = self.functional_cutting_tool_id.is_standard - - # 功能刀具预警 特有字段 - outbound_time = fields.Datetime('出库时间', readonly=True, related='functional_tool_assembly_id.receive_time') - on_board_time = fields.Datetime('上机时间', readonly=False) - machine_table_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=True, - group_expand='_read_group_machine_table_name_ids') + name = fields.Char('名称', invisible=True, readonly=True, related='functional_tool_name_id.name') + # 机床信息 + production_line_id = fields.Many2one('sf.production.line', string='生产线', + group_expand='_read_group_machine_table_name_ids') + maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床') + machine_tool_code = fields.Char(string='机台号') + machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型') + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', + domain="[('equipment_id', '=', maintenance_equipment_id)]") + # 功能刀具信息 + functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称') + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', related='functional_tool_name_id.barcode_id') + mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型') + diameter = fields.Integer(string='刀具直径(mm)') + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)') + # 其他信息 + install_tool_time = fields.Datetime("刀具组装时间") + on_board_time = fields.Datetime('上机装刀时间') + max_lifetime_value = fields.Integer(string='最大寿命值(min)') + alarm_value = fields.Integer(string='报警值(min)') + used_value = fields.Integer(string='已使用值(min)') + functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警'), ('已拆除', '已拆除')], string='状态') + alarm_time = fields.Char('报警时间') + dispose_user = fields.Char('处理人') + dispose_time = fields.Char('处理时间') + dispose_func = fields.Char('处理方法/措施', readonly=False) @api.model def _read_group_machine_table_name_ids(self, categories, domain, order): machine_table_name_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID) return categories.browse(machine_table_name_ids) - machine_tool_code = fields.Char('机台号', readonly=True, related='functional_tool_assembly_id.machine_tool_code') - cutting_tool_code = fields.Char('刀位号', readonly=True, related='functional_tool_assembly_id.cutter_spacing_code') - # idle_time = fields.Char('闲置时长', readonly=False) - idle_time = fields.Char('闲置时长(h)', readonly=False) - alarm_value = fields.Char('报警值', readonly=False) - used_value = fields.Char('已使用值', readonly=False) - alarm_type = fields.Char('报警类型', readonly=False) - dispose_user = fields.Char('处理人', readonly=False) - alarm_time = fields.Char('报警时间', readonly=False) - dispose_time = fields.Char('处理时间', readonly=False) - dispose_func = fields.Char('处理方法/措施', readonly=False) - remark = fields.Char('备注', readonly=False) - - @api.onchange('functional_cutting_tool_id') - def onchange_functional_cutting_tool_id(self): - print(self.functional_cutting_tool_id.name) - class RealTimeDistributionOfFunctionalTools(models.Model): _name = 'sf.real.time.distribution.of.functional.tools' @@ -221,60 +172,61 @@ class RealTimeDistributionOfFunctionalTools(models.Model): record.mrs_cutting_tool_type_id = record.functional_cutting_tool_id.mrs_cutting_tool_type_id.id # code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code') - barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True, - related='functional_cutting_tool_id.barcode_id') - name = fields.Char('名称', invisible=True, readonly=True, related='functional_cutting_tool_id.name') - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True, - related='functional_cutting_tool_id.functional_tool_name_id') + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) + name = fields.Char('名称', invisible=True, readonly=True) + functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) # mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True, # related='functional_cutting_tool_id.mrs_cutting_tool_type_id') # 整体式刀具型号 - cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '整体式刀具')], - related='functional_cutting_tool_id.cutting_tool_integral_model_id') + cutting_tool_integral_model_id = fields.Many2one( + 'product.product', string='整体式刀具型号', readonly=True, + domain=[('cutting_tool_material_id', '=', '整体式刀具')], + related='functional_cutting_tool_id.cutting_tool_integral_model_id') # 刀片型号 - cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀片')], - related='functional_cutting_tool_id.cutting_tool_blade_model_id') + cutting_tool_blade_model_id = fields.Many2one( + 'product.product', string='刀片型号', readonly=True, + domain=[('cutting_tool_material_id', '=', '刀片')], + related='functional_cutting_tool_id.cutting_tool_blade_model_id') # 刀杆型号 - cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀杆')], - related='functional_cutting_tool_id.cutting_tool_cutterbar_model_id') + cutting_tool_cutterbar_model_id = fields.Many2one( + 'product.product', string='刀杆型号', readonly=True, + domain=[('cutting_tool_material_id', '=', '刀杆')], + related='functional_cutting_tool_id.cutting_tool_cutterbar_model_id') # 刀盘型号 - cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀盘')], - related='functional_cutting_tool_id.cutting_tool_cutterpad_model_id') + cutting_tool_cutterpad_model_id = fields.Many2one( + 'product.product', string='刀盘型号', readonly=True, + domain=[('cutting_tool_material_id', '=', '刀盘')], + related='functional_cutting_tool_id.cutting_tool_cutterpad_model_id') # 刀柄型号 - cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀柄')], - related='functional_cutting_tool_id.cutting_tool_cutterhandle_model_id') + cutting_tool_cutterhandle_model_id = fields.Many2one( + 'product.product', string='刀柄型号', readonly=True, + domain=[('cutting_tool_material_id', '=', '刀柄')], + related='functional_cutting_tool_id.cutting_tool_cutterhandle_model_id') # 夹头型号 - cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '夹头')], - related='functional_cutting_tool_id.cutting_tool_cutterhead_model_id') + cutting_tool_cutterhead_model_id = fields.Many2one( + 'product.product', string='夹头型号', readonly=True, + domain=[('cutting_tool_material_id', '=', '夹头')], + related='functional_cutting_tool_id.cutting_tool_cutterhead_model_id') - diameter = fields.Float('直径(mm)', readonly=True, related='functional_cutting_tool_id.diameter') + diameter = fields.Float('直径(mm)', readonly=True) tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')], - string='刀具等级', readonly=True, compute='_compute_functional_cutting_tool_id') - machining_accuracy = fields.Float('加工精度(mm)', readonly=True, - related='functional_cutting_tool_id.machining_accuracy') - tool_length = fields.Float('装刀长(mm)', readonly=True, related='functional_cutting_tool_id.tool_length') - blade_number = fields.Integer('刃数', readonly=True, related='functional_cutting_tool_id.blade_number') - integral_blade_length = fields.Float('整体刃长(mm)', readonly=True, - related='functional_cutting_tool_id.integral_blade_length') - effective_blade_length = fields.Float('有效刃长(mm)', readonly=True, - related='functional_cutting_tool_id.effective_blade_length') - max_life = fields.Float('最大寿命值', readonly=True, related='functional_cutting_tool_id.max_life') + string='刀具等级', readonly=True) + machining_accuracy = fields.Float('加工精度(mm)', readonly=True) + tool_length = fields.Float('装刀长(mm)', readonly=True) + blade_number = fields.Integer('刃数', readonly=True) + integral_blade_length = fields.Float('整体刃长(mm)', readonly=True) + effective_blade_length = fields.Float('有效刃长(mm)', readonly=True) + max_life = fields.Float('最大寿命值', readonly=True) is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀', readonly=True, compute='_compute_functional_cutting_tool_id') - applicable_range = fields.Char('适用范围', readonly=True, related='functional_cutting_tool_id.applicable_range') - image = fields.Binary('图片', readonly=True, related='functional_cutting_tool_id.image') + applicable_range = fields.Char('适用范围', readonly=True) + image = fields.Binary('图片', readonly=True) @api.depends('functional_cutting_tool_id') def _compute_functional_cutting_tool_id(self): @@ -304,7 +256,8 @@ class RealTimeDistributionOfFunctionalTools(models.Model): def _compute_return_total(self): for record in self: if record: - self.return_total = record.return_reuse_num_re + record.return_reuse_num_co + record.return_processing_num + self.return_total = (record.return_reuse_num_re + record.return_reuse_num_co + + record.return_processing_num) @api.depends('tool_stock_total', 'return_total') def _compute_total(self): @@ -335,58 +288,47 @@ class InboundAndOutboundRecordsOfFunctionalTools(models.Model): record.mrs_cutting_tool_type_id = record.functional_cutting_tool_id.mrs_cutting_tool_type_id.id # code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code') - barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True, - related='functional_cutting_tool_id.barcode_id') - name = fields.Char('名称', invisible=True, readonly=True, related='functional_cutting_tool_id.name') - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True, - related='functional_cutting_tool_id.functional_tool_name_id') + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) + name = fields.Char('名称', invisible=True, readonly=True) + functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) # 整体式刀具型号 cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '整体式刀具')], - related='functional_cutting_tool_id.cutting_tool_integral_model_id') + domain=[('cutting_tool_material_id', '=', '整体式刀具')]) # 刀片型号 cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀片')], - related='functional_cutting_tool_id.cutting_tool_blade_model_id') + domain=[('cutting_tool_material_id', '=', '刀片')]) # 刀杆型号 cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀杆')], - related='functional_cutting_tool_id.cutting_tool_cutterbar_model_id') + domain=[('cutting_tool_material_id', '=', '刀杆')]) # 刀盘型号 cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀盘')], - related='functional_cutting_tool_id.cutting_tool_cutterpad_model_id') + domain=[('cutting_tool_material_id', '=', '刀盘')]) # 刀柄型号 cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀柄')], - related='functional_cutting_tool_id.cutting_tool_cutterhandle_model_id') + domain=[('cutting_tool_material_id', '=', '刀柄')]) # 夹头型号 cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '夹头')], - related='functional_cutting_tool_id.cutting_tool_cutterhead_model_id') + domain=[('cutting_tool_material_id', '=', '夹头')]) - diameter = fields.Float('直径(mm)', readonly=True, related='functional_cutting_tool_id.diameter') + diameter = fields.Float('直径(mm)', readonly=True) tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')], string='刀具等级', readonly=True, compute='_compute_functional_cutting_tool_id') - machining_accuracy = fields.Float('加工精度(mm)', readonly=True, - related='functional_cutting_tool_id.machining_accuracy') - tool_length = fields.Float('装刀长(mm)', readonly=True, related='functional_cutting_tool_id.tool_length') - blade_number = fields.Integer('刃数', readonly=True, related='functional_cutting_tool_id.blade_number') - integral_blade_length = fields.Float('整体刃长(mm)', readonly=True, - related='functional_cutting_tool_id.integral_blade_length') - effective_blade_length = fields.Float('有效刃长(mm)', readonly=True, - related='functional_cutting_tool_id.effective_blade_length') - max_life = fields.Float('最大寿命值', readonly=True, related='functional_cutting_tool_id.max_life') + machining_accuracy = fields.Float('加工精度(mm)', readonly=True) + tool_length = fields.Float('装刀长(mm)', readonly=True) + blade_number = fields.Integer('刃数', readonly=True) + integral_blade_length = fields.Float('整体刃长(mm)', readonly=True) + effective_blade_length = fields.Float('有效刃长(mm)', readonly=True) + max_life = fields.Float('最大寿命值', readonly=True) is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀', readonly=True, compute='_compute_functional_cutting_tool_id') - applicable_range = fields.Char('适用范围', readonly=True, related='functional_cutting_tool_id.applicable_range') - image = fields.Binary('图片', readonly=True, related='functional_cutting_tool_id.image') + applicable_range = fields.Char('适用范围', readonly=True) + image = fields.Binary('图片', readonly=True) @api.depends('functional_cutting_tool_id') def _compute_functional_cutting_tool_id(self): @@ -436,110 +378,135 @@ class InboundAndOutboundRecords(models.Model): class MachineTableToolChangingApply(models.Model): _name = 'sf.machine.table.tool.changing.apply' _description = '机床换刀申请' + _order = 'cutter_spacing_code_id' - name = fields.Many2one('maintenance.equipment', string='CNC机床', required=True, readonly=False, - group_expand='_read_group_names') + name = fields.Char('名称', related='maintenance_equipment_id.name', store=True) + maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', required=True, readonly=False, + domain=[('category_id.equipment_type', '=', '机床')]) + production_line_id = fields.Many2one('sf.production.line', string='生产线', readonly=True, + group_expand='_read_group_names') machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True, compute='_compute_machine_table_type_id') machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True) - cutter_spacing_code = fields.Char(string='刀位号', readonly=False, required=True) - - @api.depends('name') - def _compute_machine_table_type_id(self): - for record in self: - if record: - record.machine_table_type_id = record.name.category_id.id - record.machine_tool_code = record.name.code - else: - record.machine_table_type_id = None - record.machine_tool_code = None - + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=False, + required=True, domain="[('equipment_id', '=', maintenance_equipment_id)]") barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', domain=[('product_id.name', '=', '功能刀具')]) - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', - domain=[('name', '=', '功能刀具')]) + functional_tool_name = fields.Char(string='功能刀具名称') functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型') + functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', + domain=[('name', '=', '功能刀具')]) + tool_position_interface_type = fields.Selection( + [('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'), + ('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'), + ('直装固定式', '直装固定式')], string='刀位接口型号', required=True) + diameter = fields.Integer(string='刀具直径(mm)', ) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)') + max_lifetime_value = fields.Integer(string='最大寿命值(min)') + alarm_value = fields.Integer(string='报警值(min)') + used_value = fields.Integer(string='已使用值(min)') + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True) + extension_length = fields.Float(string='伸出长(mm)') + effective_length = fields.Float(string='有效长(mm)') - diameter = fields.Char(string='直径(mm)', readonly=False) - coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=False) - hilt_name = fields.Char(string='刀柄名称', readonly=False) - hilt_code = fields.Char(string='刀柄编号', readonly=False) - max_lifetime_value = fields.Char(string='最大寿命值', readonly=False) - alarm_value = fields.Char(string='报警值', readonly=False) - used_value = fields.Char(string='已使用值', readonly=False) - functional_tool_status = fields.Selection([('正常', '正常'), ('异常', '异常')], string='功能刀具状态', - default='正常', readonly=False) + functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警')], string='功能刀具状态', store=True, + default='正常', compute='_compute_functional_tool_status') - # replacement_tool_code = fields.Char(string='待换功能刀具编码', readonly=True) assembly_order_code = fields.Char(string='组装单编码', readonly=True) - replacement_tool_name_id = fields.Many2one('product.product', string='待换功能刀具名称', readonly=True) - replacement_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='待换功能刀具类型', - readonly=True) - replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], - string='粗/中/精(待换)', readonly=True) - new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) applicant = fields.Char(string='申请人', readonly=True) - used_tool_time = fields.Datetime(string='用刀时间', readonly=True) reason_for_applying = fields.Char(string='申请原因', readonly=True) remark = fields.Char(string='备注说明', readonly=False) - status = fields.Selection([('0', '未操作'), ('1', '已换刀申请'), ('2', '已转移'), ('3', '已组装')], string='操作状态', default='0') + status = fields.Selection([('0', '未操作'), ('1', '已换刀申请'), ('2', '已转移'), ('3', '已组装')], + string='操作状态', default='0') - sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True) + sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装单', readonly=True) + + @api.depends('alarm_value', 'used_value') + def _compute_functional_tool_status(self): + for record in self: + if record.alarm_value <= record.used_value: + record.functional_tool_status = '报警' + else: + record.functional_tool_status = '正常' + + @api.depends('maintenance_equipment_id') + def _compute_machine_table_type_id(self): + for record in self: + if record: + record.production_line_id = record.maintenance_equipment_id.production_line_id.id + record.machine_table_type_id = record.maintenance_equipment_id.category_id.id + record.machine_tool_code = record.maintenance_equipment_id.code + else: + record.production_line_id = None + record.machine_table_type_id = None + record.machine_tool_code = None + + @api.constrains("cutter_spacing_code_id") + def _check_cutter_spacing_code_id(self): + for obj in self: + records = self.env['sf.machine.table.tool.changing.apply'].search([ + ('maintenance_equipment_id', '=', obj.maintenance_equipment_id.id), + ('cutter_spacing_code_id', '=', obj.cutter_spacing_code_id.id)]) + if len(records) > 1: + raise ValidationError('该刀位号已存在,请重新选择!!!') @api.model def _read_group_names(self, categories, domain, order): names = categories._search([], order=order, access_rights_uid=SUPERUSER_ID) return categories.browse(names) - @api.onchange('functional_tool_status') + @api.constrains('functional_tool_status') def automation_apply_for_tool_change(self): """ 自动申请换刀 :return: """ # 更新数据到机台换刀申请界面 - # todo 自动换刀申请条件需补充完善 - if self.functional_tool_status == '异常': - self.env['sf.machine.table.tool.changing.apply'].search([ - ('name', '=', self.name.id)]).write({ - 'replacement_tool_name_id': self.functional_tool_name_id.id, - 'replacement_tool_type_id': self.functional_tool_type_id.id, - 'replacement_tool_coarse_middle_thin': self.coarse_middle_thin, - 'new_former': '0', - 'applicant': '自动申请', - 'used_tool_time': fields.Datetime.now(), - 'reason_for_applying': '功能刀具状态异常', - 'remark': None, - 'status': '1' - }) + if self.functional_tool_status == '报警' and self.sf_functional_tool_assembly_id == False: + machine_table_tool_changing_apply = self.env['sf.machine.table.tool.changing.apply'].search( + [('maintenance_equipment_id', '=', self.maintenance_equipment_id.id), + ('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id) + ]) # 新建组装任务 - self.env['sf.functional.tool.assembly'].create({ - 'name': self.functional_tool_name_id, + sf_functional_tool_assembly = self.env['sf.functional.tool.assembly'].create({ + 'functional_tool_name': self.functional_tool_name, 'functional_tool_type_id': self.functional_tool_type_id.id, 'functional_tool_diameter': self.diameter, + 'knife_tip_r_angle': self.knife_tip_r_angle, + 'coarse_middle_thin': '3', + 'new_former': '0', + 'functional_tool_length': self.extension_length, + 'effective_length': self.effective_length, 'loading_task_source': '1', - 'applicant': '自动申请', - 'reason_for_applying': '功能刀具状态异常', - 'use_tool_time': self.used_tool_time, - 'machine_tool_name': self.CNC_machine_table, - 'machine_tool_code': self.machine_tool_code, - 'cutter_spacing_code': self.cutter_spacing_code, + 'use_tool_time': fields.Datetime.now() + timedelta(hours=4), + 'production_line_name_id': self.production_line_id.id, + 'machine_tool_name_id': self.maintenance_equipment_id.id, + 'applicant': self.applicant, + 'apply_time': fields.Datetime.now(), + 'cutter_spacing_code_id': self.cutter_spacing_code_id.id, + 'whether_standard_knife': self.whether_standard_knife, + 'reason_for_applying': '机台报警自动换刀', + 'sf_machine_table_tool_changing_apply_id': self.id }) - def new_assembly_task(self, vals): - """ - 新建组装任务 - :param vals: - :return: - """ - # 增加设置直径的值 - tool_changing_apply = self.env['sf.machine.table.tool.changing.apply'].search( - [('name', '=', vals['name'])]) - vals['functional_tool_diameter'] = tool_changing_apply.diameter + machine_table_tool_changing_apply.write( + {'status': '1', + 'sf_functional_tool_assembly_id': sf_functional_tool_assembly}) - self.env['sf.functional.tool.assembly'].create(vals) + # def new_assembly_task(self, vals): + # """ + # 新建组装任务 + # :param vals: + # :return: + # """ + # # 增加设置直径的值 + # tool_changing_apply = self.env['sf.machine.table.tool.changing.apply'].search( + # [('name', '=', vals['name'])]) + # vals['functional_tool_diameter'] = tool_changing_apply.diameter + # + # self.env['sf.functional.tool.assembly'].create(vals) def revocation_1(self): """ @@ -548,22 +515,16 @@ class MachineTableToolChangingApply(models.Model): """ # 撤回功能刀具组装创建的任务 self.env['sf.functional.tool.assembly'].search( - [('assembly_order_code', '=', self.assembly_order_code), + [('id', '=', self.sf_functional_tool_assembly_id.id), ('loading_task_source', '=', '1')]).unlink() # 撤回数据更新 - self.env['sf.machine.table.tool.changing.apply'].search([('name', '=', self.name.id)]).write({ - 'replacement_tool_name_id': None, - 'replacement_tool_type_id': None, - 'replacement_tool_coarse_middle_thin': None, - 'new_former': None, - 'applicant': None, - 'used_tool_time': None, - 'reason_for_applying': None, - 'remark': None, - 'status': '0', - 'sf_functional_tool_assembly_id': None, - }) + self.env['sf.machine.table.tool.changing.apply'].search( + [('maintenance_equipment_id', '=', self.maintenance_equipment_id.id), + ('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id)]).write( + {'status': '0', + 'sf_functional_tool_assembly_id': None + }) def revocation_2(self): """ @@ -571,9 +532,7 @@ class MachineTableToolChangingApply(models.Model): :return: """ self.env['sf.machine.table.tool.changing.apply'].search( - [('name', '=', self.name.id)]).write({ - 'status': '0' - }) + [('name', '=', self.name.id)]).write({'status': '0'}) class CAMWorkOrderProgramKnifePlan(models.Model): @@ -643,8 +602,8 @@ class CAMWorkOrderProgramKnifePlan(models.Model): # 将计划执行状态改为执行中 self.env['sf.cam.work.order.program.knife.plan'].search( [('barcode_id', '=', self.barcode_id.id)]).write({ - 'plan_execute_status': '1', - 'applicant': self.env.user.name}) + 'plan_execute_status': '1', + 'applicant': self.env.user.name}) def revocation(self): """ @@ -658,10 +617,10 @@ class CAMWorkOrderProgramKnifePlan(models.Model): # 将计划执行状态改为待执行,同时清除申请人、功能刀具组装字段数据 self.env['sf.cam.work.order.program.knife.plan'].search( [('barcode_id', '=', self.barcode_id.id)]).write({ - 'plan_execute_status': '0', - 'applicant': None, - 'sf_functional_tool_assembly_id': None, - }) + 'plan_execute_status': '0', + 'applicant': None, + 'sf_functional_tool_assembly_id': None, + }) class FunctionalToolAssembly(models.Model): @@ -669,12 +628,41 @@ class FunctionalToolAssembly(models.Model): _description = '功能刀具组装单' _order = 'use_tool_time asc' + @api.depends('functional_tool_name') + def _compute_name(self): + for obj in self: + obj.name = obj.after_assembly_functional_tool_name + + name = fields.Char(string='名称', readonly=True, compute='_compute_name') assembly_order_code = fields.Char(string='编码', readonly=True) - barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) - name = fields.Char(string='名称', readonly=True) + + functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', readonly=True) + functional_tool_name = fields.Char(string='功能刀具名称', readonly=True) functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True, group_expand='_read_group_functional_tool_type_ids') + functional_tool_diameter = fields.Integer(string='功能刀具直径(mm)', readonly=True) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) + coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True) + new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) + tool_loading_length = fields.Float(string='装刀长(mm)', readonly=True) + functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True) + effective_length = fields.Float(string='有效长(mm)', readonly=True) + loading_task_source = fields.Selection([('0', 'CAM装刀'), ('1', '机台换刀'), ('2', '按库存组装')], + string='装刀任务来源', readonly=True) + use_tool_time = fields.Datetime(string='用刀时间', readonly=True) + production_line_name_id = fields.Many2one('sf.production.line', string='申请产线', readonly=True) + machine_tool_name_id = fields.Many2one('maintenance.equipment', string='申请机台', readonly=True) + machine_tool_code = fields.Char(string='机台号', readonly=True) + applicant = fields.Char(string='申请人', readonly=True) + apply_time = fields.Datetime(string='申请时间', default=fields.Datetime.now(), readonly=True) + assemble_status = fields.Selection([('0', '待组装'), ('1', '已组装')], string='组装状态', default='0', + readonly=True) + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) + reason_for_applying = fields.Char(string='申请原因', readonly=True) + max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) + alarm_value = fields.Integer(string='报警值(min)', readonly=True) + used_value = fields.Integer(string='已使用值(min)', readonly=True) @api.model def _read_group_functional_tool_type_ids(self, categories, domain, order): @@ -682,43 +670,40 @@ class FunctionalToolAssembly(models.Model): functional_tool_type_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID) return categories.browse(functional_tool_type_ids) - functional_tool_diameter = fields.Char(string='功能刀具直径(mm)', readonly=True) - functional_tool_length = fields.Char(string='功能刀具伸出长(mm)', readonly=True) - functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=False) - + # 刀具物料信息 # 整体式刀具型号 integral_code_id = fields.Many2one('stock.lot', string='整体式刀具序列号', readonly=True) - cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号', readonly=True) + cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号', + readonly=True) integral_name = fields.Char('整体式刀具名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', string='整体式刀具品牌', readonly=True) - # 刀片型号 blade_code_id = fields.Many2one('stock.lot', '刀片序列号', readonly=True) cutting_tool_blade_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀片型号', readonly=True) blade_name = fields.Char('刀片名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_2 = fields.Many2one('sf.machine.brand', '刀片品牌', readonly=True) - # 刀杆型号 bar_code_id = fields.Many2one('stock.lot', '刀杆序列号', readonly=True) - cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号', readonly=True) + cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号', + readonly=True) bar_name = fields.Char('刀杆名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', readonly=True) - # 刀盘型号 pad_code_id = fields.Many2one('stock.lot', '刀盘序列号', readonly=True) - cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号', readonly=True) + cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号', + readonly=True) pad_name = fields.Char('刀盘名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', readonly=True) - # 刀柄型号 handle_code_id = fields.Many2one('stock.lot', '刀柄序列号', readonly=True) - cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号', readonly=True) + cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号', + readonly=True) handle_name = fields.Char('刀柄名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', readonly=True) - # 夹头型号 chuck_code_id = fields.Many2one('stock.lot', '夹头序列号', readonly=True) - cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号', readonly=True) + cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号', + readonly=True) chuck_name = fields.Char('夹头名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_6 = fields.Many2one('sf.machine.brand', '夹头品牌', readonly=True) @@ -775,35 +760,38 @@ class FunctionalToolAssembly(models.Model): record.chuck_name = None record.sf_tool_brand_id_6 = None - coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True) - tool_loading_length = fields.Char(string='装刀长(mm)', readonly=True) - new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) - reference_length = fields.Char(string='参考伸出长(mm)', readonly=True) - cut_time = fields.Char(string='已切削时间', readonly=True) - cut_length = fields.Char(string='已切削长度(mm)', readonly=True) - cut_number = fields.Char(string='已切削次数', readonly=True) + # 组装功能刀具参数信息 + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) + after_assembly_functional_tool_name = fields.Char(string='组装后功能刀具名称', readonly=True) + after_assembly_functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', + string='组装后功能刀具类型', readonly=True) + after_assembly_functional_tool_diameter = fields.Integer(string='组装后功能刀具直径(mm)', readonly=True) + after_assembly_knife_tip_r_angle = fields.Float(string='组装后刀尖R角(mm)', readonly=True) + after_assembly_new_former = fields.Selection([('0', '新'), ('1', '旧')], string='组装后新/旧', readonly=True) + cut_time = fields.Integer(string='已切削时间(min)', readonly=True) + cut_length = fields.Float(string='已切削长度(mm)', readonly=True) + cut_number = fields.Integer(string='已切削次数', readonly=True) - loading_task_source = fields.Selection([('0', 'CAM装刀'), ('1', '机台换刀'), ('2', '按库存组装')], - string='装刀任务来源', readonly=True) - applicant = fields.Char(string='申请人', readonly=True) - reason_for_applying = fields.Char(string='申请原因', readonly=True) - apply_time = fields.Datetime(string='申请时间', default=fields.Datetime.now(), readonly=True) - assemble_status = fields.Selection([('0', '待组装'), ('1', '已组装')], string='组装状态', - default='0', readonly=True) - use_tool_time = fields.Datetime(string='用刀时间', readonly=True) - production_line_name_id = fields.Many2one('sf.production.line', string='产线名称', readonly=False) - machine_tool_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=True) - machine_tool_code = fields.Char(string='机台号', readonly=True) - cutter_spacing_code = fields.Char(string='刀位号', readonly=True) + after_assembly_whether_standard_knife = fields.Boolean(string='组装后是否标准刀', default=True, readonly=True) + after_assembly_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], + string='组装后粗/中/精', readonly=True) + after_assembly_max_lifetime_value = fields.Integer(string='组装后最大寿命值(min)', readonly=True) + after_assembly_alarm_value = fields.Integer(string='组装后报警值(min)', readonly=True) + after_assembly_used_value = fields.Integer(string='组装后已使用值(min)', readonly=True) + after_assembly_tool_loading_length = fields.Float(string='组装后装刀长(mm)', readonly=True) + after_assembly_functional_tool_length = fields.Float(string='组装后伸出长(mm)', readonly=True) + after_assembly_effective_length = fields.Float(string='组装后有效长(mm)', readonly=True) + L_D_number = fields.Float(string='L/D值(mm)', readonly=True) + hiding_length = fields.Float(string='避空长(mm)', readonly=True) + functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=False) tool_loading_person = fields.Char(string='装刀人', readonly=True) tool_loading_time = fields.Datetime(string='装刀时间', readonly=True) - receive_person = fields.Char(string='领用人', readonly=True) - receive_time = fields.Datetime(string='领用出库时间', readonly=True) remark = fields.Char(string='备注说明', readonly=True) check_box_1 = fields.Boolean(string='复选框', default=False, readonly=False) - sf_machine_table_tool_changing_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', '机床换刀申请', readonly=True) + sf_machine_table_tool_changing_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', '机床换刀申请', + readonly=True) sf_cam_work_order_program_knife_plan_id = fields.Many2one('sf.cam.work.order.program.knife.plan', 'CAM工单程序用刀计划', readonly=True, ) @@ -855,5 +843,4 @@ class FunctionalToolAssembly(models.Model): if obj.loading_task_source: code = self._get_code(obj.loading_task_source) obj.assembly_order_code = code - obj.name = code - return obj \ No newline at end of file + return obj diff --git a/sf_tool_management/views/menu_view.xml b/sf_tool_management/views/menu_view.xml index 301233c4..efa4feee 100644 --- a/sf_tool_management/views/menu_view.xml +++ b/sf_tool_management/views/menu_view.xml @@ -13,7 +13,7 @@ name="功能刀具列表" sequence="4" action="sf_function_tool_entry_list_view_act" - /> + /> + /> + /> + /> + /> + /> + /> - + /> - \ No newline at end of file + diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml index a63e650f..1cac4820 100644 --- a/sf_tool_management/views/tool_base_views.xml +++ b/sf_tool_management/views/tool_base_views.xml @@ -1,22 +1,32 @@ - + sf.functional.cutting.tool.entity.list.tree sf.functional.cutting.tool.entity - - - - - - - - - + + + + + + + + + + + + + + + + + + + @@ -25,8 +35,25 @@ sf.functional.cutting.tool.entity.list.form sf.functional.cutting.tool.entity -
+ +
+ +
+
+ +

@@ -34,8 +61,9 @@

- - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -122,18 +121,24 @@ - - - - - + + + + + + + + - - - - - + + + + + + + + @@ -148,23 +153,36 @@ sf.functional.cutting.tool.entity - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + + + - + 功能刀具列表 ir.actions.act_window sf.functional.cutting.tool.entity @@ -172,152 +190,59 @@ - + sf.functional.tool.warning.tree sf.functional.tool.warning - - + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + - - sf.functional.tool.warning.form - sf.functional.tool.warning - - - -
-

- -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- sf.functional.tool.warning.search sf.functional.tool.warning - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + + @@ -327,16 +252,16 @@ 功能刀具预警 ir.actions.act_window sf.functional.tool.warning - tree,form,search + tree,search - + 功能刀具实时分布 sf.real.time.distribution.of.functional.tools - + @@ -365,7 +290,7 @@ 功能刀具实时分布 sf.real.time.distribution.of.functional.tools -
+

@@ -487,7 +412,7 @@ - + 功能刀具出入库记录 @@ -506,7 +431,7 @@ - + @@ -588,7 +513,7 @@ - + @@ -618,7 +543,7 @@ - + @@ -634,7 +559,7 @@ - + 出入库记录 sf.inbound.and.outbound.records @@ -688,54 +613,102 @@ - + 机床换刀申请 sf.machine.table.tool.changing.apply - - - - - - - - - + + + + + + + + + + + + + - - - + + + + + + + + + +

+ - - - + + + - - - - - - - + - + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + +
- +
- +
- +
- +
@@ -1164,7 +1198,7 @@
- +
@@ -1178,7 +1212,7 @@
- +
@@ -1191,34 +1225,36 @@
-
+
- - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - @@ -1236,24 +1272,31 @@
- + sf.functional.tool.assembly - - - - - - - + + + + + + + + + + - - - + + + + + + + diff --git a/sf_tool_management/wizard/__init__.py b/sf_tool_management/wizard/__init__.py index 20a7f5c4..40272379 100644 --- a/sf_tool_management/wizard/__init__.py +++ b/sf_tool_management/wizard/__init__.py @@ -1 +1 @@ -from . import wizard \ No newline at end of file +from . import wizard diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py index 53d7f28a..990addf1 100644 --- a/sf_tool_management/wizard/wizard.py +++ b/sf_tool_management/wizard/wizard.py @@ -1,3 +1,5 @@ +from datetime import timedelta + from odoo import fields, models, api from odoo.exceptions import ValidationError @@ -6,75 +8,90 @@ class ToolChangeRequirementInformation(models.TransientModel): _name = 'sf.tool.change.requirement.information' _description = '换刀需求信息' - # tool_change_to_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', string='机床换刀申请') + name = fields.Char('名称', related='maintenance_equipment_id.name', store=True, readonly=True) + maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', readonly=True) + production_line_id = fields.Many2one('sf.production.line', string='生产线', readonly=True) + machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True) + machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True) + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) - name = fields.Many2one('maintenance.equipment', string='CNC机床', readonly=True) - machine_tool_code = fields.Char(string='机台号', readonly=True) - cutter_spacing_code = fields.Char(string='刀位号', readonly=True) - # functional_tool_code = fields.Char(string='功能刀具编码', readonly=True) barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) + functional_tool_name = fields.Char(string='功能刀具名称', readonly=True) functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True) + tool_position_interface_type = fields.Selection( + [('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'), + ('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'), + ('直装固定式', '直装固定式')], string='刀位接口型号', readonly=True) + diameter = fields.Integer(string='刀具直径(mm)', readonly=True) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) + max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) + alarm_value = fields.Integer(string='报警值(min)', readonly=True) + used_value = fields.Integer(string='已使用值(min)', readonly=True) + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) + extension_length = fields.Float(string='伸出长(mm)', readonly=True) + effective_length = fields.Float(string='有效长(mm)', readonly=True) - # replacement_tool_code = fields.Char(string='待换功能刀具编码', readonly=True) - replacement_tool_name_id = fields.Many2one('product.product', string='待换功能刀具名称', - domain=[('name', '=', '功能刀具')]) + # 待换功能刀具信息 + replacement_tool_name = fields.Char(string='待换功能刀具名称', required=True) replacement_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='待换功能刀具类型') + replacement_diameter = fields.Integer(string='待换刀具直径(mm)') + replacement_knife_tip_r_angle = fields.Float(string='待换刀具刀尖R角(mm)') + replacement_tool_setting_length = fields.Float(string='待换刀具装刀长(mm)') + replacement_extension_length = fields.Float(string='待换刀具伸出长(mm)') + replacement_effective_length = fields.Float(string='待换刀具有效长(mm)') replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], - string='粗/中/精') - new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧') - applicant = fields.Char(string='申请人', default=lambda self: self.env.user.name, readonly=True) - used_tool_time = fields.Datetime(string='用刀时间') - reason_for_applying = fields.Char(string='申请原因') - remark = fields.Char(string='备注说明') + string='待换刀具粗/中/精', default='3') + replacement_max_lifetime_value = fields.Integer(string='待换刀具最大寿命值(min)') + replacement_alarm_value = fields.Integer(string='待换刀具报警值(min)') + replacement_used_value = fields.Integer(string='待换刀具已使用值(min)') + new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', default='0') + replacement_whether_standard_knife = fields.Boolean(string='待换刀具是否标准刀', default=True) + used_tool_time = fields.Datetime(string='用刀时间', + default=lambda self: fields.Datetime.now() + timedelta(hours=4)) + applicant = fields.Char(string='申请人', default=lambda self: self.env.user.name, readonly=True) + reason_for_applying = fields.Char(string='申请原因') def tool_changing_apply(self): """ 确认换刀申请(按键) :return: """ - # 将数据更新到机台换刀申请界面 print('已运行') record = self.env['sf.machine.table.tool.changing.apply'].search( - [('name', '=', self.name.id), - ('machine_tool_code', '=', self.machine_tool_code), - ('cutter_spacing_code', '=', self.cutter_spacing_code), + [('maintenance_equipment_id', '=', self.maintenance_equipment_id.id), + ('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id) ]) print('运行record_1') + # 功能刀具组装创建新任务(new_assembly_task) - record_1 = self.env['sf.functional.tool.assembly'].sudo().create({ - 'functional_tool_name_id': self.replacement_tool_name_id.id, + sf_functional_tool_assembly = self.env['sf.functional.tool.assembly'].sudo().create({ + 'functional_tool_name': self.replacement_tool_name, 'functional_tool_type_id': self.replacement_tool_type_id.id, - 'loading_task_source': '1', - 'applicant': self.applicant, - 'reason_for_applying': self.reason_for_applying, - 'use_tool_time': self.used_tool_time, - 'machine_tool_name_id': self.name.id, - 'machine_tool_code': self.machine_tool_code, - 'cutter_spacing_code': self.cutter_spacing_code, - 'sf_machine_table_tool_changing_apply_id': record.id, - }) - print('record_1:', record_1) - # 封装数据 - desc = { - 'name': self.name.id, - 'assembly_order_code': record_1.assembly_order_code, - 'machine_tool_code': self.machine_tool_code, - 'cutter_spacing_code': self.cutter_spacing_code, - 'replacement_tool_name_id': self.replacement_tool_name_id.id, - 'replacement_tool_type_id': self.replacement_tool_type_id.id, - 'replacement_tool_coarse_middle_thin': self.replacement_tool_coarse_middle_thin, + 'functional_tool_diameter': self.replacement_diameter, + 'knife_tip_r_angle': self.replacement_knife_tip_r_angle, + 'coarse_middle_thin': self.replacement_tool_coarse_middle_thin, 'new_former': self.new_former, + 'tool_loading_length': self.replacement_tool_setting_length, + 'functional_tool_length': self.replacement_extension_length, + 'effective_length': self.replacement_effective_length, + 'loading_task_source': '1', + 'use_tool_time': self.used_tool_time, + 'production_line_name_id': self.production_line_id.id, + 'machine_tool_name_id': self.maintenance_equipment_id.id, 'applicant': self.applicant, - 'used_tool_time': self.used_tool_time, + 'apply_time': fields.Datetime.now(), + 'cutter_spacing_code_id': self.cutter_spacing_code_id.id, + 'whether_standard_knife': self.whether_standard_knife, 'reason_for_applying': self.reason_for_applying, - 'remark': self.new_former, + 'sf_machine_table_tool_changing_apply_id': record.id + }) + print('sf_functional_tool_assembly:', sf_functional_tool_assembly) + # 修改机床换刀申请状态 + record.write({ 'status': '1', - 'sf_functional_tool_assembly_id': record_1.id, - } - print('运行record.write(desc):') - record.write(desc) + 'sf_functional_tool_assembly_id': sf_functional_tool_assembly + }) print('运行成功') # 关闭弹出窗口 @@ -85,18 +102,35 @@ class ToolTransferRequestInformation(models.TransientModel): _name = 'sf.tool.transfer.request.information' _description = '刀具转移申请信息' - CNC_machine_table_id = fields.Many2one('sf.machine_tool', string='CNC机床', readonly=True) - machine_tool_code = fields.Char(string='机台号', readonly=True) - cutter_spacing_code = fields.Char(string='刀位号', readonly=True) - # functional_tool_code = fields.Char(string='功能刀具编码', readonly=True) + name = fields.Char('名称', related='maintenance_equipment_id.name', store=True, readonly=True) + maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', readonly=True) + production_line_id = fields.Many2one('sf.production.line', string='生产线', readonly=True) + machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True) + machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True) + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) + functional_tool_name = fields.Char(string='功能刀具名称', readonly=True) functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True) + tool_position_interface_type = fields.Selection( + [('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'), + ('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'), + ('直装固定式', '直装固定式')], string='刀位接口型号', readonly=True) + diameter = fields.Integer(string='刀具直径(mm)', readonly=True) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) + max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) + alarm_value = fields.Integer(string='报警值(min)', readonly=True) + used_value = fields.Integer(string='已使用值(min)', readonly=True) + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) + extension_length = fields.Float(string='伸出长(mm)', readonly=True) + effective_length = fields.Float(string='有效长(mm)', readonly=True) + + # 转移刀具信息 transfer_target = fields.Selection([('机台', '机台'), ('线边刀库', '线边刀库'), ('刀具房', '刀具房')], string='转移到:', default='线边刀库') - new_cnc_machine_table_id = fields.Many2one('sf.machine_tool', string='机床名称') + new_production_line_id = fields.Many2one('sf.production.line', string='目标生产线') new_machine_tool_code = fields.Char(string='机床号') new_cutter_spacing_code = fields.Char(string='目标刀位号') @@ -120,27 +154,41 @@ class FunctionalToolAssemblyOrder(models.TransientModel): _inherit = ["barcodes.barcode_events_mixin"] _description = '功能刀具组装单' - # 功能刀具申请信息 - machine_tool_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=True) + assembly_order_code = fields.Char(string='编码', readonly=True) + functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', readonly=True) + functional_tool_name = fields.Char(string='功能刀具名称', readonly=True) + functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True, + group_expand='_read_group_functional_tool_type_ids') + functional_tool_diameter = fields.Integer(string='功能刀具直径(mm)', readonly=True) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) + coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True) + new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) + tool_loading_length = fields.Float(string='装刀长(mm)', readonly=True) + functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True) + effective_length = fields.Float(string='有效长(mm)', readonly=True) + loading_task_source = fields.Selection([('0', 'CAM装刀'), ('1', '机台换刀'), ('2', '按库存组装')], + string='装刀任务来源', readonly=True) + use_tool_time = fields.Datetime(string='用刀时间', readonly=True) + production_line_name_id = fields.Many2one('sf.production.line', string='申请产线', readonly=True) + machine_tool_name_id = fields.Many2one('maintenance.equipment', string='申请机台', readonly=True) machine_tool_code = fields.Char(string='机台号', readonly=True) - cutter_spacing_code = fields.Char(string='刀位号', readonly=True) - # code = fields.Char(string='功能刀具编码', readonly=True) - barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) - functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True) - functional_tool_length = fields.Char(string='功能刀具伸出长(mm)', readonly=True) - effective_length = fields.Char(string='有效长(mm)', readonly=True) - functional_tool_diameter = fields.Char(string='功能刀具直径(mm)', readonly=True) - tool_included_angle = fields.Char(string='刀尖角(R角)', readonly=True) - functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=True) - required_cutting_time = fields.Char(string='需切削时长', readonly=True) - whether_standard_tool = fields.Boolean(string='是否标准刀', readonly=True) + applicant = fields.Char(string='申请人', readonly=True) + apply_time = fields.Datetime(string='申请时间', default=fields.Datetime.now(), readonly=True) + assemble_status = fields.Selection([('0', '待组装'), ('1', '已组装')], string='组装状态', default='0', + readonly=True) + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) + reason_for_applying = fields.Char(string='申请原因', readonly=True) + max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) + alarm_value = fields.Integer(string='报警值(min)', readonly=True) + used_value = fields.Integer(string='已使用值(min)', readonly=True) # 功能刀具组装信息 # 整体式刀具型号 integral_code_id = fields.Many2one('stock.lot', string='整体式刀具序列号', domain=[('product_id.cutting_tool_material_id.name', '=', '整体式刀具')]) - cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号', readonly=True) + cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号', + readonly=True) integral_name = fields.Char('整体式刀具名称', readonly=True) sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', string='整体式刀具品牌', readonly=True) @@ -154,28 +202,32 @@ class FunctionalToolAssemblyOrder(models.TransientModel): # 刀杆型号 bar_code_id = fields.Many2one('stock.lot', '刀杆序列号', domain=[('product_id.cutting_tool_material_id.name', '=', '刀杆')]) - cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号', readonly=True) + cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号', + readonly=True) bar_name = fields.Char('刀杆名称', readonly=True) sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', readonly=True) # 刀盘型号 pad_code_id = fields.Many2one('stock.lot', '刀盘序列号', domain=[('product_id.cutting_tool_material_id.name', '=', '刀盘')]) - cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号', readonly=True) + cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号', + readonly=True) pad_name = fields.Char('刀盘名称', readonly=True) sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', readonly=True) # 刀柄型号 - handle_code_id = fields.Many2one('stock.lot', '刀柄序列号', + handle_code_id = fields.Many2one('stock.lot', '刀柄序列号', required=True, domain=[('product_id.cutting_tool_material_id.name', '=', '刀柄')]) - cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号', readonly=True) + cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号', + readonly=True) handle_name = fields.Char('刀柄名称', readonly=True) sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', readonly=True) # 夹头型号 - chuck_code_id = fields.Many2one('stock.lot', '夹头序列号', + chuck_code_id = fields.Many2one('stock.lot', '夹头序列号', required=True, domain=[('product_id.cutting_tool_material_id.name', '=', '夹头')]) - cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号', readonly=True) + cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号', + readonly=True) chuck_name = fields.Char('夹头名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_6 = fields.Many2one('sf.machine.brand', '夹头品牌', readonly=True) @@ -256,86 +308,72 @@ class FunctionalToolAssemblyOrder(models.TransientModel): record.chuck_name = None record.sf_tool_brand_id_6 = None - coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', default='1') - tool_loading_length = fields.Char(string='装刀长') - new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', required=True, default='0') - reference_length = fields.Char(string='参考伸出长') - cut_time = fields.Char(string='已切削时间') - cut_length = fields.Char(string='已切削长度') - cut_number = fields.Char(string='已切削次数') + # 组装功能刀具参数信息 + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号') + after_assembly_functional_tool_name = fields.Char(string='组装后功能刀具名称', required=True) + after_assembly_functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', + string='组装后功能刀具类型') + after_assembly_functional_tool_diameter = fields.Integer(string='组装后功能刀具直径(mm)') + after_assembly_knife_tip_r_angle = fields.Float(string='组装后刀尖R角(mm)') + after_assembly_new_former = fields.Selection([('0', '新'), ('1', '旧')], string='组装后新/旧') + cut_time = fields.Integer(string='已切削时间(min)') + cut_length = fields.Float(string='已切削长度(mm)') + cut_number = fields.Integer(string='已切削次数') + + after_assembly_whether_standard_knife = fields.Boolean(string='组装后是否标准刀', default=True) + after_assembly_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], + string='组装后粗/中/精') + after_assembly_max_lifetime_value = fields.Integer(string='组装后最大寿命值(min)') + after_assembly_alarm_value = fields.Integer(string='组装后报警值(min)') + after_assembly_used_value = fields.Integer(string='组装后已使用值(min)') + after_assembly_tool_loading_length = fields.Float(string='组装后装刀长(mm)') + after_assembly_functional_tool_length = fields.Float(string='组装后伸出长(mm)') + after_assembly_effective_length = fields.Float(string='组装后有效长(mm)') + L_D_number = fields.Float(string='L/D值(mm)') + hiding_length = fields.Float(string='避空长(mm)') + + functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=False) def functional_tool_assembly(self): """ 功能刀具组装 :return: """ + # 对物料做必填判断 + self.materials_must_be_judged() + # 创建组装入库单 # 创建功能刀具批次/序列号记录 stock_lot = self.create_assemble_warehouse_receipt() # 创建刀具组装入库单 self.create_stocking_picking(stock_lot) - desc_1 = { - 'barcode_id': stock_lot.id, - 'integral_code_id': self.integral_code_id.id, - 'blade_code_id': self.blade_code_id.id, - 'bar_code_id': self.bar_code_id.id, - 'pad_code_id': self.pad_code_id.id, - 'handle_code_id': self.handle_code_id.id, - 'chuck_code_id': self.chuck_code_id.id, - 'coarse_middle_thin': self.coarse_middle_thin, - 'tool_loading_length': self.tool_loading_length, - 'new_former': self.new_former, - 'reference_length': self.reference_length, - 'cut_time': self.cut_time, - 'cut_length': self.cut_length, - 'cut_number': self.cut_number, - 'assemble_status': '1', - 'tool_loading_person': self.env.user.name, - 'tool_loading_time': fields.Datetime.now() - } + # 封装功能刀具数据 + desc_1 = self.get_desc_1(stock_lot) functional_tool_assembly = self.env['sf.functional.tool.assembly'].search([ + ('assembly_order_code', '=', self.assembly_order_code), ('machine_tool_name_id', '=', self.machine_tool_name_id.id), - ('cutter_spacing_code', '=', self.cutter_spacing_code), + ('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id), ('assemble_status', '=', '0'), ]) + + # 创建功能刀具列表记录 # 封装功能刀具数据 - desc_2 = { - 'barcode_id': stock_lot.id, - 'functional_tool_name_id': self.functional_tool_name_id.id, - 'mrs_cutting_tool_type_id': self.functional_tool_type_id.id, - 'cutting_tool_integral_model_id': self.integral_code_id.product_id.id, - 'cutting_tool_blade_model_id': self.blade_code_id.product_id.id, - 'cutting_tool_cutterbar_model_id': self.bar_code_id.product_id.id, - 'cutting_tool_cutterpad_model_id': self.pad_code_id.product_id.id, - 'cutting_tool_cutterhandle_model_id': self.handle_code_id.product_id.id, - 'cutting_tool_cutterhead_model_id': self.chuck_code_id.product_id.id, - 'diameter': self.functional_tool_diameter, - 'tool_grade': None, - 'machining_accuracy': None, - 'tool_length': self.tool_loading_length, - 'blade_number': None, - 'integral_blade_length': None, - 'effective_blade_length': self.effective_length, - 'max_life': None, - 'is_standard': self.whether_standard_tool, - 'applicable_range': None, - 'image': None, - } + desc_2 = self.get_desc_2(stock_lot, functional_tool_assembly) # 创建功能刀具列表、功能刀具预警、功能刀具实时分布、功能刀具出入库记录 record_1 = self.env['sf.functional.cutting.tool.entity'].create(desc_2) - self.env['sf.functional.tool.warning'].create({ - 'functional_cutting_tool_id': record_1.id, - 'functional_tool_assembly_id': functional_tool_assembly.id, - 'machine_table_name_id': self.machine_tool_name_id.id, - }) - self.env['sf.real.time.distribution.of.functional.tools'].create({ - 'functional_cutting_tool_id': record_1.id - }) - self.env['sf.inbound.and.outbound.records.of.functional.tools'].create({ - 'functional_cutting_tool_id': record_1.id - }) + # self.env['sf.functional.tool.warning'].create({ + # 'functional_cutting_tool_id': record_1.id, + # 'functional_tool_assembly_id': functional_tool_assembly.id, + # 'machine_table_name_id': self.machine_tool_name_id.id, + # }) + # self.env['sf.real.time.distribution.of.functional.tools'].create({ + # 'functional_cutting_tool_id': record_1.id + # }) + # self.env['sf.inbound.and.outbound.records.of.functional.tools'].create({ + # 'functional_cutting_tool_id': record_1.id + # }) - # 修改功能刀具组装信息 + # 修改功能刀具组装单信息 functional_tool_assembly.write(desc_1) if functional_tool_assembly.sf_machine_table_tool_changing_apply_id: @@ -352,6 +390,16 @@ class FunctionalToolAssemblyOrder(models.TransientModel): # 关闭弹出窗口 return {'type': 'ir.actions.act_window_close'} + def materials_must_be_judged(self): + """ + 功能刀具组装物料必填判断 + """ + if not self.integral_code_id and not self.blade_code_id: + raise ValidationError('【整体式刀具】和【刀片】必须填写一个!') + if self.blade_code_id: + if not self.bar_code_id and not self.pad_code_id: + raise ValidationError('【刀盘】和【刀杆】必须填写一个!') + def create_stocking_picking(self, stock_lot): """ 创建刀具组装入库单 @@ -413,7 +461,6 @@ class FunctionalToolAssemblyOrder(models.TransientModel): 'qty_done': 1.0, 'state': 'done' }) - return stock_move_id, stock_move_line_id def get_stock_lot_name(self): @@ -433,4 +480,69 @@ class FunctionalToolAssemblyOrder(models.TransientModel): else: m = int(stock_lot_id.name[-3:]) + 1 num = "%03d" % m - return code + str(num) \ No newline at end of file + return code + str(num) + + def get_desc_1(self, stock_lot): + return { + 'barcode_id': stock_lot.id, + 'integral_code_id': self.integral_code_id.id, + 'blade_code_id': self.blade_code_id.id, + 'bar_code_id': self.bar_code_id.id, + 'pad_code_id': self.pad_code_id.id, + 'handle_code_id': self.handle_code_id.id, + 'chuck_code_id': self.chuck_code_id.id, + + 'after_assembly_functional_tool_name': self.after_assembly_functional_tool_name, + 'after_assembly_functional_tool_type_id': self.after_assembly_functional_tool_type_id.id, + 'after_assembly_functional_tool_diameter': self.after_assembly_functional_tool_diameter, + 'after_assembly_knife_tip_r_angle': self.after_assembly_knife_tip_r_angle, + 'after_assembly_new_former': self.after_assembly_new_former, + 'cut_time': self.cut_time, + 'cut_length': self.cut_length, + 'cut_number': self.cut_number, + 'after_assembly_whether_standard_knife': self.after_assembly_whether_standard_knife, + 'after_assembly_coarse_middle_thin': self.after_assembly_coarse_middle_thin, + 'after_assembly_max_lifetime_value': self.after_assembly_max_lifetime_value, + 'after_assembly_alarm_value': self.after_assembly_alarm_value, + 'after_assembly_used_value': self.after_assembly_used_value, + 'after_assembly_tool_loading_length': self.after_assembly_tool_loading_length, + 'after_assembly_functional_tool_length': self.after_assembly_functional_tool_length, + 'after_assembly_effective_length': self.after_assembly_effective_length, + 'L_D_number': self.L_D_number, + 'hiding_length': self.hiding_length, + 'assemble_status': '1', + 'tool_loading_person': self.env.user.name, + 'tool_loading_time': fields.Datetime.now() + } + + def get_desc_2(self, stock_lot, functional_tool_assembly_id): + return { + 'barcode_id': stock_lot.id, + 'functional_tool_name_id': functional_tool_assembly_id.id, + 'sf_cutting_tool_type_id': self.after_assembly_functional_tool_type_id.id, + 'cutting_tool_integral_model_id': self.integral_code_id.product_id.id, + 'cutting_tool_blade_model_id': self.blade_code_id.product_id.id, + 'cutting_tool_cutterbar_model_id': self.bar_code_id.product_id.id, + 'cutting_tool_cutterpad_model_id': self.pad_code_id.product_id.id, + 'cutting_tool_cutterhandle_model_id': self.handle_code_id.product_id.id, + 'cutting_tool_cutterhead_model_id': self.chuck_code_id.product_id.id, + + 'functional_tool_diameter': self.after_assembly_functional_tool_diameter, + 'knife_tip_r_angle': self.after_assembly_knife_tip_r_angle, + 'coarse_middle_thin': self.after_assembly_coarse_middle_thin, + 'new_former': self.after_assembly_new_former, + 'tool_loading_length': self.after_assembly_tool_loading_length, + 'functional_tool_length': self.after_assembly_functional_tool_length, + 'effective_length': self.after_assembly_effective_length, + + 'max_lifetime_value': self.after_assembly_max_lifetime_value, + 'alarm_value': self.after_assembly_alarm_value, + 'used_value': self.after_assembly_used_value, + 'whether_standard_knife': self.after_assembly_whether_standard_knife, + 'L_D_number': self.L_D_number, + 'hiding_length': self.hiding_length, + 'cut_time': self.cut_time, + 'cut_length': self.cut_length, + 'cut_number': self.cut_number, + 'current_location_id': stock_lot.quant_ids.location_id.ids[-1], + } diff --git a/sf_tool_management/wizard/wizard_view.xml b/sf_tool_management/wizard/wizard_view.xml index a6c6ec7b..35db780f 100644 --- a/sf_tool_management/wizard/wizard_view.xml +++ b/sf_tool_management/wizard/wizard_view.xml @@ -1,46 +1,68 @@ - + - 换刀需求信息 - sf.tool.change.requirement.information - - - - - - - - - - - - - - - - + 换刀需求信息 + sf.tool.change.requirement.information + + + +
+

+ +

+
+ + + + + + + + + + - - - - - - - - - - - - + + + + + + + + -
-
-
- -
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
@@ -53,54 +75,71 @@ - + - 刀具转移申请信息 - sf.tool.transfer.request.information - -
- - - - - - - - - - - - - - - - - - - - - - - + 刀具转移申请信息 + sf.tool.transfer.request.information + + + +
+

+ +

+
+ + + + + + + + + + - - - - - - - - - + + + + + + + -
-
-
- -
+
+ + + + + + + + + + + + + + + + + +
+
+
+ +
@@ -113,187 +152,215 @@ - + - 功能刀具组装单 - sf.functional.tool.assembly.order - -
- - + 功能刀具组装单 + sf.functional.tool.assembly.order + + + +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
- - - - - - + + + - - - - - - - + + + + + + + + + + - - - -
- -
+ +
+ +
+ - - - - - - - - - - - - - - + - -
- -
+ - - - + - - - - - - - - - - + + + + + - -
- -
+
+ +
+ +
+ - - - - - - - - - - - - - - + - -
- -
+ - - - + - - - - - - - - - - + + + + + - -
- -
+
+ +
+ +
+ - - - - - - - - - - - - - - + - -
- -
+ - - - + - - - - - - - - - - + + + + + - +
+ +
+ +
+ + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + +
+
- - - - - - - - - - - - + + + + + + + + + + + -
-
-
- -
+ + + + + + + + + + + + +
+
+
+
+ +