2009年7月30日星期四

CMSEntity之五,price plan的生成

接昨日:
prepareMfgPricePlan用于构建manufacture price plan文件,它会调用createMfgPriceMethod方 法,前面提到了,方法createPriceMethod会创建price method,这些信息会被manufacturer price plan文件和operation price plan文件使用,当createPriceMethod创建好price method后,这些信息保存在ProductPriceMethodVO,查看ProductPriceMethodVO的成员可以,其实里面放的就是四元组:price method,price value,price basis和price。同时createPriceMethod也会调用setPriceMethod将这些信息保存到ProductVO(ProductVO有一个ProductPriceMethodVO型的成员priceMethod)。

再 回到prepareMfgPricePlan,它调用createMfgPriceMethod方法,createMfgPriceMethod其实就是 从ProductVO中得到ProductPriceMethodVO信息,然后将这些信息分别填到MfgPriceMethodTypeVO中去。 prepareMfgPricePlan然后就是一个逻辑:因为调用createMfgPriceMethod后得到一个 MfgPriceMethodTypeVO对象mpmo,然后用这个对象的Method_type作为一个key,去mpmoMap里去查找,看是能查 到,如果能查到,将查到的值赋给prevMpmo。

为了清楚地描述这个逻辑,现在做下面的定义:
当前的MfgPriceMethodTypeVO对象:mpmo
原有的MfgPriceMethodTypeVO对象:prevMpmo(如果原有的对象存在,这是用Method_type作为一个key,去mpmoMap里查找的)
四元组:price method,price,price value,price basis
price mothod可能的值有:Demo,Purchase,Subscription
price valude可能的值有:数值(1,2,3等),UNLIMITED
price basis可能的值有:USES,TIME,DAYS
OPTION:是Manufacturer price plan文件的一个tag,它包含四元组的price和price value两项。

逻辑:
1,如果当前的product value是UNLIMITED,那么将当前的productVO和method type存放到一个map里:productsBasisUnlimited.put(key, pv);

2,判断是否有prevMpmo,如果有,进入步骤3,如果没有,直接到步骤5。

3.a, 当prevMpmo存在时,如果当前的method type是Purchase,将optionSize赋值为3:optionSize = Constants.PURCHASE_PRICE_OPTION_SIZE;(这里需要解释的是为什么常量 PURCHASE_PRICE_OPTION_SIZE为3而不是别的值,今天看到“关于BREW内容提交和产品定价的规则说明”邮件才知道,这是 BREW规定的。“对于任意一个被选中的定价基础,BREW允许最多三个定价基础值”,所以常量PURCHASE_PRICE_OPTION_SIZE的 值为3).

3.b,当prevMpmo存在时,如果当前的method type不是Purchase,将optionSize赋值为1:optionSize = Constants.DEMO_PRICE_OPTION_SIZE(解释见上)。

4,判读mpmo和prevMpmo的price basis是否相等,相等进入4.1,不等进入4.2

4.1.a,获取prevMpmo的OPTION的size,如果大于optionSize,报错

4.1.b, 如果小于optionSize,调用方法checkDuplicatePriceValue判断prevMpmo和mpmo是否相等(也就是判断两者包含 的四元组是否完全相等),如果相等就抛出异常。如果不等,将当前mpmo的OPTINO加入到原有prevMpmo的OPTION 中:prevMpmo.getOPTION().addAll(mpmo.getOPTION());

4.2.a,price basis不相等,调用方法updateBasisUnlimited,这个方法判断prevMpmo和mpmo的price basis是否是UNLIMITED,如果是就将其price basis赋给另一方,如果都不是,返回false。

4.2.b,如果updateBasisUnlimited返回true,将当前mpmo的OPTINO加入到原有prevMpmo的OPTION中:prevMpmo.getOPTION().addAll(mpmo.getOPTION());否则报错。

5,将当前mpmo加入map:mpmoMap.put(key, mpmo);

逻辑完后,prepareMfgPricePlan会调用ProductParserImpl类的方法prepareMfgPricePlanMeta去生成meta文件,到此为止。

prepareMfgPricePlan 执行完毕后,返回到processCntProductAssocList,它会调用submitMfgPricePlan方法,这个方法最终会调用 BMCClientImpl类的createMfrPricePlan,这个方法的功能是:This method will invoke the BMC service and submits the manufacturer price plan。到此为止,manufacturer price plan文件的生成及提交就完成了。

processCntProductAssocList继续调用prepareOprPricePlan来生成operation price plan文件。prepareOprPricePlan调用createOprPriceMethod来 说生成price method,这个方法和createMfgPriceMethod(如前述)的作用是一样的。prepareOprPricePlan后面的工作就很简 单了。这里有个问题,相对于prepareMfgPricePlan,prepareOprPricePlan的逻辑非常简单,根本原因就是 MfgPriceMethodTypeVO和OprPricePlanMethodTypeVO的成员虽然很相似,都是四元组,但是两者有一个很大的区别 是:OprPricePlanMethodTypeVO的PricePointTypeVO变量是一个值,而MfgPriceMethodTypeVO中 是一个PricePointTypeVO的List。这导致了prepareMfgPricePlan比prepareOprPricePlan要简单得 多。

没有评论:

发表评论