From 86905014b731a3f1b99b8ff5c98c8aabaab07b23 Mon Sep 17 00:00:00 2001 From: 陶杰 <1378534974@qq.com> Date: 星期一, 02 九月 2024 17:03:25 +0800 Subject: [PATCH] 1.优惠券-活动添加字段 2.优惠券-领取超领控制 3.优惠券-会员优惠券的方法修改 4.优惠券-查询优惠券前根据时间更新当前用户优惠券是否过期 --- src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java | 7 src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateActivyVO.java | 18 ++ src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java | 335 +++++++++++++++++++++++------------------ src/main/java/com/mzl/flower/config/RedissonConfig.java | 45 +++++ src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java | 4 pom.xml | 11 + src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapperCustom.java | 2 src/main/java/com/mzl/flower/service/customer/CustomerService.java | 18 ++ src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml | 9 + 9 files changed, 299 insertions(+), 150 deletions(-) diff --git a/pom.xml b/pom.xml index 8f0d9f0..c624d4f 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,7 @@ <springfox-swagger.version>2.9.2</springfox-swagger.version> <io.swagger.version>1.5.22</io.swagger.version> <base.version>1.0-SNAPSHOT</base.version> + <mybatis-plus.version>3.4.1</mybatis-plus.version> </properties> <dependencies> @@ -55,6 +56,8 @@ <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> + <version>1.18.20</version> + <scope>provided</scope> <optional>true</optional> </dependency> @@ -259,6 +262,14 @@ <artifactId>aspectjweaver</artifactId> <version>1.9.7</version> </dependency> + + <dependency> + <groupId>org.redisson</groupId> + <artifactId>redisson</artifactId> + <version>3.15.6</version> + </dependency> + + </dependencies> <build> diff --git a/src/main/java/com/mzl/flower/config/RedissonConfig.java b/src/main/java/com/mzl/flower/config/RedissonConfig.java new file mode 100644 index 0000000..4d921e2 --- /dev/null +++ b/src/main/java/com/mzl/flower/config/RedissonConfig.java @@ -0,0 +1,45 @@ +package com.mzl.flower.config; + +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RedissonConfig { + + @Value("${spring.redis.host}") + private String host; + + @Value("${spring.redis.port}") + private Integer port; + + @Value("${spring.redis.password}") + private String password; + + @Value("${spring.redis.timeout:10000}") + private int timeout; // 10秒 + + @Value("${spring.redis.connectionPoolSize:100}") + private int connectionPoolSize; // 100个连接 + + @Value("${spring.redis.connectionMinimumIdleSize:20}") + private int connectionMinimumIdleSize; // 20个空闲连接 + + + + @Bean(destroyMethod = "shutdown") + public RedissonClient redissonClient() { + Config config = new Config(); + config.useSingleServer() + .setAddress(String.format("redis://%s:%d", host, port)) + .setPassword(password) + .setTimeout(timeout) + .setConnectionPoolSize(connectionPoolSize) + .setConnectionMinimumIdleSize(connectionMinimumIdleSize); + + return Redisson.create(config); + } +} diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateActivyVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateActivyVO.java index 288837d..d00eb2e 100644 --- a/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateActivyVO.java +++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateActivyVO.java @@ -151,5 +151,23 @@ @ApiModelProperty(value = "使用时间类型") private String usageTypeName; + @ApiModelProperty(value = "领取后有效类型名称") + private String usageTimeTypeName; + + @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)") + @DictTrans(target = "getTypeName",codeType = "COUPON_GET_TYPE") + private String getType; + + /** + * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心 + */ + @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)") + private String getTypeName; + + /** + * 每人限领 + */ + @ApiModelProperty(value = "每人限领") + private Integer getLimit; } diff --git a/src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapperCustom.java b/src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapperCustom.java index 4e550cf..2cc46fa 100644 --- a/src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapperCustom.java +++ b/src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapperCustom.java @@ -32,4 +32,6 @@ Integer statisCouponPointCurMonPointAmonut(@Param("param") QueryCouponStatisticsBO queryCouponStatisticsBO); List<CouponRecordVO> getMineCouponRecordList(@Param("param") QueryMineCouponRecordDTO dto); + + void checkCouponExpired(@Param("param") QueryMineCouponRecordDTO dto); } diff --git a/src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java b/src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java index b55d1e1..76e6ee8 100644 --- a/src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java +++ b/src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java @@ -66,4 +66,11 @@ List<CouponRecordVO> getMineCouponRecordList(QueryMineCouponRecordDTO dto); + /** + * 检查优惠券是否到期 + * @param dto + */ + void checkCouponExpired(QueryMineCouponRecordDTO dto); + + } diff --git a/src/main/java/com/mzl/flower/service/customer/CustomerService.java b/src/main/java/com/mzl/flower/service/customer/CustomerService.java index 13d2701..564e32a 100644 --- a/src/main/java/com/mzl/flower/service/customer/CustomerService.java +++ b/src/main/java/com/mzl/flower/service/customer/CustomerService.java @@ -14,6 +14,7 @@ import com.mzl.flower.dto.response.partner.PartnerDTO; import com.mzl.flower.entity.customer.Customer; import com.mzl.flower.entity.partner.Partner; +import com.mzl.flower.enums.TrueOrFalseEnum; import com.mzl.flower.mapper.customer.CustomerMapper; import com.mzl.flower.mapper.partner.PartnerMapper; import lombok.extern.slf4j.Slf4j; @@ -202,4 +203,21 @@ } return null; } + + /** + * 根据会员等级获取等级下的customer信息 + * @param levelId + * @return + */ + public List<Customer> getCustomerListByLevelId(Integer levelId){ + if(null != levelId){ + QueryWrapper<Customer> customerQueryWrapper=new QueryWrapper<>(); + customerQueryWrapper.lambda() + .eq(Customer::getDeleted, TrueOrFalseEnum.FALSE.isFlag()) + .eq(Customer::getLevelId,levelId); + return customerMapper.selectList(customerQueryWrapper); + } + return null; + } + } diff --git a/src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java index 4a577d0..2de8630 100644 --- a/src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java +++ b/src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java @@ -1,5 +1,6 @@ package com.mzl.flower.service.impl.coupon; +import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -16,10 +17,13 @@ import com.mzl.flower.mapper.customer.CustomerMapper; import com.mzl.flower.service.coupon.CouponRecordService; import com.mzl.flower.service.coupon.CouponTemplateService2; +import com.mzl.flower.service.customer.CustomerService; import com.mzl.flower.service.system.UserService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -28,6 +32,7 @@ import java.time.LocalDateTime; import java.time.temporal.TemporalAdjusters; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -54,120 +59,146 @@ @Autowired private CustomerMapper customerMapper; + @Autowired + private CustomerService customerService; + + + @Override public List<CouponRecordVO> getList(QueryCouponRecordDTO dto) { return couponRecordMapperCustom.getList(dto); } + @Autowired + RedissonClient redissonClient; + + private static final String COUPON_KEY="com:mzl:flower:service:impl:coupon:%s"; + + @Transactional @Override public boolean createCouponRecord(CreateCouponRecordDTO dto) { - - // TODO 需要控制超领 - - final Customer customer = customerMapper.selectById(dto.getCustomerId()); - if(null==customer){ - throw new ValidationException("商户信息不存在"); - } final CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getCouponId()); if(couponTemplateDO==null){ throw new ValidationException("优惠券不存在"); } - // 活动优惠券和积分优惠券需要根据库存来控制- 根据优惠券的发放数量来控制有没有超发 - if(StringUtils.isNotBlank(couponTemplateDO.getCategory()) && ( - couponTemplateDO.getCategory().equals(CouponCategoryEnum.ACTIVITY.getStatus()) || couponTemplateDO.getCategory().equals(CouponCategoryEnum.POINT.getStatus()) - )){ - // 获取当前优惠券已经领取的数量 - final Integer gainTotal = getExistGainCouponRecordAmountById(couponTemplateDO.getId()); - if(couponTemplateDO.getCouponAmount().compareTo(gainTotal)<=0){ - throw new ValidationException("当前优惠券已经领完!"); - } + final Customer customer = customerMapper.selectById(dto.getCustomerId()); + if(null==customer){ + throw new ValidationException("商户信息不存在"); } - // 根据用户领取设置的getLimit 查看当前用户是否已经超领优惠券 - if(StringUtils.isNotBlank(couponTemplateDO.getCategory()) && couponTemplateDO.getCategory().equals(CouponCategoryEnum.ACTIVITY.getStatus()) ){ - // 查看当前优惠券的领取时间在不在设置的领取时间范围类 - LocalDateTime now = LocalDateTime.now(); - // 判断当前时间是否在领取时间范围内 - if (!(now.isAfter(couponTemplateDO.getGetStartDate()) && now.isBefore(couponTemplateDO.getGetEndDate()))) { - throw new ValidationException("当前时间不在优惠券的领取时间范围内,无法操作!"); - } + RLock lock = redissonClient.getLock(String.format(COUPON_KEY, couponTemplateDO.getId())); + try { + // 获取锁,最多等待 10 秒,锁自动释放时间 30 秒 + if (lock.tryLock(10, 30, TimeUnit.SECONDS)) { + try { + // 活动优惠券和积分优惠券需要根据库存来控制- 根据优惠券的发放数量来控制有没有超发 + if(StringUtils.isNotBlank(couponTemplateDO.getCategory()) && ( + couponTemplateDO.getCategory().equals(CouponCategoryEnum.ACTIVITY.getStatus()) || couponTemplateDO.getCategory().equals(CouponCategoryEnum.POINT.getStatus()) + )){ + // 获取当前优惠券已经领取的数量 + final Integer gainTotal = getExistGainCouponRecordAmountById(couponTemplateDO.getId()); + if(couponTemplateDO.getCouponAmount().compareTo(gainTotal)<=0){ + throw new ValidationException("当前优惠券已经领完!"); + } + } - // 获取当前优惠券已经领取的数量 - final Integer customGainTotal = getUserGainCouponRecordAmountById(couponTemplateDO.getId(),customer.getId()); - if(couponTemplateDO.getGetLimit().compareTo(customGainTotal)<=0){ - throw new ValidationException("超出个人领取限制,每人限领"+couponTemplateDO.getGetLimit()+"张!"); + // 根据用户领取设置的getLimit 查看当前用户是否已经超领优惠券 + if(StringUtils.isNotBlank(couponTemplateDO.getCategory()) && couponTemplateDO.getCategory().equals(CouponCategoryEnum.ACTIVITY.getStatus()) ){ + // 查看当前优惠券的领取时间在不在设置的领取时间范围类 + LocalDateTime now = LocalDateTime.now(); + // 判断当前时间是否在领取时间范围内 + if (!(now.isAfter(couponTemplateDO.getGetStartDate()) && now.isBefore(couponTemplateDO.getGetEndDate()))) { + throw new ValidationException("当前时间不在优惠券的领取时间范围内,无法操作!"); + } + + // 获取当前优惠券已经领取的数量 + final Integer customGainTotal = getUserGainCouponRecordAmountById(couponTemplateDO.getId(),customer.getId()); + if(couponTemplateDO.getGetLimit().compareTo(customGainTotal)<=0){ + throw new ValidationException("超出个人领取限制,每人限领"+couponTemplateDO.getGetLimit()+"张!"); + } + } + + + CouponRecordDO couponRecordDO=new CouponRecordDO(); + BeanUtils.copyProperties(dto,couponRecordDO); + couponRecordDO.create(SecurityUtils.getUserId()); + // 设置为待使用状态 + couponRecordDO.setStatus(CouponUsedStatusEnum.UNUSED.getType()); + + // 根据商户设置用户id + if(StringUtils.isBlank(dto.getUserId()) && StringUtils.isNotBlank(customer.getUserId())){ + couponRecordDO.setUserId(customer.getUserId()); + } + + // 优惠券字段冗余 + couponRecordDO.setCategory(couponTemplateDO.getGetUserType()); + couponRecordDO.setCouponCode(couponTemplateDO.getCouponCode()); + couponRecordDO.setCouponName(couponTemplateDO.getCouponName()); + couponRecordDO.setCouponDiscountValue(couponTemplateDO.getCouponDiscountValue()); + couponRecordDO.setMinOrderAmount(couponTemplateDO.getMinOrderAmount()); + couponRecordDO.setGetType(couponTemplateDO.getGetType()); + couponRecordDO.setCouponDiscountType(couponTemplateDO.getCouponDiscountType()); + couponRecordDO.setGetUserType(couponTemplateDO.getGetUserType()); + couponRecordDO.setPoint(couponTemplateDO.getPoint()); + couponRecordDO.setMemberId(couponRecordDO.getMemberId()); + + + // 根据优惠券模板来计算优惠券的生效开始时间和结束时间 + if(StringUtils.isNotBlank(couponTemplateDO.getCategory()) && couponTemplateDO.getCategory().equals(CouponCategoryEnum.MEMBER.getStatus())){ + // 如果是会员优惠券的话,则设置为优惠券的使用条件为优惠券的时间 + couponRecordDO.setEffectiveStart(couponTemplateDO.getUsageStartDate()); + couponRecordDO.setEffectiveEnd(couponTemplateDO.getUsageEndDate()); + }else{ + // 非会员的根据领取时间类型来计算优惠券的时间 + if(StringUtils.isNotBlank(couponTemplateDO.getUsageType()) && couponTemplateDO.getUsageType().equals(CouponUsageTypeEnum.GET.getType())){ + // 与领取时间一致 + couponRecordDO.setEffectiveStart(couponTemplateDO.getGetStartDate()); + couponRecordDO.setEffectiveEnd(couponTemplateDO.getGetEndDate()); + } + if(StringUtils.isNotBlank(couponTemplateDO.getUsageType()) && couponTemplateDO.getUsageType().equals(CouponUsageTypeEnum.FIXED.getType())){ + // 固定时间 + couponRecordDO.setEffectiveStart(couponTemplateDO.getUsageStartDate()); + couponRecordDO.setEffectiveEnd(couponTemplateDO.getUsageEndDate()); + } + if(StringUtils.isNotBlank(couponTemplateDO.getUsageType()) && couponTemplateDO.getUsageType().equals(CouponUsageTypeEnum.GET_AFTER_TIME.getType())){ + // 领取后有段时间 领取后有效时间 + // 根据发放后有效期来设置时间 + if (couponTemplateDO.getUsageTimeNum() == null || couponTemplateDO.getUsageTimeNum() <= 0) { + throw new IllegalArgumentException("使用时间数量必须为正整数"); + } + LocalDateTime currentTime = LocalDateTime.now(); + couponRecordDO.setEffectiveStart(currentTime); + if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.DAY.getType())) { + // 天 + couponRecordDO.setEffectiveEnd(currentTime.plusDays(couponTemplateDO.getUsageTimeNum())); + } + if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.HOUR.getType())) { + // 小时 + couponRecordDO.setEffectiveEnd(currentTime.plusHours(couponTemplateDO.getUsageTimeNum())); + } + if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.MINUTE.getType())) { + // 分钟 + couponRecordDO.setEffectiveEnd(currentTime.plusMinutes(couponTemplateDO.getUsageTimeNum())); + } + + } + } + + return baseMapper.insert(couponRecordDO)>0; + + } finally { + lock.unlock(); + } } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + // 处理异常 } + return false; - CouponRecordDO couponRecordDO=new CouponRecordDO(); - BeanUtils.copyProperties(dto,couponRecordDO); - couponRecordDO.create(SecurityUtils.getUserId()); - // 设置为待使用状态 - couponRecordDO.setStatus(CouponUsedStatusEnum.UNUSED.getType()); - - // 根据商户设置用户id - if(StringUtils.isBlank(dto.getUserId()) && StringUtils.isNotBlank(customer.getUserId())){ - couponRecordDO.setUserId(customer.getUserId()); - } - - // 优惠券字段冗余 - couponRecordDO.setCategory(couponTemplateDO.getGetUserType()); - couponRecordDO.setCouponCode(couponTemplateDO.getCouponCode()); - couponRecordDO.setCouponName(couponTemplateDO.getCouponName()); - couponRecordDO.setCouponDiscountValue(couponTemplateDO.getCouponDiscountValue()); - couponRecordDO.setMinOrderAmount(couponTemplateDO.getMinOrderAmount()); - couponRecordDO.setGetType(couponTemplateDO.getGetType()); - couponRecordDO.setCouponDiscountType(couponTemplateDO.getCouponDiscountType()); - couponRecordDO.setGetUserType(couponTemplateDO.getGetUserType()); - couponRecordDO.setPoint(couponTemplateDO.getPoint()); - couponRecordDO.setMemberId(couponRecordDO.getMemberId()); - - - // 根据优惠券模板来计算优惠券的生效开始时间和结束时间 - if(StringUtils.isNotBlank(couponTemplateDO.getCategory()) && couponTemplateDO.getCategory().equals(CouponCategoryEnum.MEMBER.getStatus())){ - // 如果是会员优惠券的话,则设置为优惠券的使用条件为优惠券的时间 - couponRecordDO.setEffectiveStart(couponTemplateDO.getUsageStartDate()); - couponRecordDO.setEffectiveEnd(couponTemplateDO.getUsageEndDate()); - }else{ - // 非会员的根据领取时间类型来计算优惠券的时间 - if(StringUtils.isNotBlank(couponTemplateDO.getUsageType()) && couponTemplateDO.getUsageType().equals(CouponUsageTypeEnum.GET.getType())){ - // 与领取时间一致 - couponRecordDO.setEffectiveStart(couponTemplateDO.getGetStartDate()); - couponRecordDO.setEffectiveEnd(couponTemplateDO.getGetEndDate()); - } - if(StringUtils.isNotBlank(couponTemplateDO.getUsageType()) && couponTemplateDO.getUsageType().equals(CouponUsageTypeEnum.FIXED.getType())){ - // 固定时间 - couponRecordDO.setEffectiveStart(couponTemplateDO.getUsageStartDate()); - couponRecordDO.setEffectiveEnd(couponTemplateDO.getUsageEndDate()); - } - if(StringUtils.isNotBlank(couponTemplateDO.getUsageType()) && couponTemplateDO.getUsageType().equals(CouponUsageTypeEnum.GET_AFTER_TIME.getType())){ - // 领取后有段时间 领取后有效时间 - // 根据发放后有效期来设置时间 - if (couponTemplateDO.getUsageTimeNum() == null || couponTemplateDO.getUsageTimeNum() <= 0) { - throw new IllegalArgumentException("使用时间数量必须为正整数"); - } - LocalDateTime currentTime = LocalDateTime.now(); - couponRecordDO.setEffectiveStart(currentTime); - if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.DAY.getType())) { - // 天 - couponRecordDO.setEffectiveEnd(currentTime.plusDays(couponTemplateDO.getUsageTimeNum())); - } - if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.HOUR.getType())) { - // 小时 - couponRecordDO.setEffectiveEnd(currentTime.plusHours(couponTemplateDO.getUsageTimeNum())); - } - if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.MINUTE.getType())) { - // 分钟 - couponRecordDO.setEffectiveEnd(currentTime.plusMinutes(couponTemplateDO.getUsageTimeNum())); - } - - } - } - - return baseMapper.insert(couponRecordDO)>0; } @Override @@ -216,58 +247,60 @@ @Override public boolean grantVipCouponRecordList() { - // TODO 会员等级修改 -// try{ -// LocalDateTime now = LocalDateTime.now(); -// LocalDateTime firstDayStart = now.with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0).withNano(0); -// LocalDateTime lastDayEnd = now.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59).withNano(0); -// -// // 获取所有会员模版列表 -// List<CouponTemplateDO> vipTemplateList= couponTemplateService.getVipCouponTemplate(); -// -// // 遍历所有相同等级用户信息,并根据优惠券设置的规则构造优惠券 -// final List<CouponTemplateDO> updateCouponTemplateList = vipTemplateList.stream().map(couponTemplateDO -> { -// final List<User> vipGradeUserList = userService.getVipGradeUserList(couponTemplateDO.getVipGrade()); -// final List<CouponRecordDO> gradeCouponRecordList = vipGradeUserList.stream().map(user -> { -// CouponRecordDO couponRecordDO = new CouponRecordDO(); -// BeanUtils.copyProperties(couponTemplateDO, couponRecordDO); -// couponRecordDO.setId(IdUtil.simpleUUID()); -// couponRecordDO.setCouponId(couponTemplateDO.getId()); -// couponRecordDO.setUserId(user.getId()); -// couponRecordDO.setStatus(CouponUsedStatusEnum.UNUSED.getType()); -// couponRecordDO.setEffectiveStart(firstDayStart); -// couponRecordDO.setEffectiveEnd(lastDayEnd); -// -// // 创建信息 -// couponRecordDO.create(); -// return couponRecordDO; -// }).collect(Collectors.toList()); -// -// // 批量保存等级下的优惠券信息 -// saveBatch(gradeCouponRecordList); -// -// couponTemplateDO.setUsageStartDate(firstDayStart); -// couponTemplateDO.setUsageEndDate(lastDayEnd); -// couponTemplateDO.setGetStartDate(firstDayStart); -// couponTemplateDO.setGetEndDate(lastDayEnd); -// -// // 设置默认类型固定 -// couponTemplateDO.setUsageType(CouponUsageTypeEnum.FIXED.getType()); -// -// return couponTemplateDO; -// -// }).collect(Collectors.toList()); -// -// // 批量更新原模版时间 -// couponTemplateService.updateBatchById(updateCouponTemplateList); -// -// return true; -// }catch (Exception e){ -// // 报错日志信息报错 -// log.error(e.getMessage()); -// return false; -// } - return false; + try{ + LocalDateTime now = LocalDateTime.now(); + LocalDateTime firstDayStart = now.with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0).withNano(0); + LocalDateTime lastDayEnd = now.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59).withNano(0); + + // 获取所有会员模版列表 + List<CouponTemplateDO> vipTemplateList= couponTemplateService.getVipCouponTemplate(); + + // 遍历所有相同等级用户信息,并根据优惠券设置的规则构造优惠券 + final List<CouponTemplateDO> updateCouponTemplateList = vipTemplateList.stream().map(couponTemplateDO -> { + // 获取当前等级下的所有用户 + final List<Customer> customerList = customerService.getCustomerListByLevelId(couponTemplateDO.getMemberId()); + + final List<CouponRecordDO> gradeCouponRecordList = customerList.stream().map(customer -> { + CouponRecordDO couponRecordDO = new CouponRecordDO(); + BeanUtils.copyProperties(couponTemplateDO, couponRecordDO); + couponRecordDO.setId(IdUtil.simpleUUID()); + couponRecordDO.setCouponId(couponTemplateDO.getId()); + couponRecordDO.setUserId(customer.getUserId()); + couponRecordDO.setCustomerId(customer.getId()); + couponRecordDO.setStatus(CouponUsedStatusEnum.UNUSED.getType()); + couponRecordDO.setEffectiveStart(firstDayStart); + couponRecordDO.setEffectiveEnd(lastDayEnd); + couponRecordDO.setMemberId(couponTemplateDO.getMemberId()); + + // 创建信息 + couponRecordDO.create(); + return couponRecordDO; + }).collect(Collectors.toList()); + + // 批量保存等级下的优惠券信息 + saveBatch(gradeCouponRecordList); + + couponTemplateDO.setUsageStartDate(firstDayStart); + couponTemplateDO.setUsageEndDate(lastDayEnd); + couponTemplateDO.setGetStartDate(firstDayStart); + couponTemplateDO.setGetEndDate(lastDayEnd); + + // 设置默认类型固定 + couponTemplateDO.setUsageType(CouponUsageTypeEnum.FIXED.getType()); + + return couponTemplateDO; + + }).collect(Collectors.toList()); + + // 批量更新原模版时间 + couponTemplateService.updateBatchById(updateCouponTemplateList); + + return true; + }catch (Exception e){ + // 报错日志信息报错 + log.error(e.getMessage()); + return false; + } } @Override @@ -350,6 +383,16 @@ @Override public List<CouponRecordVO> getMineCouponRecordList(QueryMineCouponRecordDTO dto) { + checkCouponExpired(dto); return couponRecordMapperCustom.getMineCouponRecordList(dto); } + + @Override + public void checkCouponExpired(QueryMineCouponRecordDTO dto) { + if(StringUtils.isBlank(dto.getUserId())){ + dto.setUserId(SecurityUtils.getUserId()); + } + // 将未使用的优惠券直接过期 + couponRecordMapperCustom.checkCouponExpired(dto); + } } diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java index 1663e93..5faa3c9 100644 --- a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java +++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java @@ -91,7 +91,6 @@ return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponRecordService.getMineCouponRecordList(dto), CouponTemplateAppVO.class)); - } @GetMapping("/mine/used/list") @ApiOperation(value = "我的优惠券-已使用", notes = "我的优惠券-已使用") @@ -113,9 +112,6 @@ return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponRecordService.getMineCouponRecordList(dto), CouponTemplateAppVO.class)); } - - - } diff --git a/src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml b/src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml index 2444d74..1254df6 100644 --- a/src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml +++ b/src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml @@ -31,6 +31,15 @@ <result column="order_no" property="orderNo" /> </resultMap> + <update id="checkCouponExpired"> + update t_coupon_record set `status`='expired' where `status`='unused' and effective_end < NOW() + <if test="param.userId != null and param.userId != ''"> + AND t.user_id = #{param.userId} + </if> + <if test="param.customerId != null and param.customerId != ''"> + AND t.customer_id = #{param.customerId} + </if> + </update> <select id="statisCouponTemplateCount" resultType="java.lang.Integer"> select IFNULL(count(1),0) as cnt from t_coupon_record where deleted=false and category=#{param.category} -- Gitblit v1.9.3