1、功能刀具组装单添加物料校验标签字段、新增扫描校验功能、优化相关计算方法;2、添加新旧、粗中精字段值根据所选物料自动计算方法,伸出长自动计算方法;3、去除部分字段的校验方法;4、组装单form、tree视图布局调整,tree视图状态字段添加背景颜色,变更筛选条件;

This commit is contained in:
yuxianghui
2024-09-06 17:55:59 +08:00
parent 29b9223a14
commit 1eae92f2b2
2 changed files with 156 additions and 74 deletions

View File

@@ -349,9 +349,42 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
class FunctionalToolAssembly(models.Model):
_name = 'sf.functional.tool.assembly'
_inherit = ['mail.thread']
_inherit = ['mail.thread', 'barcodes.barcode_events_mixin']
_description = '功能刀具组装'
_order = 'assemble_status, use_tool_time asc'
_order = 'tool_loading_time desc, use_tool_time asc'
def on_barcode_scanned(self, barcode):
"""
智能工厂组装单处扫码校验刀具物料
"""
for record in self:
lot_ids = self.env['stock.lot'].sudo().search([('rfid', '=', barcode)])
if lot_ids:
for lot_id in lot_ids:
if lot_id.tool_material_status != '可用':
raise ValidationError(f'Rfid为【{barcode}】的刀柄已被占用,请重新扫描!!')
if lot_id.product_id == record.handle_product_id:
record.handle_code_id = lot_id.id
record.handle_verify = True
else:
raise ValidationError('刀具选择错误,请重新确认!!!')
else:
location = self.env['sf.shelf.location'].sudo().search([('barcode', '=', barcode)])
if location:
if location == record.integral_freight_barcode_id:
record.integral_verify = True
elif location == record.blade_freight_barcode_id:
record.blade_verify = True
elif location == record.bar_freight_barcode_id:
record.bar_verify = True
elif location == record.pad_freight_barcode_id:
record.pad_verify = True
elif location == record.chuck_freight_barcode_id:
record.chuck_verify = True
else:
raise ValidationError('刀具选择错误,请重新确认!')
else:
raise ValidationError(f'扫描为【{barcode}】的刀具不存在,请重新扫描!')
@api.depends('functional_tool_name')
def _compute_name(self):
@@ -390,6 +423,8 @@ class FunctionalToolAssembly(models.Model):
'tool_inventory_id.extension', 'tool_inventory_id.life_span')
def _compute_inventory_num(self):
for item in self:
if item.assemble_status != '01':
return True
if item.tool_inventory_id:
item.functional_tool_type_id = item.tool_inventory_id.functional_cutting_tool_model_id.id
item.tool_groups_id = item.tool_inventory_id.tool_groups_id.id # 刀具组
@@ -397,7 +432,6 @@ class FunctionalToolAssembly(models.Model):
item.after_assembly_functional_tool_diameter = item.tool_inventory_id.diameter # 直径
item.after_assembly_knife_tip_r_angle = item.tool_inventory_id.angle # R角
item.after_assembly_tool_loading_length = item.tool_inventory_id.tool_length # 总长度
item.after_assembly_functional_tool_length = item.tool_inventory_id.extension # 伸出长度
item.after_assembly_max_lifetime_value = item.tool_inventory_id.life_span # 最大寿命
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型',
@@ -451,6 +485,7 @@ class FunctionalToolAssembly(models.Model):
related='integral_product_id.specification_id')
sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', string='整体式刀具品牌',
related='integral_product_id.brand_id')
integral_verify = fields.Boolean('整体刀校验', default=False)
@api.onchange('integral_freight_barcode_id')
def _onchange_integral_freight_barcode_id(self):
@@ -478,6 +513,7 @@ class FunctionalToolAssembly(models.Model):
blade_specification_id = fields.Many2one('sf.tool.materials.basic.parameters', string='刀片规格',
related='blade_product_id.specification_id')
sf_tool_brand_id_2 = fields.Many2one('sf.machine.brand', '刀片品牌', related='blade_product_id.brand_id')
blade_verify = fields.Boolean('刀片校验', default=False)
@api.onchange('blade_freight_barcode_id')
def _onchange_blade_freight_barcode_id(self):
@@ -505,6 +541,7 @@ class FunctionalToolAssembly(models.Model):
bar_specification_id = fields.Many2one('sf.tool.materials.basic.parameters', string='刀杆规格',
related='bar_product_id.specification_id')
sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', related='bar_product_id.brand_id')
brand_verify = fields.Boolean('刀杆校验', default=False)
@api.onchange('bar_freight_barcode_id')
def _onchange_bar_freight_barcode_id(self):
@@ -532,6 +569,7 @@ class FunctionalToolAssembly(models.Model):
pad_specification_id = fields.Many2one('sf.tool.materials.basic.parameters', string='刀盘规格',
related='pad_product_id.specification_id')
sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', related='pad_product_id.brand_id')
pad_verify = fields.Boolean('刀盘校验', default=False)
@api.onchange('pad_freight_barcode_id')
def _onchange_pad_freight_barcode_id(self):
@@ -558,6 +596,7 @@ class FunctionalToolAssembly(models.Model):
handle_specification_id = fields.Many2one('sf.tool.materials.basic.parameters', string='刀柄规格',
related='handle_product_id.specification_id')
sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', related='handle_product_id.brand_id')
handle_verify = fields.Boolean('刀柄校验', default=False)
@api.depends('handle_code_id')
def _compute_handle_product_id(self):
@@ -584,6 +623,7 @@ class FunctionalToolAssembly(models.Model):
chuck_specification_id = fields.Many2one('sf.tool.materials.basic.parameters', string='夹头规格',
related='chuck_product_id.specification_id')
sf_tool_brand_id_6 = fields.Many2one('sf.machine.brand', '夹头品牌', related='chuck_product_id.brand_id')
chuck_verify = fields.Boolean('夹头校验', default=False)
@api.onchange('chuck_freight_barcode_id')
def _onchange_chuck_freight_barcode_id(self):
@@ -630,14 +670,16 @@ class FunctionalToolAssembly(models.Model):
compute='_compute_inventory_num')
after_assembly_knife_tip_r_angle = fields.Float(string='组装后刀尖R角(mm)', digits=(10, 3), store=True,
compute='_compute_inventory_num')
after_assembly_new_former = fields.Selection([('0', ''), ('1', '')], string='组装后新/旧', default='0')
after_assembly_new_former = fields.Selection([('0', ''), ('1', '')], string='组装后新/旧', default='0',
store=True, compute='_compute_rota_tive')
cut_time = fields.Integer(string='已切削时间(min)', readonly=True)
cut_length = fields.Float(string='已切削长度(mm)', readonly=True)
cut_number = fields.Integer(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='组装后粗/中/精', default='3')
after_assembly_coarse_middle_thin = fields.Selection([("1", ""), ('2', ''), ('3', '')], store=True,
string='组装后粗/中/精', default='3',
compute='_compute_rota_tive')
after_assembly_max_lifetime_value = fields.Integer(string='组装后最大寿命值(min)', store=True,
compute='_compute_inventory_num')
after_assembly_alarm_value = fields.Integer(string='组装后报警值(min)')
@@ -645,7 +687,7 @@ class FunctionalToolAssembly(models.Model):
compute='_compute_inventory_num')
after_assembly_handle_length = fields.Float(string='组装后刀柄长度(mm)', digits=(10, 3))
after_assembly_functional_tool_length = fields.Float(string='组装后伸出长(mm)', digits=(10, 3), store=True,
compute='_compute_inventory_num')
compute='_compute_length')
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)
@@ -659,12 +701,44 @@ class FunctionalToolAssembly(models.Model):
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, )
'CAM工单程序用刀计划', readonly=True)
active = fields.Boolean(string='已归档', default=True)
code = fields.Char('功能刀具编码', compute='_compute_code')
@api.depends('after_assembly_tool_loading_length', 'after_assembly_handle_length')
def _compute_length(self):
for item in self:
if item.assemble_status != '01':
return True
if item.after_assembly_tool_loading_length == 0:
raise ValidationError('【总长度】值为0请重新测量')
elif item.after_assembly_tool_loading_length > item.after_assembly_handle_length:
item.after_assembly_functional_tool_length = (
item.after_assembly_tool_loading_length - item.after_assembly_handle_length)
elif item.after_assembly_tool_loading_length < item.after_assembly_handle_length:
raise ValidationError('【总长度】不能小于【刀柄长度】')
@api.depends('integral_freight_barcode_id', 'blade_freight_barcode_id')
def _compute_rota_tive(self):
for item in self:
rota_tive_boolean = False
if item.integral_freight_barcode_id:
# 整体刀
if item.integral_freight_barcode_id.rotative_Boolean:
rota_tive_boolean = True
elif item.blade_freight_barcode_id:
# 刀片
if item.blade_freight_barcode_id.rotative_Boolean:
rota_tive_boolean = True
if rota_tive_boolean:
item.after_assembly_coarse_middle_thin = '1'
item.after_assembly_new_former = '1'
else:
item.after_assembly_coarse_middle_thin = '3'
item.after_assembly_new_former = '0'
@api.onchange('handle_product_id')
def _onchange_after_assembly_handle_length(self):
for item in self:
@@ -724,7 +798,7 @@ class FunctionalToolAssembly(models.Model):
def functional_tool_assembly(self):
"""
功能刀具组装
功能刀具确认组装
:return:
"""
logging.info('功能刀具开始组装!')
@@ -777,6 +851,8 @@ class FunctionalToolAssembly(models.Model):
"""
功能刀具组装必填判断
"""
# 物料准确性校验
# 物料必填校验
if not self.handle_code_id:
raise ValidationError('缺少【刀柄】物料信息!')
@@ -790,8 +866,8 @@ class FunctionalToolAssembly(models.Model):
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_alarm_value == 0:
# raise ValidationError('组装参数信息【报警值】不能为0')
# if self.after_assembly_effective_length == 0:
# raise ValidationError('组装参数信息【有效长】不能为0')
# if self.hiding_length == 0:

View File

@@ -448,7 +448,11 @@
<field name="machine_tool_name_id" optional="hide"/>
<field name="applicant" optional="hide"/>
<field name="apply_time"/>
<field name="assemble_status"/>
<field name="assemble_status" widget='badge'
decoration-info="assemble_status == '0'"
decoration-warning="assemble_status == '01'"
decoration-success="assemble_status == '1'"
/>
<!-- <field name="name" invisible="True"/>-->
<!-- <field name="machine_tool_code" invisible="True"/>-->
@@ -513,54 +517,7 @@
</group>
<notebook>
<page string="组装信息">
<group col="1" attrs="{'invisible': [('assemble_status', '=', '0')]}">
<group col="1">
<group>
<group>
<field name="barcode_id" invisible="True"/>
<field name="rfid" string="功能刀具rfid"/>
<field name="code"/>
<field name="after_assembly_functional_tool_name"
string="功能刀具名称"/>
<field name="after_assembly_functional_tool_type_id"
string="功能刀具类型"/>
<field name="tool_groups_id"/>
<field name="after_assembly_whether_standard_knife"
string="是否标准刀"/>
<field name="after_assembly_coarse_middle_thin" string="粗/中/精"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<field name="after_assembly_new_former" string="新/旧"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<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>
<field name="after_assembly_functional_tool_diameter"
string="刀具直径(mm)"/>
<field name="after_assembly_knife_tip_r_angle" string="刀尖R角(mm)"/>
<field name="after_assembly_tool_loading_length" string="总长度(mm)"/>
<field name="after_assembly_handle_length" string="刀柄长度(mm)"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<field name="after_assembly_functional_tool_length"
string="伸出长(mm)"/>
<field name="after_assembly_max_lifetime_value"
string="最大寿命值(min)"/>
<field name="after_assembly_alarm_value" string="报警值(min)"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<field name="after_assembly_used_value" string="已使用值(min)"
invisible="1"/>
<field name="after_assembly_effective_length" string="有效长(mm)"
invisible="1"/>
<field name="L_D_number" invisible="1"/>
<field name="hiding_length" invisible="1"/>
</group>
</group>
</group>
</group>
<field name="_barcode_scanned" widget="barcode_handler"/>
<group attrs="{'invisible': [('assemble_status', '=', '0')]}">
<group col="1">
<div>
@@ -641,17 +598,15 @@
<separator string="刀杆:" style="font-size: 13px;"/>
</div>
<group>
<group>
<field name="bar_freight_barcode_id" string="货位"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<field name="bar_freight_lot_id" string="批次"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<field name="bar_lot_id" invisible="1"/>
<field name="bar_product_id" string="名称"/>
<field name="cutting_tool_cutterbar_model_id" string="型号"/>
<field name="bar_specification_id" string="规格"/>
<field name="sf_tool_brand_id_3" string="品牌"/>
</group>
<field name="bar_freight_barcode_id" string="货位"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<field name="bar_freight_lot_id" string="批次"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<field name="bar_lot_id" invisible="1"/>
<field name="bar_product_id" string="名称"/>
<field name="cutting_tool_cutterbar_model_id" string="型号"/>
<field name="bar_specification_id" string="规格"/>
<field name="sf_tool_brand_id_3" string="品牌"/>
</group>
</group>
<group col="1"
@@ -675,6 +630,59 @@
</group>
</group>
</group>
<group col="1" attrs="{'invisible': [('assemble_status', '=', '0')]}">
<group col="1">
<group string="组装参数信息">
<group>
<field name="barcode_id" invisible="True"/>
<field name="rfid" string="功能刀具rfid"/>
<field name="code"/>
<field name="after_assembly_functional_tool_name"
string="功能刀具名称"/>
<field name="after_assembly_functional_tool_type_id"
string="功能刀具类型"/>
<field name="tool_groups_id"/>
<field name="after_assembly_whether_standard_knife"
string="是否标准刀" invisible="1"/>
<field name="after_assembly_coarse_middle_thin" string="粗/中/精"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<field name="after_assembly_new_former" string="新/旧"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<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>
<field name="after_assembly_functional_tool_diameter" readonly="0"
string="刀具直径(mm)"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<field name="after_assembly_knife_tip_r_angle" readonly="0"
string="刀尖R角(mm)"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<field name="after_assembly_tool_loading_length" readonly="0"
string="总长度(mm)"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<field name="after_assembly_handle_length" string="刀柄长度(mm)"
attrs="{'readonly': [('assemble_status', 'in', ['1','2'])]}"/>
<field name="after_assembly_functional_tool_length"
string="伸出长(mm)"/>
<field name="after_assembly_max_lifetime_value"
string="最大寿命值(min)"/>
<field name="after_assembly_alarm_value" string="报警值(min)"
invisible="1"/>
<field name="after_assembly_used_value" string="已使用值(min)"
invisible="1"/>
<field name="after_assembly_effective_length" string="有效长(mm)"
invisible="1"/>
<field name="L_D_number" invisible="1"/>
<field name="hiding_length" invisible="1"/>
</group>
</group>
</group>
</group>
</page>
<page string="装刀信息">
<group>
@@ -734,10 +742,8 @@
<field name="code" string="功能刀具编码"/>
<field name="barcode_id"/>
<filter name="no_assemble_status" string="未组装"
domain="[('assemble_status', 'in', ['0', '01'])]"/>
<filter name="no_assemble_status" string="未组装" domain="[('assemble_status', 'in', ['0','01'])]"/>
<filter name="yes_assemble_status" string="已组装" domain="[('assemble_status', '=', '1')]"/>
<filter name="cancel_assemble_status" string="已取消" domain="[('assemble_status', '=', '3')]"/>
<separator/>
<filter string="已归档" name="inactive" domain="[('active', '=', False)]"/>
<searchpanel>