关于计算优惠券金额的部分优化

这是一个 (原金额 - 优惠券 = 实付金额) 的一个接口

原代码:

		BigDecimal amount = new BigDecimal(computeAmtCardParam.getAmount());
		BigDecimal vou = null;
		boolean existed = amount.doubleValue() >= 0.00 && (MobileCardvouConstants.CASH_COUPON.equals(couponDef.getCouType()) || MobileCardvouConstants.DISCOUNT_COUPON.equals(couponDef.getCouType()));
		if(existed){
			if (MobileCardvouConstants.CASH_COUPON.equals(couponDef.getCouType())){
				//Calculate the amount of cash coupons
				vou = new BigDecimal(couponDef.getVouContent());
				result.setPaymoney(amount.subtract(vou));
				result.setOriginalAmt(amount);
				result.setConsumeAmt(vou);
				if(result.getPaymoney().compareTo(BigDecimal.valueOf(0.00)) < 0) {
					result.setPaymoney(BigDecimal.valueOf(0.00));
				}
			}else if (MobileCardvouConstants.DISCOUNT_COUPON.equals(couponDef.getCouType())){
				//Calculate the discount amount
				vou = new BigDecimal(couponDef.getVouContent());
				result.setPaymoney(amount.multiply(vou.multiply(BigDecimal.valueOf(0.1))));
				result.setOriginalAmt(amount);
				result.setConsumeAmt(result.getOriginalAmt().subtract(result.getPaymoney()));
				if(result.getPaymoney().compareTo(BigDecimal.valueOf(0.00)) < 0) {
					result.setPaymoney(BigDecimal.valueOf(0.00));
				}
			}
		}else{
			result.setPaymoney(amount);
			result.setOriginalAmt(amount);
			result.setConsumeAmt(BigDecimal.valueOf(0.00));
		}
		//Coupon calculation
		result.setResultCode(MobileApiConstants.RESULT_CODE_SUCCESS);
		return result;

 原来的代码思路是:先判断金额以及优惠券类型是否存在,在这个判断的基础上再嵌套一层判断优惠券类型,然后根据优惠券的类型再给金额做出处理,最后将原金额,优惠券金额,实付金额输出。这里他的思路很直接,先判断金额是否大于0且是否存在指定的优惠券类型:不存在则将优惠券金额设置成0,然后将指定字段输出;存在则再判断一次类型,根据不同类型做金额处理最后将指定字段输出。这段代码个人觉得中规中矩,但是很多代码都是多余的,比如在计算金额后得到金额小于0则用0来表示,完全是没有必要写成两段话的,因此我对这段代码进行了一些优化。

 

然后下面是我对这段代码的优化:

		BigDecimal amount = new BigDecimal(computeAmtCardParam.getAmount());
		BigDecimal originalAmount = amount.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : amount;
		BigDecimal vouContent =  couponDef.getVouContent() == null ? BigDecimal.ZERO : new BigDecimal(couponDef.getVouContent());	
		BigDecimal payMoney = null;		
		if(MobileCardvouConstants.CASH_COUPON.equals(couponDef.getCouType())) {
			payMoney = originalAmount.subtract(vouContent).compareTo(BigDecimal.valueOf(0.0)) < 0 ? BigDecimal.ZERO : originalAmount.subtract(vouContent);
		}else if(MobileCardvouConstants.DISCOUNT_COUPON.equals(couponDef.getCouType())) {
			payMoney = originalAmount.multiply(vouContent.multiply(BigDecimal.valueOf(0.1)));
		}else {
			payMoney = originalAmount;
		}
		result.setPaymoney(payMoney);
		result.setConsumeAmt(vouContent);
		result.setOriginalAmt(originalAmount);
		result.setResultCode(MobileApiConstants.RESULT_CODE_SUCCESS);
		return result;

这段代码中,我使用了两个三目运算,第一个三目运算就可以确定实际收款金额小于0后使用0代替,第二个三目运算符可以确定优惠的类型,并根据优惠类型来做出计算。这样的做法可以避免在判断中做出进一步的判断0的计算,然后通过不同的优惠券类型进行相应计算,这里只需要得到计算的结果后直接将数值传给结果Bean即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值