2017-05-29 61 views
0

我實施了BXGY自定義促銷。 爲了簡化我的情況,讓我們假設在購物車中有X件產品後,您將獲得Y件免費產品。BXGY促銷的多重點燃 - 合格訂單分錄的消費

如果我在購物車中有2 * X合格產品,預期的行爲是獲得2 * Y免費產品。

我的問題是多次推廣該促銷活動。如果我將多次啓動的最大次數設置爲4,則比行動(獲得免費產品)啓用4次,儘管我在購物車中裝有2 * X產品。

所以我的結論是,我需要消耗合格產品(項目與產品)一樣,用戶得到消耗,使他們不能參加資格再推廣免費產品。

我的研究結論是我需要使用(YFreeGift)RAOAction中的條目,但是我需要檢索所有條件產品,並且我不覺得這是一個正確的方式(條件)。

不要任何人知道如何消費排位賽項?

條件翻譯人員BXGY(我有強制性合格產品太多,但不是重要的,這個問題)

public class RuleHeinekenBXGYFQualifyingProductsConditionTranslator implements RuleConditionTranslator 
{ 
    @Override 
    public RuleIrCondition translate(RuleCompilerContext context, RuleConditionData ruleCondition, RuleConditionDefinitionData conditionDefinition) throws RuleCompilerException 
    { 
     List<String> mandatoryProducts = (List) getConditionParameterValue(ruleCondition, "mandatoryQualifyingProducts"); 
     List<String> alternativeProducts = (List) getConditionParameterValue(ruleCondition, "alternativeQualifyingProducts"); 
     Integer qualifyingCount = (Integer) getConditionParameterValue(ruleCondition, "qualifyingCount"); 

     if(isEmpty(mandatoryProducts) && isEmpty(alternativeProducts) || qualifyingCount == null || qualifyingCount <= 0) 
      throw new PromotionConditionParametersValidationException(); 

     String cartRAO = context.generateVariable(CartRAO.class); 
     List<RuleIrCondition> mandatoryProductsConditions = getMandatoryProductsConditions(context, mandatoryProducts, cartRAO); 
     List<RuleIrCondition> qualifyingCountCondition = getQualifyingCountCondition(context, qualifyingCount, cartRAO); 

     RuleIrGroupCondition qualifyingConditions = new RuleIrGroupCondition(); 
     qualifyingConditions.setOperator(RuleIrGroupOperator.AND); 
     qualifyingConditions.setChildren(listUnion(mandatoryProductsConditions, qualifyingCountCondition)); 
     return qualifyingConditions; 
    } 

    private List<RuleIrCondition> getQualifyingCountCondition(RuleCompilerContext context, Integer qualifyingCount, String cartRAO) 
    { 
     String qualifyingCountRAO = context.generateVariable(QualifyingCountRAO.class); 
     String promotionCode = context.getRule().getCode(); 

     return getListOfRuleConditions(
      aRuleCondition() 
       .withModelRAO(qualifyingCountRAO) 
       .withAttribute("promotionCode") 
       .withOperator(EQUAL) 
       .withValue(promotionCode) 
       .buildAttributeCondition(), 

      aRuleCondition() 
       .withModelRAO(qualifyingCountRAO) 
       .withAttribute("qualifyingCount") 
       .withOperator(GREATER_THAN_OR_EQUAL) 
       .withValue(qualifyingCount) 
       .buildAttributeCondition(), 

      aRuleCondition() 
       .withModelRAO(cartRAO) 
       .withAttribute("qualifyingCounts") 
       .withOperator(CONTAINS) 
       .withTargetVariable(qualifyingCountRAO) 
       .buildAttributeRelationCondition()); 
    } 

    private List<RuleIrCondition> getMandatoryProductsConditions(RuleCompilerContext context, List<String> mandatoryProducts, String cartRAO) 
    { 
     if(isEmpty(mandatoryProducts)) 
      return emptyList(); 

     return getMapOfQualifyingProductsWithQuantities(mandatoryProducts) 
       .entrySet().stream() 
       .map(entry -> getMandatoryProductCondition(context, cartRAO, entry.getKey(), entry.getValue())) 
       .collect(toList()); 
    } 

    private RuleIrExistsCondition getMandatoryProductCondition(RuleCompilerContext context, String cartRAO, String product, int qualifyingCount) 
    { 
     RuleIrLocalVariablesContainer variablesContainer = context.createLocalContainer(); 
     String containsProductRAO = context.generateLocalVariable(variablesContainer, ProductRAO.class); 
     String containsOrderEntryRAO = context.generateLocalVariable(variablesContainer, OrderEntryRAO.class); 

     List<RuleIrCondition> listOfConditions = getListOfRuleConditions(
      aRuleCondition() 
       .withModelRAO(containsProductRAO) 
       .withAttribute("code") 
       .withOperator(EQUAL) 
       .withValue(product) 
       .buildAttributeCondition(), 

      aRuleCondition() 
       .withModelRAO(containsOrderEntryRAO) 
       .withAttribute("product") 
       .withOperator(EQUAL) 
       .withTargetVariable(containsProductRAO) 
       .buildAttributeRelationCondition(), 

      aRuleCondition() 
       .withModelRAO(containsOrderEntryRAO) 
       .withAttribute("quantity") 
       .withOperator(GREATER_THAN_OR_EQUAL) 
       .withValue(qualifyingCount) 
       .buildAttributeCondition(), 

      aRuleCondition() 
       .withModelRAO(cartRAO) 
       .withAttribute("entries") 
       .withOperator(CONTAINS) 
       .withTargetVariable(containsOrderEntryRAO) 
       .buildAttributeRelationCondition()); 

     RuleIrExistsCondition mandatoryProductsExistCondition = new RuleIrExistsCondition(); 
     mandatoryProductsExistCondition.setVariablesContainer(variablesContainer); 
     mandatoryProductsExistCondition.setChildren(listOfConditions); 
     return mandatoryProductsExistCondition; 
    } 
} 

回答

1

規則引擎提供了一個機制,讓你在 數量配置限制規則可以觸發行動項目的次數。

只要滿足條件 ,最大規則執行次數允許您控制規則可以執行的最大次數 次。對於所有開箱即用的促銷操作,此 屬性的值應設置爲1。

看RuleConfigurationRRD屬性。

採取自help.hybris.com。

+0

從閱讀它看起來像Zildyan已經意識到這個屬性的問題。 – Sebastian

1

你是什麼版本? 6.4或6.3 AFAIK之前免費贈品行動有一個錯誤。 免費贈品行動由內部的兩項行動組成(將產品添加到購物車並給予添加產品100%的折扣)。 由於這個錯誤,您可能必須增加最大規則執行次數,以使您原來的數量增加一倍(因爲每個操作「添加到購物車」和「折扣產品」都將計爲一次執行)。

要回答你的問題,突出對訂單錄入消費: 的promotionengine不支持訂單錄入消費OOTB現在。 這是一個功能,是遺留促銷的一部分,但已被放棄贊成堆疊。

但更一般地說,您似乎採取的方法並不是hybris打算如何使用免費禮物動作。 如果您想要一個BOGOF(或BXGYF),您通常會定義一個促銷,以檢查您的合格產品X和待折扣產品和Y是否在購物車中的數量足夠。然後,該行動將簡單折扣產品Y。 您還可以添加一個潛在的促銷活動,只檢查產品X這將觸發一條消息,如將n個產品Y添加到您的購物車以獲得它們免費爲了提醒顧客他/她有資格獲得推廣。

如果你看一下promotionenginesamplesaddon擴展/插件,你會發現這兩個促銷活動,應該做的正是我的意思上面:

potential_product_buy_x_get_y_free 
product_buy_x_get_y_free 

希望這有助於

塞巴斯蒂安

+0

謝謝你的好回答,但是 - 總有但是。客戶有一些複雜的自定義促銷。我成功實施了他們,但我堅持這一點。所以基本上,如果您有兩次BXGY促銷活動具有相同或相交的合格產品,則優先級較高的應禁用那些使用過的BXGY促銷活動,因此其他BXGY促銷活動只能享用剩餘食物,如果這些促銷活動具有合格產品的話,那就太棒了。 – Zildyan

+0

例如:購買4瓶啤酒獲得1個杜松子酒,然後購買2個啤酒獲得1個威士忌。如果購物車中有10杯啤酒,顧客應該購買2杯威士忌和1杯威士忌。 – Zildyan

+0

是的,如果有訂單輸入消費,那將是可行的,但現在它不容易做到這一點:(可能讓你的客戶從hybris請求它?有時他們聽他們的客戶;) – Sebastian