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