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

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

原代码:

 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即可。

原文链接:https://blog.csdn.net/baidu_35912315/article/details/82501829?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165277499316782390570638%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165277499316782390570638&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-12-82501829-null-null.nonecase&utm_term=%E4%BC%98%E6%83%A0

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
文明发言,共建和谐米科社区
提交
头像

昵称

取消
昵称表情图片