From a21c0b965f85c62bcb9dea9f34dcde5f6d28e1f6 Mon Sep 17 00:00:00 2001 From: Cui Zhi Feng <7426394+wuxixiaocui@user.noreply.gitee.com> Date: 星期三, 18 九月 2024 17:27:49 +0800 Subject: [PATCH] 结算备注新增账号名称 --- src/main/java/com/mzl/flower/service/payment/OrderService.java | 132 ++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 121 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 71d5a97..54dd68e 100644 --- a/src/main/java/com/mzl/flower/service/payment/OrderService.java +++ b/src/main/java/com/mzl/flower/service/payment/OrderService.java @@ -180,7 +180,7 @@ cartMapper.insert(c); } else { - c.setNum(c.getNum() + dto.getNum()); + c.setNum((c.getNum()==null?0:c.getNum()) + dto.getNum()); c.update(userId); if (c.getNum() <= 0) { cartMapper.deleteById(c.getId()); @@ -442,8 +442,9 @@ 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){ order.setMemberCouponId(coupon.getId()); order.setMemberCouponCode(coupon.getCouponCode()); @@ -451,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); @@ -474,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()); @@ -503,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); @@ -550,19 +570,34 @@ * @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){ + log.info("使用用户优惠券id: " + couponRecordId + "; 订单id: " + orderId); if(StringUtils.isNotEmpty(couponRecordId)){ //优惠券使用和验证,如果不符合使用条件需要抛出异常。需调用优惠券使用方法 couponRecordService.useCoupon(couponRecordId, orderId, amount); @@ -777,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(); @@ -878,6 +912,82 @@ return ls; } + public List<OrderCheckLocationListDTO> selectOrderCheckLocationList(OrderQueryDTO dto) { + dto.setIdList(splitParam(dto.getIds())); + dto.setStartDate(parseLocalDateTime(dto.getStartDateStr(), true)); + dto.setEndDate(parseLocalDateTime(dto.getEndDateStr(), false)); + + dto.setCreateStartDate(parseLocalDateTime(dto.getCreateStartDateStr(), 17, 0, 0, -1)); + dto.setCreateEndDate(parseLocalDateTime(dto.getCreateEndDateStr(), 17, 0, 0, 0)); + + List<OrderCheckListDTO> ls = orderMapper.selectOrderCheckList(dto); + + List<OrderCheckLocationListDTO> result = new ArrayList<>(); + + if (ls != null && ls.size() > 0) { + List<String> orderIds = new ArrayList<>(); + Map<Long, OrderCheckLocationListDTO> rMap = new HashMap<>(); + Map<String, OrderCheckListDTO> orderMap = new HashMap<>(); + for (OrderCheckListDTO c : ls) { + orderIds.add(c.getId()); + + orderMap.put(c.getId(), c); + + Long locationId = c.getWarehouseLocationId(); + OrderCheckLocationListDTO llc = rMap.get(locationId); + if(llc == null){ + llc = new OrderCheckLocationListDTO(); + BeanUtils.copyProperties(c, 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(); + + List<OrderItem> itemList = orderItemMapper.selectList(new QueryWrapper<OrderItem>() + .in("order_id", orderIds)); + Map<String, List<OrderItemLocationListDTO>> map = new HashMap<>(); + + for (OrderItem oi : itemList) { + String orderId = oi.getOrderId(); + List<OrderItemLocationListDTO> ll = map.computeIfAbsent(orderId, k -> new ArrayList<>()); + OrderItemLocationListDTO d = new OrderItemLocationListDTO(); + BeanUtils.copyProperties(oi, d); + d.setStationName(stationMap.get(oi.getStationId())); + + OrderCheckListDTO c = orderMap.get(oi.getOrderId()); + d.setOrderNo(c.getOrderNo()); + d.setOrderId(c.getId()); + + ll.add(d); + } + + for (OrderCheckListDTO c : ls) { + String orderId = c.getId(); + Long locationId = c.getWarehouseLocationId(); + OrderCheckLocationListDTO r = rMap.get(locationId); + List<OrderItemLocationListDTO> items = r.getItems(); + if(items == null){ + items = new ArrayList<>(); + r.setItems(items); + } + items.addAll(map.get(orderId)); + } + } + + return result; + } + public Page<OrderListDTO> selectPartnerOrderList(Page page, OrderQueryDTO dto) { Partner p = getCurrentPartner(); dto.setPartnerId(p.getId()); -- Gitblit v1.9.3