rk
2026-03-10 fa668c325f2dac348fb9f80c0c6c679f9ce1e41b
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -165,6 +165,7 @@
    private List<Member> getMemberListByParam(MemberCouponAddDTO memberCoupon) {
        List<Member>  list = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                .eq(Member::getIsdeleted,Constants.ZERO)
                .eq(Member::getStatus,Constants.ZERO)
                .eq(memberCoupon.getAddType() == Constants.ZERO,Member::getId,memberCoupon.getAddMemberIds())
                .in(memberCoupon.getAddType() == Constants.ONE,Member::getPhone,memberCoupon.getPhones()));
        if(list == null || list.size()==0){
@@ -400,8 +401,7 @@
                .apply(Objects.nonNull(status)&&Constants.equalsInteger(status,Constants.TWO),"m.STATUS = 0 and  m.END_DATE < now() " )
                .eq("TYPE",couponType)
                .apply(!Objects.isNull(price)," m.LIMIT_PRICE >= "+price+" ")
//                .apply("   now() between m.START_DATE and m.END_DATE ")
                .orderByDesc(" m.PRICE ")
                .orderByDesc( " m.CREATE_DATE ")
        );
        return page;
    }
@@ -586,13 +586,20 @@
                        .eq(MemberCoupon::getStatus,Constants.ZERO)
                        .eq(MemberCoupon::getMemberId,memberId)
                        .apply("  LIMIT_PRICE <= " + totalAmount)
                        .apply("  now() between START_DATE and  END_DATE "));
                        .apply("  now() between START_DATE and  END_DATE ")
                        .orderByDesc(MemberCoupon::getMaxPrice)
                        .orderByAsc(MemberCoupon::getEndDate)
        );
        if(CollectionUtils.isNotEmpty(allCoupon)){
            for (MemberCoupon memberCoupon:allCoupon) {
                //适用类型:0=全场;1=品类;2=指定商品
                if(this.calculateCouponRata(memberCoupon,goodsCalculateList,totalAmount).compareTo(memberCoupon.getPrice())<=Constants.ZERO){
                    continue;
                }
                memberCouponList.add(memberCoupon);
                /*//适用类型:0=全场;1=品类;2=指定商品
                 if(Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ZERO)){
                     memberCoupon.setValidAmount(memberCoupon.getPrice());
                     memberCoupon.setValidAmount(memberCoupon.getMaxPrice());
                     memberCouponList.add(memberCoupon);
                 }else{
                     List<String> applyIdList = Arrays.asList(memberCoupon.getApplyIds().split(","));
@@ -600,13 +607,13 @@
                     isVaildUse(applyIdList,goodsCalculateList,memberCoupon.getApplyType());
                     BigDecimal skuAmount = goodsCalculateList.stream().filter(i->i.getUseCoupon()).map(i->i.getSkuAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
                     if(skuAmount.compareTo(memberCoupon.getLimitPrice())>=Constants.ZERO){
                         //根据金额计算实际折扣金额
                         BigDecimal couponPrice = skuAmount.multiply(memberCoupon.getPrice()).divide(new BigDecimal("100"),2, RoundingMode.HALF_UP);
                         //根据金额计算实际折扣金额  PRICE 存储折扣值  例如 5折 存储值 5
                         BigDecimal couponPrice = skuAmount.multiply(memberCoupon.getPrice()).divide(new BigDecimal("10"),2, RoundingMode.HALF_UP);
                         //折扣金额大于最大可折扣金额  则使用最大可折扣金额
                         memberCoupon.setValidAmount(couponPrice.compareTo(memberCoupon.getMaxPrice())>Constants.ZERO?memberCoupon.getMaxPrice():couponPrice);
                         memberCouponList.add(memberCoupon);
                     }
                 }
                 }*/
            }
        }
        // 使用 Stream 排序  reversed() 表示倒序
@@ -679,14 +686,15 @@
    /**
     * 计算当前已选择优惠券每个商品占比金额
     * 计算优惠券每个商品占比金额
     * @param coupon 优惠券信息
     * @param goodsCalculateList 商品集合
     * @param totalAmount 订单总金额
     * @return 可以使用优惠券的商品总金额
     */
    public void  calculateCouponRata(MemberCoupon coupon,List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalAmount){
    public BigDecimal calculateCouponRata(MemberCoupon coupon,List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalAmount){
        //总余额
        BigDecimal validAmount = coupon.getValidAmount();
        BigDecimal validAmount = coupon.getMaxPrice();
        //剩余可分配金额
        BigDecimal surplusValidAmount = validAmount;
        //已用占比比例值
@@ -695,12 +703,22 @@
        if(!Constants.equalsInteger(coupon.getApplyType(),Constants.ZERO)){
            List<String> applyIdList = Arrays.asList(coupon.getApplyIds().split(","));
            isVaildUse(applyIdList,goodsCalculateList,coupon.getApplyType());
                    //Constants.equalsInteger(coupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO);
        }else{
            isVaildUse(null,goodsCalculateList,coupon.getApplyType());
        }
        //使用了优惠券的商品数量
        Integer countCouponNum = goodsCalculateList.stream().filter(i->i.getUseCoupon()).collect(Collectors.toList()).size();
        //使用优惠券的总金额
        BigDecimal useCouponPrice = goodsCalculateList.stream().filter(i->i.getUseCoupon())
                .map(i->i.getSkuAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
        if(Constants.equalsInteger(coupon.getCouponType(),Constants.ONE)){
            //最大可优惠金额
            BigDecimal couponAmount = useCouponPrice.multiply(coupon.getPrice()).divide(new BigDecimal("10"),2,BigDecimal.ROUND_DOWN);
            if(couponAmount.compareTo(validAmount)<=Constants.ZERO){
                validAmount = couponAmount;
                surplusValidAmount = validAmount;
            }
        }
        Integer useCouponNum = Constants.ZERO;
        for (int i = 0; i < goodsCalculateList.size(); i++) {
            if(!goodsCalculateList.get(i).getUseCoupon()){
@@ -710,6 +728,7 @@
            if(Constants.equalsInteger(useCouponNum+1,countCouponNum)){
                goodsCalculateList.get(i).setOrderCouponRata(new BigDecimal("1").subtract(rata));
                goodsCalculateList.get(i).setCouponDeductCash(surplusValidAmount);
                surplusValidAmount = BigDecimal.ZERO;
                break;
            }
            goodsCalculateList.get(i).setOrderCouponRata(goodsCalculateList.get(i).getSkuAmount().divide(totalAmount,2,BigDecimal.ROUND_DOWN));
@@ -718,6 +737,8 @@
            rata = rata.add(goodsCalculateList.get(i).getOrderCouponRata());
            useCouponNum = useCouponNum + 1;
        }
        coupon.setValidAmount(validAmount.subtract(surplusValidAmount));
        return useCouponPrice;
    }