From 0957bded1684aa26f5b8d7ac0a5fb8c33203cb5d Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Tue, 12 Mar 2024 17:39:21 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E5=88=80=E5=85=B7?= =?UTF-8?q?=E7=89=A9=E6=96=99=E6=8E=A5=E5=8F=A3=E3=80=81=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7=E5=AE=89=E5=85=A8=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E6=8E=A5=E5=8F=A3=E3=80=81=E4=BC=98=E5=8C=96=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=88=80=E5=85=B7=E9=A2=84=E8=AD=A6=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=9B2=E3=80=81=E4=BC=98=E5=8C=96=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=88=80=E5=85=B7=E7=BB=84=E8=A3=85=E6=B5=81=E7=A8=8B=EF=BC=9B?= =?UTF-8?q?3=E3=80=81=E4=BC=98=E5=8C=96=E5=88=80=E5=85=B7=E7=89=A9?= =?UTF-8?q?=E6=96=99=E5=BA=8F=E5=88=97=E5=8F=B7=E5=90=8C=E6=AD=A5=E6=AD=A5?= =?UTF-8?q?=E9=AA=A4=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_tool_management/models/base.py | 109 +++++++++--------- .../models/functional_tool_enroll.py | 62 ++++++---- .../models/maintenance_equipment.py | 11 +- sf_tool_management/views/tool_base_views.xml | 18 +-- sf_tool_management/wizard/wizard.py | 45 ++++++-- 5 files changed, 145 insertions(+), 100 deletions(-) diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index da1433ea..6c02bcc1 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -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' diff --git a/sf_tool_management/models/functional_tool_enroll.py b/sf_tool_management/models/functional_tool_enroll.py index b14ce16b..0cfac5b7 100644 --- a/sf_tool_management/models/functional_tool_enroll.py +++ b/sf_tool_management/models/functional_tool_enroll.py @@ -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 diff --git a/sf_tool_management/models/maintenance_equipment.py b/sf_tool_management/models/maintenance_equipment.py index 0dca8868..d4eeafad 100644 --- a/sf_tool_management/models/maintenance_equipment.py +++ b/sf_tool_management/models/maintenance_equipment.py @@ -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): diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml index afd13ce0..20bc3b32 100644 --- a/sf_tool_management/views/tool_base_views.xml +++ b/sf_tool_management/views/tool_base_views.xml @@ -40,8 +40,8 @@
-
@@ -245,8 +245,8 @@ -