From 6e4d62beb7d449cd89bb785592d62932f95df391 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期五, 30 八月 2024 10:41:37 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master-v2' into master-v2

---
 src/main/java/com/mzl/flower/entity/coupon/CouponTemplateCustomerDO.java         |    2 
 src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java                   |    2 
 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateBO.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 +++++++++++++++
 10 files changed, 145 insertions(+), 54 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/CreateCouponTemplateBO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateBO.java
index b3df572..41ad94b 100644
--- a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateBO.java
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateBO.java
@@ -144,6 +144,6 @@
 
     @ApiModelProperty(value = "指定的用户列表id")
     @NotNull(message = "指定的用户列表id不能为空")
-    private List<String> pointCostomIdList;
+    private List<Long> pointCostomIdList;
 
 }
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/entity/coupon/CouponTemplateCustomerDO.java b/src/main/java/com/mzl/flower/entity/coupon/CouponTemplateCustomerDO.java
index 50e96a5..b698ca1 100644
--- a/src/main/java/com/mzl/flower/entity/coupon/CouponTemplateCustomerDO.java
+++ b/src/main/java/com/mzl/flower/entity/coupon/CouponTemplateCustomerDO.java
@@ -29,7 +29,7 @@
      * 指定的顾客id
      */
     @TableField("custom_id")
-    private String customId;
+    private Long customId;
 
 
 }
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