1、优化刀具物料接口、优化功能刀具安全库存接口、优化功能刀具预警接口;2、优化功能刀具组装流程;3、优化刀具物料序列号同步步骤;

This commit is contained in:
yuxianghui
2024-03-12 17:39:21 +08:00
parent fbce395321
commit 0957bded16
5 changed files with 145 additions and 100 deletions

View File

@@ -16,7 +16,7 @@ class FunctionalCuttingToolEntity(models.Model):
tool_groups_id = fields.Many2one('sf.tool.groups', '刀具组', related='functional_tool_name_id.tool_groups_id')
code = fields.Char('编码', related='functional_tool_name_id.code')
rfid = fields.Char('rfid', readonly=True)
name = fields.Char(related='functional_tool_name_id.name')
name = fields.Char('名称')
functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称', readonly=True)
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True)
sf_cutting_tool_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具型号')
@@ -69,22 +69,15 @@ class FunctionalCuttingToolEntity(models.Model):
"""
for obj in self:
if obj.current_location_id:
obj.tool_room_num = 0
obj.line_edge_knife_library_num = 0
obj.machine_knife_library_num = 0
if obj.current_location in ['刀具房']:
obj.tool_room_num = 1
obj.line_edge_knife_library_num = 0
obj.machine_knife_library_num = 0
elif "线边刀库" in obj.current_location:
obj.tool_room_num = 0
obj.line_edge_knife_library_num = 1
obj.machine_knife_library_num = 0
elif "机内刀库" in obj.current_location:
obj.tool_room_num = 0
obj.line_edge_knife_library_num = 0
obj.machine_knife_library_num = 1
else:
obj.tool_room_num = 0
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):
@@ -193,36 +186,35 @@ class FunctionalCuttingToolEntity(models.Model):
stock_location_id = self.env['stock.location'].search([('name', '=', '制造前')])
# 创建功能刀具该批次/序列号 库存移动和移动历史
self.barcode_id.create_stock_quant(location_inventory_id, stock_location_id,
self.functional_tool_name_id.id, '机床装刀')
self.functional_tool_name_id.id, '机床装刀', self.functional_tool_name_id)
# ==========刀具组接口==========
# def _register_functional_tool_groups(self, obj):
# create_url = '/AutoDeviceApi/ToolGroup'
# sf_sync_config = self.env['res.config.settings'].get_values()
# token = sf_sync_config['token']
# sf_secret_key = sf_sync_config['sf_secret_key']
# headers = Common.get_headers(obj, token, sf_secret_key)
# strurl = sf_sync_config['sf_url'] + create_url
# val = {
# 'ToolName': obj.name,
# 'GroupName': obj.tool_groups_id.name,
# 'ToolId': obj.code
# }
# kw = json.dumps(val, ensure_ascii=False)
# r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
# ret = r.json()
# if r == 200:
# return "刀具组发送成功"
# else:
# raise ValidationError("刀具组发送失败")
# ==========刀具组接口==========
# def _register_functional_tool_groups(self, obj):
# create_url = '/AutoDeviceApi/ToolGroup'
# sf_sync_config = self.env['res.config.settings'].get_values()
# token = sf_sync_config['token']
# sf_secret_key = sf_sync_config['sf_secret_key']
# headers = Common.get_headers(obj, token, sf_secret_key)
# strurl = sf_sync_config['sf_url'] + create_url
# val = {
# 'ToolName': obj.name,
# 'GroupName': obj.tool_groups_id.name,
# 'ToolId': obj.code
# }
# kw = json.dumps(val, ensure_ascii=False)
# r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
# ret = r.json()
# if r == 200:
# return "刀具组发送成功"
# else:
# raise ValidationError("刀具组发送失败")
# @api.model_create_multi
# def create(self, vals):
# obj = super(FunctionalCuttingToolEntity, self).create(vals)
# # 调用刀具组接口
# self._register_functional_tool_groups(obj)
# return obj
# @api.model_create_multi
# def create(self, vals):
# obj = super(FunctionalCuttingToolEntity, self).create(vals)
# # 调用刀具组接口
# self._register_functional_tool_groups(obj)
# return obj
class FunctionalToolWarning(models.Model):
@@ -238,7 +230,8 @@ class FunctionalToolWarning(models.Model):
group_expand='_read_group_machine_table_name_ids')
maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床')
machine_tool_code = fields.Char(string='机台号', related='maintenance_equipment_id.name')
machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型')
machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型',
related='maintenance_equipment_id.category_id')
cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号',
domain="[('equipment_id', '=', maintenance_equipment_id)]")
# 功能刀具信息
@@ -297,14 +290,14 @@ class StockMoveLine(models.Model):
functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称')
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', store=True,
group_expand='_read_group_functional_tool_type_id',
related='functional_tool_name_id.functional_tool_type_id')
diameter = fields.Integer(string='刀具直径(mm)', related='functional_tool_name_id.functional_tool_diameter')
knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', related='functional_tool_name_id.knife_tip_r_angle')
install_tool_time = fields.Datetime("刀具组装时间", related='functional_tool_name_id.tool_loading_time')
code = fields.Char('编码', related='functional_tool_name_id.code')
rfid = fields.Char('rfid', related='functional_tool_name_id.rfid')
tool_groups_id = fields.Many2one('sf.tool.groups', '刀具组', related='functional_tool_name_id.tool_groups_id')
group_expand='_read_group_functional_tool_type_id')
functional_tool_name = fields.Char('刀具名称')
diameter = fields.Integer(string='刀具直径(mm)')
knife_tip_r_angle = fields.Float(string='刀尖R角(mm)')
install_tool_time = fields.Datetime("刀具组装时间", default=fields.Datetime.now())
code = fields.Char('编码')
rfid = fields.Char('rfid')
tool_groups_id = fields.Many2one('sf.tool.groups', '刀具组')
@api.model
def _read_group_functional_tool_type_id(self, categories, domain, order):
@@ -441,17 +434,17 @@ class RealTimeDistributionOfFunctionalTools(models.Model):
计算刀具房数量、线边刀库数量、机内刀库数量
"""
if tool:
tool.sudo().tool_stock_num = 0
tool.sudo().side_shelf_num = 0
tool.sudo().on_tool_stock_num = 0
tool.tool_stock_num = 0
tool.side_shelf_num = 0
tool.on_tool_stock_num = 0
if tool.sf_functional_cutting_tool_entity_ids:
for cutting_tool in tool.sf_functional_cutting_tool_entity_ids:
if cutting_tool.tool_room_num > 0:
tool.sudo().tool_stock_num += 1
tool.tool_stock_num += 1
elif cutting_tool.line_edge_knife_library_num > 0:
tool.sudo().side_shelf_num += 1
tool.side_shelf_num += 1
elif cutting_tool.machine_knife_library_num > 0:
tool.sudo().on_tool_stock_num += 1
tool.on_tool_stock_num += 1
def create_or_edit_safety_stock(self, vals, sf_functional_cutting_tool_entity_ids):
"""
@@ -478,6 +471,14 @@ class RealTimeDistributionOfFunctionalTools(models.Model):
records = super(RealTimeDistributionOfFunctionalTools, self).create(vals_list)
return records
def write(self, vals):
res = super().write(vals)
for item in self:
if item:
if vals.get('min_stock_num') or vals.get('max_stock_num'):
item.enroll_functional_tool_real_time_distribution()
return res
class MachineTableToolChangingApply(models.Model):
_name = 'sf.machine.table.tool.changing.apply'

View File

@@ -6,6 +6,30 @@ from odoo.addons.sf_base.commons.common import Common
from odoo.exceptions import UserError
def get_suitable_machining_method_names(item):
suitable_machining_method_names = []
for suitable_machining_method_id in item.suitable_machining_method_ids:
if suitable_machining_method_id:
suitable_machining_method_names.append(suitable_machining_method_id.name)
return suitable_machining_method_names
def get_cutting_direction_names(item):
cutting_direction_names = []
for cutting_direction_id in item.cutting_direction_ids:
if cutting_direction_id:
cutting_direction_names.append(cutting_direction_id.name)
return cutting_direction_names
def get_suitable_coolant_names(item):
suitable_coolant_names = []
for suitable_coolant_id in item.suitable_coolant_ids:
if suitable_coolant_id:
suitable_coolant_names.append(suitable_coolant_id.name)
return suitable_coolant_names
class StockLot(models.Model):
_inherit = 'stock.lot'
_description = '刀具物料序列号注册'
@@ -116,18 +140,6 @@ class FunctionalCuttingToolEntity(models.Model):
functional_tool_list = []
if objs_all:
for item in objs_all:
suitable_machining_method_names = []
cutting_direction_names = []
suitable_coolant_names = []
for suitable_machining_method_id in item.suitable_machining_method_ids:
if suitable_machining_method_id:
suitable_machining_method_names.append(suitable_machining_method_id.name)
for cutting_direction_id in item.cutting_direction_ids:
if cutting_direction_id:
cutting_direction_names.append(cutting_direction_id.name)
for suitable_coolant_id in item.suitable_coolant_ids:
if suitable_coolant_id:
suitable_coolant_names.append(suitable_coolant_id.name)
val = {
'id': item.id,
'code': item.code,
@@ -143,9 +155,6 @@ class FunctionalCuttingToolEntity(models.Model):
'tool_loading_length': item.tool_loading_length,
'functional_tool_length': item.functional_tool_length,
'effective_length': item.effective_length,
'tool_room_num': item.tool_room_num,
'line_edge_knife_library_num': item.line_edge_knife_library_num,
'machine_knife_library_num': item.machine_knife_library_num,
'max_lifetime_value': item.max_lifetime_value,
'alarm_value': item.alarm_value,
'used_value': item.used_value,
@@ -164,11 +173,11 @@ class FunctionalCuttingToolEntity(models.Model):
'cutting_tool_cutterpad_model_id': item.cutting_tool_cutterpad_model_id.tool_material_id,
'cutting_tool_cutterhandle_model_id': item.cutting_tool_cutterhandle_model_id.tool_material_id,
'cutting_tool_cutterhead_model_id': item.cutting_tool_cutterhead_model_id.tool_material_id,
'suitable_machining_method_names': suitable_machining_method_names,
'suitable_machining_method_names': get_suitable_machining_method_names(item),
'blade_tip_characteristics_name': item.blade_tip_characteristics_id.name,
'handle_type_name': item.handle_type_id.name,
'cutting_direction_names': cutting_direction_names,
'suitable_coolant_names': suitable_coolant_names,
'cutting_direction_names': get_cutting_direction_names(item),
'suitable_coolant_names': get_suitable_coolant_names(item),
'active': item.active,
}
functional_tool_list.append(val)
@@ -215,7 +224,6 @@ class FunctionalToolWarning(models.Model):
'production_line': item.production_line_id.name,
'machine_tool_id': item.maintenance_equipment_id.code,
'machine_tool_code': item.machine_tool_code,
'machine_table_type_code': item.machine_table_type_id.code,
'cutter_spacing_code': item.cutter_spacing_code_id.code,
'functional_tool_name': item.name,
'barcode': item.barcode_id.name,
@@ -228,9 +236,9 @@ class FunctionalToolWarning(models.Model):
'alarm_value': item.alarm_value,
'used_value': item.used_value,
'functional_tool_status': item.functional_tool_status,
'alarm_time': item.alarm_time,
'alarm_time': item.alarm_time.strftime('%Y-%m-%d %H:%M:%S'),
'dispose_user': item.dispose_user,
'dispose_time': item.dispose_time.strftime('%Y-%m-%d %H:%M:%S'),
'dispose_time': item.dispose_time,
'dispose_func': item.dispose_func,
}
tool_warning_list.append(val)
@@ -270,7 +278,7 @@ class StockMoveLine(models.Model):
for item in objs_all:
val = {
'id': item.id,
'name': item.functional_tool_name_id.name,
'name': item.functional_tool_name,
'code': item.code,
'rfid': item.rfid,
'tool_groups_name': item.tool_groups_id.name,
@@ -326,7 +334,6 @@ class RealTimeDistributionFunctionalTools(models.Model):
val = {
'id': item.id,
'name': item.name,
'rfid': item.rfid,
'tool_groups_name': item.tool_groups_id.name,
'cutting_tool_type_code': item.sf_cutting_tool_type_id.code,
'diameter': item.diameter,
@@ -341,8 +348,13 @@ class RealTimeDistributionFunctionalTools(models.Model):
'unit': item.unit,
'image': '' if not item.image else base64.b64encode(item.image).decode('utf-8'),
'functional_tool_codes': str(functional_tool_codes),
'whether_standard_knife': item.whether_standard_knife,
'coarse_middle_thin': item.coarse_middle_thin,
'whether_standard_knife': item.whether_standard_knife,
'suitable_machining_method_names': get_suitable_machining_method_names(item),
'blade_tip_characteristics_name': item.blade_tip_characteristics_id.name,
'handle_type_name': item.handle_type_id.name,
'cutting_direction_names': get_cutting_direction_names(item),
'suitable_coolant_names': get_suitable_coolant_names(item),
'active': item.active
}
tool_distribution_list.append(val)
@@ -358,6 +370,6 @@ class RealTimeDistributionFunctionalTools(models.Model):
def create(self, vals_list):
records = super(RealTimeDistributionFunctionalTools, self).create(vals_list)
for record in records:
if record.functional_tool_name_id:
if record:
record.enroll_functional_tool_real_time_distribution()
return records

View File

@@ -98,7 +98,7 @@ class StockLot(models.Model):
tool_material_search_id = fields.Many2one('sf.tool.material.search', string='刀具物料搜索')
tool_material_status = fields.Selection([('可用', '可用'), ('在用', '在用'), ('报废', '报废')], string='状态',
compute='_compute_tool_material_status')
compute='_compute_tool_material_status', store=True)
@api.depends('quant_ids')
def _compute_tool_material_status(self):
@@ -109,8 +109,13 @@ class StockLot(models.Model):
record.tool_material_status = '在用'
else:
record.tool_material_status = '可用'
# 注册刀具物料状态到cloud平台
record.enroll_tool_material_stock()
@api.onchange('tool_material_status')
def _onchange_tool_material_status(self):
for obj in self:
if obj:
# 注册刀具物料状态到cloud平台
obj.enroll_tool_material_stock()
@api.model
def name_search(self, name='', args=None, operator='ilike', limit=100):