From be408b98de2e374eedff04b068bd7e02e8d14e5e Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Mon, 25 Nov 2024 18:00:06 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=B6=E9=80=A0?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=9B=B8=E5=85=B3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_production.py | 2 +- sf_manufacturing/models/product_template.py | 4 ++-- sf_manufacturing/models/stock.py | 19 +++++++++++++------ sf_sale/models/quick_easy_order.py | 4 ++-- sf_sale/models/quick_easy_order_old.py | 4 ++-- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index d60a2497..29ce69c7 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -1306,6 +1306,7 @@ class MrpProduction(models.Model): raise_user_error=not self.env.context.get('from_orderpoint')) productions = self.env['mrp.production'].sudo().search( [('origin', '=', self.origin)], order='id desc', limit=1) + productions.write({'programming_no': self.programming_no, 'is_remanufacture': True}) move = self.env['stock.move'].search([('origin', '=', productions.name)], order='id desc') for mo in move: domain = [] @@ -1332,7 +1333,6 @@ class MrpProduction(models.Model): mo_move.write({'reference': sfp_move.reference, 'partner_id': sfp_move.partner_id.id, 'picking_id': sfp_move.picking_id.id, 'picking_type_id': sfp_move.picking_type_id.id, 'production_id': False}) - productions.write({'programming_no': self.programming_no, 'is_remanufacture': True}) # productions.procurement_group_id.mrp_production_ids.move_dest_ids.write( # {'group_id': self.env['procurement.group'].search([('name', '=', sale_order.name)])}) stock_picking_remanufacture = self.env['stock.picking'].search([('origin', '=', productions.name)]) diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index f5f685aa..ebbf5bd2 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -9,8 +9,8 @@ from odoo.exceptions import ValidationError, UserError 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): diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index c9c97ec7..84271b44 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -970,12 +970,19 @@ class ReStockMove(models.Model): 创建调拨单时,在此新增或修改调拨单的数据 """ res = super(ReStockMove, self)._get_new_picking_values() - if self[0].origin and self.picking_type_id.name in ['生产发料', '内部调拨']: - production = self.env['mrp.production'].search([('name', '=', self[0].origin)], limit=1, order='id asc') - productions = self.env['mrp.production'].search( - [('origin', '=', production.origin), ('product_id', '=', production.product_id.id)]) - res['origin'] = ','.join(productions.mapped('name')) - res['retrospect_ref'] = production.product_id.name + ## 制造订单报废生成的新制造订单不走合并 + production_remanufacture = None + if 'origin' in res: + if self.picking_type_id.name in ['生产发料', '内部调拨']: + production_remanufacture = self.env['mrp.production'].search( + [('name', '=', res['origin']), ('is_remanufacture', '=', True)]) + if not production_remanufacture: + if self[0].origin and self.picking_type_id.name in ['生产发料', '内部调拨']: + production = self.env['mrp.production'].search([('name', '=', self[0].origin)], limit=1, order='id asc') + productions = self.env['mrp.production'].search( + [('origin', '=', production.origin), ('product_id', '=', production.product_id.id)]) + res['origin'] = ','.join(productions.mapped('name')) + res['retrospect_ref'] = production.product_id.name return res def _single_manufactuing_mo_generate_origin(self, res): diff --git a/sf_sale/models/quick_easy_order.py b/sf_sale/models/quick_easy_order.py index 081807a4..cb1886a1 100644 --- a/sf_sale/models/quick_easy_order.py +++ b/sf_sale/models/quick_easy_order.py @@ -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 diff --git a/sf_sale/models/quick_easy_order_old.py b/sf_sale/models/quick_easy_order_old.py index 87848e3a..d963d021 100644 --- a/sf_sale/models/quick_easy_order_old.py +++ b/sf_sale/models/quick_easy_order_old.py @@ -5,8 +5,8 @@ import requests import os from datetime import datetime # 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 From 3e55bb47173494c28afb78356a45156fb170d094 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Tue, 26 Nov 2024 10:39:04 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=B6=E9=80=A0?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E6=89=B9=E9=87=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/product_template.py | 4 ++-- .../wizard/production_technology_re_adjust_wizard.py | 2 +- sf_sale/models/quick_easy_order.py | 4 ++-- sf_sale/models/quick_easy_order_old.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index ebbf5bd2..f5f685aa 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -9,8 +9,8 @@ from odoo.exceptions import ValidationError, UserError 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): diff --git a/sf_manufacturing/wizard/production_technology_re_adjust_wizard.py b/sf_manufacturing/wizard/production_technology_re_adjust_wizard.py index 774dbd74..746c953e 100644 --- a/sf_manufacturing/wizard/production_technology_re_adjust_wizard.py +++ b/sf_manufacturing/wizard/production_technology_re_adjust_wizard.py @@ -14,7 +14,7 @@ class ProductionTechnologyReAdjustWizard(models.TransientModel): def confirm(self): if self.is_technology_re_adjust is True: - domain = [('origin', '=', self.origin), ('state', '=', 'technology_to_confirmed'), + domain = [('origin', '=', self.origin), ('state', '=', 'confirmed'), ('product_id', '=', self.production_id.product_id.id)] else: domain = [('id', '=', self.production_id.id)] diff --git a/sf_sale/models/quick_easy_order.py b/sf_sale/models/quick_easy_order.py index cb1886a1..081807a4 100644 --- a/sf_sale/models/quick_easy_order.py +++ b/sf_sale/models/quick_easy_order.py @@ -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 diff --git a/sf_sale/models/quick_easy_order_old.py b/sf_sale/models/quick_easy_order_old.py index d963d021..87848e3a 100644 --- a/sf_sale/models/quick_easy_order_old.py +++ b/sf_sale/models/quick_easy_order_old.py @@ -5,8 +5,8 @@ import requests import os from datetime import datetime # 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 From 5f70690af555b1885f5af203997885e902ba5e81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Tue, 26 Nov 2024 10:45:43 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=8D=95=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E9=87=87=E8=B4=AD=E7=B1=BB=E5=9E=8B=E6=8B=86=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_dlm/models/stock_rule_inherit.py | 88 +++++++++++++++++------ sf_manufacturing/models/mrp_production.py | 24 +++++++ sf_sale/models/__init__.py | 1 - sf_sale/models/stock_move.py | 9 --- 4 files changed, 90 insertions(+), 32 deletions(-) delete mode 100644 sf_sale/models/stock_move.py diff --git a/sf_dlm/models/stock_rule_inherit.py b/sf_dlm/models/stock_rule_inherit.py index 72e7ed28..b1e5b911 100644 --- a/sf_dlm/models/stock_rule_inherit.py +++ b/sf_dlm/models/stock_rule_inherit.py @@ -1,4 +1,5 @@ import logging +from itertools import groupby from odoo import models, fields, api, _ @@ -7,11 +8,10 @@ class StockRuleInherit(models.Model): @api.model def _run_buy(self, procurements): - # 首先调用父类的 _run_buy 方法,以保留原有逻辑 - super(StockRuleInherit, self)._run_buy(procurements) - - # 然后在这里添加自定义的逻辑 + # 判断补货组的采购类型 + procurements_group = {'standard': [], 'consignment': []} for procurement, rule in procurements: + is_consignment = False product = procurement.product_id # 获取主 BOM bom = self.env['mrp.bom'].search([('product_tmpl_id', '=', product.product_tmpl_id.id)], limit=1) @@ -23,21 +23,65 @@ class StockRuleInherit(models.Model): # 检查路线 for route in raw_material.route_ids: # print('route.name:', route.name) - if route.name == '按订单补给外包商': # 或者用 route.id 检查精确的路线 - print("按订单补给外包商============是") - # 使用 procurement.values['supplier'] 获取供应商 - supplier = procurement.values.get('supplier') - if supplier: - domain = rule._make_po_get_domain(procurement.company_id, procurement.values, - supplier.partner_id) - logging.info("domain=============: %s", domain) - po = self.env['purchase.order'].sudo().search([ - ('partner_id', '=', supplier.partner_id.id), - ('company_id', '=', procurement.company_id.id), # 保证公司一致 - ('origin', '=', procurement.origin), # 根据来源匹配 - ('state', '=', 'draft') # 状态为草稿 - ], limit=1) - logging.info("po=: %s", po) - if po: - po.write({'purchase_type': 'consignment'}) - break + if route.name == '按订单补给外包商': + is_consignment = True + + if is_consignment: + procurements_group['consignment'].append((procurement, rule)) + else: + procurements_group['standard'].append((procurement, rule)) + + for key, value in procurements_group.items(): + super(StockRuleInherit, self)._run_buy(value) + + if key == 'consignment': + for procurement, rule in value: + supplier = procurement.values.get('supplier') + if supplier: + domain = rule._make_po_get_domain(procurement.company_id, procurement.values, + supplier.partner_id) + logging.info("domain=============: %s", domain) + po = self.env['purchase.order'].sudo().search([ + ('partner_id', '=', supplier.partner_id.id), + ('company_id', '=', procurement.company_id.id), # 保证公司一致 + ('origin', '=', procurement.origin), # 根据来源匹配 + ('state', '=', 'draft') # 状态为草稿 + ], limit=1) + logging.info("po=: %s", po) + if po: + po.write({'purchase_type': 'consignment'}) + + # # 首先调用父类的 _run_buy 方法,以保留原有逻辑 + # super(StockRuleInherit, self)._run_buy(procurements) + + # 然后在这里添加自定义的逻辑 + # for procurement, rule in procurements: + # product = procurement.product_id + # # 获取主 BOM + # bom = self.env['mrp.bom'].search([('product_tmpl_id', '=', product.product_tmpl_id.id)], limit=1) + + # if bom: + # # 遍历 BOM 中的组件(即坯料等) + # for line in bom.bom_line_ids: + # raw_material = line.product_id + # # 检查路线 + # for route in raw_material.route_ids: + # # print('route.name:', route.name) + # if route.name == '按订单补给外包商': # 或者用 route.id 检查精确的路线 + # print("按订单补给外包商============是") + # # 使用 procurement.values['supplier'] 获取供应商 + # supplier = procurement.values.get('supplier') + # if supplier: + # domain = rule._make_po_get_domain(procurement.company_id, procurement.values, + # supplier.partner_id) + # logging.info("domain=============: %s", domain) + # po = self.env['purchase.order'].sudo().search([ + # ('partner_id', '=', supplier.partner_id.id), + # ('company_id', '=', procurement.company_id.id), # 保证公司一致 + # ('origin', '=', procurement.origin), # 根据来源匹配 + # ('state', '=', 'draft') # 状态为草稿 + # ], limit=1) + # logging.info("po=: %s", po) + # if po: + # po.write({'purchase_type': 'consignment'}) + # break diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 71703f02..315ab908 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -1442,6 +1442,30 @@ class MrpProduction(models.Model): ]) order.delivery_count = len(order.picking_ids) + def action_view_purchase_orders(self): + self.ensure_one() + if self.product_id.product_tmpl_id.single_manufacturing == True: + production = self.env['mrp.production'].search([('origin', '=', self.origin), ('product_id', '=', self.product_id.id)], limit=1, order='id asc') + else: + production = self + purchase_order_ids = (production.procurement_group_id.stock_move_ids.created_purchase_line_id.order_id | production.procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id).ids + action = { + 'res_model': 'purchase.order', + 'type': 'ir.actions.act_window', + } + if len(purchase_order_ids) == 1: + action.update({ + 'view_mode': 'form', + 'res_id': purchase_order_ids[0], + }) + else: + action.update({ + 'name': _("Purchase Order generated from %s", self.name), + 'domain': [('id', 'in', purchase_order_ids)], + 'view_mode': 'tree,form', + }) + return action + class sf_detection_result(models.Model): _name = 'sf.detection.result' _description = "检测结果" diff --git a/sf_sale/models/__init__.py b/sf_sale/models/__init__.py index 30552565..97400237 100644 --- a/sf_sale/models/__init__.py +++ b/sf_sale/models/__init__.py @@ -4,5 +4,4 @@ from . import quick_easy_order_old from . import auto_quatotion_common from . import parser_and_calculate_work_time from . import preload_datas_functions -from . import stock_move diff --git a/sf_sale/models/stock_move.py b/sf_sale/models/stock_move.py deleted file mode 100644 index de522509..00000000 --- a/sf_sale/models/stock_move.py +++ /dev/null @@ -1,9 +0,0 @@ -from odoo import models, fields, api - -class StockMove(models.Model): - _inherit = 'stock.move' - - @api.model - def _prepare_merge_negative_moves_excluded_distinct_fields(self): - excluded_fields = super()._prepare_merge_negative_moves_excluded_distinct_fields() + ['pruchase_type'] - return excluded_fields \ No newline at end of file