From a92e296c28d4c09055f53293378da001117ec979 Mon Sep 17 00:00:00 2001
From: gongzuming <gongzuming>
Date: 星期一, 02 九月 2024 17:13:03 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master-v2' into master-v2
---
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