From a1a6e227628810259fcba0fff146792e97a80b8a Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期一, 15 十二月 2025 08:56:09 +0800
Subject: [PATCH] 订单业务开发

---
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java |  175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 166 insertions(+), 9 deletions(-)

diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
index b5af21e..7b10f17 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -7,31 +7,31 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.ListUtil;
 import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.CouponMapper;
-import com.doumee.dao.business.MemberCouponJoinMapper;
-import com.doumee.dao.business.MemberCouponMapper;
-import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.*;
 import com.doumee.dao.business.model.*;
 import com.doumee.dao.web.dto.CouponDTO;
 import com.doumee.dao.web.dto.MemberCouponDTO;
+import com.doumee.dao.web.request.PayDetailRequest;
+import com.doumee.dao.web.response.goods.OrderGoodsCalculateResponse;
 import com.doumee.service.business.MemberCouponService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 鐢ㄦ埛浼樻儬鍒稿叧鑱旇〃Service瀹炵幇
@@ -43,6 +43,12 @@
 
     @Autowired
     private MemberCouponMapper memberCouponMapper;
+
+    @Autowired
+    private GoodsMapper goodsMapper;
+
+    @Autowired
+    private GoodsSkuMapper goodsSkuMapper;
 
     @Autowired
     private MemberCouponJoinMapper memberCouponJoinMapper;
@@ -209,6 +215,10 @@
         return page;
     }
 
+
+
+
+
     /**
      * 浼樻儬鍒告暟閲�
      * @param price
@@ -220,7 +230,6 @@
     public long memberCouponNum( BigDecimal price, Integer memberId,Integer couponType) {
         long count = memberCouponMapper.selectCount(new QueryWrapper<MemberCoupon>()
                 .eq("MEMBER_ID",memberId)
-                .eq("TYPE",Constants.ONE)
                 .eq("STATUS",Constants.ZERO)
                 .eq("TYPE",couponType)
                 .apply("LIMIT_PRICE >= "+price+" ")
@@ -317,4 +326,152 @@
     }
 
 
+    /**
+     * 鏍规嵁鍟嗗搧淇℃伅鑾峰彇閫傜敤鐨勪紭鎯犲埜
+     */
+    @Override
+    public List<MemberCoupon> getApplyCoupon(List<PayDetailRequest> requestList,Integer memberId){
+        List<MemberCoupon> memberCouponList = new ArrayList<>();
+        List<GoodsSku> goodsSkuList = goodsSkuMapper.selectList(new QueryWrapper<GoodsSku>()
+                .lambda()
+                .eq(GoodsSku::getIsdeleted,Constants.ZERO)
+                .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList()))
+        );
+        if(CollectionUtils.isEmpty(goodsSkuList)||!Constants.equalsInteger(goodsSkuList.size(),requestList.size())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU淇℃伅閿欒,璇峰埛鏂伴噸璇�");
+        }
+
+        //鏌ヨ鍟嗗搧鍒楄〃
+        List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
+                new MPJLambdaWrapper<Goods>()
+                        .selectAs(GoodsSku::getPrice,Goods::getSkuPrice)
+                        .selectAs(GoodsSku::getId,Goods::getSkuId)
+                        .leftJoin(GoodsSku.class,GoodsSku::getGoodsId,Goods::getId)
+                .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList())));
+
+        if(Objects.isNull(goodsList)){
+            return memberCouponList;
+        }
+
+        //鑾峰彇閫夋嫨鐨勫晢鍝佹�婚噾棰� 涓� 鍗曚釜鍟嗗搧閲戦
+        BigDecimal totalAmount = BigDecimal.ZERO;
+        for (Goods goods:goodsList) {
+            List<PayDetailRequest> request = requestList.stream().filter(i->Constants.equalsInteger(i.getGoodsSkuId(), goods.getSkuId())).collect(Collectors.toList());
+            if(CollectionUtils.isNotEmpty(request)){
+                goods.setSkuAmount(goods.getSkuPrice().multiply(new BigDecimal(request.get(Constants.ZERO).getGoodsNum()+"")));
+                totalAmount = totalAmount.add(goods.getSkuAmount());
+            }
+        }
+        List<OrderGoodsCalculateResponse> goodsCalculateList = ListUtil.copyProperties(goodsList,OrderGoodsCalculateResponse::new);
+        //鑾峰彇鎵�鏈夋弧瓒抽噾棰濅笖鍙敤鐨勪紭鎯犲埜
+        List<MemberCoupon> allCoupon =  memberCouponMapper.selectList(new QueryWrapper<MemberCoupon>().lambda()
+                        .eq(MemberCoupon::getIsdeleted,Constants.ZERO)
+                        .eq(MemberCoupon::getStatus,Constants.ZERO)
+                        .apply("  LIMIT_PRICE <= " + totalAmount)
+                        .apply("  now() between START_DATE and  END_DATE "));
+
+        if(CollectionUtils.isNotEmpty(allCoupon)){
+            for (MemberCoupon memberCoupon:allCoupon) {
+                //閫傜敤绫诲瀷锛�0=鍏ㄥ満;1=鍝佺被锛�2=鎸囧畾鍟嗗搧
+                 if(Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ZERO)){
+                     memberCoupon.setValidAmount(memberCoupon.getPrice());
+                 }else{
+                     List<String> applyIdList = Arrays.asList(memberCoupon.getApplyIds().split(","));
+                     //鑾峰彇鏈夋晥鍙互浣跨敤浼樻儬鍒哥殑鏁版嵁
+                     isVaildUse(applyIdList,goodsCalculateList,
+                             Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO);
+                     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);
+                         //鎶樻墸閲戦澶т簬鏈�澶у彲鎶樻墸閲戦  鍒欎娇鐢ㄦ渶澶у彲鎶樻墸閲戦
+                         memberCoupon.setValidAmount(couponPrice.compareTo(memberCoupon.getMaxPrice())>Constants.ZERO?memberCoupon.getMaxPrice():couponPrice);
+                         memberCouponList.add(memberCoupon);
+                     }
+                 }
+            }
+        }
+        // 浣跨敤 Stream 鎺掑簭  reversed() 琛ㄧず鍊掑簭
+        memberCouponList = memberCouponList.stream().sorted(Comparator.comparing(MemberCoupon::getValidAmount,Comparator.nullsFirst(BigDecimal::compareTo)).reversed())
+                .collect(Collectors.toList());
+        return memberCouponList;
+    }
+
+
+    /**
+     * 璁$畻褰撳墠宸查�夋嫨浼樻儬鍒告瘡涓晢鍝佸崰姣旈噾棰�
+     * @param coupon 浼樻儬鍒镐俊鎭�
+     * @param goodsCalculateList 鍟嗗搧闆嗗悎
+     * @param totalAmount 璁㈠崟鎬婚噾棰�
+     */
+    public void  calculateCouponRata(MemberCoupon coupon,List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalAmount){
+        //鎬讳綑棰�
+        BigDecimal validAmount = coupon.getValidAmount();
+        //鍓╀綑鍙垎閰嶉噾棰�
+        BigDecimal surplusValidAmount = validAmount;
+        //宸茬敤鍗犳瘮姣斾緥鍊�
+        BigDecimal rata = BigDecimal.ZERO;
+        //鏍规嵁浼樻儬鍒哥被鍨� 璁$畻鍙互浣跨敤浼樻儬鍒哥殑鍟嗗搧淇℃伅 閫傜敤绫诲瀷锛�0=鍏ㄥ満;1=鍝佺被锛�2=鎸囧畾鍟嗗搧
+        if(!Constants.equalsInteger(coupon.getApplyType(),Constants.ZERO)){
+            List<String> applyIdList = Arrays.asList(coupon.getApplyIds().split(","));
+            isVaildUse(applyIdList,goodsCalculateList,
+                    Constants.equalsInteger(coupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO);
+        }
+        //浣跨敤浜嗕紭鎯犲埜鐨勫晢鍝佹暟閲�
+        Integer countCouponNum = goodsCalculateList.stream().filter(i->i.getUseCoupon()).collect(Collectors.toList()).size();
+        Integer useCouponNum = Constants.ZERO;
+        for (int i = 0; i < goodsCalculateList.size(); i++) {
+            if(!goodsCalculateList.get(i).getUseCoupon()){
+                goodsCalculateList.get(i).setCouponDeductCash(BigDecimal.ZERO);
+                continue;
+            }
+            if(Constants.equalsInteger(useCouponNum+1,countCouponNum)){
+                goodsCalculateList.get(i).setOrderCouponRata(new BigDecimal("1").subtract(rata));
+                goodsCalculateList.get(i).setCouponDeductCash(surplusValidAmount);
+                break;
+            }
+            goodsCalculateList.get(i).setOrderCouponRata(goodsCalculateList.get(i).getSkuAmount().divide(totalAmount,2,BigDecimal.ROUND_DOWN));
+            goodsCalculateList.get(i).setCouponDeductCash(validAmount.multiply(goodsCalculateList.get(i).getOrderCouponRata()));
+            surplusValidAmount = surplusValidAmount.subtract(goodsCalculateList.get(i).getCouponDeductCash());
+            rata = rata.add(goodsCalculateList.get(i).getOrderCouponRata());
+            useCouponNum = useCouponNum + 1;
+        }
+    }
+
+
+
+
+
+    /**
+     * 鍒ゆ柇鏄惁鍙互鏈夋晥浣跨敤
+     * @param idList
+     * @param goodsList
+     * @param vaildType 0=鍟嗗搧锛�1=鍝佺被
+     * @return
+     */
+    public void isVaildUse(List<String> idList,List<OrderGoodsCalculateResponse> goodsList,Integer vaildType){
+        for (OrderGoodsCalculateResponse response:goodsList) {
+            response.setUseCoupon(idList.contains(Constants.equalsInteger(vaildType,Constants.ZERO)?response.getId().toString():response.getCategoryId().toString())?true:false);
+        }
+    }
+//    public Set<Integer> isVaildUse(List<String> idList,List<OrderGoodsCalculateResponse> goodsList,Integer vaildType){
+//        List<OrderGoodsCalculateResponse> resultList = new ArrayList<>();
+//        for (String id:idList) {
+//            if(Constants.equalsInteger(vaildType,Constants.ZERO)){
+//                resultList.addAll(goodsList.stream().filter(i->i.getId().toString().equals(id)).collect(Collectors.toList()));
+//            }else{
+//                resultList.addAll(goodsList.stream().filter(i->i.getCategoryId().toString().equals(id)).collect(Collectors.toList()));
+//            }
+//        }
+//        if(CollectionUtils.isNotEmpty(resultList)){
+//            return new HashSet<>(resultList.stream().map(i->i.getId()).collect(Collectors.toList()));
+//        }
+//        return new HashSet<>();
+//    }
+
+
+
+
+
+
 }

--
Gitblit v1.9.3