소스 검색

fix 渠道推广添加关联优惠券;添加直接领取优惠券接口

zoujiajian 3 년 전
부모
커밋
ed964ddff3

+ 17 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ChannelPopularize.java

@@ -1,8 +1,15 @@
 package com.cyksj.model.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.cyksj.model.views.CouponTfPopularizeView;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.List;
+
 /**
  * @author chan
  * @date 2022/12/13 2:27 PM
@@ -46,4 +53,14 @@ public class ChannelPopularize extends BaseEntity{
      */
     private Boolean isShowLogo;
 
+    /**
+     * 绑定的优惠券
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    @JsonIgnore
+    private String couponIds;
+
+    @DbIgnore
+    @TableField(exist = false)
+    private List<CouponTfPopularizeView> coupons;
 }

+ 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;
+}

+ 101 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CouponTfPopularizeView.java

@@ -0,0 +1,101 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.Coupon;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: CouponTfPopularizeView
+ *创建者: JavaZou
+ *创建时间:2023/7/7 15:15
+ */
+@Getter
+@Setter
+@SearchBean(tables = "coupon c left join coupon_user cu on cu.coupon_id = c.id :user_id:")
+public class CouponTfPopularizeView {
+
+	/**
+	 * 优惠券id
+	 */
+	@DbField("c.id")
+	private Long couponId;
+
+	/**
+	 * 优惠券名称
+	 */
+	@DbField("c.name")
+	private String name;
+
+	/**
+	 * 优惠券平台类型
+	 */
+	@DbField("c.goods_type")
+	private Coupon.GoodsType goodsType;
+
+	/**
+	 * 优惠券类型
+	 */
+	@DbField("c.type")
+	private Coupon.Type type;
+
+	/**
+	 * 可用满减卷金额条件
+	 */
+	@DbField("c.reduce_condition")
+	private BigDecimal reduceCondition;
+
+	/**
+	 * 抵扣金额
+	 */
+	@DbField("c.reduce_money")
+	private BigDecimal reduceMoney;
+
+	/**
+	 * 折扣
+	 */
+	@DbField("c.discount")
+	private BigDecimal discount;
+
+	@DbIgnore
+	private String goodsSkuStr;
+
+	/**
+	 * 是否是有效时间
+	 */
+	@DbField("c.is_valid_time")
+	private Boolean isValidTime;
+
+	/**
+	 * 起始有效时间
+	 */
+	@DbField("c.valid_start_time")
+	private Date validStartTime;
+
+	/**
+	 * 截止有效时间
+	 */
+	@DbField("c.valid_end_time")
+	private Date validEndTime;
+
+	/**
+	 * 领取有效天数
+	 */
+	@DbField("c.valid_days")
+	private Integer validDays;
+
+	/**
+	 * 使用范围
+	 */
+	@DbField("c.use_scope")
+	private Coupon.UseScope useScope;
+
+	@DbField("case when cu.id is not null then 'received' else 'collecting' end")
+	private CouponActiveView.CouponStatus couponStatus;
+}

+ 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);
 }

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

@@ -2,16 +2,19 @@ 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.enums.GatewayApiCode;
+import com.cyksj.mapper.UserMapper;
+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 +57,14 @@ public class CouponFontServiceImpl implements CouponFontService {
 
 	private final CouponRecommendMapper recommendMapper;
 
+	private final ChannelPopularizeMapper channelPopularizeMapper;
+
+	private final UserMapper userMapper;
+
 	@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 +72,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 +87,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 +216,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 +229,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 +271,60 @@ 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();
+		//是否是该渠道来源新用户
+		User user = userMapper.selectById(userId);
+		if (user == null) {
+			throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_USER_NO_FIND);
+		}
+		if (!user.getPopularizeId().equals(req.getPopularizeId())) {
+			throw BusinessRuntimeException.getInstance("渠道推广新用户才能领取该优惠券");
+		}
+		//渠道链接是否存在
+		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("链接未关联该优惠券");
+			}
+		} catch (Exception e) {
+			throw BusinessRuntimeException.getInstance("链接未关联该优惠券");
+		}
+		//优惠券领取状态校验
+		collectCommonCheck(couponId, userId);
+		//领取优惠券
+		receiveCouponUser(couponId, userId, CouponUser.Channel.channel_popularize);
+	}
+
+	/**
+	 * 领取优惠券
+	 */
+	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("已领取成功");
+		}
+	}
 }

+ 35 - 2
netflix-web/src/main/java/com/cyksj/web/controller/channel/ChannelController.java

@@ -1,17 +1,28 @@
 package com.cyksj.web.controller.channel;
 
+import cn.hutool.core.util.StrUtil;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.channel.ChannelPopularizeVisitMapper;
 import com.cyksj.mapper.channel.MoviesVisitRecordMapper;
+import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
 import com.cyksj.model.entity.ChannelPopularize;
 import com.cyksj.model.entity.ChannelPopularizeVisit;
 import com.cyksj.model.entity.MoviesVisitRecord;
+import com.cyksj.model.views.CouponTfPopularizeView;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapBuilder;
+import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * @author chan
  * @date 2022/12/13 2:36 PM
@@ -27,12 +38,34 @@ public class ChannelController {
 
     private final MoviesVisitRecordMapper moviesVisitRecordMapper;
 
+    private final BeanSearcher beanSearcher;
+
+    private final CouponSkuMapper couponSkuMapper;
+
     @GetMapping("/get/{id}")
-    public Result<ChannelPopularize> getById(@PathVariable Long id){
+    public Result<ChannelPopularize> getById(@PathVariable Long id, Boolean isLogin) {
         ChannelPopularize channelPopularize = popularizeMapper.selectById(id);
-        if(channelPopularize == null){
+        if (channelPopularize == null) {
             throw BusinessRuntimeException.getInstance("该链接不存在!");
         }
+        if (StrUtil.isNotBlank(channelPopularize.getCouponIds())) {
+            try {
+                List<Long> couponIds = Jsons.parseList(channelPopularize.getCouponIds(), Long.class);
+                Long userId = (isLogin != null && !isLogin) ? null : StpUserUtil.getLoginIdAsLong();
+                MapBuilder builder = MapUtils.builder().field(CouponTfPopularizeView::getCouponId, couponIds).op(Operator.InList);
+                if (userId != null) {
+                    builder.put("user_id", String.format("and cu.user_id = %s", userId));
+                }
+                List<CouponTfPopularizeView> couponTfPopularizeViews = beanSearcher.searchAll(CouponTfPopularizeView.class, builder.build());
+                couponTfPopularizeViews.forEach(data -> {
+                    String str = couponSkuMapper.selectGoodsSkuStr(data.getCouponId());
+                    data.setGoodsSkuStr(str.replaceAll(",", "/").replaceAll(";", ""));
+                });
+                channelPopularize.setCoupons(couponTfPopularizeViews);
+            } catch (Exception e) {
+                System.out.println(e.getMessage());
+            }
+        }
         ChannelPopularizeVisit channelPopularizeVisit = new ChannelPopularizeVisit();
         channelPopularizeVisit.setPopularizeId(id);
         channelPopularizeVisitMapper.insert(channelPopularizeVisit);

+ 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("领取成功");
+	}
 }