From dfb9a4823a95427f4a709ede63078df771d5b677 Mon Sep 17 00:00:00 2001
From: gongzuming <gongzuming>
Date: 星期五, 30 八月 2024 10:36:40 +0800
Subject: [PATCH] 积分兑换券兑换
---
src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java | 2
src/main/java/com/mzl/flower/service/coupon/CouponTemplateService2.java | 2
src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java | 95 +++++++++++------------
src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordDTO.java | 5
src/main/java/com/mzl/flower/service/point/PointGoodsService.java | 3
src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java | 11 ++
src/main/java/com/mzl/flower/dto/request/coupon/ExchangeCouponDTO.java | 16 ++++
src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java | 61 +++++++++++++++
8 files changed, 143 insertions(+), 52 deletions(-)
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordDTO.java
index 4386cad..b5e7334 100644
--- a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordDTO.java
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordDTO.java
@@ -4,6 +4,7 @@
import lombok.Data;
import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
@Data
public class CreateCouponRecordDTO {
@@ -30,8 +31,8 @@
* 商户ID
*/
@ApiModelProperty(value = "商户ID")
- @NotEmpty(message = "商户ID不能为空")
- private String customerId;
+ @NotNull(message = "商户ID不能为空")
+ private Long customerId;
/**
* 状态(coupon_record_status)未使用、已使用、已过期
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/ExchangeCouponDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/ExchangeCouponDTO.java
new file mode 100644
index 0000000..c5fe403
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/ExchangeCouponDTO.java
@@ -0,0 +1,16 @@
+package com.mzl.flower.dto.request.coupon;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class ExchangeCouponDTO {
+
+ @NotNull(message = "优惠券id不能为空")
+ private String couponId;
+
+ @ApiModelProperty(value = "兑换数量",hidden = true)
+ private Integer num;
+}
diff --git a/src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java b/src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java
index 964e122..3fdb745 100644
--- a/src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java
+++ b/src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java
@@ -33,7 +33,7 @@
/**
* 商户ID
*/
- private String customerId;
+ private Long customerId;
/**
* 状态(coupon_record_status)未使用、已使用、已过期
diff --git a/src/main/java/com/mzl/flower/service/coupon/CouponTemplateService2.java b/src/main/java/com/mzl/flower/service/coupon/CouponTemplateService2.java
index f30f175..648effb 100644
--- a/src/main/java/com/mzl/flower/service/coupon/CouponTemplateService2.java
+++ b/src/main/java/com/mzl/flower/service/coupon/CouponTemplateService2.java
@@ -81,4 +81,6 @@
* @return
*/
Page<CouponTemplateVO> getPointPage(Page page, QueryActivePointCouponDTO dto);
+
+ void exchangeCoupon(ExchangeCouponDTO dto);
}
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 3724c94..a56b81e 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
@@ -73,6 +73,9 @@
}
final CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getCouponId());
+ if(couponTemplateDO==null){
+ throw new ValidationException("优惠券不存在");
+ }
// TODO 活动优惠券和积分优惠券需要根据库存来控制- 根据优惠券的发放数量来控制有没有超发
@@ -92,60 +95,56 @@
}
// 优惠券字段冗余
-
- if(null!=couponTemplateDO){
- 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.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());
- // 根据优惠券模板来计算优惠券的生效开始时间和结束时间
- if(StringUtils.isNotBlank(couponTemplateDO.getCategory()) && couponTemplateDO.getCategory().equals(CouponCategoryEnum.MEMBER.getStatus())){
- // 如果是会员优惠券的话,则设置为优惠券的使用条件为优惠券的时间
+ // 根据优惠券模板来计算优惠券的生效开始时间和结束时间
+ 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());
- }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()));
- }
-
- }
}
+ 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()));
+ }
+ }
}
diff --git a/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java b/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java
index ec5c385..d5df0b5 100644
--- a/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java
+++ b/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java
@@ -1,10 +1,13 @@
package com.mzl.flower.service.impl.coupon;
import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mzl.flower.config.exception.ValidationException;
import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.constant.Constants;
import com.mzl.flower.dto.request.coupon.*;
import com.mzl.flower.dto.response.coupon.CouponPointStatisVO;
import com.mzl.flower.dto.response.coupon.CouponTemplateVO;
@@ -12,14 +15,20 @@
import com.mzl.flower.entity.coupon.CouponTemplateCustomerDO;
import com.mzl.flower.entity.coupon.CouponTemplateDO;
import com.mzl.flower.entity.customer.Customer;
+import com.mzl.flower.entity.point.CustomerPoint;
+import com.mzl.flower.entity.point.CustomerPointDetail;
+import com.mzl.flower.entity.point.PointGoodsRecord;
import com.mzl.flower.enums.*;
import com.mzl.flower.mapper.coupon.CouponTemplateMapper;
import com.mzl.flower.mapper.coupon.CouponTemplateMapperCustom;
import com.mzl.flower.mapper.customer.CustomerMapper;
+import com.mzl.flower.mapper.point.CustomerPointDetailMapper;
+import com.mzl.flower.mapper.point.CustomerPointMapper;
import com.mzl.flower.service.coupon.CouponRecordService;
import com.mzl.flower.service.coupon.CouponTemplateCustomerService;
import com.mzl.flower.service.coupon.CouponTemplateService2;
import com.mzl.flower.service.payment.OrderService;
+import com.mzl.flower.utils.UUIDGenerator;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
@@ -27,6 +36,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
@@ -55,7 +65,13 @@
private CustomerMapper customerMapper;
@Autowired
- private OrderService orderService;
+ private CustomerPointMapper customerPointMapper;
+
+ @Autowired
+ private CouponTemplateService2 couponTemplateService;
+
+ @Autowired
+ private CustomerPointDetailMapper customerPointDetailMapper;
@Transactional
@Override
@@ -323,4 +339,47 @@
return couponTemplateMapperCustom.getPointPage(page,dto);
}
+ @Override
+ public synchronized void exchangeCoupon(ExchangeCouponDTO dto) {
+ dto.setNum(1);
+
+ final CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getCouponId());
+ if(couponTemplateDO==null){
+ throw new ValidationException("优惠券不存在");
+ }
+
+ CustomerPoint cp = customerPointMapper.selectOne(new LambdaQueryWrapper<CustomerPoint>()
+ .eq(CustomerPoint::getUserId, SecurityUtils.getUserId()));
+ if(cp == null || (cp.getTotalPoint()-cp.getUsedPoint()-cp.getExpiredPoint()) < couponTemplateDO.getPoint() * dto.getNum()){
+ throw new ValidationException("积分不足");
+ }
+
+ CreateCouponRecordDTO recordDTO =new CreateCouponRecordDTO();
+ recordDTO.setCouponId(dto.getCouponId());
+ recordDTO.setUserId(SecurityUtils.getUserId());
+ Customer customer = customerMapper.selectOne(new LambdaQueryWrapper<Customer>()
+ .eq(Customer::getUserId, SecurityUtils.getUserId()));
+ if(customer == null){
+ throw new ValidationException("商户不存在");
+ }
+ recordDTO.setCustomerId(customer.getId());
+ couponRecordService.createCouponRecord(recordDTO);
+
+ //更新积分汇总
+ cp.setUsedPoint(cp.getUsedPoint()+couponTemplateDO.getPoint());
+ customerPointMapper.updateById(cp);
+
+ //记录积分明细
+ CustomerPointDetail detail = new CustomerPointDetail();
+ detail.setUserId(customer.getUserId());
+ detail.setCustomerId(customer.getId());
+ detail.setPoint(couponTemplateDO.getPoint());
+ detail.setChangeType(Constants.POINT_CHANGE_TYPE.reduce.name());
+ detail.setType(Constants.POINT_TYPE.exchange.name());
+ detail.setRecordDate(LocalDate.now());
+ detail.setRemarks(couponTemplateDO.getCouponName());
+ detail.create(SecurityUtils.getUserId());
+ customerPointDetailMapper.insert(detail);
+ }
+
}
diff --git a/src/main/java/com/mzl/flower/service/point/PointGoodsService.java b/src/main/java/com/mzl/flower/service/point/PointGoodsService.java
index 9e408ea..d7cca87 100644
--- a/src/main/java/com/mzl/flower/service/point/PointGoodsService.java
+++ b/src/main/java/com/mzl/flower/service/point/PointGoodsService.java
@@ -24,6 +24,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import java.time.LocalDate;
import java.util.List;
@Service
@@ -147,6 +148,8 @@
detail.setPoint(record.getTotalPoint());
detail.setChangeType(Constants.POINT_CHANGE_TYPE.reduce.name());
detail.setType(Constants.POINT_TYPE.exchange.name());
+ detail.setRecordDate(LocalDate.now());
+ detail.setRemarks(record.getName());
detail.create(SecurityUtils.getUserId());
customerPointDetailMapper.insert(detail);
diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java
index 301b0ca..4b51ad0 100644
--- a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java
+++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java
@@ -233,4 +233,15 @@
}
+
+
+
+ @PostMapping("/exchange")
+ @ApiOperation(value = "小程序-积分优惠券兑换", notes = "小程序-积分优惠券兑换")
+ public ResponseEntity<ReturnDataDTO> exchangeCoupon(@Validated @RequestBody ExchangeCouponDTO dto) {
+ couponTemplateService.exchangeCoupon(dto);
+ return returnData(R.SUCCESS.getCode(), null);
+
+
+ }
}
--
Gitblit v1.9.3