From 90bf25f06256b06ebcbedd0b2838db9e2f9df40f Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期三, 18 九月 2024 14:44:44 +0800 Subject: [PATCH] add:商品限购数量 --- src/main/java/com/mzl/flower/service/payment/OrderService.java | 62 +++++++++++++++++++++++++----- 1 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/mzl/flower/service/payment/OrderService.java b/src/main/java/com/mzl/flower/service/payment/OrderService.java index 75a5177..54dd68e 100644 --- a/src/main/java/com/mzl/flower/service/payment/OrderService.java +++ b/src/main/java/com/mzl/flower/service/payment/OrderService.java @@ -442,7 +442,7 @@ order.setTransportFee(transportFee); order.setDeliveryName(deliveryName); - BigDecimal totalAmount = order.getFlowerAmount().add(p.getPacking()).add(transportFee);//使用优惠券之前的总价 + BigDecimal totalAmount = order.getFlowerAmount();//使用优惠券之前的总价,使用商品价格 CouponRecordDO coupon = useCouponRecord(order.getId(), totalAmount, dto.getCouponRecordId()); log.info("用户优惠券: " + coupon); if(coupon != null){ @@ -452,6 +452,13 @@ order.setMemberCouponAmount(coupon.getCouponDiscountValue()); totalAmount = totalAmount.subtract(order.getMemberCouponAmount());//满足条件需要减去优惠券金额 + } + if(totalAmount.doubleValue() < 0){//假如扣除优惠券后金额小于0,则按0计算 + totalAmount = new BigDecimal(0); + } + totalAmount = totalAmount.add(p.getPacking()).add(transportFee); + if(totalAmount.doubleValue() <= 0){//假如总价小于等于0,则支付0.01元 + totalAmount = new BigDecimal(0.01); } order.setTotalAmount(totalAmount); @@ -475,7 +482,9 @@ Map<Long, List<ParamItemDTO>> paramMap = new HashMap<>(); final BigDecimal flowerAmount = order.getFlowerAmount();//订单商品总价 final BigDecimal memberCouponAmount = order.getMemberCouponAmount();//使用优惠券面值 - for (FlowerCartListDTO f : flowers) { + BigDecimal usedCouponAmount = new BigDecimal(0); + for (int i = 0; i < flowers.size(); i++) { + FlowerCartListDTO f = flowers.get(i); OrderItem t = new OrderItem(); t.setId(UUIDGenerator.getUUID()); t.setOrderId(order.getId()); @@ -504,9 +513,19 @@ t.setTotal(f.getTotalMember());//使用会员总价 t.setOriginalPrice(pp.getPrice());//非会员售价 - BigDecimal couponAmount = calculateCoupon(memberCouponAmount, t.getTotal(), flowerAmount, t.getNum()); + boolean isLastOne = i == (flowers.size() - 1); + BigDecimal couponAmount = calculateCoupon(memberCouponAmount, t.getTotal() + , flowerAmount, t.getNum(), t.getPrice(), isLastOne, usedCouponAmount); t.setCouponAmount(couponAmount);//每扎平摊的优惠券面值 - t.setRealPrice(t.getPrice().subtract(couponAmount));//退款时使用的真实成交价 + t.setRealPrice(t.getPrice().subtract(couponAmount));//退款时使用的真实成交单价 + + t.setCouponAmountTotal(couponAmount.multiply(BigDecimal.valueOf(t.getNum()))); + if(isLastOne){ + t.setCouponAmountTotal(memberCouponAmount.subtract(usedCouponAmount)); + } else { + usedCouponAmount = usedCouponAmount.add(t.getCouponAmountTotal()); + } + t.setRealTotal(t.getTotal().subtract(t.getCouponAmountTotal())); t.create(userId); orderItemMapper.insert(t); @@ -551,16 +570,30 @@ * @param itemTotalAmount * @param totalAmount * @param num + * @param price * @return */ private BigDecimal calculateCoupon(BigDecimal couponAmount, BigDecimal itemTotalAmount - , BigDecimal totalAmount, Integer num){ + , BigDecimal totalAmount, Integer num, BigDecimal price + , boolean isLastOne, BigDecimal usedCouponAmount){ if(couponAmount == null){ return new BigDecimal(0); } - BigDecimal radio = itemTotalAmount.divide(totalAmount, 2, RoundingMode.HALF_UP);//计算该商品总价在订单中的占比 + + if(couponAmount.doubleValue() >= totalAmount.doubleValue()){ + return price; + } + if(isLastOne){//最后的商品使用优惠券剩下的面值 + BigDecimal subCoupon = couponAmount.subtract(usedCouponAmount);//占有的优惠券面值 + return subCoupon.divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP); + } + + /*BigDecimal radio = itemTotalAmount.divide(totalAmount, 2, RoundingMode.HALF_UP);//计算该商品总价在订单中的占比 BigDecimal subCoupon = couponAmount.multiply(radio);//占有的优惠券面值 - return subCoupon.divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP); + return subCoupon.divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP);*/ + + //不能分步计算,分步计算会有精度问题 + return couponAmount.multiply(itemTotalAmount).divide(totalAmount.multiply(BigDecimal.valueOf(num)), 2, RoundingMode.HALF_UP); } private CouponRecordDO useCouponRecord(String orderId, BigDecimal amount, String couponRecordId){ @@ -779,10 +812,9 @@ orderIds.add(o.getId()); } - List<OrderItem> itemList = orderItemMapper.selectList( - new QueryWrapper<OrderItem>().in("order_id", orderIds)); + List<OrderItemListDTO> itemList = orderItemMapper.getOrderItems(orderIds); Map<String, List<OrderItemListDTO>> map = new HashMap<>(); - for (OrderItem oi : itemList) { + for (OrderItemListDTO oi : itemList) { String orderId = oi.getOrderId(); List<OrderItemListDTO> ll = map.computeIfAbsent(orderId, k -> new ArrayList<>()); OrderItemListDTO d = new OrderItemListDTO(); @@ -906,10 +938,18 @@ if(llc == null){ llc = new OrderCheckLocationListDTO(); BeanUtils.copyProperties(c, llc); - rMap.put(locationId, llc); + llc.setTotalAmount(new BigDecimal(0)); + rMap.put(locationId, llc); result.add(llc); } + + BigDecimal t = llc.getTotalAmount(); + if(t == null){ + t = new BigDecimal(0); + } + t = t.add(c.getTotalAmount()); + llc.setTotalAmount(t); } Map<Long, String> stationMap = prepareStationMap(); -- Gitblit v1.9.3