如何处理 Hybris 2105 的发布推广问题?

How to deal with publishing promotion issues Hybris 2105?

我们已将 SAP Hybris 从 2011 迁移到 2105。

发布新促销时会出现一些问题,这些问题似乎在较低的 version.When 我们发布促销时运行良好(甚至是 OOB 促销,如在 Conditions CMS 网站和 Action 购物车 10% 折扣)当我发布促销时,我收到如下错误:

   ruleOrderEntryFixedDiscountAction.executeAction(new 
   DefaultDroolsRuleActionContext(variables, kcontext), 
   ["value_uuid":"6e732228-89fe-4f4e-8dea-5235dee2ccd7", 
    "bundleSize":new Integer(4), "bundleSize_uuid":"49803399- 
     53a8-44b6-85cd-35c1b83235d7", "bundleLimit_uuid":"778299c6- 
     75bd-414e-97bb-3e5fe1aa0bf9", "bundleLimit":new Integer(2), 
     "value":new BigDecimal("50")]);
     $groupExecution.trackRuleGroupExecution($config);:
     [Error: unable to resolve method using strict-mode: 
     org.drools.core.spi.KnowledgeHelper.$groupExecution()]

这是由于 drools 规则引擎发生了一些变化。这会在解析较旧的 Drools 规则期间导致异常。

要解决这个问题,您可以

  • 将所有 drools 规则的内容设为空白,并重新发布所有规则,以便为您的所有促销活动提供正确且有效的 drools 规则。脚本示例:您需要禁用拦截器,因为它们可能会阻止您更改规则内容

      import de.hybris.platform.commerceservices.search.pagedata.PageableData
      import de.hybris.platform.servicelayer.search.FlexibleSearchQuery
      import com.google.common.collect.ImmutableMap;
      import de.hybris.platform.servicelayer.interceptor.impl.InterceptorExecutionPolicy;
      import de.hybris.platform.servicelayer.session.SessionExecutionBody;
      import de.hybris.platform.servicelayer.session.SessionService;
      import com.google.common.collect.ImmutableSet;
    
    
      int start = 0
      int pageSize = 1000
      int total = pageSize
    
      final FlexibleSearchQuery searchQuery = new FlexibleSearchQuery("select {PK} from {DroolsRule} ORDER BY {PK}")
    
      searchQuery.setCount(pageSize)
      searchQuery.setNeedTotal(true)
    
      while (start < total) {
          searchQuery.setStart(start)
          def searchResult = flexibleSearchService.search(searchQuery)
    
          searchResult.getResult().each {
              final Map<String, Object> params = ImmutableMap.of(InterceptorExecutionPolicy.DISABLED_INTERCEPTOR_TYPES,
                  ImmutableSet.of(InterceptorExecutionPolicy.InterceptorType.PREPARE,InterceptorExecutionPolicy.InterceptorType.VALIDATE));
    
              sessionService.executeInLocalViewWithParams(params, new SessionExecutionBody() {
                  @Override
                  public void executeWithoutResult() {
                      it.setRuleContent("");
                      modelService.save(it);
                  }
              });
          }
    
          total = searchResult.getTotalCount()
          start += pageSize
      }
    
      println "Script has been completed."
    

  • 如果不再需要,请删除所有 DroolsRule 对象。请注意,删除这些旧规则可能会影响与该 Drools 规则相关的现有订单。促销结果仍将附上,但很难判断是什么促销触发了该结果。

我建议选择第一个选项,以免丢失任何数据

不要忘记在执行任一步骤后重新发布您的规则