1、添加刀具预调仪功能

This commit is contained in:
yuxianghui
2024-06-05 10:54:58 +08:00
parent 19799aefe4
commit cf0afd6c64
9 changed files with 316 additions and 191 deletions

View File

@@ -223,8 +223,8 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
image = fields.Binary('图片')
@api.onchange('functional_tool_name')
def _onchange_functional_tool_name(self):
@api.depends('functional_tool_name')
def _compute_functional_tool_name(self):
for item in self:
if item.functional_tool_name:
inventory = self.env['sf.tool.inventory'].sudo().search([('name', '=', item.functional_tool_name)])
@@ -355,7 +355,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
# ================刀柄型号===============
handle_freight_rfid = fields.Char('刀柄Rfid', compute='_compute_rfid')
handle_code_id = fields.Many2one('stock.lot', '刀柄序列号', required=True,
handle_code_id = fields.Many2one('stock.lot', '刀柄序列号',
domain=[('product_id.cutting_tool_material_id.name', '=', '刀柄'),
('tool_material_status', '=', '可用')])
handle_product_id = fields.Many2one('product.product', string='刀柄名称', compute='_compute_handle_product_id',
@@ -456,15 +456,17 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
item.handle_freight_rfid = None
# 组装功能刀具参数信息
after_name_id = fields.Many2one('sf.tool.inventory', string='功能刀具名称', required=True)
after_name_id = fields.Many2one('sf.tool.inventory', string='功能刀具名称', compute='_compute_functional_tool_name',
store=True)
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号')
rfid = fields.Char('Rfid', compute='_compute_rfid')
code = fields.Char(string='功能刀具编码', compute='_compute_code')
after_assembly_functional_tool_name = fields.Char(string='组装后功能刀具名称', compute='_compute_name', store=True)
after_assembly_functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model',
string='组装后功能刀具类型')
after_assembly_functional_tool_diameter = fields.Float(string='组装后功能刀具直径(mm)')
after_assembly_knife_tip_r_angle = fields.Float(string='组装后刀尖R角(mm)')
string='组装后功能刀具类型', store=True,
compute='_compute_after_assembly_max_lifetime_value')
after_assembly_functional_tool_diameter = fields.Float(string='组装后功能刀具直径(mm)', digits=(10, 3))
after_assembly_knife_tip_r_angle = fields.Float(string='组装后刀尖R角(mm)', digits=(10, 3))
after_assembly_new_former = fields.Selection([('0', ''), ('1', '')], string='组装后新/旧', default='0')
cut_time = fields.Integer(string='已切削时间(min)')
cut_length = fields.Float(string='已切削长度(mm)')
@@ -473,15 +475,66 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
after_assembly_whether_standard_knife = fields.Boolean(string='组装后是否标准刀', default=True)
after_assembly_coarse_middle_thin = fields.Selection([("1", ""), ('2', ''), ('3', '')],
string='组装后粗/中/精', default='3')
after_assembly_max_lifetime_value = fields.Integer(string='组装后最大寿命值(min)')
after_assembly_max_lifetime_value = fields.Integer(string='组装后最大寿命值(min)', store=True,
compute='_compute_after_assembly_max_lifetime_value')
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)', required=True)
after_assembly_tool_loading_length = fields.Float(string='组装后总长度(mm)', digits=(10, 3))
after_assembly_handle_length = fields.Float(string='组装后刀柄长度(mm)', digits=(10, 3))
after_assembly_functional_tool_length = fields.Float(string='组装后伸出长(mm)', digits=(10, 3),
compute='_compute_after_assembly_functional_tool_length')
after_assembly_effective_length = fields.Float(string='组装后有效长(mm)')
L_D_number = fields.Float(string='L/D值(mm)', compute='_compute_l_d_number')
hiding_length = fields.Float(string='避空长(mm)')
after_tool_groups_id = fields.Many2one('sf.tool.groups', string='组装后刀具组')
after_tool_groups_id = fields.Many2one('sf.tool.groups', string='组装后刀具组', store=True,
compute='_compute_after_assembly_max_lifetime_value')
obtain_measurement_status = fields.Boolean('是否获取测量值', default=False)
@api.depends('after_assembly_tool_loading_length', 'after_assembly_handle_length')
def _compute_after_assembly_functional_tool_length(self):
for item in self:
item.after_assembly_functional_tool_length = item.after_assembly_tool_loading_length - item.after_assembly_handle_length
@api.onchange('after_assembly_max_lifetime_value')
def _onchange_after_assembly_alarm_value(self):
for item in self:
if item.after_assembly_max_lifetime_value:
item.after_assembly_alarm_value = item.after_assembly_max_lifetime_value * 0.95
def get_tool_preset_parameter(self):
"""
获取刀具预调仪数据
"""
tool = self.env['sf.functional.tool.assembly'].search([('assembly_order_code', '=', self.assembly_order_code)])
tool_loading_length = tool.after_assembly_tool_loading_length
diameter = tool.after_assembly_functional_tool_diameter
r_angle = tool.after_assembly_knife_tip_r_angle
if tool_loading_length == 0 and diameter == 0 and r_angle == 0:
raise ValidationError('没有获取到测量数据!')
self.write({
'after_assembly_tool_loading_length': tool_loading_length, # 总长度
'after_assembly_functional_tool_diameter': diameter, # 直径
'after_assembly_knife_tip_r_angle': r_angle, # R角
'obtain_measurement_status': True # 是否获取测量值
})
return {
'type': 'ir.actions.act_window',
'res_model': 'sf.functional.tool.assembly.order',
'view_mode': 'form',
'res_id': self.id,
'target': 'new',
'flags': {'form': {'action_buttons': True, 'options': {'mode': 'modal'}}}
}
@api.depends('after_name_id')
def _compute_after_assembly_max_lifetime_value(self):
for item in self:
if item.after_name_id:
item.after_assembly_max_lifetime_value = item.after_name_id.life_span
item.after_assembly_functional_tool_type_id = item.after_name_id.functional_cutting_tool_model_id.id
item.after_tool_groups_id = item.after_name_id.tool_groups_id.id
@api.onchange('after_name_id')
def _onchange_number(self):
@@ -489,14 +542,12 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
if item.after_name_id:
item.after_assembly_functional_tool_diameter = item.after_name_id.diameter
item.after_assembly_knife_tip_r_angle = item.after_name_id.angle
item.after_assembly_max_lifetime_value = item.after_name_id.life_span
item.after_assembly_tool_loading_length = item.after_name_id.tool_length
item.after_assembly_functional_tool_length = item.after_name_id.extension
item.hiding_length = item.after_name_id.blade_length
item.after_assembly_functional_tool_type_id = item.after_name_id.functional_cutting_tool_model_id.id
item.after_tool_groups_id = item.after_name_id.tool_groups_id.id
else:
item.after_assembly_functional_tool_type_id = item.functional_tool_type_id
item.after_assembly_functional_tool_type_id = item.functional_tool_type_id.id
item.after_tool_groups_id = item.tool_groups_id.id
# functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=False)
@@ -574,24 +625,6 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
else:
record.L_D_number = 0
@api.constrains('after_assembly_tool_loading_length', 'after_assembly_functional_tool_length',
'after_assembly_max_lifetime_value', 'after_assembly_alarm_value',
'after_assembly_effective_length', 'hiding_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')
if obj.after_assembly_max_lifetime_value == 0:
raise ValidationError('组装参数信息【最大寿命值】不能为0')
if obj.after_assembly_alarm_value == 0:
raise ValidationError('组装参数信息【报警值】不能为0')
if obj.after_assembly_effective_length == 0:
raise ValidationError('组装参数信息【有效长】不能为0')
if obj.hiding_length == 0:
raise ValidationError('组装参数信息【避空长】不能为0')
def functional_tool_assembly(self):
"""
功能刀具组装
@@ -659,16 +692,39 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
def materials_must_be_judged(self):
"""
功能刀具组装物料必填判断
功能刀具组装必填判断
"""
# 物料必填校验
if not self.handle_code_id:
raise ValidationError('缺少【刀柄】物料信息!')
if not self.integral_product_id and not self.blade_product_id:
raise ValidationError('【整体式刀具】和【刀片】必须填写一个!')
if self.blade_product_id:
if not self.bar_product_id and not self.pad_product_id:
raise ValidationError('【刀盘】和【刀杆】必须填写一个!')
# 组装参数必填校验
if self.after_assembly_functional_tool_length == 0:
raise ValidationError('组装参数信息【伸出长】不能为0')
if self.after_assembly_max_lifetime_value == 0:
raise ValidationError('组装参数信息【最大寿命值】不能为0')
if self.after_assembly_alarm_value == 0:
raise ValidationError('组装参数信息【报警值】不能为0')
# if self.after_assembly_effective_length == 0:
# raise ValidationError('组装参数信息【有效长】不能为0')
# if self.hiding_length == 0:
# raise ValidationError('组装参数信息【避空长】不能为0')
if self.after_assembly_functional_tool_diameter == 0:
raise ValidationError('组装参数信息【刀具直径】不能为0')
if self.after_assembly_tool_loading_length == 0:
raise ValidationError('组装参数信息【总长度】不能为0')
if self.after_assembly_handle_length == 0:
raise ValidationError('组装参数信息【刀柄长度】不能为0')
if self.after_assembly_tool_loading_length < self.after_assembly_handle_length:
raise ValidationError('组装参数信息【刀柄长度】不能大于【总长度】!')
def get_desc_1(self, stock_lot):
return {
'start_preset_bool': False,
'barcode_id': stock_lot.id,
'code': self.code,
'rfid': self.rfid,
@@ -694,6 +750,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
'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_handle_length': self.after_assembly_handle_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,
@@ -726,6 +783,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
'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,
'handle_length': self.after_assembly_handle_length,
'functional_tool_length': self.after_assembly_functional_tool_length,
'effective_length': self.after_assembly_effective_length,
@@ -918,14 +976,13 @@ class StockLot(models.Model):
})
return stock_move_id, stock_move_line_id
class StockQuant(models.Model):
_inherit = 'stock.quant'
@api.model_create_multi
def create(self, vals_list):
records = super(StockQuant, self).create(vals_list)
for record in records:
if record.lot_id.product_id.categ_id.name == '刀具':
record.lot_id.enroll_tool_material_stock()
return records
# class StockQuant(models.Model):
# _inherit = 'stock.quant'
#
# @api.model_create_multi
# def create(self, vals_list):
# records = super(StockQuant, self).create(vals_list)
# for record in records:
# if record.lot_id.product_id.categ_id.name == '刀具':
# record.lot_id.enroll_tool_material_stock()
# return records

View File

@@ -166,11 +166,12 @@
<sheet>
<div class="oe_title">
<h1>
<field name="production_line_name_id"/>
<field name="assembly_order_code"/>
</h1>
</div>
<group>
<group>
<field name="production_line_name_id"/>
<field name="machine_tool_name_id"/>
<field name="cutter_spacing_code_id"/>
</group>
@@ -178,24 +179,26 @@
<field name="image" nolabel="1" widget="image"/>
</group>
</group>
<group string="功能刀具申请信息">
<group string="功能刀具申请信息" col="1">
<group>
<field name="functional_tool_name"/>
<field name="functional_tool_type_id"/>
<field name="tool_groups_id"/>
<field name="functional_tool_diameter" string="刀具直径(mm)"/>
<field name="knife_tip_r_angle"/>
<field name="tool_loading_length"/>
<field name="functional_tool_length"/>
<field name="effective_length"/>
</group>
<group>
<field name="whether_standard_knife"/>
<field name="coarse_middle_thin"/>
<field name="new_former"/>
<field name="use_tool_time"/>
<field name="reason_for_applying"/>
<!-- <field name="functional_tool_cutting_type"/>-->
<group>
<field name="functional_tool_name"/>
<field name="functional_tool_type_id"/>
<field name="tool_groups_id"/>
<field name="functional_tool_diameter" string="刀具直径(mm)"/>
<field name="knife_tip_r_angle"/>
<field name="tool_loading_length"/>
<field name="functional_tool_length"/>
<field name="effective_length"/>
</group>
<group>
<field name="whether_standard_knife"/>
<field name="coarse_middle_thin"/>
<field name="new_former"/>
<field name="use_tool_time"/>
<field name="reason_for_applying"/>
<!-- <field name="functional_tool_cutting_type"/>-->
</group>
</group>
</group>
<group string="组装物料信息" col="1">
@@ -330,53 +333,66 @@
</group>
</group>
<group string="组装参数信息">
<group string="组装参数信息" col="1">
<group>
<group>
<field name="barcode_id" invisible="True"/>
<field name="code" readonly="True"/>
<field name="rfid" class="custom_required"/>
<field name="after_name_id" string="功能刀具名称" placeholder="请选择功能刀具名称"
</group>
<group>
<field name="obtain_measurement_status" invisible="1"/>
<button name="get_tool_preset_parameter" string="获取测量值" type="object"
class="btn-primary"/>
</group>
</group>
<group>
<group>
<field name="after_name_id" string="功能刀具名称" placeholder="请选择功能刀具名称" readonly="1"
options="{'no_create': True, 'no_quick_create': True}"/>
<field name="after_assembly_functional_tool_name" string="功能刀具名称" invisible="1"/>
<field name="after_assembly_functional_tool_type_id" string="功能刀具类型"
<field name="after_assembly_functional_tool_name" string="功能刀具名称"
invisible="1"/>
<field name="after_assembly_functional_tool_type_id" string="功能刀具类型" readonly="1"
options="{'no_create': True, 'no_quick_create': True}"/>
<field name="after_tool_groups_id"
<field name="after_tool_groups_id" readonly="1"
options="{'no_create': True, 'no_quick_create': True}"/>
<field name="after_assembly_functional_tool_diameter" string="刀具直径(mm)"
class="custom_required"/>
<field name="after_assembly_knife_tip_r_angle" string="刀尖R角(mm)"
class="custom_required"/>
<field name="after_assembly_whether_standard_knife" string="是否标准刀"/>
<field name="after_assembly_coarse_middle_thin" string="粗/中/精"/>
<field name="after_assembly_new_former" string="新/旧"/>
<field name="cut_time" attrs="{'invisible': [('after_assembly_new_former','=','0')]}"/>
<field name="cut_time"
attrs="{'invisible': [('after_assembly_new_former','=','0')]}"/>
<field name="cut_length"
attrs="{'invisible': [('after_assembly_new_former','=','0')]}"/>
<field name="cut_number"
attrs="{'invisible': [('after_assembly_new_former','=','0')]}"/>
</group>
</group>
<group>
<group>
<field name="after_assembly_whether_standard_knife" string="是否标准刀"/>
<field name="after_assembly_coarse_middle_thin" string="粗/中/精"/>
<field name="after_assembly_max_lifetime_value" string="最大寿命值(min)"
class="custom_required"/>
<field name="after_assembly_alarm_value" string="报警值(min)" class="custom_required"/>
<field name="after_assembly_used_value" string="已使用值(min)"/>
<field name="after_assembly_functional_tool_diameter" string="刀具直径(mm)"
class="custom_required" readonly="1"/>
<field name="after_assembly_knife_tip_r_angle" string="刀尖R角(mm)"
class="custom_required" readonly="1"/>
<field name="after_assembly_tool_loading_length" string="总长度(mm)"
class="custom_required" readonly="1"/>
<field name="after_assembly_handle_length" string="刀柄长度(mm)"
class="custom_required"/>
<field name="after_assembly_functional_tool_length" string="伸出长(mm)"
class="custom_required"/>
<field name="after_assembly_effective_length" string="有效长(mm)"
<field name="after_assembly_max_lifetime_value" string="最大寿命值(min)"
class="custom_required"/>
<field name="hiding_length" class="custom_required"/>
<field name="L_D_number"/>
<field name="after_assembly_alarm_value" string="报警值(min)"
class="custom_required"/>
<field name="after_assembly_used_value" string="已使用值(min)" invisible="1"/>
<field name="after_assembly_effective_length" string="有效长(mm)" invisible="1"
class="custom_required"/>
<field name="hiding_length" class="custom_required" invisible="1"/>
<field name="L_D_number" invisible="1"/>
</group>
</group>
</group>
</sheet>
<footer>
<button string="确定" name="functional_tool_assembly" type="object" class="btn-primary"
attrs="{'invisible': [('obtain_measurement_status', '=', False)]}"
confirm="是否确认申请组装"/>
<button string="取消" class="btn-secondary" special="cancel"/>
</footer>