From 03dd384bb8b78f04eadcf619849b3687fa98c6c1 Mon Sep 17 00:00:00 2001 From: zhanglin <852614290@qq.com> Date: 星期六, 22 七月 2023 18:19:47 +0800 Subject: [PATCH] 微信支付,支付与结果通知 --- ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java | 369 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 310 insertions(+), 59 deletions(-) diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java index dd43e02..2fed412 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java @@ -8,29 +8,26 @@ import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.bean.BeanUtils; import com.ruoyi.common.core.utils.uuid.IdUtils; +import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.member.domain.dto.*; -import com.ruoyi.member.domain.pojo.coupon.Coupon; -import com.ruoyi.member.domain.pojo.coupon.CouponRelGoods; -import com.ruoyi.member.domain.pojo.coupon.CouponRelUser; -import com.ruoyi.member.domain.pojo.coupon.CouponTotal; -import com.ruoyi.system.api.domain.dto.BirthdayGiftSendDto; -import com.ruoyi.system.api.domain.dto.MerBaseGetDto; -import com.ruoyi.system.api.domain.dto.MerPageDto; -import com.ruoyi.system.api.domain.poji.member.MemberCoupon; +import com.ruoyi.member.domain.pojo.coupon.*; import com.ruoyi.member.domain.vo.*; import com.ruoyi.member.mapper.coupon.CouponMapper; -import com.ruoyi.member.service.coupon.CouponRelGoodsService; -import com.ruoyi.member.service.coupon.CouponRelUserService; -import com.ruoyi.member.service.coupon.CouponService; -import com.ruoyi.member.service.coupon.CouponTotalService; +import com.ruoyi.member.service.coupon.*; import com.ruoyi.member.service.member.MemberCouponService; import com.ruoyi.member.service.member.MemberService; import com.ruoyi.system.api.constant.AppErrorConstant; -import com.ruoyi.system.api.domain.dto.MgtBaseGetDto; +import com.ruoyi.system.api.constant.DelayTaskEnum; +import com.ruoyi.system.api.domain.dto.*; +import com.ruoyi.system.api.domain.poji.config.DelayTask; import com.ruoyi.system.api.domain.poji.goods.Goods; +import com.ruoyi.system.api.domain.poji.member.MemberCoupon; +import com.ruoyi.system.api.domain.poji.shop.Shop; import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo; import com.ruoyi.system.api.service.RemoteActivityService; +import com.ruoyi.system.api.service.RemoteConfigService; import com.ruoyi.system.api.service.RemoteGoodsService; +import com.ruoyi.system.api.service.RemoteShopService; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -39,6 +36,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -75,6 +73,18 @@ @Resource private RemoteActivityService remoteActivityService; + + @Resource + private MemberCouponRecordService memberCouponRecordService; + + @Resource + private RemoteShopService remoteShopService; + + @Resource + private RedisService redisService; + + @Resource + private RemoteConfigService remoteConfigService; /** * @description 平台获取优惠券列表 @@ -197,6 +207,10 @@ MerCouponGetVo merCouponGetVo = new MerCouponGetVo(); Coupon coupon = this.getById(couponId); BeanUtils.copyProperties(coupon, merCouponGetVo); + if(merCouponGetVo.getSendType()>1){ + merCouponGetVo.setSendType(2); + merCouponGetVo.setSendTarget(merCouponGetVo.getSendType()); + } //判断优惠券是否为指定商品 if(coupon.getUseScope()==2){ String relGoodsIds = coupon.getRelGoodsIds(); @@ -247,6 +261,8 @@ coupon.setCreateUserId(mgtCouponEditDto.getUserId()); coupon.setCouponFrom(1); coupon.setAuditStatus(2); + coupon.setLimitNumber(0); + coupon.setSendFlag(0); //创建优惠券统计 couponTotal = new CouponTotal(); couponTotal.setCouponId(couponId); @@ -304,10 +320,13 @@ .collect(Collectors.toList()); couponRelUserService.saveBatch(couponRelUserList); } - this.saveOrUpdate(coupon); //处理优惠券发放 if(coupon.getSendTimeType()==1){ sendCoupon(coupon,relUserIdList); + coupon.setSendFlag(1); + this.saveOrUpdate(coupon); + }else{ + this.saveOrUpdate(coupon); } } @@ -376,6 +395,7 @@ memberCoupon.setValidStartTime(coupon.getValidStartTime()); memberCoupon.setValidEndTime(coupon.getValidEndTime()); memberCoupon.setValidDay(coupon.getValidDay()); + memberCoupon.setCouponFrom(coupon.getCouponFrom()); memberCoupon.setReceiveTime(nowTime); memberCoupon.setRelGoodsIds(coupon.getRelGoodsIds()); //有效期处理1.时间段2.领取之日起 @@ -393,6 +413,92 @@ sendPerson = sendPerson + 1; } } + memberCouponRecordService.updateMemberCouponRecord(coupon,userId,1); + } + memberCouponService.saveBatch(memberCouponList); + //处理优惠券统计 + if(sendTotal>0){ + couponMapper.updateCouponTotal(coupon.getCouponId(),sendTotal,sendPerson); + } + } + } + + + private void sendCouponNow(Coupon coupon, List<Long> relUserIdList){ + //1.手动领取2.全部用户3.会员用户4非会员用户5自定义 + Date nowTime = new Date(); + Integer sendType = coupon.getSendType(); + List<Long> userIdList = new ArrayList<>(); + Long shopId = null; + if(coupon.getCouponFrom()==2 && sendType==3){ + shopId = coupon.getShopId(); + } + if(sendType >= 2 && sendType <= 4){ + userIdList = memberService.listIdBySendType(sendType,shopId); + }else if(sendType == 5){ + //关联类型1.用户管理筛选2.活动管理筛选 + if(coupon.getRelationType()==2){ + Integer relationActivityType = coupon.getRelationActivityType(); + //关联活动类型1秒杀活动 + switch(relationActivityType){ + case 1: + userIdList = remoteActivityService.listUserIdByActivityId(coupon.getRelationActivityId()).getData(); + break; + default: + break; + } + }else if(coupon.getRelationType()==1){ + userIdList = relUserIdList; + } + } + if(relUserIdList!=null&&!relUserIdList.isEmpty()){ + List<MemberCoupon> memberCouponList = new ArrayList<>(); + MemberCoupon memberCoupon; + Integer sendTotal = 0; + Integer sendPerson = 0; + String memberCouponId; + Integer sendUserTotal; + for(Long userId : userIdList){ + memberCouponId = IdUtils.simpleUUID(); + memberCoupon = new MemberCoupon(); + memberCoupon.setId(memberCouponId); + memberCoupon.setDelFlag(0); + memberCoupon.setCouponId(coupon.getCouponId()); + memberCoupon.setUserId(userId); + memberCoupon.setShopId(coupon.getShopId()); + memberCoupon.setCouponType(coupon.getCouponType()); + memberCoupon.setCouponStatus(coupon.getCouponStatus()); + memberCoupon.setCouponName(coupon.getCouponName()); + memberCoupon.setSendType(coupon.getSendType()); + memberCoupon.setSendTimeType(coupon.getSendTimeType()); + memberCoupon.setSendTime(coupon.getSendTime()); + memberCoupon.setMoneyThreshold(coupon.getMoneyThreshold()); + memberCoupon.setDiscountMoney(coupon.getDiscountMoney()); + memberCoupon.setDiscountPercent(coupon.getDiscountPercent()); + memberCoupon.setUseScope(coupon.getUseScope()); + memberCoupon.setValidTimeType(coupon.getValidTimeType()); + memberCoupon.setValidStartTime(coupon.getValidStartTime()); + memberCoupon.setValidEndTime(coupon.getValidEndTime()); + memberCoupon.setValidDay(coupon.getValidDay()); + memberCoupon.setCouponFrom(coupon.getCouponFrom()); + memberCoupon.setReceiveTime(nowTime); + memberCoupon.setRelGoodsIds(coupon.getRelGoodsIds()); + //有效期处理1.时间段2.领取之日起 + if(coupon.getValidTimeType()==1){ + memberCoupon.setDeadlineTime(coupon.getValidEndTime()); + }else if(coupon.getValidTimeType()==2){ + memberCoupon.setDeadlineTime(DateUtils.addDays(nowTime,coupon.getValidDay())); + } + memberCouponList.add(memberCoupon); + sendTotal = sendTotal + 1; + if(coupon.getSendType()==1){ + sendUserTotal = memberCouponService.totalMemberCouponByUserAndCoupon(userId,coupon.getCouponId()); + if(sendUserTotal!=null&&sendUserTotal>0){ + }else{ + sendPerson = sendPerson + 1; + } + } + memberCouponRecordService.updateMemberCouponRecord(coupon,userId,1); } memberCouponService.saveBatch(memberCouponList); //处理优惠券统计 @@ -432,31 +538,61 @@ */ @Override public void timingSendCoupon(){ + //获取1小时内需要发送的优惠券 LambdaQueryWrapper<Coupon> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Coupon::getDelFlag,0); queryWrapper.eq(Coupon::getCouponStatus,1); queryWrapper.eq(Coupon::getSendTimeType,2); queryWrapper.eq(Coupon::getAuditStatus,2); - queryWrapper.eq(Coupon::getSendTime,DateUtils.getNowDate()); + queryWrapper.eq(Coupon::getSendFlag,0); + Date checkTime = DateUtils.addMinutes(new Date(),61); + queryWrapper.le(Coupon::getSendTime, checkTime); List<Coupon> couponList = couponMapper.selectList(queryWrapper); if(couponList!=null&&!couponList.isEmpty()){ - List<CouponRelUser> couponRelUserList; - List<Long> userIdList = new ArrayList<>(); - for(Coupon coupon : couponList){ - if(coupon.getSendType()==5&&coupon.getRelationType()==1){ - couponRelUserList = couponRelUserService.list(new LambdaQueryWrapper<CouponRelUser>().eq(CouponRelUser::getDelFlag,0).eq(CouponRelUser::getCouponId,coupon.getCouponId())); - if(couponRelUserList!=null&&!couponRelUserList.isEmpty()){ - userIdList = couponRelUserList.stream() - .map(CouponRelUser::getUserId) - .collect(Collectors.toList()); - }else{ - userIdList = new ArrayList<>(); - } + for(Coupon coupon : couponList) { + String couponId = coupon.getCouponId(); + Date sendTime = coupon.getSendTime(); + long currentTimeMillis = System.currentTimeMillis(); + long timeDifference = currentTimeMillis - sendTime.getTime(); + DelayTask delayTask = remoteConfigService.getDelayTask(DelayTaskEnum.COUPON_SEND_DELAY_TASK.getCode()+"-"+couponId).getData(); + if(delayTask==null){ + //创建延时任务控制优惠券定时发放 + redisService.setCacheObject(DelayTaskEnum.COUPON_SEND_DELAY_TASK.getCode()+"-"+couponId,sendTime,timeDifference, TimeUnit.MILLISECONDS); + delayTask = new DelayTask(); + delayTask.setDelFlag(0); + delayTask.setCreateTime(new Date()); + delayTask.setEndTime(sendTime); + delayTask.setRedisKey(DelayTaskEnum.COUPON_SEND_DELAY_TASK.getCode()+"-"+couponId); + remoteConfigService.addDelayTask(delayTask); } - //发送优惠券 - sendCoupon(coupon, userIdList); } } + } + + /** + * @description 定时发送优惠券 + * @author jqs + * @date 2023/7/12 12:01 + * @param couponId + * @return void + */ + @Override + public void autoTimeSendCoupon(String couponId){ + List<CouponRelUser> couponRelUserList; + List<Long> userIdList = new ArrayList<>(); + Coupon coupon = this.getById(couponId); + if(coupon.getSendType()==5&&coupon.getRelationType()==1){ + couponRelUserList = couponRelUserService.list(new LambdaQueryWrapper<CouponRelUser>().eq(CouponRelUser::getDelFlag,0).eq(CouponRelUser::getCouponId,coupon.getCouponId())); + if(couponRelUserList!=null&&!couponRelUserList.isEmpty()){ + userIdList = couponRelUserList.stream() + .map(CouponRelUser::getUserId) + .collect(Collectors.toList()); + }else{ + userIdList = new ArrayList<>(); + } + } + //发送优惠券 + sendCouponNow(coupon, userIdList); } /** @@ -588,7 +724,6 @@ coupon.setAuditReason(mgtCouponAuditDto.getAuditReason()); coupon.setUpdateTime(new Date()); coupon.setUpdateUserId(mgtCouponAuditDto.getUserId()); - this.saveOrUpdate(coupon); //审核通过后判断是否立即发放 if(coupon.getCouponStatus()==2&&coupon.getSendTimeType()==1){ List<CouponRelUser> couponRelUserList = couponRelUserService.list(new LambdaQueryWrapper<CouponRelUser>().eq(CouponRelUser::getDelFlag,0).eq(CouponRelUser::getCouponId,coupon.getCouponId())); @@ -600,7 +735,9 @@ } //发放优惠券 sendCoupon(coupon, userIdList); + coupon.setSendFlag(1); } + this.saveOrUpdate(coupon); } /** @@ -750,6 +887,8 @@ coupon.setCreateTime(new Date()); coupon.setCreateUserId(merCouponEditDto.getUserId()); coupon.setCouponFrom(2); + coupon.setSendFlag(0); + coupon.setLimitNumber(merCouponEditDto.getLimitNumber()); //创建优惠券统计 couponTotal = new CouponTotal(); couponTotal.setCouponId(couponId); @@ -762,6 +901,9 @@ coupon.setCouponType(merCouponEditDto.getCouponType()); coupon.setCouponName(merCouponEditDto.getCouponName()); coupon.setSendType(merCouponEditDto.getSendType()); + if(merCouponEditDto.getSendType()!=1){ + coupon.setSendType(merCouponEditDto.getSendTarget()); + } coupon.setSendTimeType(merCouponEditDto.getSendTimeType()); coupon.setSendTime(merCouponEditDto.getSendTime()); coupon.setMoneyThreshold(merCouponEditDto.getMoneyThreshold()); @@ -845,37 +987,146 @@ for(BirthdayGiftSendDto birthdayGiftSendDto : giftSendDtoList){ couponId = birthdayGiftSendDto.getCouponId(); coupon = this.getById(couponId); - memberCoupon = new MemberCoupon(); - memberCouponId = IdUtils.simpleUUID(); - memberCoupon.setId(memberCouponId); - memberCoupon.setDelFlag(0); - memberCoupon.setCouponId(couponId); - memberCoupon.setUserId(userId); - memberCoupon.setShopId(shopId); - memberCoupon.setCouponType(coupon.getCouponType()); - memberCoupon.setCouponStatus(coupon.getCouponStatus()); - memberCoupon.setCouponName(coupon.getCouponName()); - memberCoupon.setSendType(coupon.getSendType()); - memberCoupon.setSendTimeType(coupon.getSendTimeType()); - memberCoupon.setSendTime(coupon.getSendTime()); - memberCoupon.setMoneyThreshold(coupon.getMoneyThreshold()); - memberCoupon.setDiscountMoney(coupon.getDiscountMoney()); - memberCoupon.setDiscountPercent(coupon.getDiscountPercent()); - memberCoupon.setUseScope(coupon.getUseScope()); - memberCoupon.setValidTimeType(coupon.getValidTimeType()); - memberCoupon.setValidStartTime(coupon.getValidStartTime()); - memberCoupon.setValidEndTime(coupon.getValidEndTime()); - memberCoupon.setValidDay(coupon.getValidDay()); - 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())); + for(int i=0;i<birthdayGiftSendDto.getCouponNumber();i++){ + memberCoupon = new MemberCoupon(); + memberCouponId = IdUtils.simpleUUID(); + memberCoupon.setId(memberCouponId); + memberCoupon.setDelFlag(0); + memberCoupon.setCouponId(couponId); + memberCoupon.setUserId(userId); + memberCoupon.setShopId(shopId); + memberCoupon.setCouponType(coupon.getCouponType()); + memberCoupon.setCouponStatus(coupon.getCouponStatus()); + memberCoupon.setCouponName(coupon.getCouponName()); + memberCoupon.setSendType(coupon.getSendType()); + memberCoupon.setSendTimeType(coupon.getSendTimeType()); + memberCoupon.setSendTime(coupon.getSendTime()); + memberCoupon.setMoneyThreshold(coupon.getMoneyThreshold()); + memberCoupon.setDiscountMoney(coupon.getDiscountMoney()); + memberCoupon.setDiscountPercent(coupon.getDiscountPercent()); + memberCoupon.setUseScope(coupon.getUseScope()); + 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())); + } + memberCoupon.setRelGoodsIds(coupon.getRelGoodsIds()); + memberCouponList.add(memberCoupon); } - memberCoupon.setRelGoodsIds(coupon.getRelGoodsIds()); - memberCouponList.add(memberCoupon); + memberCouponRecordService.updateMemberCouponRecord(coupon,userId,birthdayGiftSendDto.getCouponNumber()); } memberCouponService.saveBatch(memberCouponList); } + + /** + * @description 用户分页获取可领取优惠券列表 + * @author jqs + * @date 2023/7/9 16:16 + * @param page + * @param appPageDto + * @return List<AppUnGetCouponPageVo> + */ + @Override + public List<AppGetAbleCouponPageVo> pageAppUserGetAbleCoupon(Page page, AppPageDto appPageDto, Long shopId){ + //获取当前已领取完优惠券 + List<String> unGetList = couponMapper.listUserUnGetCoupon(appPageDto.getUserId()); + List<AppGetAbleCouponPageVo> getAbleCouponPageVoList = couponMapper.getAbleCouponPageVoList(page, shopId, unGetList); + //处理商品限制 + if(!getAbleCouponPageVoList.isEmpty()){ + String relGoodsIds; + List<Goods> goodsList; + List<String> goodsLimitList = null; + Shop shop = null; + for(AppGetAbleCouponPageVo appGetAbleCouponPageVo : getAbleCouponPageVoList){ + 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){ + if(shop!=null&&shop.getShopId().equals(appGetAbleCouponPageVo.getShopId())){ + }else{ + shop = remoteShopService.getShop(appGetAbleCouponPageVo.getShopId()).getData(); + } + goodsLimitList.add(shop.getShopName()+"通用"); + }else{ + goodsLimitList.add("全场通用"); + } + } + appGetAbleCouponPageVo.setGoodsLimitList(goodsLimitList); + } + + } + return getAbleCouponPageVoList; + } + + + + + /** + * @description 用户领取优惠券 + * @author jqs + * @date 2023/7/11 15:04 + * @param couponId + * @param shopId + * @return void + */ + @Override + public void appGetCoupon(String couponId,Long userId,Long shopId){ + Coupon coupon = this.getById(couponId); + if(coupon==null||coupon.getDelFlag()==1||coupon.getCouponStatus()!=1||coupon.getSendType()!=1){ + throw new ServiceException(AppErrorConstant.COUPON_GET_ERROR); + } + MemberCouponRecord memberCouponRecord = memberCouponRecordService.getByCouponIdAndUserId(couponId,userId); + if(memberCouponRecord!=null&&memberCouponRecord.getLimitFlag()==1){ + throw new ServiceException(AppErrorConstant.COUPON_GET_ALL); + } + MemberCoupon memberCoupon = new MemberCoupon(); + String memberCouponId = IdUtils.simpleUUID(); + memberCoupon.setId(memberCouponId); + memberCoupon.setDelFlag(0); + memberCoupon.setCouponId(couponId); + memberCoupon.setUserId(userId); + memberCoupon.setShopId(shopId); + memberCoupon.setCouponType(coupon.getCouponType()); + memberCoupon.setCouponStatus(coupon.getCouponStatus()); + memberCoupon.setCouponName(coupon.getCouponName()); + memberCoupon.setSendType(coupon.getSendType()); + memberCoupon.setSendTimeType(coupon.getSendTimeType()); + memberCoupon.setSendTime(coupon.getSendTime()); + memberCoupon.setMoneyThreshold(coupon.getMoneyThreshold()); + memberCoupon.setDiscountMoney(coupon.getDiscountMoney()); + memberCoupon.setDiscountPercent(coupon.getDiscountPercent()); + memberCoupon.setUseScope(coupon.getUseScope()); + 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())); + } + memberCoupon.setRelGoodsIds(coupon.getRelGoodsIds()); + memberCouponService.save(memberCoupon); + memberCouponRecordService.updateMemberCouponRecord(coupon,userId,1); + } + } -- Gitblit v1.7.1