From b977bf61c82b7dc39079974d7316b7a80cf520fa Mon Sep 17 00:00:00 2001 From: 陶杰 <1378534974@qq.com> Date: 星期一, 02 九月 2024 09:36:28 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master-v2' into master-v2 --- src/main/java/com/mzl/flower/service/payment/OrderService.java | 100 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 93 insertions(+), 7 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 c9bab5f..5d8fa5a 100644 --- a/src/main/java/com/mzl/flower/service/payment/OrderService.java +++ b/src/main/java/com/mzl/flower/service/payment/OrderService.java @@ -21,6 +21,7 @@ import com.mzl.flower.dto.response.system.CodeValueDTO; import com.mzl.flower.dto.response.transport.TransportOrderDTO; import com.mzl.flower.dto.response.warehouse.WarehouseLocationDTO; +import com.mzl.flower.entity.coupon.CouponRecordDO; import com.mzl.flower.entity.customer.Address; import com.mzl.flower.entity.customer.Customer; import com.mzl.flower.entity.flower.FlowerSupplierSaleNum; @@ -131,6 +132,9 @@ @Autowired private OrderItemCheckMapper orderItemCheckMapper; + + @Autowired + private OrderPointGoodsMapper pointGoodsMapper; public void changeFlower2Cart(CartSaveDTO dto) { String userId = SecurityUtils.getUserId(); @@ -273,10 +277,18 @@ Long partnerId = customer.getPartnerId(); Long levelId = customer.getLevelId(); Member member = getMember(levelId); + if (member != null) { + result.setMemberId(levelId); + result.setMemberName(member.getName()); + result.setMemberDiscountType(member.getDiscountType()); + result.setMemberDiscountRatio(member.getDiscountRatio()); + result.setMemberDiscountAmount(member.getDiscountAmount()); + } double totalWeight = 0D; int num = 0; BigDecimal totalAmount = new BigDecimal(0); + BigDecimal totalMemberAmount = new BigDecimal(0); for (FlowerCartListDTO c : ls) { if (!Constants.FLOWER_STATUS.UP.name().equals(c.getStatus())) { throw new ValidationException("商品" + c.getName() + "已下架,请重新提交"); @@ -307,6 +319,7 @@ totalWeight += c.getWeight() * c.getNum(); totalAmount = totalAmount.add(c.getTotal()); + totalMemberAmount = totalMemberAmount.add(c.getTotalMember()); num += c.getNum(); } @@ -317,6 +330,7 @@ result.setFlowers(ls); result.setPacking(packing); result.setTotalAmount(totalAmount); + result.setTotalMemberAmount(totalMemberAmount); result.setTotalWeight(totalWeight); return result; @@ -350,7 +364,8 @@ } Address address = addressMapper.selectById(dto.getAddressId()); - List<TransportOrderDTO> tLs = transportService.getPreOrderTransportList(address, p.getTotalWeight(), dto.getTransportId()); + List<TransportOrderDTO> tLs = transportService.getPreOrderTransportList(address + , p.getTotalWeight(), dto.getTransportId()); BigDecimal transportFee = new BigDecimal(0); String deliveryName = ""; if (tLs != null && tLs.size() > 0) { @@ -359,23 +374,41 @@ deliveryName = d.getName(); } - //TODO 优惠券和会员价相关修改 - String userId = SecurityUtils.getUserId(); Order order = new Order(); order.setId(UUIDGenerator.getUUID()); + + final List<Long> goodsRecordIdList = dto.getGoodsRecordIdList(); + usePointGoods(order.getId(), goodsRecordIdList);//使用积分商品兑换券 + order.create(userId); order.setRemarks(dto.getRemarks()); order.setSpecialNeeds(dto.getSpecialNeeds()); order.setStatusBackend(Constants.ORDER_STATUS_BACKEND.PENDING.name()); order.setStatus(Constants.ORDER_STATUS.PENDING.name()); - order.setFlowerAmount(p.getTotalAmount()); + //设置下单时的会员信息 + order.setMemberId(p.getMemberId()); + order.setMemberName(p.getMemberName()); + order.setMemberDiscountType(p.getMemberDiscountType()); + order.setMemberDiscountRatio(p.getMemberDiscountRatio()); + order.setMemberCouponAmount(p.getMemberDiscountAmount()); + + order.setFlowerAmount(p.getTotalMemberAmount());//使用会员价总价 order.setPackingFee(p.getPacking()); order.setTransportFee(transportFee); order.setDeliveryName(deliveryName); - BigDecimal totalAmount = order.getFlowerAmount().add(p.getPacking()).add(transportFee); + BigDecimal totalAmount = order.getFlowerAmount().add(p.getPacking()).add(transportFee);//使用优惠券之前的总价 + CouponRecordDO coupon = useCouponRecord(order.getId(), totalAmount, dto.getCouponRecordId()); + if(coupon != null){ + order.setMemberCouponId(coupon.getId()); + order.setMemberCouponCode(coupon.getCouponCode()); + order.setMemberCouponName(coupon.getCouponName()); + order.setMemberCouponAmount(coupon.getCouponDiscountValue()); + + totalAmount = totalAmount.subtract(order.getMemberCouponAmount());//满足条件需要减去优惠券金额 + } order.setTotalAmount(totalAmount); order.setCustomer(address.getName()); @@ -396,6 +429,8 @@ //商品列表处理 List<FlowerCartListDTO> flowers = p.getFlowers(); Map<Long, List<ParamItemDTO>> paramMap = new HashMap<>(); + final BigDecimal flowerAmount = order.getFlowerAmount();//订单商品总价 + final BigDecimal memberCouponAmount = order.getMemberCouponAmount();//使用优惠券面值 for (FlowerCartListDTO f : flowers) { OrderItem t = new OrderItem(); t.setId(UUIDGenerator.getUUID()); @@ -421,8 +456,13 @@ t.setMarkupOne(pp.getFirstFee()); t.setMarkupTwo(pp.getSecondFee()); t.setMarkupPartner(pp.getPartnerFee()); - t.setPrice(pp.getPrice()); - t.setTotal(f.getTotal()); + t.setPrice(f.getPriceMember());//使用会员单价 + t.setTotal(f.getTotalMember());//使用会员总价 + + t.setOriginalPrice(pp.getPrice());//非会员售价 + BigDecimal couponAmount = calculateCoupon(memberCouponAmount, t.getTotal(), flowerAmount, t.getNum()); + t.setCouponAmount(couponAmount);//每扎平摊的优惠券面值 + t.setRealPrice(t.getPrice().subtract(couponAmount));//退款时使用的真实成交价 t.create(userId); orderItemMapper.insert(t); @@ -434,9 +474,52 @@ order.setPayOpenid(openId); orderMapper.insert(order); + //处理积分商品兑换券 + if(goodsRecordIdList != null && goodsRecordIdList.size() > 0){ + for(Long goodsRecordId : goodsRecordIdList){ + OrderPointGoods g = new OrderPointGoods(); + g.setId(UUIDGenerator.getUUID()); + g.setOrderId(order.getId()); + g.setGoodsRecordId(goodsRecordId); + g.create(userId); + pointGoodsMapper.insert(g); + } + } + Map map = paymentV3Service.wxPrepay(order); map.put("_testV2OrderId", order.getId()); return map; + } + + private void usePointGoods(String orderId, List<Long> goodsRecordIdList){ + //TODO 使用积分商品兑换券 + } + + /** + * 计算订单中每种商品每扎平摊的优惠券面值,保留2位小数 + * + * @param couponAmount + * @param itemTotalAmount + * @param totalAmount + * @param num + * @return + */ + private BigDecimal calculateCoupon(BigDecimal couponAmount, BigDecimal itemTotalAmount + , BigDecimal totalAmount, Integer num){ + if(couponAmount == null){ + return new BigDecimal(0); + } + BigDecimal radio = itemTotalAmount.divide(totalAmount, 2, RoundingMode.HALF_UP);//计算该商品总价在订单中的占比 + BigDecimal subCoupon = couponAmount.multiply(radio);//占有的优惠券面值 + return subCoupon.divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP); + } + + private CouponRecordDO useCouponRecord(String orderId, BigDecimal amount, String couponRecordId){ + if(StringUtils.isNotEmpty(couponRecordId)){ + //TODO 优惠券使用和验证,如果不符合使用条件需要抛出异常。需调用优惠券使用方法 + } + + return null; } private String getOrderNo() { @@ -780,6 +863,9 @@ boolean couldCheckRefund = StringUtils.isEmpty(transferId) && count == 0 && cc == 0; dto.setCouldCheckRefund(couldCheckRefund); + List<OrderPointGoodsListDTO> pointGoodsList = orderMapper.getPointGoodsList(id); + dto.setPointGoodsList(pointGoodsList); + return dto; } -- Gitblit v1.9.3