Cui Zhi Feng
2024-08-31 fc3ff48eade6ad0a54c3ab0669b846bb9a51f4db
src/main/java/com/mzl/flower/service/payment/OrderService.java
@@ -21,9 +21,11 @@
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;
import com.mzl.flower.entity.menber.Member;
import com.mzl.flower.entity.partner.Partner;
import com.mzl.flower.entity.payment.*;
import com.mzl.flower.entity.supplier.Station;
@@ -211,13 +213,18 @@
        if (ls != null && ls.size() > 0) {
            Customer customer = getCurrentCustomer();
            Long partnerId = customer.getPartnerId();
            Long levelId = customer.getLevelId();
            Member member = getMember(levelId);
            Map<Long, FlowerCartListWrapDTO> map = new HashMap<>();
            for (FlowerCartListDTO c : ls) {
                BigDecimal price = getFinalPrice(partnerId, c.getCategory()
                        , c.getId(), c.getPrice(), c.getLevel());
                c.setPrice(price);
                c.setPriceMember(calculateMemberPrice(price, member));
                c.setTotal(price.multiply(new BigDecimal(c.getNum())));
                c.setTotalMember(c.getPriceMember().multiply(new BigDecimal(c.getNum())));
                if (c.getSales() != null && c.getRealSales() != null) {
                    c.setSales(c.getSales() + c.getRealSales());
@@ -265,10 +272,20 @@
        List<FlowerCartListDTO> ls = flowerMapper.selectFlowerOrderList(ids);
        Customer customer = getCurrentCustomer();
        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() + "已下架,请重新提交");
@@ -288,7 +305,10 @@
                    , c.getId(), c.getPrice(), c.getLevel());
            BigDecimal price = priceDTO.getPrice();
            c.setPrice(price);
            c.setPriceMember(calculateMemberPrice(price, member));
            c.setTotal(price.multiply(new BigDecimal(c.getNum())));
            c.setTotalMember(c.getPriceMember().multiply(new BigDecimal(c.getNum())));//使用会员价计算总价
            if (priceMap != null) {
                priceMap.put(c.getId(), priceDTO);
@@ -296,6 +316,7 @@
            totalWeight += c.getWeight() * c.getNum();
            totalAmount = totalAmount.add(c.getTotal());
            totalMemberAmount = totalMemberAmount.add(c.getTotalMember());
            num += c.getNum();
        }
@@ -306,6 +327,7 @@
        result.setFlowers(ls);
        result.setPacking(packing);
        result.setTotalAmount(totalAmount);
        result.setTotalMemberAmount(totalMemberAmount);
        result.setTotalWeight(totalWeight);
        return result;
@@ -357,12 +379,28 @@
        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());
@@ -383,6 +421,7 @@
        //商品列表处理
        List<FlowerCartListDTO> flowers = p.getFlowers();
        Map<Long, List<ParamItemDTO>> paramMap = new HashMap<>();
        BigDecimal flowerAmount = order.getFlowerAmount();//订单商品总价
        for (FlowerCartListDTO f : flowers) {
            OrderItem t = new OrderItem();
            t.setId(UUIDGenerator.getUUID());
@@ -408,8 +447,14 @@
            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(order.getMemberCouponAmount()
                    , t.getTotal(), order.getFlowerAmount(), t.getNum());
            t.setCouponAmount(couponAmount);//每扎平摊的优惠券面值
            t.setRealPrice(t.getPrice().subtract(couponAmount));//退款时使用的真实成交价
            t.create(userId);
            orderItemMapper.insert(t);
@@ -421,11 +466,40 @@
        order.setPayOpenid(openId);
        orderMapper.insert(order);
        //TODO 处理积分商品兑换券
        Map map = paymentV3Service.wxPrepay(order);
        map.put("_testV2OrderId", order.getId());
        return map;
    }
    /**
     * 计算订单中每种商品每扎平摊的优惠券面值,保留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() {
        String seq = sequenceNo.getSeqNo(SequenceNo.ORDER_FLOWER);
        return "XH" + format(LocalDateTime.now(), "yyyyMMdd") + seq;