Accept Merge Request #706: (feature/功能刀具组装流程优化 -> develop)

Merge Request: 功能刀具组装流程优化

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/706?initial=true
This commit is contained in:
禹翔辉
2023-12-06 09:14:29 +08:00
committed by Coding
4 changed files with 109 additions and 59 deletions

View File

@@ -88,19 +88,19 @@ class ResProductMo(models.Model):
cutting_tool_run_out_accuracy_min = fields.Float('端跳精度min', digits=(6, 1))
cutting_tool_blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角)', size=20)
fit_blade_shape_id = fields.Many2one('maintenance.equipment.image',
'适配刀片形状', domain=[('type', '=', '刀片形状')])
'适配刀片形状', domain=[('type', '=', '刀片形状')])
suitable_machining_method_ids = fields.Many2many('maintenance.equipment.image',
'rel_machining_product_template', '适合加工方式',
domain=[('type', '=', '加工能力')])
blade_tip_characteristics_id = fields.Many2one('maintenance.equipment.image', '刀尖特征',
domain=[('type', '=', '刀尖特征')])
handle_type_id = fields.Many2one('maintenance.equipment.image', '柄部类型',domain=[('type', '=', '柄部类型')])
domain=[('type', '=', '刀尖特征')])
handle_type_id = fields.Many2one('maintenance.equipment.image', '柄部类型', domain=[('type', '=', '柄部类型')])
cutting_direction_ids = fields.Many2many('maintenance.equipment.image', 'rel_cutting_product_template',
'走刀方向', domain=[('type', '=', '走刀方向')])
suitable_coolant_ids = fields.Many2many('maintenance.equipment.image', 'rel_coolant_product_template',
'适合冷却液', domain=[('type', '=', '冷却液')])
compaction_way_id = fields.Many2one('maintenance.equipment.image',
'压紧方式', domain=[('type', '=', '压紧方式')])
'压紧方式', domain=[('type', '=', '压紧方式')])
@api.onchange('cutting_tool_material_id')
def _onchange_cutting_tool_material_id(self):
@@ -873,3 +873,13 @@ class SfMaintenanceEquipmentTool(models.Model):
for record in self:
if record.code:
record.name = record.code
@api.model_create_multi
def create(self, vals_list):
tools = super().create(vals_list)
for tool in tools:
self.env['sf.machine.table.tool.changing.apply'].sudo().create({
'maintenance_equipment_id': tool.equipment_id.id,
'cutter_spacing_code_id': tool.id
})
return tools

View File

@@ -42,10 +42,12 @@ class FunctionalCuttingToolEntity(models.Model):
# 计算库存位置数量
# """
# 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
# if obj.current_location_id:
# 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):
@@ -230,7 +232,13 @@ class RealTimeDistributionOfFunctionalTools(models.Model):
def _compute_tool_stock_total(self):
for record in self:
if record:
self.tool_stock_total = record.tool_stock_num + record.side_shelf_num + record.on_tool_stock_num
record.tool_stock_total = record.tool_stock_num + record.side_shelf_num + record.on_tool_stock_num
# @api.depends('tool_stock_total', 'min_stock_num', 'max_stock_num')
# def _compute_batch_replenishment_num(self):
# for record in self:
# if record.tool_stock_total < record.min_stock_num:
# record.batch_replenishment_num = record.max_stock_num - record.tool_stock_total
def create_or_edit_safety_stock(self, vals, sf_functional_cutting_tool_entity_ids):
"""
@@ -258,14 +266,14 @@ class MachineTableToolChangingApply(models.Model):
name = fields.Char('名称', related='maintenance_equipment_id.name', store=True)
# 设备信息
maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', required=True, readonly=False,
maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', readonly=True,
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_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=False,
cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True,
required=True, domain="[('equipment_id', '=', maintenance_equipment_id)]")
# 功能刀具信息
functional_tool_name = fields.Char(string='刀具名称', related='functional_tool_name_id.name', store=True)
@@ -279,7 +287,7 @@ class MachineTableToolChangingApply(models.Model):
tool_position_interface_type = fields.Selection(
[('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'),
('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'),
('直装固定式', '直装固定式')], string='刀位接口型号', required=True)
('直装固定式', '直装固定式')], string='刀位接口型号')
diameter = fields.Integer(string='刀具直径(mm)', )
knife_tip_r_angle = fields.Float(string='刀尖R角(mm)')
max_lifetime_value = fields.Integer(string='最大寿命值(min)')
@@ -305,7 +313,7 @@ class MachineTableToolChangingApply(models.Model):
@api.depends('alarm_value', 'used_value')
def _compute_functional_tool_status(self):
for record in self:
if record.alarm_value <= record.used_value:
if record.alarm_value < record.used_value:
record.functional_tool_status = '报警'
else:
record.functional_tool_status = '正常'
@@ -363,7 +371,7 @@ class MachineTableToolChangingApply(models.Model):
'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,
'applicant': '系统自动',
'apply_time': fields.Datetime.now(),
'cutter_spacing_code_id': self.cutter_spacing_code_id.id,
'whether_standard_knife': self.whether_standard_knife,
@@ -685,6 +693,20 @@ class FunctionalToolAssembly(models.Model):
code = False
return code
def get_functional_tool(self, val):
functional_tools = self.env['sf.functional.tool.assembly'].search(
[('after_assembly_functional_tool_name', '=', val.get('after_assembly_functional_tool_name')),
('after_assembly_functional_tool_diameter', '=', val.get('after_assembly_functional_tool_diameter')),
('after_assembly_knife_tip_r_angle', '=', val.get('after_assembly_knife_tip_r_angle')),
('after_assembly_coarse_middle_thin', '=', val.get('after_assembly_coarse_middle_thin'))])
for functional_tool in functional_tools:
if functional_tool.barcode_id.quant_ids[-1].location_id.name == '刀具线边库':
return functional_tool
for functional_tool in functional_tools:
if functional_tool.barcode_id.quant_ids[-1].location_id.name == '刀具房':
return functional_tool
return False
def automated_assembly(self):
"""
todo 自动组装

View File

@@ -301,7 +301,7 @@
<field name="name">功能刀具安全库存</field>
<field name="model">sf.real.time.distribution.of.functional.tools</field>
<field name="arch" type="xml">
<form create="0" edit="0" delete="0">
<form create="0" edit="1" delete="0">
<sheet>
<div class="oe_title">
<h1>
@@ -310,41 +310,44 @@
</div>
<group>
<group>
<field name="sf_cutting_tool_type_id"/>
<field name="diameter"/>
<field name="knife_tip_r_angle"/>
<field name="coarse_middle_thin"/>
<field name="whether_standard_knife"/>
<field name="sf_cutting_tool_type_id" readonly="1"/>
<field name="diameter" readonly="1"/>
<field name="knife_tip_r_angle" readonly="1"/>
<field name="coarse_middle_thin" readonly="1"/>
<field name="whether_standard_knife" readonly="1"/>
<field name="min_stock_num"/>
<field name="max_stock_num"/>
<field name="batch_replenishment_num"/>
</group>
<group>
<field name="image" widget='image'/>
<field name="image" widget='image' readonly="1"/>
</group>
</group>
<group col="1">
<group string="适合加工方式">
<field name="suitable_machining_method_ids" string=""
widget="custom_many2many_checkboxes"
widget="custom_many2many_checkboxes" readonly="1"
domain="[('id','in',suitable_machining_method_ids)]"/>
</group>
<group>
<group string="刀尖特征">
<field name="blade_tip_characteristics_id" string=""
widget="many2one_radio"
widget="many2one_radio" readonly="1"
domain="[('id','in',blade_tip_characteristics_id)]"/>
</group>
<group string="柄部类型">
<field name="handle_type_id" string=""
widget="many2one_radio"
widget="many2one_radio" readonly="1"
domain="[('id','in',handle_type_id)]"/>
</group>
</group>
<group>
<group string="走刀方向">
<field name="cutting_direction_ids" string="" widget="custom_many2many_checkboxes"
<field name="cutting_direction_ids" string="" widget="custom_many2many_checkboxes" readonly="1"
domain="[('id','in',cutting_direction_ids)]"/>
</group>
<group string="适合冷却液">
<field name="suitable_coolant_ids" string="" widget="custom_many2many_checkboxes"
<field name="suitable_coolant_ids" string="" widget="custom_many2many_checkboxes" readonly="1"
domain="[('id','in',suitable_coolant_ids)]"/>
</group>
</group>
@@ -352,7 +355,7 @@
<notebook>
<page string="刀具信息">
<field name="sf_functional_cutting_tool_entity_ids" widget="many2many">
<tree>
<tree edit="0" create="0" delete="0">
<field name="barcode_id"/>
<field name="functional_tool_name_id"/>
<field name="new_former"/>
@@ -468,7 +471,7 @@
<field name="name">机床换刀申请</field>
<field name="model">sf.machine.table.tool.changing.apply</field>
<field name="arch" type="xml">
<tree>
<tree create="0" delete="0">
<field name="name" invisible="1"/>
<field name="production_line_id" invisible="1"/>
<field name="maintenance_equipment_id"/>
@@ -634,15 +637,15 @@
<sheet>
<div class="oe_title">
<h1>
<field name="maintenance_equipment_id" readonly="0" placeholder="请选择"/>
<field name="maintenance_equipment_id" readonly="1" placeholder="请选择"/>
</h1>
</div>
<group>
<group>
<field name="production_line_id"/>
<field name="machine_table_type_id"/>
<field name="cutter_spacing_code_id"/>
<field name="tool_position_interface_type" placeholder="请选择"/>
<field name="cutter_spacing_code_id" options="{'no_create': True}"/>
<field name="tool_position_interface_type" placeholder="请选择" required="1"/>
<field name="sf_functional_tool_assembly_id" string="组装单"/>
</group>
</group>
@@ -698,6 +701,7 @@
<field name="applicant" optional="hide"/>
<searchpanel>
<field name="production_line_id" enable_counters="1" icon="fa-building"/>
<field name="maintenance_equipment_id" enable_counters="1" icon="fa-building"/>
<field name="functional_tool_status" enable_counters="1" icon="fa-building"/>
</searchpanel>
</search>

View File

@@ -62,33 +62,47 @@ class ToolChangeRequirementInformation(models.TransientModel):
('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id)
])
# 功能刀具组装创建新任务(new_assembly_task)
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,
'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,
'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,
'sf_machine_table_tool_changing_apply_id': record.id
})
# 修改机床换刀申请状态
record.write({
'status': '1',
'sf_functional_tool_assembly_id': sf_functional_tool_assembly.id
# 搜索满足需求的功能刀具
functional_tool = self.env['sf.functional.tool.assembly'].get_functional_tool({
'after_assembly_functional_tool_name': self.replacement_tool_name,
'after_assembly_functional_tool_diameter': self.replacement_diameter,
'after_assembly_knife_tip_r_angle': self.replacement_knife_tip_r_angle,
'after_assembly_coarse_middle_thin': self.replacement_tool_coarse_middle_thin
})
# 如果有满足需求的刀具,就返回刀具信息
if functional_tool:
record.write({'status': '3'})
# todo 将功能刀具信息传递到机床
return functional_tool
# 如果没有满足需求的刀具,就创建功能刀具组装单
else:
# 功能刀具组装创建新任务(new_assembly_task)
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,
'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,
'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,
'sf_machine_table_tool_changing_apply_id': record.id
})
# 修改机床换刀申请状态
record.write({
'status': '1',
'sf_functional_tool_assembly_id': sf_functional_tool_assembly.id
})
# 关闭弹出窗口
return {'type': 'ir.actions.act_window_close'}
@@ -323,14 +337,14 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
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='组装后新/旧')
after_assembly_new_former = fields.Selection([('0', ''), ('1', '')], string='组装后新/旧', default='0')
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='组装后粗/中/精')
string='组装后粗/中/精', default='3')
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)')