227 lines
14 KiB
Python
227 lines
14 KiB
Python
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_1(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、创建制造订单无效刀检测结果记录
|
||
if not production_id.detection_result_ids.filtered(
|
||
lambda a: (a.processing_panel == key and a.detailed_reason == '无效功能刀具'
|
||
and a.handle_result == '待处理' and a.routing_type == 'CNC加工'
|
||
and a.rework_reason == 'programming' and a.test_results == '返工')):
|
||
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': '待处理'
|
||
})
|
||
# 修改当前面装夹预调工单的 is_rework 为 True
|
||
# work_ids = production_id.workorder_ids.filtered(
|
||
# lambda a: a.routing_type == '装夹预调' and a.processing_panel == key and not a.is_rework)
|
||
# work_ids.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程序用刀校验已完成!')
|
||
|
||
|
||
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
|
||
|
||
|
||
class MrpProduction(models.Model):
|
||
_inherit = 'mrp.production'
|
||
|
||
def production_cnc_tool_checkout(self):
|
||
logging.info('开始进行工单cnc程序用刀校验!!!')
|
||
invalid_tool = [] # 无效刀
|
||
invalid_tool_processing_panel = [] # 无效刀加工面
|
||
missing_tool_1 = [] # 缺刀(机内、线边)
|
||
missing_tool_2 = [] # 缺刀(库存)
|
||
for item in self:
|
||
workorder_ids = item.workorder_ids.filtered(lambda a: a.state not in ['rework', 'cancel'])
|
||
for workorder_id in workorder_ids:
|
||
if workorder_id.cnc_ids:
|
||
for cnc_id in workorder_id.cnc_ids:
|
||
tool_name = cnc_id.cutting_tool_name
|
||
# 查询功能刀具在清单中是否存在
|
||
tool_inventory_id = self.env['sf.tool.inventory'].sudo().search([('name', '=', tool_name)])
|
||
if not tool_inventory_id:
|
||
invalid_tool.append(tool_name)
|
||
invalid_tool_processing_panel.append(workorder_id.processing_panel)
|
||
continue
|
||
# 查询功能刀具是否存在库存
|
||
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 ('线边刀库', '机内刀库')):
|
||
missing_tool_1.append(tool_name) # 判断为 ('线边刀库', '机内刀库') 缺刀
|
||
if not functional_tools:
|
||
missing_tool_2.append(tool_name) # 判断为 库存缺刀
|
||
break
|
||
# 修改cnc程序的‘刀具状态’
|
||
workorder_ids = self.env['mrp.workorder'].sudo().search([('production_id', 'in', self.ids)])
|
||
if invalid_tool:
|
||
logging.info(f'无效刀:{invalid_tool}')
|
||
# 修改cnc程序的‘刀具状态’为 ‘无效刀’
|
||
cnc_ids = self.env['sf.cnc.processing'].sudo().search(
|
||
[('workorder_id', 'in', workorder_ids.ids), ('cutting_tool_name', 'in', invalid_tool)])
|
||
if cnc_ids:
|
||
for cnc_id in cnc_ids:
|
||
cnc_id.tool_state = '2'
|
||
# cnc_ids.write({'tool_state': '2'})
|
||
# 创建制造订单无效刀检测结果记录
|
||
for production_id in self:
|
||
for processing_panel in list(set(invalid_tool_processing_panel)):
|
||
if not production_id.detection_result_ids.filtered(
|
||
lambda a: (a.processing_panel == processing_panel and a.detailed_reason == '无效功能刀具'
|
||
and a.handle_result == '待处理' and a.routing_type == 'CNC加工'
|
||
and a.rework_reason == 'programming' and a.test_results == '返工')):
|
||
production_id.detection_result_ids.create({
|
||
'production_id': production_id.id,
|
||
'processing_panel': processing_panel,
|
||
'routing_type': 'CNC加工',
|
||
'rework_reason': 'programming', # 原因:编程(programming)
|
||
'detailed_reason': '无效功能刀具',
|
||
'test_results': '返工',
|
||
'handle_result': '待处理'
|
||
})
|
||
# 自动调用重新获取编程的方法
|
||
logging.info('cnc用刀校验到无效刀自动调用重新编程方法:update_programming_state()')
|
||
self[0].update_programming_state()
|
||
self[0].write({'is_rework': False})
|
||
# 修改制造订单 编程状态变为“编程中” 制造订单状态为‘返工’
|
||
self.write({'programming_state': '编程中', 'work_state': '编程中', 'state': 'rework'})
|
||
self[0].workorder_ids.filtered(
|
||
lambda a: a.name == '装夹预调' and a.state not in ['rework', 'done', 'cancel'])._compute_state()
|
||
if missing_tool_1:
|
||
logging.info(f'线边、机内缺刀:{missing_tool_1}')
|
||
# 修改 修改cnc程序的‘刀具状态’ 为 ‘缺刀’
|
||
cnc_ids = self.env['sf.cnc.processing'].sudo().search(
|
||
[('workorder_id', 'in', workorder_ids.ids), ('cutting_tool_name', 'in', missing_tool_1)])
|
||
if cnc_ids:
|
||
for cnc_id in cnc_ids:
|
||
cnc_id.tool_state = '1'
|
||
# cnc_ids.write({'tool_state': '1'})
|
||
if missing_tool_2 and invalid_tool == []:
|
||
logging.info(f'库存缺刀:{missing_tool_2}')
|
||
# 调用CAM工单程序用刀计划创建方法
|
||
cnc_ids = self.env['sf.cnc.processing'].sudo().search(
|
||
[('workorder_id', 'in', workorder_ids.filtered(lambda a: a.production_id == self[0]).ids),
|
||
('cutting_tool_name', 'in', missing_tool_2)])
|
||
if cnc_ids:
|
||
logging.info('调用CAM工单程序用刀计划创建方法!!!')
|
||
self.env['sf.cam.work.order.program.knife.plan'].sudo().create_cam_work_plan(cnc_ids)
|
||
if not invalid_tool and not missing_tool_1:
|
||
self.sudo().write({'tool_state': '0'})
|
||
logging.info('校验cnc用刀正常!!!')
|
||
logging.info('工单cnc程序用刀校验完成!!!')
|