From c5d38d650d2ac4101b1293a4f17346e7d5420076 Mon Sep 17 00:00:00 2001
From: huliguo <2023611923@qq.com>
Date: 星期五, 04 七月 2025 20:39:58 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/2.0' into 2.0

---
 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java |  339 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 323 insertions(+), 16 deletions(-)

diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java
index f5d5e86..14e1a02 100644
--- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java
+++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java
@@ -1,21 +1,44 @@
 package com.ruoyi.member.service.impl.member;
 
+import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.member.domain.dto.AppMemberCouponPageDto;
+import com.ruoyi.member.domain.dto.MemberSelectCouponDto;
+import com.ruoyi.member.domain.dto.MerGoodsCouponListDto;
+import com.ruoyi.member.domain.pojo.coupon.Coupon;
+import com.ruoyi.member.domain.vo.AppMemberCouponPageVo;
+import com.ruoyi.member.mapper.coupon.CouponMapper;
 import com.ruoyi.member.mapper.member.MemberCouponMapper;
+import com.ruoyi.member.service.coupon.CouponService;
+import com.ruoyi.member.service.coupon.MemberCouponRecordService;
 import com.ruoyi.member.service.member.MemberCouponService;
 import com.ruoyi.system.api.constant.AppErrorConstant;
+import com.ruoyi.system.api.domain.dto.MerBaseDto;
+import com.ruoyi.system.api.domain.dto.MgtBaseBathDto;
 import com.ruoyi.system.api.domain.poji.goods.Goods;
+import com.ruoyi.system.api.domain.poji.member.Member;
 import com.ruoyi.system.api.domain.poji.member.MemberCoupon;
 import com.ruoyi.system.api.domain.vo.AppMemberCouponVo;
+import com.ruoyi.system.api.domain.vo.MerMemberCouponVo;
 import com.ruoyi.system.api.domain.vo.MerVerifyCouponGetVo;
+import com.ruoyi.system.api.domain.vo.MgtSimpleShopVo;
 import com.ruoyi.system.api.service.RemoteGoodsService;
+import com.ruoyi.system.api.service.RemoteShopService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.Date;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -26,15 +49,28 @@
  * @since 2023-04-25
  */
 @Service
+@DS("sharding")
 public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, MemberCoupon> implements MemberCouponService {
-
+    
     @Resource
     private MemberCouponMapper memberCouponMapper;
-
+    
     @Resource
     private RemoteGoodsService remoteGoodsService;
-
-
+    
+    @Resource
+    private RemoteShopService remoteShopService;
+    
+    @Resource
+    private CouponService couponService;
+    
+    @Resource
+    private MemberCouponRecordService memberCouponRecordService;
+    
+    @Resource
+    private CouponMapper couponMapper;
+    
+    
     /**
      * @description: TODO
      * @author jqs34
@@ -42,11 +78,11 @@
      * @version 1.0
      */
     @Override
-    public List<AppMemberCouponVo> listVoMemberCouponByUserId(Long userId){
-        List<AppMemberCouponVo> appMemberCouponVoList = memberCouponMapper.listVoMemberCouponByUserId(userId);
+    public List<AppMemberCouponVo> listVoMemberCouponByUserId(MerBaseDto merBaseDto) {
+        List<AppMemberCouponVo> appMemberCouponVoList = memberCouponMapper.listVoMemberCouponByUserId(merBaseDto);
         return appMemberCouponVoList;
     }
-
+    
     /**
      * @description  核销优惠券
      * @author  jqs
@@ -55,7 +91,7 @@
      * @return  void
      */
     @Override
-    public MerVerifyCouponGetVo getVerifyCoupon(String verifyCoupon){
+    public MerVerifyCouponGetVo getVerifyCoupon(Long verifyCoupon){
         MemberCoupon memberCoupon = this.getById(verifyCoupon);
         // 检查是否存在该优惠券
         if (memberCoupon == null) {
@@ -67,7 +103,7 @@
             throw new ServiceException(AppErrorConstant.COUPON_EXPIRED);
         } else if (couponStatus == 2) {
             throw new ServiceException(AppErrorConstant.COUPON_USED);
-        } else if (couponStatus != 0) {
+        } else if (couponStatus != 1) {
             throw new ServiceException(AppErrorConstant.COUPON_NO_FIND);
         }
         // 检查优惠券类型
@@ -91,7 +127,7 @@
         merVerifyCouponGetVo.setMemberCoupon(memberCoupon);
         return merVerifyCouponGetVo;
     }
-
+    
     /**
      * @description  核销优惠券
      * @author  jqs
@@ -100,7 +136,7 @@
      * @return  MerVerifyCouponGetVo
      */
     @Override
-    public MerVerifyCouponGetVo sureVerifyCoupon(String memberCouponId){
+    public MerVerifyCouponGetVo sureVerifyCoupon(Long memberCouponId){
         MemberCoupon memberCoupon = this.getById(memberCouponId);
         if(memberCoupon==null||memberCoupon.getDelFlag()==1){
             throw new ServiceException(AppErrorConstant.COUPON_NO_FIND);
@@ -109,7 +145,7 @@
             throw new ServiceException(AppErrorConstant.COUPON_EXPIRED);
         }else if(memberCoupon.getCouponStatus()==2){
             throw new ServiceException(AppErrorConstant.COUPON_USED);
-        }else if(memberCoupon.getCouponStatus()!=0){
+        }else if(memberCoupon.getCouponStatus()!=1){
             throw new ServiceException(AppErrorConstant.COUPON_NO_FIND);
         }
         if(memberCoupon.getCouponType()!=4){
@@ -129,12 +165,13 @@
             merVerifyCouponGetVo.setCouponFrom("平台");
         }
         memberCoupon.setCouponStatus(2);
+    
         memberCoupon.setUseTime(new Date());
         this.saveOrUpdate(memberCoupon);
         merVerifyCouponGetVo.setMemberCoupon(memberCoupon);
         return merVerifyCouponGetVo;
     }
-
+    
     /**
      * @description
      * @author  jqs
@@ -151,5 +188,275 @@
         Integer total = this.count(queryWrapper);
         return total;
     }
-
+    
+    /**
+     * @description 用户分页获取已领取优惠券列表
+     * @author  jqs
+     * @date    2023/7/11 16:25
+     * @param page
+     * @param appMemberCouponPageDto
+     * @return  List<AppMemberCouponPageVo>
+     */
+    @Override
+    public List<AppMemberCouponPageVo> pageAppUserGetCoupon(Page page, AppMemberCouponPageDto appMemberCouponPageDto, Member member){
+        List<AppMemberCouponPageVo> memberCouponPageVoList = memberCouponMapper.pageAppUserGetCoupon(page, appMemberCouponPageDto);
+        if(!memberCouponPageVoList.isEmpty()){
+            String relGoodsIds;
+            HashSet<Long> shopIdSet = new HashSet<>();
+            HashSet<String> goodsIdSet = new HashSet<>();
+            String[] goodsIdArr;
+            for(AppMemberCouponPageVo appGetAbleCouponPageVo : memberCouponPageVoList){
+                if(appGetAbleCouponPageVo.getShopId()!=null){
+                    shopIdSet.add(appGetAbleCouponPageVo.getShopId());
+                }
+                if(appGetAbleCouponPageVo.getCouponType()==4){
+                    appGetAbleCouponPageVo.setVerifyCode("2-"+appGetAbleCouponPageVo.getMemberCouponId());
+                }
+                if(StringUtils.isNotBlank(appGetAbleCouponPageVo.getRelGoodsIds())){
+                    relGoodsIds = appGetAbleCouponPageVo.getRelGoodsIds();
+                    goodsIdArr = relGoodsIds.split(",");
+                    for(String str : goodsIdArr){
+                        goodsIdSet.add(str);
+                    }
+                }
+            }
+            //获取关联商户和商品信息并转换为Map
+            String shopJoinedString;
+            Map<Long, MgtSimpleShopVo> shopMap = null;
+            if(shopIdSet!=null&&!shopIdSet.isEmpty()) {
+                shopJoinedString = String.join(",", shopIdSet.stream().map(Object::toString).collect(Collectors.toList()));
+                MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto();
+                mgtBaseBathDto.setIds(shopJoinedString);
+                List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData();
+                shopMap = simpleShopVoList.stream()
+                        .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity()));
+            }
+            String goodsJoinedString = null;
+            if(goodsIdSet!=null&&!goodsIdSet.isEmpty()){
+                goodsJoinedString = String.join(",", goodsIdSet.stream().map(Object::toString).collect(Collectors.toList()));
+            }
+            Map<String, Goods> goodsMap = null;
+            if(goodsJoinedString!=null){
+                List<Goods> goodsList = remoteGoodsService.listGoodsByGoodsId(goodsJoinedString).getData();
+                goodsMap = goodsList.stream()
+                        .collect(Collectors.toMap(Goods::getGoodsId, Function.identity()));
+            }
+            //处理返回信息
+            String shopLimit = "全门店通用";
+            String goodsLimit;
+            StringJoiner goodsNameSj;
+            for(AppMemberCouponPageVo appGetAbleCouponPageVo : memberCouponPageVoList){
+                goodsLimit = null;
+                goodsNameSj = new StringJoiner(",");
+                //商户限制
+                if(appGetAbleCouponPageVo.getShopId()!=null){
+                    shopLimit = shopMap.get(appGetAbleCouponPageVo.getShopId()).getShopName()+"可用";
+                }
+                appGetAbleCouponPageVo.setShopLimit(shopLimit);
+                //商品限制
+                relGoodsIds = appGetAbleCouponPageVo.getRelGoodsIds();
+                if(StringUtils.isNotBlank(relGoodsIds)){
+                    relGoodsIds = appGetAbleCouponPageVo.getRelGoodsIds();
+                    goodsIdArr = relGoodsIds.split(",");
+                    for(String goodsIs : goodsIdArr){
+                        if(goodsMap.get(goodsIs)!=null){
+                            goodsNameSj.add(goodsMap.get(goodsIs).getGoodsName());
+                        }else{
+                            log.debug("用户优惠券未找到关联商品"+appGetAbleCouponPageVo.getMemberCouponId()+"-"+appGetAbleCouponPageVo.getRelGoodsIds());
+                        }
+                    }
+                    goodsLimit = goodsNameSj.toString();
+                }
+                appGetAbleCouponPageVo.setGoodsLimit(goodsLimit);
+                //核销商店
+                if(appGetAbleCouponPageVo.getShopId()!=null){
+                    appGetAbleCouponPageVo.setVerifyShopName(shopMap.get(appGetAbleCouponPageVo.getShopId()).getShopName());
+                }
+            }
+        }
+        return memberCouponPageVoList;
+    }
+    
+    /**
+     * @description  定时检查优惠券过期
+     * @author  jqs
+     * @date    2023/7/12 19:19
+     * @param
+     * @return  void
+     */
+    @Override
+    public void timingCheckMemberCoupon(){
+        memberCouponMapper.timingCheckMemberCoupon();
+    }
+    
+    /**
+     * @description  使用优惠券
+     * @author  jqs
+     * @date    2023/7/13 19:38
+     * @param memberCouponIds
+     * @return  void
+     */
+    @Override
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public void useMemberCoupon(String memberCouponIds){
+        memberCouponMapper.useMemberCoupon(memberCouponIds);
+    }
+    
+    /**
+     * @description  使用优惠券
+     * @author  jqs
+     * @date    2023/7/13 19:38
+     * @param memberCouponIds
+     * @return  void
+     */
+    @Override
+    public void backMemberCoupon(String memberCouponIds){
+        memberCouponMapper.backMemberCoupon(memberCouponIds);
+    }
+    
+    /**
+     * @description
+     * @author  jqs
+     * @date    2023/7/19 17:35
+     * @param
+     * @return  List<MerMemberCouponVo>
+     */
+    @Override
+    public List<MerMemberCouponVo> listMerShopGoodsMemberCoupon(MerGoodsCouponListDto merGoodsCouponListDto){
+        List<MerMemberCouponVo> merMemberCouponVoList = memberCouponMapper.listMerShopGoodsMemberCoupon(merGoodsCouponListDto);
+        if(merMemberCouponVoList!=null&&merMemberCouponVoList.size()>0){
+            List<MemberSelectCouponDto> goodsCpuponList = merGoodsCouponListDto.getGoodsCpuponList();
+            List<Long> selectCouponList =  new ArrayList<>();
+            Map<Long, String>  selectCouponMap = new HashMap<>();
+            Boolean checkSelect = false;
+            if(merGoodsCouponListDto.getGoodsCpuponList()!=null&&merGoodsCouponListDto.getGoodsCpuponList().size()>0) {
+                for (MemberSelectCouponDto couponDto : goodsCpuponList) {
+                    selectCouponList.add(couponDto.getMemberCouponId());
+                    selectCouponMap.put(couponDto.getMemberCouponId(), couponDto.getGoodsId());
+                }
+                checkSelect = true;
+            }
+            Iterator<MerMemberCouponVo> iterator = merMemberCouponVoList.iterator();
+            while (iterator.hasNext()) {
+                MerMemberCouponVo couponVo = iterator.next();
+                //处理已选择优惠券过滤
+                if(checkSelect){
+                    if (selectCouponList.contains(couponVo.getMemberCouponId()) && selectCouponMap.containsKey(couponVo.getMemberCouponId())) {
+                        String goodsId = selectCouponMap.get(couponVo.getMemberCouponId());
+                        if (!merGoodsCouponListDto.getGoodsId().equals(goodsId)) {
+                            iterator.remove();
+                            continue;
+                        }
+                    }
+                }
+                //处理满减卷门槛过滤
+                if(merGoodsCouponListDto.getBuyNum()!=null&&merGoodsCouponListDto.getSalesPrice()!=null){
+                    if(couponVo.getCouponType()==1){
+                        BigDecimal goodsMoney = merGoodsCouponListDto.getSalesPrice().multiply(new BigDecimal(merGoodsCouponListDto.getBuyNum().toString()));
+                        if(goodsMoney.compareTo(couponVo.getMoneyThreshold())<0){
+                            iterator.remove();
+                        }
+                    }
+                }
+            }
+        }
+        return merMemberCouponVoList;
+    }
+    
+    
+    /**
+     * @param memberCouponId
+     * @param shopId
+     * @return void
+     * @description 确认核销优惠券
+     * @author jqs
+     * @date 2023/8/15 11:21
+     */
+    @Override
+    public void sureMemberCoupon(Long memberCouponId, Long shopId) {
+        memberCouponMapper.sureMemberCoupon(memberCouponId, shopId);
+    }
+    
+    @Override
+    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
+    public void insert(MemberCoupon memberCoupon) {
+        this.baseMapper.insert(memberCoupon);
+    }
+    
+    
+    /**
+     * 手动添加用户优惠券
+     *
+     * @param couponId
+     * @param number
+     * @return
+     */
+    @Override
+    public R addMemberCoupon(String couponId, Integer number, Long userId) {
+        Coupon coupon = couponService.getById(couponId);
+        if (null == coupon) {
+            return R.fail("优惠券不存在");
+        }
+        List<MemberCoupon> memberCouponList = new ArrayList<>();
+        MemberCoupon memberCoupon;
+        Integer sendTotal = 0;
+        Integer sendPerson = 0;
+        Integer sendUserTotal;
+        for (int i = 0; i < number; i++) {
+            memberCoupon = new MemberCoupon();
+            memberCoupon.setDelFlag(0);
+            memberCoupon.setCouponId(coupon.getCouponId());
+            memberCoupon.setUserId(userId);
+            memberCoupon.setShopId(coupon.getShopId());
+            memberCoupon.setCouponType(coupon.getCouponType());
+            if (coupon.getCouponType() == 1) {
+                memberCoupon.setMoneyThreshold(coupon.getMoneyThreshold());
+                memberCoupon.setDiscountMoney(coupon.getDiscountMoney());
+            } else if (coupon.getCouponType() == 2) {
+                memberCoupon.setDiscountPercent(coupon.getDiscountPercent());
+            } else if (coupon.getCouponType() == 3) {
+                memberCoupon.setDiscountMoney(coupon.getDiscountMoney());
+            } else {
+                memberCoupon.setRelGoodsIds(coupon.getRelGoodsIds());
+            }
+            memberCoupon.setCouponStatus(coupon.getCouponStatus());
+            memberCoupon.setCouponName(coupon.getCouponName());
+            memberCoupon.setSendType(coupon.getSendType());
+            memberCoupon.setSendTarget(coupon.getSendTarget());
+            memberCoupon.setSendTimeType(coupon.getSendTimeType());
+            memberCoupon.setSendTime(coupon.getSendTime());
+            memberCoupon.setUseScope(coupon.getUseScope());
+            if (memberCoupon.getUseScope() == 2) {
+                memberCoupon.setRelGoodsIds(coupon.getRelGoodsIds());
+            }
+            memberCoupon.setValidTimeType(coupon.getValidTimeType());
+            memberCoupon.setValidStartTime(coupon.getValidStartTime());
+            memberCoupon.setValidEndTime(coupon.getValidEndTime());
+            memberCoupon.setValidDay(coupon.getValidDay());
+            memberCoupon.setCouponFrom(coupon.getCouponFrom());
+            memberCoupon.setReceiveTime(new Date());
+            //有效期处理1.时间段2.领取之日起
+            if (coupon.getValidTimeType() == 1) {
+                memberCoupon.setDeadlineTime(coupon.getValidEndTime());
+            } else if (coupon.getValidTimeType() == 2) {
+                memberCoupon.setDeadlineTime(DateUtils.addDays(new Date(), coupon.getValidDay()));
+            }
+            memberCouponList.add(memberCoupon);
+            sendTotal = sendTotal + 1;
+            if (coupon.getSendType() == 1) {
+                sendUserTotal = this.totalMemberCouponByUserAndCoupon(userId, coupon.getCouponId());
+                if (sendUserTotal != null && sendUserTotal > 0) {
+                } else {
+                    sendPerson = sendPerson + 1;
+                }
+            }
+            memberCouponRecordService.updateMemberCouponRecord(coupon, userId, 1);
+        }
+        this.saveBatch(memberCouponList);
+        //处理优惠券统计
+        if (sendTotal > 0) {
+            couponMapper.updateCouponTotal(coupon.getCouponId(), sendTotal, sendPerson);
+        }
+        return R.ok();
+    }
 }

--
Gitblit v1.7.1