diff --git a/sf_base/models/tool_base_new.py b/sf_base/models/tool_base_new.py
index c619ea9f..932bb106 100644
--- a/sf_base/models/tool_base_new.py
+++ b/sf_base/models/tool_base_new.py
@@ -77,32 +77,32 @@ class CuttingToolModel(models.Model):
integral_run_out_accuracy_min = fields.Char('整体式刀具端跳精度min')
fit_blade_shape_id = fields.Many2one('maintenance.equipment.image',
- '适配刀片形状', domain=[('type', '=', '刀片形状')])
+ '适配刀片形状', domain=[('type', '=', '刀片形状')])
suitable_machining_method_ids = fields.Many2many('maintenance.equipment.image',
'suitable_machining_method_library_rel',
'适合加工方式', domain=[('type', '=', '加工能力')])
blade_tip_characteristics_id = fields.Many2one('maintenance.equipment.image',
- '刀尖特征', domain=[('type', '=', '刀尖特征')])
+ '刀尖特征', domain=[('type', '=', '刀尖特征')])
handle_type_id = fields.Many2one('maintenance.equipment.image',
- '柄部类型', domain=[('type', '=', '柄部类型')])
+ '柄部类型', domain=[('type', '=', '柄部类型')])
cutting_direction_ids = fields.Many2many('maintenance.equipment.image', 'cutting_direction_library_rel',
'走刀方向', domain=[('type', '=', '走刀方向')])
suitable_coolant_ids = fields.Many2many('maintenance.equipment.image', 'suitable_coolant_library_rel',
'适合冷却液', domain=[('type', '=', '冷却液')])
compaction_way_id = fields.Many2one('maintenance.equipment.image',
- '压紧方式', domain=[('type', '=', '压紧方式')])
+ '压紧方式', domain=[('type', '=', '压紧方式')])
integral_tool_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters',
- 'standard_library_id', string='整体式刀具基本参数')
+ 'standard_library_id', string='整体式刀具基本参数')
blade_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters',
- 'standard_library_id', string='刀片基本参数')
+ 'standard_library_id', string='刀片基本参数')
cutter_bar_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters',
- 'standard_library_id', string='刀杆基本参数')
+ 'standard_library_id', string='刀杆基本参数')
cutter_head_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters',
- 'standard_library_id', string='刀盘基本参数')
+ 'standard_library_id', string='刀盘基本参数')
knife_handle_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters',
- 'standard_library_id', string='刀柄基本参数')
+ 'standard_library_id', string='刀柄基本参数')
chuck_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters',
- 'standard_library_id', string='夹头基本参数')
+ 'standard_library_id', string='夹头基本参数')
cutting_speed_ids = fields.One2many('sf.cutting.speed', 'standard_library_id', string='切削速度Vc')
feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz',
domain=[('cutting_speed', '!=', False)])
diff --git a/sf_dlm_management/__manifest__.py b/sf_dlm_management/__manifest__.py
index a32ecf81..a5c894d4 100644
--- a/sf_dlm_management/__manifest__.py
+++ b/sf_dlm_management/__manifest__.py
@@ -11,6 +11,7 @@
'website': 'https://www.sf.jikimo.com',
'depends': ['sf_sale', 'sf_dlm', 'sf_manufacturing'],
'data': [
+ 'data/stock_data.xml',
'views/product_template_management_view.xml',
],
'demo': [
diff --git a/sf_dlm_management/data/stock_data.xml b/sf_dlm_management/data/stock_data.xml
new file mode 100644
index 00000000..d6067cdf
--- /dev/null
+++ b/sf_dlm_management/data/stock_data.xml
@@ -0,0 +1,29 @@
+
+
+
+
+ 刀具房
+ internal
+ 库区
+ 存货区
+ DJF
+ true
+
+
+
+
+
+
+ 刀具组装入库
+ internal
+
+ true
+
+ ZR
+
+
+
+
+
\ No newline at end of file
diff --git a/sf_manufacturing/data/stock_data.xml b/sf_manufacturing/data/stock_data.xml
index b65b2235..74d02b4a 100644
--- a/sf_manufacturing/data/stock_data.xml
+++ b/sf_manufacturing/data/stock_data.xml
@@ -13,6 +13,12 @@
5
+
+ My Company 刀具组装入库
+ ZR/
+ 5
+
+
外协
@@ -31,15 +37,6 @@
-
-
-
-
-
-
-
-
-
外协入库
internal
@@ -63,17 +60,5 @@
search="[('barcode','=','WH-PREPRODUCTION')]"/>
-
-
- 刀具组装入库
- internal
- true
-
- ZR
-
-
-
-
diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py
index 54834390..44b2b912 100644
--- a/sf_tool_management/models/base.py
+++ b/sf_tool_management/models/base.py
@@ -22,7 +22,7 @@ class FunctionalCuttingToolEntity(models.Model):
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)
+ tool_loading_length = fields.Float(strin='总长度(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)
@@ -107,19 +107,41 @@ class FunctionalCuttingToolEntity(models.Model):
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')
+ domain=[('type', '=', '加工能力')])
blade_tip_characteristics_id = fields.Many2one(
'maintenance.equipment.image', '刀尖特征',
- domain=[('type', '=', '刀尖特征')], related='cutting_tool_integral_model_id.blade_tip_characteristics_id')
+ domain=[('type', '=', '刀尖特征')])
handle_type_id = fields.Many2one(
'maintenance.equipment.image', '柄部类型',
- domain=[('type', '=', '柄部类型')], related='cutting_tool_integral_model_id.handle_type_id')
+ domain=[('type', '=', '柄部类型')])
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')
+ domain=[('type', '=', '走刀方向')])
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')
+ domain=[('type', '=', '冷却液')])
+
+ @api.depends('cutting_tool_integral_model_id', 'cutting_tool_blade_model_id')
+ def _compute_maintenance_equipment_image(self):
+ for record in self:
+ if record.cutting_tool_integral_model_id:
+ record.suitable_machining_method_ids = record.cutting_tool_integral_model_id.suitable_machining_method_ids.ids
+ record.blade_tip_characteristics_id = record.cutting_tool_integral_model_id.blade_tip_characteristics_id.ids
+ record.handle_type_id = record.cutting_tool_integral_model_id.handle_type_id.ids
+ record.cutting_direction_ids = record.cutting_tool_integral_model_id.cutting_direction_ids.ids
+ record.suitable_coolant_ids = record.cutting_tool_integral_model_id.suitable_coolant_ids.ids
+ elif record.cutting_tool_blade_model_id:
+ record.suitable_machining_method_ids = record.cutting_tool_blade_model_id.suitable_machining_method_ids.ids
+ record.blade_tip_characteristics_id = record.cutting_tool_blade_model_id.blade_tip_characteristics_id.ids
+ record.handle_type_id = record.cutting_tool_blade_model_id.handle_type_id.ids
+ record.cutting_direction_ids = record.cutting_tool_blade_model_id.cutting_direction_ids.ids
+ record.suitable_coolant_ids = record.cutting_tool_blade_model_id.suitable_coolant_ids.ids
+ else:
+ record.suitable_machining_method_ids = []
+ record.blade_tip_characteristics_id = []
+ record.handle_type_id = []
+ record.cutting_direction_ids = []
+ record.suitable_coolant_ids = []
def _get_functional_tool_model_ids(self, functional_tool_model_code):
functional_tool_model_ids = []
@@ -332,8 +354,7 @@ class MachineTableToolChangingApply(models.Model):
# 设备信息
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')
+ production_line_id = fields.Many2one('sf.production.line', string='生产线', readonly=True)
machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True,
compute='_compute_machine_table_type_id')
machine_tool_code = fields.Char(string='机台号', related='maintenance_equipment_id.name')
@@ -344,9 +365,10 @@ class MachineTableToolChangingApply(models.Model):
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', store=True,
domain=[('product_id.name', '=', '功能刀具')],
related='functional_tool_name_id.barcode_id')
- functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称')
+ functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', domain=[('assemble_status', '=', '1')],
+ string='功能刀具名称')
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', store=True,
- related='functional_tool_name_id.functional_tool_type_id')
+ related='functional_tool_name_id.after_assembly_functional_tool_type_id')
tool_position_interface_type = fields.Selection(
[('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'),
@@ -403,11 +425,6 @@ class MachineTableToolChangingApply(models.Model):
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.constrains('functional_tool_status')
def automation_apply_for_tool_change(self):
"""
@@ -520,7 +537,7 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=False)
diameter = fields.Integer(string='刀具直径(mm)', readonly=False)
tool_included_angle = fields.Float(string='刀尖R角(mm)', readonly=False)
- tool_loading_length = fields.Float(string='装刀长(mm)', readonly=False)
+ tool_loading_length = fields.Float(strin='总长度(mm)', readonly=False)
extension_length = fields.Float(string='伸出长(mm)')
effective_length = fields.Float(string='有效长(mm)')
new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=False, default='0')
@@ -608,7 +625,7 @@ class FunctionalToolAssembly(models.Model):
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)
+ tool_loading_length = fields.Float(strin='总长度(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', '按库存组装')],
@@ -744,7 +761,7 @@ class FunctionalToolAssembly(models.Model):
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_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)
diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml
index 0553eb97..c4202131 100644
--- a/sf_tool_management/views/tool_base_views.xml
+++ b/sf_tool_management/views/tool_base_views.xml
@@ -156,9 +156,10 @@
-
-
-
+
+
+
+
@@ -990,7 +991,7 @@
string="最大寿命值(min)"/>
-
+
diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py
index 8b3af487..b198c2e7 100644
--- a/sf_tool_management/wizard/wizard.py
+++ b/sf_tool_management/wizard/wizard.py
@@ -35,23 +35,34 @@ class ToolChangeRequirementInformation(models.TransientModel):
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_knife_tip_r_angle = fields.Float(string='待换刀具刀尖R角(mm)', requride=True)
+ replacement_tool_setting_length = fields.Float(string='待换刀具总长度(mm)', requride=True)
replacement_extension_length = fields.Float(string='待换刀具伸出长(mm)')
replacement_effective_length = fields.Float(string='待换刀具有效长(mm)')
- replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')],
+ replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], requride=True,
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')
+ new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', default='0', requride=True)
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='申请原因')
+ @api.constrains('replacement_knife_tip_r_angle', 'replacement_diameter', 'replacement_tool_coarse_middle_thin',
+ 'new_former')
+ def _check_length_or_diamenter(self):
+ for obj in self:
+ if obj.replacement_diameter == 0 and obj.replacement_knife_tip_r_angle == 0:
+ raise ValidationError('待换功能刀具信息【刀具直径】和【刀尖R角】不能同时为0!!!')
+ if not obj.new_former:
+ raise ValidationError('待换功能刀具信息【新/旧】不能位空!!!')
+ if not obj.replacement_tool_coarse_middle_thin:
+ raise ValidationError('待换功能刀具信息【粗/中/精】不能位空!!!')
+
def tool_changing_apply(self):
"""
确认换刀申请(按键)
@@ -173,7 +184,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
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)
+ 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', '按库存组装')],
@@ -336,7 +347,8 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
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='组装后功能刀具类型')
+ string='组装后功能刀具类型',
+ compute='_compute_after_assembly_functional_tool_type_id')
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='组装后新/旧', default='0')
@@ -350,14 +362,54 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
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_tool_loading_length = fields.Float(string='组装后总长度(mm)')
+ after_assembly_functional_tool_length = fields.Float(string='组装后伸出长(mm)', required=True)
after_assembly_effective_length = fields.Float(string='组装后有效长(mm)')
- L_D_number = fields.Float(string='L/D值(mm)')
+ L_D_number = fields.Float(string='L/D值(mm)', compute='_compute_l_d_number')
hiding_length = fields.Float(string='避空长(mm)')
functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=False)
+ @api.onchange('integral_code_id')
+ def _onchange_after_assembly_functional_tool_diameter(self):
+ for obj in self:
+ if obj.integral_code_id:
+ obj.after_assembly_functional_tool_diameter = obj.integral_code_id.product_id.cutting_tool_blade_diameter
+ else:
+ obj.after_assembly_functional_tool_diameter = 0
+
+ @api.onchange('blade_code_id')
+ def _onchange_after_assembly_knife_tip_r_angle(self):
+ for obj in self:
+ if obj.blade_code_id:
+ obj.after_assembly_knife_tip_r_angle = obj.blade_code_id.product_id.cutting_tool_blade_tip_circular_arc_radius
+ else:
+ obj.after_assembly_knife_tip_r_angle = 0
+
+ @api.depends('functional_tool_type_id')
+ def _compute_after_assembly_functional_tool_type_id(self):
+ for obj in self:
+ if obj.functional_tool_type_id:
+ obj.after_assembly_functional_tool_type_id = obj.functional_tool_type_id
+ else:
+ obj.after_assembly_functional_tool_type_id = None
+
+ @api.depends('hiding_length', 'after_assembly_functional_tool_diameter')
+ def _compute_l_d_number(self):
+ for record in self:
+ if record.hiding_length != 0 and record.after_assembly_functional_tool_diameter != 0:
+ record.L_D_number = record.hiding_length / record.after_assembly_functional_tool_diameter
+ else:
+ record.L_D_number = 0
+
+ @api.constrains('after_assembly_tool_loading_length', 'after_assembly_functional_tool_length')
+ def _check_length_control(self):
+ for obj in self:
+ if obj.after_assembly_tool_loading_length == 0:
+ raise ValidationError('组装参数信息【总长度】不能为0!!!')
+ if obj.after_assembly_functional_tool_length == 0:
+ raise ValidationError('组装参数信息【伸出长】不能为0!!!')
+
def functional_tool_assembly(self):
"""
功能刀具组装
diff --git a/sf_tool_management/wizard/wizard_view.xml b/sf_tool_management/wizard/wizard_view.xml
index bf061d99..453d6f60 100644
--- a/sf_tool_management/wizard/wizard_view.xml
+++ b/sf_tool_management/wizard/wizard_view.xml
@@ -40,7 +40,7 @@
options="{'no_create': True, 'no_quick_create': True}"/>
-
+
@@ -341,9 +341,9 @@
-
-
-
+
+
+
@@ -351,11 +351,11 @@
-
+
-
+