1、重构刀具物料查询模型;2、新增产品创建时产品类别为刀具时,创建刀具物料查询模型记录;3、新增序列号和刀具物料查询模型的关联字段,新增刀具物料是否可用状态字段;并在新增序列号记录时,如果关联的产品的产品类别为刀具时,对对应刀具物料查询记录进行关联;

This commit is contained in:
yuxianghui
2024-02-18 17:22:06 +08:00
parent 39a2b1035a
commit cb8285d0ca
3 changed files with 128 additions and 315 deletions

View File

@@ -32,6 +32,19 @@ class SfMaintenanceEquipmentTool(models.Model):
class StockLot(models.Model):
_inherit = 'stock.lot'
tool_material_search_id = fields.Many2one('sf.tool.material.search', string='刀具物料搜索')
tool_material_status = fields.Selection([('可用', '可用'), ('在用', '在用'), ('报废', '报废')], string='状态',
compute='_compute_tool_material_status')
@api.depends('quant_ids')
def _compute_tool_material_status(self):
for record in self:
if record:
if record.quant_ids[-1].location_id.name == '刀具组装位置':
record.tool_material_status = '在用'
else:
record.tool_material_status = '可用'
@api.model
def name_search(self, name='', args=None, operator='ilike', limit=100):
# 调用父类的name_search方法
@@ -52,3 +65,30 @@ class StockLot(models.Model):
if objs.product_id.categ_id.name == '刀具':
raise ValidationError('这是【%s】物料,请扫入正确的【%s】物料!!!' % (
objs.product_id.cutting_tool_material_id.name, args[2][2]))
@api.model_create_multi
def create(self, vals_list):
records = super(StockLot, self).create(vals_list)
for record in records:
if record.product_id.categ_id.name == '刀具':
tool_material_search = self.env['sf.tool.material.search'].sudo().search(
[('cutting_tool_material_id', '=', record.product_id.cutting_tool_material_id.id),
('cutting_tool_standard_library_id', '=', record.product_id.cutting_tool_model_id.id),
('specification_id', '=', record.product_id.specification_id.id)])
if tool_material_search:
record.tool_material_search_id = tool_material_search
return records
class ProductProduct(models.Model):
_inherit = 'product.product'
@api.model_create_multi
def create(self, vals_list):
records = super(ProductProduct, self).create(vals_list)
for record in records:
if record.categ_id.name == '刀具':
self.env['sf.tool.material.search'].sudo().create({
'product_id': record.id
})
return records

View File

@@ -5,7 +5,7 @@ from odoo import fields, models, api, SUPERUSER_ID
# from odoo.exceptions import ValidationError
# 刀具物料搜索
# 刀具物料搜索(待删除)
class SfToolMaterialSearch(models.Model):
_name = 'sf.tool.material.search'
_description = '刀具物料搜索'
@@ -302,3 +302,55 @@ class SfToolMaterialSearch(models.Model):
warehouse_area = fields.Char('库区')
warehouse_location = fields.Char('库位')
three_d_model = fields.Many2one('ir.attachment', '3D模型')
class ToolMaterial(models.Model):
_name = 'sf.tool.material.search'
_description = '刀具物料搜索'
product_id = fields.Many2one('product.product', string='刀具物料产品')
name = fields.Char('名称', related='product_id.name')
cutting_tool_material_id = fields.Many2one('sf.cutting.tool.material', '刀具物料',
related='product_id.cutting_tool_material_id',
store=True,
group_expand='_read_group_cutting_tool_material_id')
tool_material_name = fields.Char('物料名称', related='product_id.cutting_tool_material_id.name')
cutting_tool_standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', '刀具型号',
related='product_id.cutting_tool_model_id')
specification_id = fields.Many2one('sf.tool.materials.basic.parameters', '规格',
related='product_id.specification_id')
image = fields.Binary('图片', related='product_id.image_1920')
number = fields.Integer('总数量', readonly=True, compute='_compute_number')
usable_num = fields.Integer('可用数量', readonly=True)
have_been_used_num = fields.Integer('在用数量', readonly=True)
scrap_num = fields.Integer('报废数量', readonly=True)
barcode_ids = fields.One2many('stock.lot', 'tool_material_search_id', string='序列号', readonly=True)
@api.depends('barcode_ids')
def _compute_number(self):
usable_num = 0
have_been_used_num = 0
scrap_num = 0
for record in self:
if record.barcode_ids:
record.number = len(record.barcode_ids)
for barcode_id in record.barcode_ids:
if barcode_id.quant_ids[-1].location_id.name == '刀具组装位置':
have_been_used_num = have_been_used_num + 1
else:
usable_num = usable_num + 1
record.usable_num = usable_num
record.have_been_used_num = have_been_used_num
record.scrap_num = scrap_num
else:
record.number = 0
record.usable_num = 0
record.have_been_used_num = 0
record.scrap_num = 0
@api.model
def _read_group_cutting_tool_material_id(self, categories, domain, order):
cutting_tool_material_id = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
return categories.browse(cutting_tool_material_id)

View File

@@ -6,116 +6,13 @@
<field name="model">sf.tool.material.search</field>
<field name="arch" type="xml">
<tree string="刀具物料查询">
<field name="sequence" invisible="True"/>
<field name="code"/>
<field name="name"/>
<field name="mrs_cutting_tool_type_id"/>
<field name="mrs_machine_brand_id"/>
<!-- <field name="mrs_cutting_tool_model_id"/> -->
<field name="mrs_materials_model_id"/>
<field name="mrs_cutting_tool_material_id"/>
<!-- <field name="blade_code" optional="hide"/> -->
<field name="blade_length" optional="hide"/>
<field name="blade_width" optional="hide"/>
<field name="blade_height" optional="hide"/>
<field name="blade_top_angle" optional="hide"/>
<field name="blade_front_angle" optional="hide"/>
<field name="blade_rear_angle" optional="hide"/>
<field name="blade_main_included_angle" optional="hide"/>
<field name="blade_r_angle" optional="hide"/>
<field name="blade_hardness" optional="hide"/>
<field name="blade_accuracy" optional="hide"/>
<field name="blade_coating_material_id" optional="hide"/>
<field name="blade_radius" optional="hide"/>
<field name="blade_nut" optional="hide"/>
<field name="mrs_cutting_tool_model_blade_cutter_pad_ids" optional="hide"/>
<field name="mrs_cutting_tool_model_blade_cutter_bar_ids" optional="hide"/>
<!-- <field name="integral_code" readonly="1"/> -->
<!-- <field name="integral_total_length" optional="hide"/>-->
<!-- <field name="integral_shank_length" optional="hide"/>-->
<!-- <field name="integral_blade_length" optional="hide"/>-->
<!-- <field name="integral_diameter" optional="hide"/>-->
<!-- <field name="integral_blade_number" optional="hide"/>-->
<!-- <field name="integral_front_angle" optional="hide"/>-->
<!-- <field name="integral_rear_angle" optional="hide"/>-->
<!-- <field name="integral_main_included_angle" optional="hide"/>-->
<!-- <field name="integral_accuracy" optional="hide"/>-->
<!-- <field name="integral_hardness" optional="hide"/>-->
<!-- <field name="integral_coating_material" optional="hide"/>-->
<!-- <field name="integral_nut" optional="hide"/>-->
<!-- <field name="integral_scope" optional="hide"/>-->
<!-- <field name="bar_code" readonly="1"/> -->
<field name="bar_c_diameter" optional="hide"/>
<field name="bar_total_length" optional="hide"/>
<field name="bar_blade_number" optional="hide"/>
<field name="bar_d_diameter" optional="hide"/>
<field name="mrs_cutting_tool_model_bar_blade_ids" widget="many2many_tags" optional="hide"/>
<field name="bar_wrench" optional="hide"/>
<field name="bar_screw" optional="hide"/>
<field name="bar_radius" optional="hide"/>
<field name="bar_accuracy" optional="hide"/>
<field name="bar_hardness" optional="hide"/>
<field name="bar_scope" optional="hide"/>
<!-- <field name="pad_code" readonly="1"/> -->
<field name="pad_c_diameter" optional="hide"/>
<field name="pad_total_length" optional="hide"/>
<field name="pad_blade_number" optional="hide"/>
<field name="pad_d_diameter" optional="hide"/>
<field name="mrs_cutting_tool_model_pad_blade_ids" widget="many2many_tags" optional="hide"/>
<field name="pad_wrench" optional="hide"/>
<field name="pad_screw" optional="hide"/>
<field name="pad_radius" optional="hide"/>
<field name="pad_accuracy" optional="hide"/>
<field name="pad_hardness" optional="hide"/>
<field name="pad_scope" optional="hide"/>
<!-- <field name="handle_code" readonly="1"/> -->
<field name="handle_length" optional="hide"/>
<field name="handle_diameter" optional="hide"/>
<field name="handle_flange_length" optional="hide"/>
<field name="handle_flange_diameter" optional="hide"/>
<field name="handle_clamping_diameter_min" optional="hide"/>
<field name="handle_clamping_diameter_max" optional="hide"/>
<field name="handle_jump_accuracy" optional="hide"/>
<field name="handle_max_speed" optional="hide"/>
<field name="handle_weight" optional="hide"/>
<field name="handle_body_accuracy" optional="hide"/>
<field name="handle_nut" optional="hide"/>
<field name="mrs_cutting_tool_model_handle_chuck_model_ids" widget="many2many_tags"
optional="hide"/>
<field name="handle_clamping_range" optional="hide"/>
<field name="handle_detection_accuracy" optional="hide"/>
<field name="handle_detection_hardness" optional="hide"/>
<field name="handle_standard_speed" optional="hide"/>
<!-- <field name="chuck_code" readonly="1"/> -->
<field name="chuck_accuracy" optional="hide"/>
<field name="chuck_clamping_diameter_min" optional="hide"/>
<field name="chuck_clamping_diameter_max" optional="hide"/>
<field name="chuck_diameter" optional="hide"/>
<field name="chuck_inner_diameter" optional="hide"/>
<field name="chuck_height" optional="hide"/>
<field name="chuck_nut" optional="hide"/>
<field name="mrs_cutting_tool_model_chuck_handle_model_ids" widget="many2many_tags"
optional="hide"/>
<field name="chuck_clamping_range" optional="hide"/>
<field name="chuck_feature" optional="hide"/>
<field name="image" widget="image" optional="hide"/>
<field name="number" optional="hide"/>
<field name="mrs_materials_model_id" optional="hide"/>
<field name="purchase_date" optional="hide"/>
<field name="purchase_batch" optional="hide"/>
<field name="supplier" optional="hide"/>
<field name="warehouse_name" optional="show"/>
<field name="warehouse_area" optional="show"/>
<field name="warehouse_location" optional="show"/>
<field name="three_d_model" widget="many2one" optional="show"/>
<field name="cutting_tool_material_id"/>
<field name="cutting_tool_standard_library_id"/>
<field name="specification_id"/>
<field name="number"/>
<field name="usable_num"/>
<field name="image" widget="image"/>
</tree>
</field>
</record>
@@ -128,221 +25,44 @@
<sheet>
<div class="oe_title">
<h1>
<field name="name"/>
<field name="product_id" readonly="1"/>
</h1>
</div>
<group>
<group>
<field name="mrs_cutting_tool_material_name" invisible="1"/>
<field name="sequence" invisible="True"/>
<field name="code"/>
<field name="mrs_cutting_tool_material_id"/>
<field name="mrs_cutting_tool_type_id"/>
<field name="mrs_machine_brand_id"/>
<!-- <field name="mrs_materials_model_id" attrs="{'invisible':[('cutting_tool_type','=','整体式刀具')]}"/>-->
<!-- <field name="mrs_cutting_tool_model_id"/> -->
<field name="name" invisible="1"/>
<field name="cutting_tool_material_id"/>
<field name="cutting_tool_standard_library_id"/>
<field name="specification_id"/>
<field name="number"/>
</group>
<group>
<field name="image" widget="image"/>
<field name="three_d_model" widget="many2one"/>
</group>
</group>
<group>
<group col="3">
<group>
<field name="usable_num"/>
</group>
<group>
<field name="have_been_used_num"/>
</group>
<group>
<field name="scrap_num"/>
</group>
</group>
</group>
<notebook>
<page string='刀具库存信息'>
<group >
<group>
<field name="number"/>
<field name="mrs_materials_model_id"/>
<field name="purchase_date"/>
<field name="purchase_batch"/>
</group>
<group>
<field name="supplier"/>
<field name="warehouse_name"/>
<field name="warehouse_area"/>
<field name="warehouse_location"/>
</group>
</group>
</page>
<page string="刀片信息" attrs="{'invisible': [('cutting_tool_type','!=','刀片')]}">
<group>
<group>
<field name="blade_code" invisible="True"/>
<field name="blade_length" string="长度L(mm)"/>
<field name="blade_width" string="宽度D(mm)"/>
<field name="blade_height" string="高度T(mm)"/>
<field name="blade_radius" string="刀尖半径(mm)"/>
<field name="blade_hardness" string="加工硬度"/>
<field name="blade_accuracy" string="精度等级"/>
<field name="blade_coating_material_id" string="涂层材质"/>
<!-- <field name="mrs_cutting_tool_model_blade_cutter_bar_ids" widget="many2many_tags"/>-->
</group>
<group>
<field name="blade_top_angle" string="顶角(°)"/>
<field name="blade_front_angle" string="前角(°)"/>
<field name="blade_rear_angle" string="后角(°)"/>
<field name="blade_main_included_angle" string="主偏角(°)"/>
<field name="blade_r_angle" string="R角(°)"/>
<field name="blade_nut" string="配对螺母(mm)"/>
<field name="mrs_cutting_tool_model_blade_cutter_pad_ids" widget="many2many_tags"/>
</group>
</group>
</page>
<!-- -->
<page string="整体式刀具信息" attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')]}">
<group>
<group>
<field name="integral_code" invisible="True"/>
<field name="integral_total_length" string="总长度(mm)"/>
<field name="mrs_materials_model_id" string="刀具材质" placeholder="请选择"
attrs="{'required': [('cutting_tool_type','=','整体式刀具')]}"/>
<field name="integral_hardness" string="刀具硬度(HRC)"/>
<field name="integral_blade_length" string="刃部长度(mm)"/>
<field name="integral_blade_diameter" string="刃部直径(mm)" class="diameter"/>
<field name="integral_blade_type" string="刃部类型"/>
<field name="integral_blade_helix_angle" string="刃部螺旋角(°)"/>
<field name="integral_blade_number" string="刃数(个)"/>
</group>
<group>
<field name="integral_shank_length" string="柄部长度(mm)"/>
<field name="integral_shank_diameter" string="柄部直径(mm)" class="diameter"/>
<field name="integral_neck_length" string="颈部长度(mm)"/>
<field name="integral_neck_diameter" string="颈部直径(mm)" class="diameter"/>
<field name="integral_blade_tip_diameter" string="刀尖直径(mm)" class="diameter"/>
<field name="integral_blade_tip_taper" string="刀尖锥度(°)"/>
<label for="integral_run_out_accuracy_min" string="端跳精度:"/>
<div class="test_model">
<label for="integral_run_out_accuracy_min" string="最小(min)"/>
<field name="integral_run_out_accuracy_min" class="o_address_zip" required="1"
options="{'format': false}" attrs="{'required': [('cutting_tool_type','=','整体式刀具')]}"/>
<span>(mm)&amp;nbsp;</span>
<label for="integral_run_out_accuracy_max" string="最大(max)"/>
<field name="integral_run_out_accuracy_max" class="o_address_zip" required="1"
options="{'format': false}" attrs="{'required': [('cutting_tool_type','=','整体式刀具')]}"/>
<span>(mm)&amp;nbsp;</span>
</div>
<field name="integral_coarse_medium_fine" string="粗/中/精" placeholder="请选择"
attrs="{'required': [('cutting_tool_type','=','整体式刀具')]}"/>
<field name="integral_coating_material" string="涂层材质"/>
</group>
</group>
<group string="适合加工方式">
<field name="suitable_machining_method_ids" string="" widget="custom_many2many_checkboxes"/>
</group>
<group>
<group string="刀尖特征">
<field name="blade_tip_characteristics_id" string="" widget="many2one_radio"/>
</group>
<group string="柄部类型">
<field name="handle_type_id" string="" widget="many2one_radio"/>
</group>
</group>
<group>
<group string="走刀方向">
<field name="cutting_direction_ids" string="" widget="custom_many2many_checkboxes"/>
</group>
<group string="适合冷却方式">
<field name="suitable_coolant_ids" string="" widget="custom_many2many_checkboxes"/>
</group>
</group>
</page>
<page string="切削速度Vc" attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')]}">
<field name="cutting_speed_ids" string=""/>
</page>
<page string="每齿走刀量fz" attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')]}">
<field name="feed_per_tooth_ids" string=""/>
</page>
<page string="刀杆信息" attrs="{'invisible': [('cutting_tool_type','!=','刀杆')]}">
<group>
<group>
<field name="bar_code" invisible="True"/>
<field name="bar_c_diameter" string="C柄径(mm)"/>
<field name="bar_total_length" string="L总长(mm)"/>
<field name="bar_blade_number" string="刃数"/>
<field name="bar_d_diameter" string="D刃径(mm)"/>
<field name="bar_scope" string="适用范围"/>
<field name="mrs_cutting_tool_model_bar_blade_ids" string="适用刀片型号" widget="many2many_tags"/>
</group>
<group>
<field name="bar_wrench" string="配对扳手(mm)"/>
<field name="bar_screw" string="配备螺丝(mm)"/>
<field name="bar_radius" string="刀尖圆角半径"/>
<field name="bar_accuracy" string="精度等级"/>
<field name="bar_hardness" string="硬度(°)"/>
</group>
</group>
</page>
<page string="刀盘信息" attrs="{'invisible': [('cutting_tool_type','!=','刀盘')]}">
<group>
<group>
<field name="pad_code" invisible="True"/>
<field name="pad_c_diameter" string="C柄径(mm)"/>
<field name="pad_total_length" string="L总长(mm)"/>
<field name="pad_blade_number" string="刃数"/>
<field name="pad_d_diameter" string="D刃径(mm)"/>
<field name="pad_scope" string="适用范围"/>
<field name="mrs_cutting_tool_model_pad_blade_ids" string="适用刀片型号" widget="many2many_tags"/>
</group>
<group>
<field name="pad_wrench" string="配对扳手(mm)"/>
<field name="pad_screw" string="配备螺丝(mm)"/>
<field name="pad_radius" string="刀尖圆角半径"/>
<field name="pad_accuracy" string="精度等级"/>
<field name="pad_hardness" string="硬度(°)"/>
</group>
</group>
</page>
<page string="刀柄信息" attrs="{'invisible': [('cutting_tool_type','!=','刀柄')]}">
<group>
<group>
<field name="handle_code" invisible="True"/>
<field name="handle_length" string="柄长L(mm)"/>
<field name="handle_diameter" string="直径D(mm)"/>
<field name="handle_flange_length" string="法兰柄长L1(mm)"/>
<field name="handle_flange_diameter" string="法兰直径D1(mm)"/>
<field name="handle_clamping_diameter_min" string="夹持直径min(mm)"/>
<field name="handle_clamping_diameter_max" string="夹持直径max(mm)"/>
<field name="handle_clamping_range" string="夹持范围(mm)"/>
<field name="handle_detection_accuracy" string="检测精度"/>
<field name="mrs_cutting_tool_model_handle_chuck_model_ids" widget="many2many_tags"/>
</group>
<group>
<field name="handle_jump_accuracy" string="径跳精度"/>
<field name="handle_standard_speed" string="标准转速"/>
<field name="handle_max_speed" string="最大转速n/min"/>
<field name="handle_standard_speed" string=""/>
<field name="handle_weight" string="重量(kg)"/>
<field name="handle_body_accuracy" string="本体精度(mm)"/>
<field name="handle_nut" string="配对螺母(mm)"/>
<field name="handle_detection_hardness" string="检测硬度"/>
</group>
</group>
</page>
<page string="夹头信息" attrs="{'invisible': [('cutting_tool_type','!=','夹头')]}">
<group>
<group>
<field name="chuck_code" invisible="True"/>
<field name="chuck_clamping_diameter_min" string="夹持直径min(mm)"/>
<field name="chuck_clamping_diameter_max" string="夹持直径max(mm)"/>
<field name="chuck_diameter" string="外径(mm)"/>
<field name="chuck_inner_diameter" string="内径(mm)"/>
<field name="chuck_feature" string="特性"/>
<field name="mrs_cutting_tool_model_chuck_handle_model_ids" widget="many2many_tags"/>
</group>
<group>
<field name="chuck_accuracy" string="精度(mm)"/>
<field name="chuck_height" string="高度(mm)"/>
<field name="chuck_nut" string="配对螺母(mm)"/>
<field name="chuck_clamping_range" string="夹持范围(mm)"/>
<field name="image" string="图片"/>
</group>
</group>
<page string="序列号">
<field name="barcode_ids">
<tree>
<field name="name"/>
<field name="tool_material_status"/>
</tree>
</field>
</page>
</notebook>
<group>
<field name="cutting_tool_material_name" invisible="True"/>
<field name="cutting_tool_type" invisible="True"/>
</group>
</sheet>
</form>
</field>
@@ -356,9 +76,10 @@
<field name="arch" type="xml">
<search string="刀具物料搜索">
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
<field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>
<field name="cutting_tool_standard_library_id" string="刀具型号搜索"/>
<field name="specification_id" string="规格搜索"/>
<searchpanel>
<field name="mrs_cutting_tool_material_id" icon="fa-building" enable_counters="1"/>
<field name="cutting_tool_material_id" icon="fa-building" enable_counters="1"/>
</searchpanel>
</search>
</field>