import json import requests import logging from odoo import fields, models, api from odoo.exceptions import ValidationError from odoo.addons.sf_base.commons.common import Common class CNCprocessing(models.Model): _inherit = 'sf.cnc.processing' _description = 'CNC加工用刀检测' # ==========MES装刀指令接口========== # def register_cnc_processing(self, knife_plan): # config = self.env['res.config.settings'].get_values() # # token = sf_sync_config['token'Ba F2CF5DCC-1A00-4234-9E95-65603F70CC8A] # headers = {'Authorization': config['center_control_Authorization']} # crea_url = config['center_control_url'] + "/AutoDeviceApi/ToolLoadInstruct" # val = { # 'DeviceId': knife_plan.machine_table_name, # 'RfidCode': knife_plan.sf_functional_tool_assembly_id.rfid.zfill(10), # 'ToolId': int(knife_plan.cam_cutter_spacing_code[1:]) # } # r = requests.post(crea_url, json=val, headers=headers) # ret = r.json() # logging.info('register_cnc_processing:%s' % ret) # if ret['Succeed']: # return "MES装刀指令发送成功" # else: # raise ValidationError("MES装刀指令发送失败") def cnc_tool_checkout(self, cnc_processing_ids): """ 根据传入的工单信息,查询是否有需要的功能刀具,如果没有则生成CAM工单程序用刀计划 """ logging.info('开始进行工单cnc程序用刀校验!!!') logging.info(f'cnc_processing_ids:{cnc_processing_ids}') if not cnc_processing_ids: return False cam_id = self.env['sf.cam.work.order.program.knife.plan'] production_ids = [] # 制造订单集 datas = {'缺刀': {}, '无效刀': {}} # 缺刀/无效刀集 for cnc_processing in cnc_processing_ids: # ======创建字典: {'缺刀': {'制造订单1': {'加工面1': [], ...}, ...}, '无效刀': {'制造订单1': {'加工面1': [], ...}, ...}}====== production_name = cnc_processing.workorder_id.production_id.name # 制造订单 processing_panel = cnc_processing.workorder_id.processing_panel # 加工面 if production_name not in list(datas['缺刀'].keys()): datas['缺刀'].update({production_name: {processing_panel: []}}) datas['无效刀'].update({production_name: {processing_panel: []}}) production_ids.append(cnc_processing.workorder_id.production_id) else: if processing_panel not in list(datas['缺刀'].get(production_name).keys()): datas['缺刀'].get(production_name).update({processing_panel: []}) datas['无效刀'].get(production_name).update({processing_panel: []}) # ====================================== if cnc_processing.cutting_tool_name: tool_name = cnc_processing.cutting_tool_name # 检验CNC用刀是否是功能刀具清单中的刀具 tool_inventory_id = self.env['sf.tool.inventory'].sudo().search([('name', '=', tool_name)]) if not tool_inventory_id: if cnc_processing.cutting_tool_name not in datas['无效刀'][production_name][processing_panel]: datas['无效刀'][production_name][processing_panel].append(cnc_processing.cutting_tool_name) cnc_processing.tool_state = '2' logging.info(f'"无效刀":[{production_name}、{processing_panel}、{cnc_processing.cutting_tool_name}]') # 跳过本次循环 continue # 校验CNC用刀在系统是否存在 functional_tools = self.env['sf.functional.cutting.tool.entity'].sudo().search( [('tool_name_id', '=', tool_inventory_id.id), ('functional_tool_status', '=', '正常')]) # 判断线边、机内是否有满足条件的刀 if not functional_tools.filtered(lambda p: p.current_location in ('线边刀库', '机内刀库')): if cnc_processing.cutting_tool_name not in datas['缺刀'][production_name][processing_panel]: datas['缺刀'][production_name][processing_panel].append(cnc_processing.cutting_tool_name) cnc_processing.tool_state = '1' logging.info(f'"缺刀":[{production_name}、{processing_panel}、{cnc_processing.cutting_tool_name}]') # 判断是否有满足条件的刀 if not functional_tools: # 创建CAM申请装刀记录 cam_id.create_cam_work_plan(cnc_processing) logging.info('成功调用CAM工单程序用刀计划创建方法!!!') logging.info(f'datas:{datas}') for production_id in production_ids: logging.info(f'production_id: {production_id}') if production_id: data1 = datas['无效刀'].get(production_id.name) # data1: {'加工面1': [], ...} data2 = datas['缺刀'].get(production_id.name) # data2: {'加工面1': [], ...} # tool_state_remark1 = '' tool_state_remark2 = '' # 对无效刀信息进行处理 for key in data1: if data1.get(key): # if tool_state_remark1 != '': # tool_state_remark1 = f'{tool_state_remark1}\n{key}无效刀:{data1.get(key)}' # else: # tool_state_remark1 = f'{key}无效刀:{data1.get(key)}' # 无效刀处理逻辑 # 1、创建制造订单无效刀检测结果记录 logging.info('创建制造订单无效刀检测结果记录!') production_id.detection_result_ids.create({ 'production_id': production_id.id, 'processing_panel': key, 'routing_type': 'CNC加工', 'rework_reason': 'programming', # 原因:编程(programming) 'detailed_reason': '无效功能刀具', 'test_results': '返工', 'handle_result': '待处理' }) if not production_id.is_rework: production_id.write({ 'is_rework': True }) production_id.workorder_ids.filtered( lambda a: a.processing_panel == key and not a.is_rework).write({'is_rework': True}) # 对缺刀信息进行处理 for key in data2: if data2.get(key): if tool_state_remark2 != '': tool_state_remark2 = f'{tool_state_remark2}\n{key}缺刀:{data2.get(key)}' else: tool_state_remark2 = f'{key}缺刀:{data2.get(key)}' # 将备注信息存入制造订单功能刀具状态的备注字段 logging.info('修改制造订单功能刀具状态的备注字段') production_id.write({ 'tool_state_remark': tool_state_remark2, # 'tool_state_remark2': tool_state_remark1 }) logging.info('工单cnc程序用刀校验已完成!') @api.model_create_multi def create(self, vals): obj = super(CNCprocessing, self).create(vals) # 调用CAM工单程序用刀计划创建方法 self.cnc_tool_checkout(obj) return obj class MrpWorkCenter(models.Model): _inherit = 'mrp.workcenter' def action_tool_order(self): action = self.env.ref('sf_tool_management.sf_functional_tool_assembly_view_act') result = action.read()[0] return result