# -*- coding: utf-8 -*- import json import requests from odoo import fields, models, api from odoo.exceptions import ValidationError from odoo.addons.sf_base.commons.common import Common class CuttingToolMaterial(models.Model): _name = 'sf.cutting.tool.material' _description = '刀具物料' code = fields.Char('编码') name = fields.Char('名称') remark = fields.Char('备注') active = fields.Boolean('有效', default=True) # 功能刀具 class FunctionalCuttingTool(models.Model): _name = 'sf.functional.cutting.tool' _description = '功能刀具' code = fields.Char('编码') name = fields.Char('名称') active = fields.Boolean('有效', default=True) mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型') mrs_cutting_tool_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具型号') # 功能刀具类型 class FunctionalCuttingToolModel(models.Model): _name = 'sf.functional.cutting.tool.model' _description = '功能刀具类型' name = fields.Char('名称', required=True) code = fields.Char('编码', required=True) remark = fields.Char('备注') active = fields.Boolean('有效', default=True) # 刀具类型 class CuttingToolType(models.Model): _name = 'sf.cutting.tool.type' _description = '刀具类型' code = fields.Char('编码') name = fields.Char('名称') # 关联刀具物料 cutting_tool_material_id = fields.Many2one('sf.cutting.tool.material', '刀具物料') remark = fields.Char('备注') active = fields.Boolean('有效', default=True) # 刀具标准库 class CuttingToolModel(models.Model): _name = 'sf.cutting_tool.standard.library' _description = '刀具标准库' code = fields.Char(string='编码') name = fields.Char('名称') # 关联刀具物料 cutting_tool_material_id = fields.Many2one('sf.cutting.tool.material', '刀具物料', required=True) # 刀具物料类型 cutting_tool_type = fields.Char(related='cutting_tool_material_id.name', string='刀具物料类型', store=True) # 关联刀具类型 cutting_tool_type_id = fields.Many2one('sf.cutting.tool.type', '类型', domain="[('cutting_tool_material_id.name', '=', cutting_tool_type)]") brand_id = fields.Many2one('sf.machine.brand', '品牌') status = fields.Boolean(string='状态', default=False) image = fields.Binary('图片') # 整体式刀具参数 material_model_id = fields.Many2one('mrs.materials.model', '刀具材质') tool_hardness = fields.Integer('刀具硬度(hrc)') coating_material = fields.Char('涂层材质') blade_type = fields.Char('刃部类型') integral_coarse_medium_fine = fields.Selection([('粗', '粗'), ('中', '中'), ('精', '精')], '粗/中/精') integral_run_out_accuracy_max = fields.Char('整体式刀具端跳精度max') integral_run_out_accuracy_min = fields.Char('整体式刀具端跳精度min') ramping_angle_ids = fields.One2many('sf.ramping.angle', 'standard_library_id', '坡铣角度', domain=lambda self: [('standard_library_id', '=', self.id)]) fit_blade_shape_id = fields.Many2one('maintenance.equipment.image', '适配刀片形状', domain=[('type', '=', '刀片形状')]) suitable_machining_method_ids = fields.Many2many('maintenance.equipment.image', 'suitable_machining_method_library_rel', '适合加工方式', domain=[('type', '=', '加工能力')]) blade_tip_characteristics_id = fields.Many2one('maintenance.equipment.image', '刀尖特征', domain=[('type', '=', '刀尖特征')]) handle_type_id = fields.Many2one('maintenance.equipment.image', '柄部类型', domain=[('type', '=', '柄部类型')]) cutting_direction_ids = fields.Many2many('maintenance.equipment.image', 'cutting_direction_library_rel', '走刀方向', domain=[('type', '=', '走刀方向')]) suitable_coolant_ids = fields.Many2many('maintenance.equipment.image', 'suitable_coolants_library_rel', '适合冷却方式', domain=[('type', '=', '冷却方式')]) compaction_way_id = fields.Many2one('maintenance.equipment.image', '压紧方式', domain=[('type', '=', '压紧方式')]) integral_tool_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters', 'standard_library_id', string='整体式刀具基本参数') blade_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters', 'standard_library_id', string='刀片基本参数') cutter_bar_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters', 'standard_library_id', string='刀杆基本参数') cutter_head_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters', 'standard_library_id', string='刀盘基本参数') knife_handle_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters', 'standard_library_id', string='刀柄基本参数') chuck_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters', 'standard_library_id', string='夹头基本参数') cutting_speed_ids = fields.One2many('sf.cutting.speed', 'standard_library_id', string='切削速度Vc') feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(整体式刀具)') feed_per_tooth_ids_3 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(刀片)') material_model_id = fields.Many2one('sf.materials.model', '材料型号') # 适用夹头型号可以多选 # chuck_ids = fields.Many2many( # 'sf.cutting_tool.standard.library', # relation='cutting_tool_type_library_handle_chuck_rel', # column1='model_id_1', # column2='model_id_2', # domain="[('cutting_tool_material_id.name', '=', '夹头')]", # string='适用夹头型号') chuck_id = fields.Many2one( 'sf.cutting_tool.standard.library', domain="[('cutting_tool_material_id.name', '=', '夹头')]", string='适用夹头型号') cutter_bar_ids = fields.Many2many( 'sf.cutting_tool.standard.library', relation='cutting_tool_type_library_cutter_bar_rel', column1='model_id_1', column2='model_id_2', domain="[('cutting_tool_material_id.name', '=', '刀杆')]", string='适用刀杆型号' ) cutter_pad_ids = fields.Many2many( 'sf.cutting_tool.standard.library', relation='cutting_tool_type_library_cutter_pad_rel', column1='model_id_1', column2='model_id_2', domain="[('cutting_tool_material_id.name', '=', '刀盘')]", string='适用刀盘型号' # 使用空列表作为默认值 ) # 刀杆/参数 # blade_ids = fields.Many2many( # 'sf.cutting_tool.standard.library', # relation='cutting_tool_type_library_pad_blade_rel', # column1='model_id_1', # column2='model_id_2', # domain="[('cutting_tool_material_id.name', '=', '刀片')]", # string='适用刀片型号' # 使用空列表作为默认值 # ) handle_id = fields.Many2one( 'sf.cutting_tool.standard.library', domain="[('cutting_tool_material_id.name', '=', '刀柄')]", string='适用刀柄型号' ) # handle_ids = fields.Many2many( # 'sf.cutting_tool.standard.library', # relation='cutting_tool_type_library_chuck_handle_rel', # column1='model_id_1', # column2='model_id_2', # domain="[('cutting_tool_material_id.name', '=', '刀柄')]", # string='适用刀柄型号' # ) active = fields.Boolean('有效', default=True) is_cloud = fields.Boolean('云端数据', default=False) def _get_ids(self, cutting_tool_type_code, factory_short_name): cutting_tool_type_ids = [] for item in cutting_tool_type_code: cutting_tool_type = self.search([('code', '=', item.replace("JKM", factory_short_name))]) if cutting_tool_type: cutting_tool_type_ids.append(cutting_tool_type.id) return [(6, 0, cutting_tool_type_ids)] class MaintenanceStandardImage(models.Model): _name = 'maintenance.equipment.image' _description = '能力特征库' active = fields.Boolean('有效', default=True) name = fields.Char('名称') image = fields.Binary(string='图文') type = fields.Selection( [('加工能力', '加工能力'), ('刀尖特征', '刀尖特征'), ('柄部类型', '柄部类型'), ('走刀方向', '走刀方向'), ('压紧方式', '压紧方式'), ('刀片形状', '刀片形状'), ('冷却方式', '冷却方式')], string='特征') equipment_id = fields.Many2many('maintenance.equipment', 'image_id', string='设备') equipment_lq_id = fields.Many2many('maintenance.equipment', 'image_lq_id', string='设备') jg_equipment_id = fields.Many2many('sf.machine_tool.type', 'jg_image_id', string='机床型号') lq_equipment_id = fields.Many2many('sf.machine_tool.type', 'lq_image_id', string='机床型号') def _get_ids(self, name_arr): ability_feature_ids = [] for item in name_arr: ability_feature = self.search([('name', '=', item)]) if ability_feature: ability_feature_ids.append(ability_feature.id) return [(6, 0, ability_feature_ids)] @api.model def name_search(self, name='', args=None, operator='ilike', limit=100): # 调用父类的name_search方法,获取原始的结果列表 res = super().name_search(name, args, operator, limit) # 定义一个空字典用来存储id和name的映射关系 name_dict = {} # 遍历结果列表,将id和name存入字典中 for item in res: id = item[0] name = item[1] name_dict[id] = name # 根据id列表搜索符合条件的记录 records = self.browse(name_dict.keys()) # 定义一个新的结果列表用来存储修改后的结果 new_res = [] # 遍历每条记录 for record in records: # 获取记录的id,name和image属性 id = record.id name = name_dict[id] image = record.image # 如果image不为空,将其转换为data URI scheme if image: data_uri = f"data:image/png;base64,{image.decode('utf-8')}" else: data_uri = "" # 将这三个属性组成一个数组,并添加到结果列表中 result.append([id, name, data_uri]) # 返回结果列表 return result new_res.append([id, name, data_uri]) # 返回新的结果列表 return new_res @api.model def search_read(self, domain=None, fields=None, offset=0, limit=None, order=None): # 调用原生的search_read方法获取记录 records = super(MaintenanceStandardImage, self).search_read(domain, fields, offset, limit, order) # 遍历每条记录,添加image数据 for record in records: image_field = self.browse(record['id']).image if image_field: record['image'] = f"data:image/png;base64,{image_field.decode('utf-8')}" else: record['image'] = "" return records class ToolGroups(models.Model): _name = 'sf.tool.groups' _description = '刀具组' name = fields.Char('名称') equipment_ids = fields.Many2many('maintenance.equipment', 'ref_maintenance_equipment', string='机台号') remark = fields.Char('备注', size=50) # ==========机床刀具组接口========== def _register_tool_groups(self, obj): create_url = '/AutoDeviceApi/MachineToolGroup' 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 device_id = '' name = None if obj: for equipment_id in obj.equipment_ids: device_id = '%s,%s' % (device_id, equipment_id.name) name = obj.name val = { 'DeviceId': device_id, 'GroupName': name, } 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 write(self, vals): # obj = super().write(vals) # self._register_tool_groups(self) # return obj # # @api.model_create_multi # def create(self, vals_list): # records = super(ToolGroups, self).create(vals_list) # self._register_tool_groups(records) # return records