From 9aca786522da3792a5e5dd50a9efa413aeda24ec Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Wed, 10 Jul 2024 17:36:26 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BC=98=E5=8C=96=E5=B7=A5=E5=8D=95=E6=8E=92?= =?UTF-8?q?=E5=BA=8F2.=E6=96=B0=E5=A2=9E=E8=B0=83=E5=8F=96cloud=E7=BC=96?= =?UTF-8?q?=E7=A8=8B=E5=8D=95=E7=9A=84=E7=8A=B6=E6=80=81=E6=96=B9=E6=B3=95?= =?UTF-8?q?3.=E5=88=B6=E9=80=A0=E8=AE=A2=E5=8D=95=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=B8=BA=E8=BF=94=E5=B7=A5=E5=8F=8A=E7=BC=96?= =?UTF-8?q?=E7=A8=8B=E7=8A=B6=E6=80=81=E4=B8=BA"=E5=B7=B2=E7=BC=96?= =?UTF-8?q?=E7=A8=8B"=EF=BC=8C=E2=80=9C=E5=B7=B2=E7=BC=96=E7=A8=8B?= =?UTF-8?q?=E6=9C=AA=E4=B8=8B=E5=8F=91=E2=80=9D=E7=9A=84=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E6=9D=A1=E4=BB=B64=EF=BC=8C=E6=96=B0=E5=A2=9E=E8=BF=94?= =?UTF-8?q?=E5=B7=A5=E4=B8=94=E7=BC=96=E7=A8=8B=E4=B8=AD=E7=9A=84=E5=88=B6?= =?UTF-8?q?=E9=80=A0=E8=AE=A2=E5=8D=95=E5=AE=9A=E6=97=B6=E8=8E=B7=E5=8F=96?= =?UTF-8?q?Cloud=E7=BC=96=E7=A8=8B=E5=8D=95=E7=8A=B6=E6=80=81=E7=9A=84?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/data/stock_data.xml | 10 + sf_manufacturing/models/mrp_production.py | 176 ++++++++++++------ .../views/mrp_production_addional_change.xml | 141 +++++++------- sf_manufacturing/views/mrp_workorder_view.xml | 1 - sf_manufacturing/wizard/rework_wizard.py | 3 +- 5 files changed, 203 insertions(+), 128 deletions(-) diff --git a/sf_manufacturing/data/stock_data.xml b/sf_manufacturing/data/stock_data.xml index 07d59708..9220d827 100644 --- a/sf_manufacturing/data/stock_data.xml +++ b/sf_manufacturing/data/stock_data.xml @@ -1,6 +1,16 @@ + + 返工且编程中的制造订单定时获取Cloud编程单状态 + + code + model._cron_get_programming_state() + 3 + minutes + -1 + + 工序编码规则 mrp.routing.workcenter diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 7ac20df1..75411116 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import base64 import logging +import json import re import requests from itertools import groupby @@ -53,10 +54,12 @@ class MrpProduction(models.Model): programming_no = fields.Char('编程单号') work_state = fields.Char('业务状态') programming_state = fields.Selection( - [('编程中', '编程中'), ('已编程', '已编程')], string='编程状态', tracking=True) + [('编程中', '编程中'), ('已编程', '已编程'), ('已编程未下发', '已编程未下发')], string='编程状态', + tracking=True) glb_file = fields.Binary("glb模型文件") production_line_id = fields.Many2one('sf.production.line', string='生产线', tracking=True) plan_start_processing_time = fields.Datetime('计划开始加工时间') + is_rework = fields.Boolean(string='是否返工', default=False) # production_line_state = fields.Selection( # [('待上产线', '待上产线'), ('已上产线', '已上产线'), ('已下产线', '已下产线')], # string='上/下产线', default='待上产线', tracking=True) @@ -156,20 +159,49 @@ class MrpProduction(models.Model): for production in self: production.maintenance_count = len(production.request_ids) + # 获取cloud编程单的状态 + def _cron_get_programming_state(self): + try: + reproduction = self.search([('state', '=', 'rework'), ('programming_state', '=', '编程中')]) + if reproduction: + programming_no = [item.programming_no for item in reproduction] + programming_no_str = ','.join(programming_no) + res = {'programming_no': programming_no_str} + 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/get_state' + config_url = configsettings['sf_url'] + url + ret = requests.post(config_url, json=res, data=None, headers=config_header) + ret = ret.json() + result = json.loads(ret['result']) + logging.info('cron_get_programming_state-ret:%s' % result) + if result['status'] == 1: + for item in result['programming_list']: + production = self.search( + [('state', '=', 'rework'), ('programming_no', '=', item['programming_no'])]) + if production: + production.write({'programming_state': '已编程未下发'}) + else: + raise UserError(ret['message']) + except Exception as e: + logging.info('cron_get_programming_state error:%s' % e) + # 编程单更新 def update_programming_state(self): try: - res = {'programming_no': self.programming_no} + res = {'programming_no': self.programming_no, 'manufacturing_type': 'rework'} 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/reset_state_again' config_url = configsettings['sf_url'] + url - ret = requests.post(config_url, json={}, data=res, headers=config_header) + ret = requests.post(config_url, json=res, data=None, headers=config_header) ret = ret.json() - logging.info('update_programming_state-ret:%s' % ret) - if ret['status'] == 1: - self.write({'work_state': '已编程'}) + result = json.loads(ret['result']) + logging.info('update_programming_state-ret:%s' % result) + if result['status'] == 1: + self.write({'is_rework': True}) else: raise UserError(ret['message']) except Exception as e: @@ -200,7 +232,7 @@ class MrpProduction(models.Model): 'material_type_code': self.env['sf.materials.model'].search( [('id', '=', cnc.product_id.materials_type_id.id)]).materials_no, 'machining_processing_panel': cnc.product_id.model_processing_panel, - 'machining_precision': cnc.product_id.model_machining_precision, + 'machining_precision': '', 'embryo_long': cnc.product_id.bom_ids.bom_line_ids.product_id.length, 'embryo_height': cnc.product_id.bom_ids.bom_line_ids.product_id.height, 'embryo_width': cnc.product_id.bom_ids.bom_line_ids.product_id.width, @@ -523,70 +555,90 @@ class MrpProduction(models.Model): def _reset_work_order_sequence(self): for rec in self: - sequence_list = {} + workorder_ids = rec.workorder_ids.filtered(lambda item: item.state in ('返工', 'rework')) # 产品模型类型 model_type_id = rec.product_id.product_model_type_id # 产品加工面板 model_processing_panel = rec.product_id.model_processing_panel - if model_type_id: - if model_processing_panel: - tmpl_num = 1 - panel_list = model_processing_panel.split(',') - for panel in panel_list: - panel_sequence_list = {} - # 成品工序 - product_routing_tmpl_ids = model_type_id.product_routing_tmpl_ids - if product_routing_tmpl_ids: - for tmpl_id in product_routing_tmpl_ids: - panel_sequence_list.update({tmpl_id.route_workcenter_id.name: tmpl_num}) - tmpl_num += 1 - sequence_list.update({panel: panel_sequence_list}) - # 表面工艺工序 - # 模型类型的表面工艺工序模版 - surface_tmpl_ids = model_type_id.surface_technics_routing_tmpl_ids - # 产品选择的表面工艺 - model_process_parameters_ids = rec.product_id.model_process_parameters_ids - process_dict = {} - if model_process_parameters_ids: - for process_parameters_id in model_process_parameters_ids: - process_id = process_parameters_id.process_id - for surface_tmpl_id in surface_tmpl_ids: - if process_id == surface_tmpl_id.route_workcenter_id.surface_technics_id: - surface_tmpl_name = surface_tmpl_id.route_workcenter_id.name - process_dict.update({int(process_id.category_id.code): '%s-%s' % ( - surface_tmpl_name, process_parameters_id.name)}) - process_list = sorted(process_dict.keys()) - for process_num in process_list: - sequence_list.update({process_dict.get(process_num): tmpl_num}) - tmpl_num += 1 - # 坯料工序 - tmpl_num = 1 - embryo_routing_tmpl_ids = model_type_id.embryo_routing_tmpl_ids - if embryo_routing_tmpl_ids: - for tmpl_id in embryo_routing_tmpl_ids: - sequence_list.update({tmpl_id.route_workcenter_id.name: tmpl_num}) + if not workorder_ids: + sequence_list = {} + if model_type_id: + if model_processing_panel: + tmpl_num = 1 + panel_list = model_processing_panel.split(',') + for panel in panel_list: + panel_sequence_list = {} + # 成品工序 + product_routing_tmpl_ids = model_type_id.product_routing_tmpl_ids + if product_routing_tmpl_ids: + for tmpl_id in product_routing_tmpl_ids: + panel_sequence_list.update({tmpl_id.route_workcenter_id.name: tmpl_num}) + tmpl_num += 1 + sequence_list.update({panel: panel_sequence_list}) + # 表面工艺工序 + # 模型类型的表面工艺工序模版 + surface_tmpl_ids = model_type_id.surface_technics_routing_tmpl_ids + # 产品选择的表面工艺 + model_process_parameters_ids = rec.product_id.model_process_parameters_ids + process_dict = {} + if model_process_parameters_ids: + for process_parameters_id in model_process_parameters_ids: + process_id = process_parameters_id.process_id + for surface_tmpl_id in surface_tmpl_ids: + if process_id == surface_tmpl_id.route_workcenter_id.surface_technics_id: + surface_tmpl_name = surface_tmpl_id.route_workcenter_id.name + process_dict.update({int(process_id.category_id.code): '%s-%s' % ( + surface_tmpl_name, process_parameters_id.name)}) + process_list = sorted(process_dict.keys()) + for process_num in process_list: + sequence_list.update({process_dict.get(process_num): tmpl_num}) tmpl_num += 1 + # 坯料工序 + tmpl_num = 1 + embryo_routing_tmpl_ids = model_type_id.embryo_routing_tmpl_ids + if embryo_routing_tmpl_ids: + for tmpl_id in embryo_routing_tmpl_ids: + sequence_list.update({tmpl_id.route_workcenter_id.name: tmpl_num}) + tmpl_num += 1 + else: + raise ValidationError('该产品【加工面板】为空!') else: - raise ValidationError('该产品【加工面板】为空!') + raise ValidationError('该产品没有选择【模版类型】!') - else: - raise ValidationError('该产品没有选择【模版类型】!') - - for work in rec.workorder_ids: - if sequence_list.get(work.name): - work.sequence = sequence_list[work.name] - elif sequence_list.get(work.processing_panel): - processing_panel = sequence_list.get(work.processing_panel) - if processing_panel.get(work.name): - work.sequence = processing_panel[work.name] + for work in rec.workorder_ids: + if sequence_list.get(work.name): + work.sequence = sequence_list[work.name] + elif sequence_list.get(work.processing_panel): + processing_panel = sequence_list.get(work.processing_panel) + if processing_panel.get(work.name): + work.sequence = processing_panel[work.name] + else: + raise ValidationError('工序【%s】在产品选择的模版类型中不存在!' % work.name) else: raise ValidationError('工序【%s】在产品选择的模版类型中不存在!' % work.name) - else: - raise ValidationError('工序【%s】在产品选择的模版类型中不存在!' % work.name) - # if work.name == '获取CNC加工程序': - # work.button_start() - # #work.fetchCNC() - # work.button_finish() + # 当单个面触发返工时,将新生成的工单插入到返工工单下方,并且后面的所以工单工序重排 + elif rec.workorder_ids.filtered(lambda item: item.sequence == 0): + # 获取新增的返工工单 + work_ids = rec.workorder_ids.filtered(lambda item: item.sequence == 0) + # 获取当前返工面最后一个工单工序 + sequence_max = sorted( + rec.workorder_ids.filtered(lambda item: item.processing_panel == work_ids[0].processing_panel), + key=lambda item: item.sequence, reverse=True)[0].sequence + # 对当前返工工单之后的工单工序进行重排 + work_order_ids = rec.workorder_ids.filtered(lambda item: item.sequence > sequence_max) + for work_id in work_order_ids: + work_id.sequence = work_id.sequence + 3 + # 生成新增的返工工单的工序 + # 成品工序 + panel_sequence_list = {} + product_routing_tmpl_ids = model_type_id.product_routing_tmpl_ids + if product_routing_tmpl_ids: + for tmpl_id in product_routing_tmpl_ids: + sequence_max += 1 + panel_sequence_list.update({tmpl_id.route_workcenter_id.name: sequence_max}) + for work_id in work_ids: + if panel_sequence_list.get(work_id.name): + work_id.sequence = panel_sequence_list[work_id.name] # 创建工单并进行排序 def _create_workorder(self, item): diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml index 8ddbb418..91a1eb84 100644 --- a/sf_manufacturing/views/mrp_production_addional_change.xml +++ b/sf_manufacturing/views/mrp_production_addional_change.xml @@ -1,63 +1,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - custom.mrp.production.tree mrp.production + + + @@ -129,8 +81,10 @@ - + @@ -364,6 +318,16 @@ mrp.workorder + + sequence + + + +