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 d60a2497..112a41ff 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)]) @@ -1466,6 +1466,29 @@ 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' diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 79f5cdea..031672b8 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -975,14 +975,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') - if not production: - return res - 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 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/__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