From 77fc61a25c14071584e45731476207959137d6b6 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期三, 04 三月 2026 17:17:39 +0800
Subject: [PATCH] 小程序   接口开发

---
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java |  161 +++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 130 insertions(+), 31 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 50aaea8..18d141b 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
@@ -15,6 +15,7 @@
 import com.doumee.dao.system.model.SystemUser;
 import com.doumee.dao.web.dto.CouponDTO;
 import com.doumee.dao.web.dto.MemberCouponDTO;
+import com.doumee.dao.web.request.CouponNoticeRequest;
 import com.doumee.dao.web.request.PayDetailRequest;
 import com.doumee.dao.web.response.MemberCouponResponse;
 import com.doumee.dao.web.response.goods.OrderGoodsCalculateResponse;
@@ -27,6 +28,7 @@
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -68,6 +70,10 @@
     @Autowired
     private MemberMapper memberMapper;
 
+    @Autowired
+    private NoticeMapper noticeMapper;
+
+
     @Override
     @Transactional(rollbackFor = {BusinessException.class,Exception.class})
     public    String addBatch(MemberCouponAddDTO memberCouponAddDTO){
@@ -85,11 +91,20 @@
                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗��"+index+"銆戜釜浼樻儬鍒告煡璇㈡棤鏁堬紝璇峰埛鏂伴〉闈㈤噸鏂帮紒");
             }
             for(Member member : memberList){
+                MemberCoupon memberCoupon = MemberCoupon.couponToBean(coupon,member,now,Constants.TWO,loginUserInfo);
                 for (int i = 0; i < Constants.formatLongNum(param.getNum()); i++) {
-                    MemberCoupon memberCoupon = MemberCoupon.couponToBean(coupon,member,now,Constants.TWO,loginUserInfo);
+                    //婊″噺鍗蜂笉浼氱敓鎴恗axPrice 闇�瑕佹牴鎹紭鎯犲埜鍑忓皯閲戦璁剧疆
+                    if(Constants.equalsInteger(coupon.getCouponType(),Constants.ZERO)){
+                        memberCoupon.setMaxPrice(coupon.getPrice());
+                    }
                     //鎸ㄤ釜閫�
                     addList.add(memberCoupon);
                 }
+                //浼樻儬鍒稿彂鏀鹃�氱煡
+                Notice notice = Notice.getNotice(Constants.NoticeType.COUPON,
+                        member.getId(),null);
+                notice.setContent(notice.getContent().replace("{param}",Constants.getCouponInfo(memberCoupon, (int) Constants.formatLongNum(param.getNum()))));
+                noticeMapper.insert(notice);
             }
             index++;
         }
@@ -325,16 +340,16 @@
         queryWrapper.leftJoin(Goodsorder.class,Goodsorder::getId,MemberCoupon::getOrderId);
         queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,MemberCoupon::getCreator);
         queryWrapper.eq(MemberCoupon::getIsdeleted, Constants.ZERO);
-        if(pageWrap.getModel().getStatus()!=null && pageWrap.getModel().getStatus()!=2){
-            queryWrapper.eq(pageWrap.getModel().getStatus()!=null,MemberCoupon::getStatus, pageWrap.getModel().getStatus());
-        } else if (pageWrap.getModel().getStatus()!=null && pageWrap.getModel().getStatus()==2) {
-            //鏌ヨ宸茶繃鏈�(鏈娇鐢紝鍒囧凡杩囦簡浣跨敤鏈熼檺锛�
-            queryWrapper.eq( MemberCoupon::getStatus, Constants.ZERO);
-            queryWrapper.lt( MemberCoupon::getEndDate, new Date());
+        if(Constants.equalsInteger(pageWrap.getModel().getStatus(),0)&&pageWrap.getModel().getIsexpire()!=null && pageWrap.getModel().getIsexpire()== 0){
+            queryWrapper.gt( MemberCoupon::getEndDate, new Date());
+        } else if (Constants.equalsInteger(pageWrap.getModel().getStatus(),0)&&pageWrap.getModel().getIsexpire()!=null && pageWrap.getModel().getIsexpire()== 1) {
+            queryWrapper.le( MemberCoupon::getEndDate, new Date());
         }
-
         queryWrapper.in(pageWrap.getModel().getMethodList()!=null,MemberCoupon::getGetMethod, pageWrap.getModel().getMethodList());
+        queryWrapper.eq(pageWrap.getModel().getStatus()!=null,MemberCoupon::getStatus, pageWrap.getModel().getStatus());
+        queryWrapper.eq(pageWrap.getModel().getCouponType()!=null,MemberCoupon::getCouponType, pageWrap.getModel().getCouponType());
         queryWrapper.eq(pageWrap.getModel().getCouponId()!=null,MemberCoupon::getCouponId, pageWrap.getModel().getCouponId());
+        queryWrapper.like(pageWrap.getModel().getName()!=null,MemberCoupon::getName, pageWrap.getModel().getName());
         queryWrapper.eq(pageWrap.getModel().getOrderCode()!=null,Goodsorder::getCode, pageWrap.getModel().getOrderCode());
         queryWrapper.eq(pageWrap.getModel().getGetMethod()!=null,MemberCoupon::getGetMethod, pageWrap.getModel().getGetMethod());
         queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getNikeName()),ms -> ms.like( Member::getNickname,  pageWrap.getModel().getNikeName()).
@@ -349,7 +364,9 @@
                         && model.getEndDate()!=null
                         && model.getEndDate().before(new Date())){
                     //宸茶繃鏈�
-                    model.setStatus(Constants.TWO);
+                    model.setIsexpire(Constants.ONE);
+                }else if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)){
+                    model.setIsexpire(Constants.ZERO);
                 }
             }
         }
@@ -539,7 +556,7 @@
                 .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淇℃伅閿欒,璇峰埛鏂伴噸璇�");
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU淇℃伅宸插け鏁�,璇峰埛鏂伴噸璇�");
         }
         //鏌ヨ鍟嗗搧鍒楄〃
         List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
@@ -567,28 +584,37 @@
         List<MemberCoupon> allCoupon =  memberCouponMapper.selectList(new QueryWrapper<MemberCoupon>().lambda()
                         .eq(MemberCoupon::getIsdeleted,Constants.ZERO)
                         .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(","));
                      //鑾峰彇鏈夋晥鍙互浣跨敤浼樻儬鍒哥殑鏁版嵁
-                     isVaildUse(applyIdList,goodsCalculateList,
-                             Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO);
+                     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() 琛ㄧず鍊掑簭
@@ -616,7 +642,7 @@
                 .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淇℃伅閿欒,璇峰埛鏂伴噸璇�");
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU淇℃伅宸插け鏁�,璇峰埛鏂伴噸璇�");
         }
         //鏌ヨ鍟嗗搧鍒楄〃
         List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
@@ -661,14 +687,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;
         //宸茬敤鍗犳瘮姣斾緥鍊�
@@ -676,11 +703,23 @@
         //鏍规嵁浼樻儬鍒哥被鍨� 璁$畻鍙互浣跨敤浼樻儬鍒哥殑鍟嗗搧淇℃伅 閫傜敤绫诲瀷锛�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);
+            isVaildUse(applyIdList,goodsCalculateList,coupon.getApplyType());
+        }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()){
@@ -690,6 +729,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));
@@ -698,6 +738,8 @@
             rata = rata.add(goodsCalculateList.get(i).getOrderCouponRata());
             useCouponNum = useCouponNum + 1;
         }
+        coupon.setValidAmount(validAmount.subtract(surplusValidAmount));
+        return useCouponPrice;
     }
 
 
@@ -708,13 +750,20 @@
      * 鍒ゆ柇鏄惁鍙互鏈夋晥浣跨敤
      * @param idList
      * @param goodsList
-     * @param vaildType 0=鍟嗗搧锛�1=鍝佺被
+     * @param vaildType 0=鍏ㄥ満;1=鍝佺被锛�2=鎸囧畾鍟嗗搧
      * @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);
+        if(Constants.equalsInteger(vaildType,Constants.ZERO)){
+            for (OrderGoodsCalculateResponse response:goodsList) {
+                response.setUseCoupon(true);
+            }
+        }else{
+            for (OrderGoodsCalculateResponse response:goodsList) {
+                response.setUseCoupon(idList.contains(Constants.equalsInteger(vaildType,Constants.TWO)?response.getId().toString():response.getCategoryId().toString())?true:false);
+            }
         }
+
     }
 
 
@@ -733,10 +782,60 @@
 //        }
 //        return new HashSet<>();
 //    }
+    
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public void notifyExpiredCoupon(Integer days) {
+        if (days == null || days <= 0) {
+            days = 3; // 榛樿鎻愬墠 3 澶╅�氱煡
+        }
+        String afterDate = DateUtil.afterDateToStr(days);
+        // 鏌ヨ鍗冲皢杩囨湡鐨勪紭鎯犲埜锛堟湭浣跨敤涓斿湪鐩爣鏃ユ湡鑼冨洿鍐呰繃鏈燂級
+        List<MemberCoupon> expiredCoupons = memberCouponMapper.selectList(
+            new QueryWrapper<MemberCoupon>().lambda()
+                .eq(MemberCoupon::getIsdeleted, Constants.ZERO)
+                .eq(MemberCoupon::getStatus, Constants.ZERO) // 鏈娇鐢�
+                .eq(MemberCoupon::getNoticeStatus,Constants.ZERO)// 鏈�氱煡鏁版嵁
+                .ge(MemberCoupon::getEndDate, DateUtil.getCurrDateTime()) // 澶т簬绛変簬寮�濮嬫椂闂�
+                .lt(MemberCoupon::getEndDate, (afterDate+" 23:59:59") )  // 灏忎簬缁撴潫鏃堕棿
+        );
+        if (CollectionUtils.isEmpty(expiredCoupons)) {
+            return;
+        }
+        // 鎸夌敤鎴峰垎缁勭粺璁�
+        Map<Integer, List<MemberCoupon>> memberCouponMap = expiredCoupons.stream()
+                .collect(Collectors.groupingBy(MemberCoupon::getMemberId));
+        
+        // 閬嶅巻姣忎釜鐢ㄦ埛鐨勪紭鎯犲埜鍙戦�侀�氱煡
+        for (Map.Entry<Integer, List<MemberCoupon>> entry : memberCouponMap.entrySet()) {
+            Integer memberId = entry.getKey();
+            List<MemberCoupon> coupons = entry.getValue();
+            if (CollectionUtils.isEmpty(coupons)) {
+                continue;
+            }
+            // 鏌ヨ鐢ㄦ埛淇℃伅
+            Member member = memberMapper.selectById(memberId);
+            if (member == null || member.getIsdeleted() == Constants.ONE) {
+                continue;
+            }
+            // 缁熻浼樻儬鍒告暟閲忓拰绫诲瀷
+            long count = coupons.size();
 
-
-
-
-
+            List<Integer> couponIds = coupons.stream().map(MemberCoupon::getId).collect(Collectors.toList());
+            //鍙戦�佺珯鍐呬俊 浼樻儬鍒稿嵆灏嗚繃鏈�
+            Notice notice = Notice.getNotice(
+                    Constants.NoticeType.EXPIRE_COUPON,
+                    member.getId(),
+                    null
+            );
+            notice.setContent(notice.getContent().replace("{param}",Long.toString(count)).replace("{param1}",afterDate));
+            noticeMapper.insert(notice);
+            memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda()
+                    .set(MemberCoupon::getNoticeStatus,Constants.ONE)
+                    .set(MemberCoupon::getNoticeTime,DateUtil.getCurrDateTime())
+                    .in(MemberCoupon::getId,couponIds)
+            );
+        }
+    }
 
 }

--
Gitblit v1.9.3