44323
2024-01-24 61b5f9863f14ab4fc9da504ca2b553a778eb2e2c
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java
@@ -6,21 +6,29 @@
import com.ruoyi.common.core.exception.ServiceException;
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.vo.AppMemberCouponPageVo;
import com.ruoyi.member.mapper.member.MemberCouponMapper;
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.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -53,8 +61,8 @@
     * @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;
    }
@@ -78,7 +86,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);
        }
        // 检查优惠券类型
@@ -120,7 +128,7 @@
            throw new ServiceException(AppErrorConstant.COUPON_EXPIRED);
        }else if(memberCoupon.getCouponStatus()==2){
            throw new ServiceException(AppErrorConstant.COUPON_USED);
        }else if(memberCoupon.getCouponStatus()==-1){
        }else if(memberCoupon.getCouponStatus()!=1){
            throw new ServiceException(AppErrorConstant.COUPON_NO_FIND);
        }
        if(memberCoupon.getCouponType()!=4){
@@ -140,6 +148,7 @@
            merVerifyCouponGetVo.setCouponFrom("平台");
        }
        memberCoupon.setCouponStatus(2);
        memberCoupon.setUseTime(new Date());
        this.saveOrUpdate(memberCoupon);
        merVerifyCouponGetVo.setMemberCoupon(memberCoupon);
@@ -172,43 +181,80 @@
     * @return  List<AppMemberCouponPageVo>
     */
    @Override
    public List<AppMemberCouponPageVo> pageAppUserGetCoupon(Page page, AppMemberCouponPageDto appMemberCouponPageDto){
    public List<AppMemberCouponPageVo> pageAppUserGetCoupon(Page page, AppMemberCouponPageDto appMemberCouponPageDto, Member member){
        List<AppMemberCouponPageVo> memberCouponPageVoList = memberCouponMapper.pageAppUserGetCoupon(page, appMemberCouponPageDto);
        if(!memberCouponPageVoList.isEmpty()){
            String relGoodsIds;
            List<Goods> goodsList;
            List<String> goodsLimitList = null;
            HashSet<Long> shopIdSet = new HashSet<>();
            HashSet<String> goodsIdSet = new HashSet<>();
            String[] goodsIdArr;
            for(AppMemberCouponPageVo appGetAbleCouponPageVo : memberCouponPageVoList){
                shopIdSet.add(appGetAbleCouponPageVo.getShopId());
            }
            String 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();
            Map<Long, MgtSimpleShopVo> shopMap = simpleShopVoList.stream()
                    .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity()));
            for(AppMemberCouponPageVo appGetAbleCouponPageVo : memberCouponPageVoList){
                relGoodsIds = appGetAbleCouponPageVo.getRelGoodsIds();
                if(StringUtils.isNotBlank(relGoodsIds)){
                    goodsList = remoteGoodsService.listGoodsByGoodsId(relGoodsIds).getData();
                    if(!goodsList.isEmpty()){
                        goodsLimitList = goodsList.stream().map(goods -> {
                            String goodsName = goods.getGoodsName();
                            goodsName = "限制" + goodsName + "适用";
                            return goodsName;
                        }).collect(Collectors.toList());
                    }
                }else{
                    goodsLimitList = new ArrayList<>();
                    if(appGetAbleCouponPageVo.getShopId()!=null){
                        goodsLimitList.add(shopMap.get(appGetAbleCouponPageVo.getShopId()).getShopName()+"通用");
                    }else{
                        goodsLimitList.add("全场通用");
                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);
                    }
                }
                appGetAbleCouponPageVo.setGoodsLimitList(goodsLimitList);
                appGetAbleCouponPageVo.setVerifyShopName(shopMap.get(appGetAbleCouponPageVo.getShopId()).getShopName());
            }
            //获取关联商户和商品信息并转换为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;
@@ -234,6 +280,7 @@
     * @return  void
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void useMemberCoupon(String memberCouponIds){
        memberCouponMapper.useMemberCoupon(memberCouponIds);
    }
@@ -249,4 +296,67 @@
    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<String> selectCouponList =  new ArrayList<>();
            Map<String, 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;
    }
    /**
     * @description  确认核销优惠券
     * @author  jqs
     * @date    2023/8/15 11:21
     * @param memberCouponId
     * @param shopId
     * @return  void
     */
    @Override
    public void sureMemberCoupon(String memberCouponId,Long shopId){
        memberCouponMapper.sureMemberCoupon(memberCouponId, shopId);
    }
}