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工单程序用刀计划 """ cam_id = self.env['sf.cam.work.order.program.knife.plan'] production_ids = [] # 制造订单集 datas = {} # 缺刀/无效刀集 for cnc_processing in cnc_processing_ids: production_name = cnc_processing.production_id.name # 制造订单 processing_panel = cnc_processing.workorder_id.processing_panel # 加工面 if not datas.get(production_name): datas.update({production_name: {}}) production_ids.append(cnc_processing.production_id) if not datas.get(production_name).get(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: datas[production_name][processing_panel]['无效刀'].append(cnc_processing.cutting_tool_name) cnc_processing.tool_state = '2' # todo 无效刀处理逻辑 # 跳过本次循环 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 ('线边刀库', '机内刀库')): datas[production_name][processing_panel]['缺刀'].append(cnc_processing.cutting_tool_name) cnc_processing.tool_state = '1' # 判断是否有满足条件的刀 if not functional_tools: # 创建CAM申请装刀记录 cam_id.create_cam_work_plan(cnc_processing) logging.info('成功调用CAM工单程序用刀计划创建方法!!!') for production_id in production_ids: if production_id: data = datas.get(production_id.name) tool_state_remark = '' # todo 对无效刀信息进行处理 # 对缺刀信息进行处理 for key in data: if tool_state_remark != '': tool_state_remark = f'{tool_state_remark}\n{key}缺刀:{data.get(key).get("缺刀")}' else: tool_state_remark = f'{key}缺刀:{data.get(key).get("缺刀")}' if production_id.tool_state == '1': production_id.write({ 'tool_state_remark': tool_state_remark }) @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