from odoo import api, fields, models from collections import defaultdict class StockRule(models.Model): _inherit = "stock.rule" def create_purchase_request(self, procurement_group): """ Create a purchase request containing procurement order product. """ procurement = procurement_group[0] rule = procurement_group[1] purchase_request_model = self.env["purchase.request"] purchase_request_line_model = self.env["purchase.request.line"] cache = {} pr = self.env["purchase.request"] domain = rule._make_pr_get_domain(procurement.values) if domain in cache: pr = cache[domain] elif domain: pr = self.env["purchase.request"].search([dom for dom in domain]) pr = pr[0] if pr else False cache[domain] = pr if not pr: request_data = rule._prepare_purchase_request( procurement.origin, procurement.values ) request_data.update({'rule_new_add': True}) pr = purchase_request_model.create(request_data) cache[domain] = pr elif ( not pr.origin or procurement.origin not in pr.origin.split(", ") and procurement.origin != "/" ): if pr.origin: if procurement.origin: pr.write({"origin": pr.origin + ", " + procurement.origin}) else: pr.write({"origin": procurement.origin}) # Create Line request_line_data = rule._prepare_purchase_request_line(pr, procurement) request_line_data.update({'origin': procurement.origin}) purchase_request_line_model.create(request_line_data) def _run_buy(self, procurements): # 如果补货组相同,并且产品相同,则合并 procurements_dict = defaultdict() for procurement, rule in procurements: if (procurement.product_id.id, procurement.values['group_id'], rule.id) not in procurements_dict: procurements_dict[(procurement.product_id.id, procurement.values['group_id'], rule.id)] = { 'product_id': procurement.product_id, 'product_qty': procurement.product_qty, 'product_uom': procurement.product_uom, 'location_id': procurement.location_id, 'name': procurement.name, 'origin': procurement.origin, 'company_id': procurement.company_id, 'values': procurement.values, 'rule': rule } else: procurements_dict[(procurement.product_id.id, procurement.values['group_id'], rule.id)]['product_qty'] += procurement.product_qty procurements_dict[(procurement.product_id.id, procurement.values['group_id'], rule.id)]['values']['move_dest_ids'] |= procurement.values['move_dest_ids'] new_procurements = [] for k, p in procurements_dict.items(): new_procurements.append(( self.env['procurement.group'].Procurement( product_id=p['product_id'], product_qty=p['product_qty'], product_uom=p['product_uom'], location_id=p['location_id'], name=p['name'], origin=p['origin'], company_id=p['company_id'], values=p['values'] ), p['rule']) ) res = super(StockRule, self)._run_buy(new_procurements) # 判断是否根据规则生成新的采购申请单据,如果生成则修改状态为 approved origins = list(set([procurement[0].origin for procurement in procurements])) for origin in origins: pr_ids = self.env["purchase.request"].sudo().search( [('origin', 'like', origin), ('rule_new_add', '=', True), ('state', '=', 'draft')]) if pr_ids: pr_ids.write({'need_validation': False}) pr_ids.write({"state": "approved", 'need_validation': True, 'rule_new_add': False}) return res