# -*- coding: utf-8 -*- from datetime import date from odoo import fields, models, api from odoo.exceptions import UserError 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', '材料型号') @api.onchange('cutting_tool_material_id') def _get_code(self): if self.is_cloud is False: today = date.today().strftime("%Y%m%d") today_code = 'T-DJWL-%s-%s' % (self.cutting_tool_material_id.code, today) cutting_tool_model = self.search( [('code', 'ilike', today_code), ('is_cloud', '=', False), ('active', 'in', [True, False])], limit=1, order="id desc") if not cutting_tool_model: num = "%03d" % 1 else: m = int(today_code[-3:]) + 1 num = "%03d" % m self.code = "%s%s" % (today_code, num) # 适用夹头型号可以多选 # 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) active = fields.Boolean(string='已归档', default=True) # ==========机床刀具组接口========== # 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 = "https://x24467i973.zicp.fun/AutoDeviceApi/MachineToolGroup" # 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) # print(r) # 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 class ToolInventory(models.Model): _name = 'sf.tool.inventory' _description = '功能刀具清单' name = fields.Char('功能刀具名称', required=True) type = fields.Char('类型') functional_cutting_tool_model_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型') prefix = fields.Char('前缀') postfix = fields.Char('后缀') diameter = fields.Float('直径(mm)') angle = fields.Float('R角(mm)',default=0) tool_length = fields.Float('刀具总长(mm)') blade_length = fields.Float('避空长/刃长(mm)') knife_head_name = fields.Char('刀头名称') cutter_number = fields.Char('刀号') blade_number = fields.Integer('刃数(个)') extension = fields.Float('伸出长度(mm)') work_material = fields.Selection([('钢', '钢'), ('铝', '铝')], string='加工材料') life_span = fields.Float('寿命(min)') tool_groups_id = fields.Many2one('sf.tool.groups', string='刀具组', required=True) active = fields.Boolean('已归档', default=True) @api.model_create_multi def create(self, vals_list): # 名称重复校验 name_list = [] for val in vals_list: tool_inventory = self.search([('name', '=', val['name'])]) if tool_inventory: name_list.append(val['name']) if name_list: raise UserError("功能刀具名称%s已存在,请重新输入" % name_list) records = super(ToolInventory, self).create(vals_list) return records