diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index b6961fda..4e3da687 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -911,5 +911,12 @@ 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 31633de3..5f275253 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from odoo import fields, models, api from odoo import SUPERUSER_ID +from odoo.exceptions import ValidationError # class FunctionalCuttingToolEntity(models.Model): @@ -68,9 +69,9 @@ class FunctionalCuttingToolEntity(models.Model): 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') + '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', '柄部类型', @@ -185,7 +186,7 @@ class FunctionalToolWarning(models.Model): 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') + cutting_tool_code = fields.Char('刀位号', readonly=True) # idle_time = fields.Char('闲置时长', readonly=False) idle_time = fields.Char('闲置时长(h)', readonly=False) alarm_value = fields.Char('报警值', readonly=False) @@ -439,60 +440,73 @@ 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', domain=[('category_id.equipment_type', '=', '机床')]) + name = fields.Char('名称', related='maintenance_equipment_id.name', store=True) + maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', required=True, readonly=False, + group_expand='_read_group_names', + domain=[('category_id.equipment_type', '=', '机床')]) 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) + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=False, + required=True, + domain="[('equipment_id', '=', name)]") + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', + domain=[('product_id.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='刀位接口型号') + diameter = fields.Integer(string='刀具直径(mm)', requried=True) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', requried=True) + max_lifetime_value = fields.Integer(string='最大寿命值(min)', requried=True) + alarm_value = fields.Integer(string='报警值(min)', requried=True) + used_value = fields.Integer(string='已使用值(min)', requried=True) + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True) + extension__length = fields.Float(string='伸出长(mm)', requried=True) + effective_length = fields.Float(string='有效长(mm)', requried=True) - @api.depends('name') + functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警')], string='功能刀具状态', + default='正常') + + assembly_order_code = fields.Char(string='组装单编码', readonly=True) + applicant = fields.Char(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') + + sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装单', readonly=True) + + @api.depends('maintenance_equipment_id') 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 + record.machine_table_type_id = record.maintenance_equipment_id.category_id.id + record.machine_tool_code = record.maintenance_equipment_id.code else: record.machine_table_type_id = None record.machine_tool_code = None - barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', - domain=[('product_id.name', '=', '功能刀具')]) - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', - domain=[('name', '=', '功能刀具')]) - functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型') - - 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) - - # 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') - - sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True) + @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([('category_id.equipment_type', '=', '机床')], order=order, access_rights_uid=SUPERUSER_ID) + names = categories._search([('category_id.equipment_type', '=', '机床')], order=order, + access_rights_uid=SUPERUSER_ID) return categories.browse(names) @api.onchange('functional_tool_status') @@ -503,7 +517,7 @@ class MachineTableToolChangingApply(models.Model): """ # 更新数据到机台换刀申请界面 # todo 自动换刀申请条件需补充完善 - if self.functional_tool_status == '异常': + 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, @@ -528,7 +542,7 @@ class MachineTableToolChangingApply(models.Model): '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, + 'cutter_spacing_code_id': self.cutter_spacing_code_id, }) def new_assembly_task(self, vals): @@ -646,8 +660,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): """ @@ -661,10 +675,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): @@ -674,7 +688,8 @@ class FunctionalToolAssembly(models.Model): 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) + functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', readonly=True) + functional_tool_name = fields.Char(string='功能刀具名称', requried=True) 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') @@ -691,7 +706,8 @@ class FunctionalToolAssembly(models.Model): # 整体式刀具型号 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) @@ -703,25 +719,29 @@ class FunctionalToolAssembly(models.Model): # 刀杆型号 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) @@ -797,7 +817,8 @@ class FunctionalToolAssembly(models.Model): 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) + # cutter_spacing_code = fields.Char(string='刀位号', readonly=True) + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) tool_loading_person = fields.Char(string='装刀人', readonly=True) tool_loading_time = fields.Datetime(string='装刀时间', readonly=True) @@ -806,7 +827,8 @@ class FunctionalToolAssembly(models.Model): 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, ) @@ -859,4 +881,4 @@ class FunctionalToolAssembly(models.Model): 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/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml index 6b8e7982..b9dd679b 100644 --- a/sf_tool_management/views/tool_base_views.xml +++ b/sf_tool_management/views/tool_base_views.xml @@ -707,43 +707,58 @@ sf.machine.table.tool.changing.apply - - + + + - - - - - - + + + + + + + + + + - - - + + + + + + + +