Переглянути джерело

fix 添加直接领取优惠券接口

zoujiajian 3 роки тому
батько
коміт
c9b9903e34

+ 2 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/CouponUser.java

@@ -61,7 +61,8 @@ public class CouponUser extends BaseEntity {
 		task("task", "完成任务"),
 		equipment("equipment", "实物设备分销"),
 		ques_response("ques_response", "问卷回答"),
-		corp_bulk_task("corp_bulk_task", "企业微信群发任务")
+		corp_bulk_task("corp_bulk_task", "企业微信群发任务"),
+		channel_popularize("channel_popularize", "渠道推广"),
 		;
 		private String channel;
 		private String desc;

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/model/request/ChannelPopularizeCouponReq.java

@@ -0,0 +1,24 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/*
+ *项目名: netflix
+ *文件名: ChannelPopularizeCouponReq
+ *创建者: JavaZou
+ *创建时间:2023/7/7 15:48
+ */
+@Getter
+@Setter
+public class ChannelPopularizeCouponReq {
+	@NotNull
+	private Long popularizeId;
+
+	@NotNull
+	private Long couponId;
+
+	private Long userId;
+}

+ 6 - 0
netflix-service/src/main/java/com/cyksj/service/coupon/CouponFontService.java

@@ -4,6 +4,7 @@ import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.model.entity.CouponUser;
 import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.request.ChannelPopularizeCouponReq;
 import com.cyksj.model.request.CouponCollectReq;
 import com.cyksj.model.views.CouponUserView;
 
@@ -50,4 +51,9 @@ public interface CouponFontService {
 	 * 归还优惠券
 	 */
 	void updateOrderDonCouponStatus(OrderDon orderDon);
+
+	/**
+	 * 渠道推广用户领取优惠券
+	 */
+	void receiveChannelPopularizeCoupon(ChannelPopularizeCouponReq req);
 }

+ 64 - 39
netflix-service/src/main/java/com/cyksj/service/coupon/impl/CouponFontServiceImpl.java

@@ -2,16 +2,17 @@ package com.cyksj.service.coupon.impl;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.Jsons;
+import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.manage.coupon.*;
-import com.cyksj.model.entity.Coupon;
-import com.cyksj.model.entity.CouponActive;
-import com.cyksj.model.entity.CouponUser;
-import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.request.ChannelPopularizeCouponReq;
 import com.cyksj.model.request.CouponCollectReq;
 import com.cyksj.model.views.*;
 import com.cyksj.service.coupon.CouponFontService;
@@ -54,10 +55,12 @@ public class CouponFontServiceImpl implements CouponFontService {
 
 	private final CouponRecommendMapper recommendMapper;
 
+	private final ChannelPopularizeMapper channelPopularizeMapper;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void collectCoupon(CouponCollectReq couponCollectReq, Long userId) {
-		collectCommonCheck(couponCollectReq, userId);
+		collectCommonCheck(couponCollectReq.getCouponId(), userId);
 		CouponActive couponActive = couponActiveMapper.selectById(couponCollectReq.getCouponActiveId());
 		if (couponActive == null) {
 			throw BusinessRuntimeException.getInstance("该发放优惠券不存在");
@@ -65,21 +68,8 @@ public class CouponFontServiceImpl implements CouponFontService {
 		if (couponActive.getRemainNum() <= 0) {
 			throw BusinessRuntimeException.getInstance("该优惠券已领取完");
 		}
-		CouponUser couponUser = new CouponUser();
-		couponUser.setUserId(userId);
-		couponUser.setCouponId(couponCollectReq.getCouponId());
-		//领券中心
-		couponUser.setChannel(CouponUser.Channel.center);
-		couponUser.setStatus(CouponUser.Status.unused);
-		couponUser.setCouponActiveId(couponCollectReq.getCouponActiveId());
-		//优惠券有效时间
-		this.updateCouponUserValidTime(couponActive.getCouponId(), couponUser);
-		try {
-			couponUserMapper.insert(couponUser);
-		} catch (DuplicateKeyException e) {
-			log.info("用户:{}重复领取优惠券{}插入数据错误", userId, couponCollectReq.getCouponId());
-			throw BusinessRuntimeException.getInstance("已领取成功");
-		}
+
+		receiveCouponUser(couponCollectReq.getCouponId(), userId, CouponUser.Channel.center);
 		if (couponActive != null) {
 			//发放优惠券记录剩余数量
 			Integer remainNum = couponActive.getRemainNum();
@@ -93,22 +83,9 @@ public class CouponFontServiceImpl implements CouponFontService {
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void collectRecommendCoupon(CouponCollectReq couponCollectReq, Long userId) {
-		collectCommonCheck(couponCollectReq, userId);
-		CouponUser couponUser = new CouponUser();
-		couponUser.setUserId(userId);
-		couponUser.setCouponId(couponCollectReq.getCouponId());
-		//推荐渠道
-		couponUser.setChannel(CouponUser.Channel.recommend);
-		couponUser.setStatus(CouponUser.Status.unused);
-		couponUser.setRecommendId(couponCollectReq.getCouponRecommendId());
-		//优惠券有效时间
-		this.updateCouponUserValidTime(couponCollectReq.getCouponId(), couponUser);
-		try {
-			couponUserMapper.insert(couponUser);
-		} catch (DuplicateKeyException e) {
-			log.info("用户:{}重复领取推荐优惠券{}插入数据错误", userId, couponCollectReq.getCouponId());
-			throw BusinessRuntimeException.getInstance("已领取成功");
-		}
+		collectCommonCheck(couponCollectReq.getCouponId(), userId);
+
+		receiveCouponUser(couponCollectReq.getCouponId(), userId, CouponUser.Channel.recommend);
 	}
 
 	@Override
@@ -235,8 +212,8 @@ public class CouponFontServiceImpl implements CouponFontService {
 		return recommendCouponList.size();
 	}
 
-	public void collectCommonCheck(CouponCollectReq couponCollectReq, Long userId) {
-		Coupon coupon = couponMapper.selectById(couponCollectReq.getCouponId());
+	public void collectCommonCheck(Long couponId, Long userId) {
+		Coupon coupon = couponMapper.selectById(couponId);
 		if (coupon == null || !coupon.getDeleted()) {
 			throw BusinessRuntimeException.getInstance("该优惠券不存在");
 		}
@@ -248,7 +225,7 @@ public class CouponFontServiceImpl implements CouponFontService {
 				throw BusinessRuntimeException.getInstance("该优惠券只能新用户才能领取");
 			}
 		}
-		CouponUser couponUser = couponUserMapper.selectOne(Wrappers.lambdaQuery(CouponUser.class).eq(CouponUser::getUserId, userId).eq(CouponUser::getCouponId, couponCollectReq.getCouponId()));
+		CouponUser couponUser = couponUserMapper.selectOne(Wrappers.lambdaQuery(CouponUser.class).eq(CouponUser::getUserId, userId).eq(CouponUser::getCouponId, couponId));
 		if (couponUser != null) {
 			if (couponUser.getChannel() == CouponUser.Channel.exCode) {
 				throw BusinessRuntimeException.getInstance("您已兑换过该优惠券..");
@@ -290,4 +267,52 @@ public class CouponFontServiceImpl implements CouponFontService {
 		}
 		log.info("订单:{}退款,优惠券返还end...", orderDon.getId());
 	}
+
+	@Override
+	public void receiveChannelPopularizeCoupon(ChannelPopularizeCouponReq req) {
+		Long userId = req.getUserId();
+		Long popularizeId = req.getPopularizeId();
+		Long couponId = req.getCouponId();
+		//渠道链接是否存在
+		ChannelPopularize channelPopularize = channelPopularizeMapper.selectById(popularizeId);
+		Assert.notNull(channelPopularize, "链接不存在");
+		//是否关联该优惠券
+		String couponIds = channelPopularize.getCouponIds();
+		if (StrUtil.isEmpty(couponIds)) {
+			throw BusinessRuntimeException.getInstance("链接未关联该优惠券");
+		}
+		List<Long> couponIdList = null;
+		try {
+			couponIdList = Jsons.parseList(couponIds, Long.class);
+			if (!couponIdList.contains(couponId)) {
+				throw BusinessRuntimeException.getInstance("链接未关联该优惠券");
+			}
+			//优惠券领取状态校验
+			collectCommonCheck(couponId, userId);
+			//领取优惠券
+			receiveCouponUser(couponId, userId, CouponUser.Channel.channel_popularize);
+		} catch (Exception e) {
+			throw BusinessRuntimeException.getInstance("链接未关联该优惠券");
+		}
+	}
+
+	/**
+	 * 领取优惠券
+	 */
+	public void receiveCouponUser(Long couponId, Long userId, CouponUser.Channel channel) {
+		CouponUser couponUser = new CouponUser();
+		couponUser.setUserId(userId);
+		couponUser.setCouponId(couponId);
+
+		couponUser.setChannel(channel);
+		couponUser.setStatus(CouponUser.Status.unused);
+		//优惠券有效时间
+		this.updateCouponUserValidTime(couponId, couponUser);
+		try {
+			couponUserMapper.insert(couponUser);
+		} catch (DuplicateKeyException e) {
+			log.info("用户:{}重复领取优惠券{}插入数据错误", userId, couponId);
+			throw BusinessRuntimeException.getInstance("已领取成功");
+		}
+	}
 }

+ 13 - 0
netflix-web/src/main/java/com/cyksj/web/controller/coupon/CouponFrontController.java

@@ -18,6 +18,7 @@ import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
 import com.cyksj.model.dto.CouponPopularizeDto;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.request.ChannelPopularizeCouponReq;
 import com.cyksj.model.request.CouponCollectReq;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
@@ -27,6 +28,7 @@ import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
@@ -329,4 +331,15 @@ public class CouponFrontController {
 				.build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(couponViews);
 	}
+
+	/**
+	 * 渠道推广用户领取优惠券
+	 */
+	@PostMapping("/channel/popularize/receive")
+	public Result<String> receiveChannelPopularizeCoupon(@RequestBody @Validated ChannelPopularizeCouponReq req) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		req.setUserId(userId);
+		couponFontService.receiveChannelPopularizeCoupon(req);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("领取成功");
+	}
 }