整单优惠的价格按照比例均摊到每一订单行价格
/**
* 按照百分比分摊 order级别的discount
* 当商品行价格<需要扣减的价格,取商品行价格作为抵扣
* 如果到最后个产品商品行依然<需要扣减的价格,抛出异常
* @param orderLines
* @param orderPayment
* @param wholePromotions
* @return
* @throws OrderValidateException
*/
private BigDecimal divideWholeDiscount(List<OrderLineCommand> orderLines,BigDecimal orderPayment,BigDecimal origionOrderPayment ,List<OrderPromotionCommand> wholePromotions) throws OrderValidateException{
/*if(orderPayment==null||orderPayment.compareTo(BigDecimal.ZERO)<1){
throw new OrderValidateException("payment less than zero",ValidateException.ORDER_DISCOUNT_VALIDATE_EXCEPTION);
}*/
BigDecimal sumDiscount = BigDecimal.ZERO;
if(wholePromotions!=null){
BigDecimal wholeDiscount = BigDecimal.ZERO;
for(OrderPromotionCommand wholePromotion : wholePromotions){
wholeDiscount = wholeDiscount.add(wholePromotion.getDiscountAmount());
}
sumDiscount = sumDiscount.add(wholeDiscount);
Collections.sort(orderLines,new Comparator<OrderLineCommand>() {
public int compare(OrderLineCommand o1, OrderLineCommand o2) {
if(Validator.isNullOrEmpty(o1)||Validator.isNullOrEmpty(o2))
return 0;
return o1.getSubTotal().compareTo(o2.getSubTotal());
}
});
int index = 0;
BigDecimal appliedDiscount = BigDecimal.ZERO;
for(OrderLineCommand orderLine : orderLines){
index++;
BigDecimal disPriceSum = orderLine.getSubTotal();
logger.debug("whole discount adjust ...:disPriceSum="+disPriceSum+",index="+index+",skuId="+orderLine.getSkuId()+",subtotal="+orderLine.getSubTotal());
BigDecimal adjustment = BigDecimal.ZERO;
if(index==orderLines.size()){
//这里表示是最后一个商品了,剩余的discount全叠加在上面
BigDecimal lastDiscount = wholeDiscount.subtract(appliedDiscount);
if(disPriceSum.compareTo(lastDiscount)<0){
throw new OrderValidateException("discount greater than order payment",ValidateException.ORDER_DISCOUNT_VALIDATE_EXCEPTION);
}else{
adjustment = adjustment.add(lastDiscount);
}
}else{
BigDecimal percent = BigDecimal.ZERO;
//获取当前商品行在整单里的一个百分比,取整
if(orderPayment.compareTo(BigDecimal.ZERO) ==1){
percent = disPriceSum.divide(orderPayment,BigDecimal.ROUND_HALF_UP,4);
}
else if(origionOrderPayment.compareTo(BigDecimal.ZERO) == 1){
percent = disPriceSum.divide(origionOrderPayment,BigDecimal.ROUND_HALF_UP,4);
}
adjustment = wholeDiscount.multiply(percent);
adjustment = adjustment.setScale(2, BigDecimal.ROUND_HALF_UP);
if(disPriceSum.compareTo(adjustment)<1){
adjustment = disPriceSum;
}
}
appliedDiscount = appliedDiscount.add(adjustment);
orderLine.setDiscount(orderLine.getDiscount().add(adjustment));
orderLine.setDiscountPrice(getDiscountPrice(orderLine.getSalePrice(), orderLine.getQuantity(), orderLine.getDiscount()));
orderLine.setSubTotal(orderLine.getSubTotal().subtract(adjustment));
logger.debug("whole discount adjust ...:adjustment="+adjustment);
}
}
return sumDiscount;
}
private BigDecimal getDiscountPrice(BigDecimal salesPrice,Integer qty,BigDecimal discountAmount){
BigDecimal qty_b = BigDecimal.valueOf(qty);
BigDecimal discountPrice
= salesPrice.multiply(qty_b).subtract(discountAmount).divide(qty_b,2,RoundingMode.HALF_UP);
Money m_dp = new Money(discountPrice);
return m_dp.getAmount();
}
分享到:
相关推荐
价格查询:该系统可以对所有商品进行实时价格查询,包括各种促销活动和优惠价格,方便用户选择最优惠的价格方案。 下单购买:该系统支持在线下单购买,用户可以通过系统提交订单、付款、发货等业务流程,同时还支持...
促销引擎是促销系统的核心组件,它负责计算促销后的实际价格,并将促销信息推送给前端界面展示。此外,还负责处理促销变动消息,确保促销信息的及时更新。 **3.2 促销信息展示** 促销信息需要清晰地展示在商品...
本文将深入探讨“购物车全选计算价格、删除及变状态”这一主题,以帮助理解购物车系统的关键实现原理。 1. **全选计算价格** 购物车中的“全选”功能允许用户一次性选中所有添加的商品,方便快速操作。全选后,...
- 在赠送促销中,企业赠送的礼品或代金券按销售价格计算应缴纳的增值税和企业所得税。同时,企业需要为顾客代扣代缴个人所得税。虽然赠送促销在增加销售额方面有积极作用,但它实际上增加了企业的税负,进而影响税后...
5. 风险成本:促销可能导致产品降价后的价格恢复困难,或对品牌形象造成影响,这些潜在风险需要预估。 二、促销成本估算 准确估算促销成本是决策的关键。企业应结合历史数据、市场环境和预期目标,对各项成本进行...
在京东的促销活动中,商家需要了解并掌握一系列关键知识点,以确保有效管理价格风险和提供吸引顾客的优惠方案。以下是一些重要的概念和规则: 1. **优惠监控系统**:这是一个用于商家监控商品价格和促销效果的工具...
4. **促销策略**:可能包含折扣计算、捆绑销售等促销策略,使商家在不同营销活动中能够快速调整价格。 5. **库存管理**:与库存系统联动,根据库存数量动态调整报价,避免超卖或资源浪费。 6. **报表生成**:生成...
本项目“jQuery Dragval仿阿里云服务器价格计算效果”旨在实现一个与阿里云服务器价格计算器类似的交互功能,让用户可以方便地调整参数以实时查看计算结果。 在该实现中,核心是jQuery的拖动(Drag)和值更新(Val...
2. 价格管理:产品商家可以在后台管理产品报价,设置不同规格和批发量对应的价格,网站根据用户选择的产品规格和数量显示相应报价。 3. 订单管理:用户在网站上选择产品后可以下单购买,产品商家可以在管理后台浏览、审核...
4. 营销组合(4P):产品(Product)、价格(Price)、地点(Place)和促销(Promotion)。在本田雅阁的案例中,可能会讨论产品的特点、定价策略、销售渠道和宣传推广活动。 5. 时间规划:设定促销活动的起止时间,以及关键...
5. 成本效益分析:计算促销活动的成本与产生的利润,看是否达到盈亏平衡。 五、案例分析 通过分享成功的促销案例,深入理解如何设计和执行有效的促销活动,并从中汲取经验教训。 总结,做好促销活动不仅需要精心...
编写程序,接受商品价格和优惠券信息,以及顾客的购物清单,计算出顾客应支付的最小费用。假设优惠券数量无限,可以反复使用。 3. **设计思路**: - **优惠方案存储**:优惠方案的组合可以使用树形结构存储,每个...
可能需要使用`CASE`语句来定义促销期,然后计算促销前后销售额的增长百分比,最后找到增长最快的商品。 3. **购买特定商品的顾客也最常购买的其他商品** 此问题涉及到了关联查询。找出购买了指定商品的用户,然后...
它涵盖了促销活动的各个方面,包括投入的成本、预期的销售收益以及计算出的成本收益率,帮助决策者判断促销活动是否值得进行。 首先,我们要理解表格中的各项内容: 1. **促销产品**:这是表格的核心,列出了公司...
【价格促销手法】如降价和折价卷,各有其功能和适用条件。降价适用于成熟期产品、低关心度消费品和知名度高、市场占有率高的产品,可以增加购买量和抵抗竞争。折价卷则能鼓励续购、试用,改善铺货,适合产品通路短、...
其中,折扣促销是通过直接降低商品价格来吸引消费者购买;赠品促销是通过赠送附加商品或礼品来增加购买者的购买欲望;满减促销是通过满足一定购买金额条件后减免部分或全部费用来吸引消费者购买;积分促销是通过累计...
- **改单不应默认重新计算促销**:在实际操作中,改单时不应该默认重新计算促销,这可能会导致促销计算错误。 - **多品促销设计限制**:砍掉了多组主商品混搭+组合的促销方式,限制了促销方案的灵活性。 #### 六、...
在协议中,促销活动的具体起止日期被详细记录,保证供应商在活动期间以促销价提供商品,活动结束后则按正常价格供应,从而维护市场的正常价格秩序。 陈列作为促销活动中的直观要素,直接影响到促销效果。协议中针对...
例如,比较三个商场的彩电促销价格,或者是计算内衣专卖店中,为了达到期望利润,剩余的内衣需要打多少折出售。通过这样的习题,学生不仅需要运用百分数的计算知识,还要综合考虑多个因素,做出最佳的购物选择。 接...
这种促销方式简单易懂,能迅速吸引顾客,但也可能降低商家利润,导致市场整体价格水平下降,甚至培养顾客非打折不买的心理习惯,损害商品价格信誉。 **现金满减**: 现金满减则是顾客购物达到一定金额后退还部分...