整单优惠的价格按照比例均摊到每一订单行价格
/**
* 按照百分比分摊 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();
}
分享到:
相关推荐
价格查询:该系统可以对所有商品进行实时价格查询,包括各种促销活动和优惠价格,方便用户选择最优惠的价格方案。 下单购买:该系统支持在线下单购买,用户可以通过系统提交订单、付款、发货等业务流程,同时还支持...
2. 价格管理:产品商家可以在后台管理产品报价,设置不同规格和批发量对应的价格,网站根据用户选择的产品规格和数量显示相应报价。 3. 订单管理:用户在网站上选择产品后可以下单购买,产品商家可以在管理后台浏览、审核...
其中,折扣促销是通过直接降低商品价格来吸引消费者购买;赠品促销是通过赠送附加商品或礼品来增加购买者的购买欲望;满减促销是通过满足一定购买金额条件后减免部分或全部费用来吸引消费者购买;积分促销是通过累计...
例如,某品牌牛奶的促销活动,需要计算哪家商店的价格最低。通过应用数学知识,可以找到最优的购物方案。 解决促销问题需要结合具体情境,综合运用百分数的知识,提高分析问题和解决问题的能力,发展应用意识和实践...
本项目的市场营销方案包括产品、价格、地点和促销等几个方面。 1. 产品:本项目的产品是专业电脑芯片级维修,旨在填补市场空白,提供高质量的电脑维修服务。 2. 价格:本项目的定价策略将被限制在较低的水平上,以...
市场营销计划包括产品、价格、地点、销售方式、促销等几个方面。产品主要是电脑维修服务,价格将根据客户的需求和市场的变化进行调整。地点选择将根据市场的需求和客源的情况进行选择。销售方式将主要针对最终消费者...
12. **付现率计算工具**:评估促销活动的现金流影响。 13. **返券回馈率计算工具**:分析优惠券的使用情况,优化促销策略。 14. **联合促销对比率**:比较不同促销组合的效果,以选择最佳组合。 15. **品牌管理...
* 市场营销知识包括市场研究、竞争分析、价格策略、促销策略、渠道管理等方面的知识。 知识点三:职业习惯和价值观念 * 良好的职业习惯和价值观念是职业发展的重要基础,包括诚信、细节、责任感等方面的价值观念。...
* 价格:较低的价格以贴近客户心理。 * 地点:选择客源相对集中的地区。 * 销售方式:直接针对最终消费者。 * 促销:强调专业的芯片级维修服务,提高工作效率和电脑使用寿命。 公司组织结构: * 公司名称:厦门新...
本文档提供了医用X射线计算机断层扫描成像装置(X-CT)行业生产部门的22种模板,涵盖了客户访问记录、客户赊货申请、邀请函、促销期间销量统计、市场价格调查、客户管理卡、渠道销售情况反馈、客户借款申请单等多个...
本资源为京麦考试答案,涵盖了优惠监控系统、商品价格计算、平行式门槛计算规则、优惠券叠加规则、促销活动等知识点。 1. 优惠监控系统:如果商家没有设置商品的参照价和预警阈值,优惠监控系统还会报警吗?答案是...
2.2 解决方案 2:在购物车中添加一个促销计算模块,对每个商品进行促销计算 权衡:结合实际使用体验,两种解决方案都可以实现促销计算,但需要根据实际情况选择合适的解决方案。 3. 会员体系制度的建立 在购物车...
计算618促销的折扣价格 :param original_price: 原价 :param discount_rate: 折扣率,默认为0.8(8折) :return: 折扣后的价格 """ if 618 in str(original_price): # 这里只是一个示例条件,你可以根据...
计算618促销的折扣价格 :param original_price: 原价 :param discount_rate: 折扣率,默认为0.8(8折) :return: 折扣后的价格 """ if 618 in str(original_price): # 这里只是一个示例条件,你可以根据...
* 首页“限时折扣”商品图文列表布局:完成首页“限时折扣”商品图文列表布局,包括商品名称、价格、日期等信息。 * 底部导航布局:完成首页底部导航布局,包括限时折扣、品牌大全、日常用品、更多等分类标签。 ...
例如,E 公司同意到供应商甲的含税报价,供应商乙却给 E 公司报不含税价格。 此外,条件技术还可以用来处理各种促销活动问题。例如,F 公司规定购买其公司 10 斤以上瘦肉搭赠猪肝一副,G 公司玩的比较 BT,在不同地...
本系统通过数据库,统一记录商品、...d) 促销:在一定时期内,某些商品会按低于原价的促销价格销售。 e) 库存告警提示:当商品的库存数量低于库存报警数量时发出提示。 f) 盘点:计算出库存、销售额、盈利等经营指标
(1)商品条形码:每种商品具有...(4)促销:在一定时期内,某些商品会按低于原价的促销价格销售。 库存告警提示:当商品的库存数量低于库存报警数量时发出提示。 (5)盘点:计算出库存、销售额、盈利等经营指标。
如没有促销价,则以正常的价格为准。厂商自动生成链接功能,也是前台销售程序的功能,如有的产品的厂商有主页,则提供这个厂商的主页链接,使其能得到详细的信息,真正做到处处以顾客的想法为先导。 7 :订单管理...
这道题目考查了计算和比较的知识点,要求学生能够正确地计算出三个商店的优惠金额,并且能够正确地比较三个商店的价格。 题目9:老有一套住房价值40万,由于急需现金,他以九折优惠卖给老。过了一段时间后,房价...