优化返工和报废

This commit is contained in:
jinling.yang
2024-05-24 17:00:44 +08:00
parent c87f310bb3
commit 412bf4b9be
7 changed files with 79 additions and 38 deletions

View File

@@ -154,8 +154,30 @@ class MrpProduction(models.Model):
for production in self:
production.maintenance_count = len(production.request_ids)
# 制造订单报废:编程单更新
def updateCNC(self):
try:
res = {'production_no': self.name, 'programming_no': self.programming_no,
'order_no': self.origin}
logging.info('res=%s:' % res)
configsettings = self.env['res.config.settings'].get_values()
config_header = Common.get_headers(self, configsettings['token'], configsettings['sf_secret_key'])
url = '/api/intelligent_programming/update_intelligent_programmings'
config_url = configsettings['sf_url'] + url
res['token'] = configsettings['token']
ret = requests.post(config_url, json={}, data=res, headers=config_header)
ret = ret.json()
logging.info('updateCNC-ret:%s' % ret)
if ret['status'] == 1:
self.write({'work_state': '已编程'})
else:
raise UserError(ret['message'])
except Exception as e:
logging.info('updateCNC error:%s' % e)
raise UserError("更新程单失败,请联系管理员")
# cnc程序获取
def fetchCNC(self, production_names):
def fetchCNC(self, production_names, scrap_production):
cnc = self.env['mrp.production'].search([('id', '=', self.id)])
quick_order = self.env['quick.easy.order'].search(
[('name', '=', cnc.product_id.default_code.rsplit('-', 1)[0])])
@@ -171,6 +193,8 @@ class MrpProduction(models.Model):
'production_no': production_names,
'machine_tool_code': '',
'product_name': cnc.product_id.name,
'remanufacture_type': '' if not scrap_production else scrap_production.workorder_ids.filtered(
lambda b: b.routing_type == "CNC加工").test_results,
'model_code': cnc.product_id.model_code,
'material_code': self.env['sf.production.materials'].search(
[('id', '=', cnc.product_id.materials_id.id)]).materials_no,
@@ -268,7 +292,7 @@ class MrpProduction(models.Model):
# 则根据设备找到工作中心;否则采用前面描述的工作中心分配机制;
# 其他规则限制: 默认只分配给工作中心状态为非故障的工作中心;
def _create_workorder3(self):
def _create_workorder3(self, is_fetchcnc=False, scrap_production=False):
# 根据product_id对self进行分组
grouped_product_ids = {k: list(g) for k, g in groupby(self, key=lambda x: x.product_id.id)}
# 初始化一个字典来存储每个product_id对应的生产订单名称列表
@@ -312,10 +336,15 @@ class MrpProduction(models.Model):
[('product_id.id', '=', production.product_id.id), ('origin', '=', production.origin)],
limit=1, order='id asc')
if not production_programming.programming_no:
production.fetchCNC(', '.join(product_id_to_production_names[production.product_id.id]))
# 制造订单报废/返工也需重新编程
if (is_fetchcnc is True and scrap_production) or (
is_fetchcnc is False and not scrap_production):
production.fetchCNC(', '.join(product_id_to_production_names[production.product_id.id]),
scrap_production)
else:
production.write({'programming_no': production_programming.programming_no,
'programming_state': '已编程' if production_programming.programming_state == '已编程' else '编程中'})
'programming_state': '编程中'})
# # 根据加工面板的面数及对应的工序模板生成工单
i = 0
processing_panel_len = len(production.product_id.model_processing_panel.split(','))
@@ -482,8 +511,8 @@ class MrpProduction(models.Model):
# work.button_finish()
# 创建工单并进行排序
def _create_workorder(self):
self._create_workorder3()
def _create_workorder(self, is_fetchcnc=False, scrap_production=False):
self._create_workorder3(is_fetchcnc=is_fetchcnc, scrap_production=scrap_production)
self._reset_work_order_sequence()
return True

View File

@@ -199,7 +199,12 @@ class ResMrpWorkOrder(models.Model):
production_line_state = fields.Selection(related='production_id.production_line_state',
string='上/下产线', store=True)
detection_report = fields.Binary('检测报告', readonly=True)
is_remanufacture = fields.Boolean(string='是否重新生成制造订单', default=True)
is_remanufacture = fields.Boolean(string='重新生成制造订单', default=False)
is_fetchcnc = fields.Boolean(string='重新获取NC程序', default=False)
reason = fields.Selection(
[("programming", "编程"), ("clamping", "返工"), ("cutter", "刀具"), ("operate computer", "操机"),
("technology", "工艺"), ("customer redrawing", "客户改图"), ("other", "其他"), ], string="原因")
detailed_reason = fields.Text('详细原因')
@api.onchange('rfid_code')
def _onchange(self):
@@ -672,14 +677,14 @@ class ResMrpWorkOrder(models.Model):
"""
重新生成制造订单或者重新生成工单
"""
if self.test_results == '报废':
if self.test_results in ['返工', '报废']:
values = self.env['mrp.production'].create_production1_values(self.production_id)
productions = self.env['mrp.production'].with_user(SUPERUSER_ID).sudo().with_company(
self.production_id.company_id).create(
values)
# self.env['stock.move'].sudo().create(productions._get_moves_raw_values())
self.env['stock.move'].sudo().create(productions._get_moves_finished_values())
productions._create_workorder()
productions._create_workorder(is_fetchcnc=self.is_fetchcnc, scrap_production=self.production_id)
productions.filtered(lambda p: (not p.orderpoint_id and p.move_raw_ids) or \
(
p.move_dest_ids.procure_method != 'make_to_order' and
@@ -772,13 +777,13 @@ class ResMrpWorkOrder(models.Model):
'product_id': productions.product_id.id,
'state': 'draft',
})
if self.test_results == '返工':
productions = self.production_id
# self.env['stock.move'].sudo().create(productions._get_moves_raw_values())
# self.env['stock.move'].sudo().create(productions._get_moves_finished_values())
productions._create_workorder2(self.processing_panel)
else:
self.results = '合格'
# if self.test_results == '返工':
# productions = self.production_id
# # self.env['stock.move'].sudo().create(productions._get_moves_raw_values())
# # self.env['stock.move'].sudo().create(productions._get_moves_finished_values())
# productions._create_workorder2(self.processing_panel)
# else:
# self.results = '合格'
def json_workorder_str1(self, k, production, route):
workorders_values_str = [0, '', {
@@ -807,24 +812,23 @@ class ResMrpWorkOrder(models.Model):
def _compute_state(self):
super(ResMrpWorkOrder, self)._compute_state()
for item in self:
scrap_workorder = self.env['mrp.workorder'].search(
[('production_id', '=', item.production_id.id), ('routing_type', '=', 'CNC加工'),
('state', '=', 'done'), ('is_remanufacture', '=', True)])
print(item.name)
print(item.state)
if item.name == 'CNC加工(返工)' and item.state not in ['ready', 'progress', 'done']:
item.state = 'ready'
print(item.is_remanufacture)
scrap_workorder = self.env['mrp.workorder'].search(
[('production_id', '=', item.production_id.id), ('routing_type', '=', 'CNC加工'),
('state', '=', 'done'), ('test_results', 'in', ['返工', '报废'])])
print(scrap_workorder)
# if item.routing_type == 'CNC加工' and item.state in ['done'] and item.test_results in ['返工', '报废']:
if item.routing_type == '解除装夹':
last_workorder = self.env['mrp.workorder'].search(
[('production_id', '=', item.production_id.id), ('name', '=', 'CNC加工(返工)'),
('state', '!=', 'done')])
if item.state != 'pending':
if last_workorder:
item.state = 'pending'
if scrap_workorder:
if scrap_workorder and item.state not in ['cancel']:
item.state = 'cancel'
elif item.routing_type == '表面工艺':
if scrap_workorder:
stock_move = self.env['stock.move'].search(
[('origin', '=', item.production_id.name)])
stock_move.write({'state': 'cancel'})
item.picking_ids.write({'state': 'cancel'})
item.state = 'cancel'
# 重写工单开始按钮方法
@@ -991,6 +995,9 @@ class ResMrpWorkOrder(models.Model):
'date_planned_finished': tem_date_planned_finished # 保持原值
})
if record.routing_type == 'CNC加工' and record.test_results in ['返工', '报废']:
record.production_id.write({'state': 'cancel'})
record.production_id.workorder_ids.write({'rfid_code': False, 'rfid_code_old': record.rfid_code})
if record.is_remanufacture is True:
record.recreateManufacturingOrWorkerOrder()
is_production_id = True
for workorder in record.production_id.workorder_ids:

View File

@@ -7,8 +7,8 @@ import os
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
from odoo.modules import get_resource_path
from OCC.Extend.DataExchange import read_step_file
from OCC.Extend.DataExchange import write_stl_file
# from OCC.Extend.DataExchange import read_step_file
# from OCC.Extend.DataExchange import write_stl_file
class ResProductMo(models.Model):

View File

@@ -207,7 +207,7 @@ class StockRule(models.Model):
'''
创建工单
'''
productions._create_workorder()
productions._create_workorder(is_fetchcnc=False, scrap_production=False)
productions.filtered(lambda p: (not p.orderpoint_id and p.move_raw_ids) or \
(

View File

@@ -214,7 +214,7 @@
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
<field name="functional_fixture_type_id"
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
<field name="rfid_code" force_save="1" readonly="1" cache="True"
<field name="rfid_code" cache="True"
attrs="{'invisible': [('rfid_code_old', '!=', False)]}"/>
<field name="rfid_code_old" readonly="1" attrs="{'invisible': [('rfid_code_old', '=', False)]}"/>
</group>
@@ -478,6 +478,11 @@
<group>
<field name="test_results" attrs='{"invisible":[("results","!=",False)]}'/>
<field name="is_remanufacture" attrs='{"invisible":[("test_results","!=","报废")]}'/>
<field name="is_fetchcnc"
attrs='{"invisible":["|",("test_results","=","合格"),("is_remanufacture","=",False)]}'/>
<field name="reason"
attrs='{"required":[("test_results","!=","合格")],"invisible":[("test_results","=","合格")]}'/>
<field name="detailed_reason" attrs='{"invisible":[("test_results","=","合格")]}'/>
<field name="results" readonly="1" attrs='{"invisible":[("results","!=","合格")]}'/>
<field name="detection_report" attrs='{"invisible":[("results","!=",False)]}'
widget="pdf_viewer"/>

View File

@@ -8,8 +8,8 @@ from datetime import datetime
import requests
from odoo import http
from odoo.http import request
from OCC.Extend.DataExchange import read_step_file
from OCC.Extend.DataExchange import write_stl_file
# from OCC.Extend.DataExchange import read_step_file
# from OCC.Extend.DataExchange import write_stl_file
from odoo import models, fields, api
from odoo.modules import get_resource_path
from odoo.exceptions import ValidationError, UserError

View File

@@ -6,8 +6,8 @@ import os
from datetime import datetime
from stl import mesh
# from OCC.Core.GProp import GProp_GProps
from OCC.Extend.DataExchange import read_step_file
from OCC.Extend.DataExchange import write_stl_file
# from OCC.Extend.DataExchange import read_step_file
# from OCC.Extend.DataExchange import write_stl_file
from odoo.addons.sf_base.commons.common import Common
from odoo import models, fields, api
from odoo.modules import get_resource_path