很抱歉我延迟回复您的答案,我花了很长时间才开始研究它,我想分享我的发现:
在我公司,我们根据 ATG 建议实施了销售清单价格;这意味着在 atg/commerce/pricing/ItemPriceInfo 上,我们将从“List Price”列表中填充 listPrice,从“Sale Price”列表中填充 salePrice。
在整个站点中,为了显示商品价格,我们必须通过应用下一个逻辑来在两个列表之间进行选择,以优先考虑销售价格:
isOnSale() && getSalePrice() < getListPrice ? getSalePrice() : getListPrice();
在 BCC 上创建新促销并选择将促销应用于最高(或最低)价格商品的选项时出现问题,因为默认情况下,BCC 将在 PDML 规则中添加一个 XML 标签,例如:
< 最高和包括 number="1" sort-by="priceInfo.listPrice" sort-order="descending" >
您可能会注意到,PDML 的技巧是根据“priceInfo.listPrice”对所有项目进行排序,然后选择第一个。
评估 PDML 时,ATG 将这个 XML 标记映射为 atg/commerce/pricing/definition/UpToAndIncludingElem 的实例;那里的“评估”方法将调用位于 atg/commerce/pricing.definition.CompoundPricingModelExpression 中的方法“resolveCollectionList”,最终调用同一类的方法“sortList”。
- 这是一种对我有用的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 方法将考虑销售价格.
为什么我放弃这种方法?
- 因为我覆盖类的方式依赖于将类添加到类路径中的项目中,并且对我来说有风险
- 我使用了一个我不能保证是最佳 JAVA 代码的反编译工具
- 如果稍后使用另一个 ATG 版本此流程发生变化,我可能会遇到麻烦
我要做什么?
我将保留我在 ItemPriceInfo 类的自定义类中添加的“priceInfo.finalPrice”的定义
我会看看如何更改促销模板,以便硬编码我的自定义属性“priceInfo.finalPrice”而不是“priceInfo.listPrice”
感谢那些花时间阅读和回答我的问题的人,我希望我的发现和方法对你有用。
当然有信心提出问题或提出建议。