1

我需要自定义应用于“最高价商品”的 ATG 促销活动,但它会考虑何时有销售价格并使用它而不是默认标价。

根据我在 BCC 中配置“条件和报价”以在标记选项时生成 PMDL 规则时从 atg.ui.commerce.pricing.DescriptionBuilder.java 读取的内容:

“应用折扣到”下的“最高价商品优先”它会生成带有此部分的 PDML 规则:

<up-to-and-including number="1" sort-by="priceInfo.listPrice" sort-order="descending">

但正如您所见,ATG 始终使用 PDML 规则中硬编码的 priceInfo.listPrice。

我该如何做才能使我的促销活动足够智能,以检测商品何时具有销售价格,以便使用它而不是标价?

4

1 回答 1

0

很抱歉我延迟回复您的答案,我花了很长时间才开始研究它,我想分享我的发现:

  1. 在我公司,我们根据 ATG 建议实施了销售清单价格;这意味着在 atg/commerce/pricing/ItemPriceInfo 上,我们将从“List Price”列表中填充 listPrice,从“Sale Price”列表中填充 salePrice。

  2. 在整个站点中,为了显示商品价格,我们必须通过应用下一个逻辑来在两个列表之间进行选择,以优先考虑销售价格:

    isOnSale() && getSalePrice() < getListPrice ? getSalePrice() : getListPrice();

  3. 在 BCC 上创建新促销并选择将促销应用于最高(或最低)价格商品的选项时出现问题,因为默认情况下,BCC 将在 PDML 规则中添加一个 XML 标签,例如:

    < 最高和包括 number="1" sort-by="priceInfo.listPrice" sort-order="descending" >

  4. 您可能会注意到,PDML 的技巧是根据“priceInfo.listPrice”对所有项目进行排序,然后选择第一个。

评估 PDML 时,ATG 将这个 XML 标记映射为 atg/commerce/pricing/definition/UpToAndIncludingElem 的实例;那里的“评估”方法将调用位于 atg/commerce/pricing.definition.CompoundPricingModelExpression 中的方法“resolveCollectionList”,最终调用同一类的方法“sortList”。

  1. 这是一种对我有用的hacky方法,但我已经放弃了:

5.a 我反编译了UpToAndIncludingElem.class并添加了它自己版本的方法sortList,因为这个方法接收一个参数“sortBy”我添加了一个条件,所以如果它的值为“priceInfo.listPrice”,我将其更改为自定义新属性“priceInfo 。最终价格”

5.b 因为我们已经扩展了 atg/commerce/pricing/ItemPriceInfo 类,所以我添加了一个名为“finalPrice”的新属性,它带有它的 setter 和一个自定义 getter,用于评估是否有要使用的销售价格,正如我在步骤 2 中解释的那样

现在,每次在 PDML 规则中使用该 XML 标记进行促销以将促销应用于最高(或最低)价格的商品时,我的自定义 UpToAndIncludingElem 的 sortList 方法将替换 sortBy 参数以使用“priceInfo.finalPrice”,该 getter 方法将考虑销售价格.

为什么我放弃这种方法?

  1. 因为我覆盖类的方式依赖于将类添加到类路径中的项目中,并且对我来说有风险
  2. 我使用了一个我不能保证是最佳 JAVA 代码的反编译工具
  3. 如果稍后使用另一个 ATG 版本此流程发生变化,我可能会遇到麻烦

我要做什么?

我将保留我在 ItemPriceInfo 类的自定义类中添加的“priceInfo.finalPrice”的定义

我会看看如何更改促销模板,以便硬编码我的自定义属性“priceInfo.finalPrice”而不是“priceInfo.listPrice”

感谢那些花时间阅读和回答我的问题的人,我希望我的发现和方法对你有用。

当然有信心提出问题或提出建议。

于 2016-09-16T19:41:44.693 回答