Kaynağa Gözat

平台发券活动

zoujiajian 1 yıl önce
ebeveyn
işleme
5bea80fb80

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponMapper.java

@@ -34,4 +34,6 @@ public interface CouponMapper extends BaseMapper<Coupon> {
 	String getCouponNameByIds(List<Long> couponIds);
 
 	Coupon getRenewCouponBySkuId(@Param("skuId") Long skuId, @Param("couponIds") Set<Long> couponIds, @Param("userId") Long userId);
+
+	List<Long> getCouponSkuIds(@Param("couponIds") List<Long> couponIds);
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponUserMapper.java

@@ -41,4 +41,6 @@ public interface CouponUserMapper extends BaseMapper<CouponUser> {
 	Coupon selectUserCouponByGidAndPrice(@Param("userId") Long userId, @Param("goodsId") Long goodsId, @Param("price") BigDecimal price);
 
 	Coupon selectUserCouponBySkuId(@Param("userId") Long userId, @Param("skuId") Long skuId);
+
+	Coupon selectNoLoginRecommendCouponReduce(@Param("goodsId") Long goodsId, @Param("price") BigDecimal price);
 }

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

@@ -74,6 +74,7 @@ public class CouponUser extends BaseEntity {
 		customer_link("customer_link", "获客链接"),
 		student_cert("student_cert","大学生认证"),
 		yl("yl", "企业微信引流"),
+		ptfq("ptfq","平台发券")
 		;
 		private String channel;
 		private String desc;

+ 1 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserActivity.java

@@ -65,6 +65,7 @@ public class UserActivity extends BaseEntity {
 	/**
 	 * 0.大学生认证
 	 * 1.个人分销排行
+	 * 3.平台发券
 	 */
 	private Integer type;
 

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserActivityDistributeDetailView.java

@@ -40,10 +40,14 @@ public class UserActivityDistributeDetailView {
 	/**
 	 * 0.大学生认证
 	 * 1.个人分销排行
+	 * 3.平台发券
 	 */
 	@DbField("ua.type")
 	private Integer type;
 
+	@DbField("ua.coupon_ids")
+	private String couponIds;
+
 	/**
 	 * 统计类型(周/月)
 	 * week,month

+ 9 - 1
netflix-dao/src/main/java/com/cyksj/model/views/UserActivityView.java

@@ -18,7 +18,7 @@ import java.util.List;
 @Getter
 @Setter
 @SearchBean(tables = "user_activity ua",
-		where = "ua.deleted is true")
+		where = "ua.deleted is true :time:")
 public class UserActivityView {
 
 	@DbField("ua.id")
@@ -36,6 +36,14 @@ public class UserActivityView {
 	@DbField("ua.end_time")
 	private Date endTime;
 
+	/**
+	 * 0.大学生认证
+	 * 1.个人分销排行
+	 * 3.平台发券
+	 */
+	@DbField("ua.type")
+	private Integer type;
+
 	/**
 	 * 优惠券ids
 	 */

+ 8 - 0
netflix-dao/src/main/resources/mapper/CouponMapper.xml

@@ -64,4 +64,12 @@
             #{item}
         </foreach>
     </select>
+
+    <select id="getCouponSkuIds" resultType="java.lang.Long">
+        select distinct sku_id from coupon_sku where coupon_id in
+        <foreach collection="couponIds" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        and deleted is true
+    </select>
 </mapper>

+ 18 - 0
netflix-dao/src/main/resources/mapper/CouponUserMapper.xml

@@ -315,4 +315,22 @@
         and c.use_scope != 'renew'
         order by couponMoney desc limit 1
     </select>
+
+    <select id="selectNoLoginRecommendCouponReduce" resultType="com.cyksj.model.entity.Coupon">
+        select c.id,
+               c.discount,
+               c.reduce_money,
+               if(type = 'discount', sku.price * (1 - c.discount), c.reduce_money) as couponMoney
+        from coupon c
+                 inner join coupon_recommend cr on cr.coupon_id = c.id
+                 inner join coupon_sku cs on cs.coupon_id = c.id and cs.goods_id = #{goodsId}
+                 inner join goods_don_sku sku on sku.id = cs.sku_id and sku.status is true and sku.price = #{price}
+        where cr.deleted is true
+          and c.deleted is true
+          and cr.status is true
+          and (cr.up_time is null or cr.up_time &lt;= now())
+          and (cr.down_time is null or cr.down_time > now())
+          and c.use_scope != 'renew'
+        order by couponMoney desc limit 1
+    </select>
 </mapper>

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

@@ -7,6 +7,9 @@ import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.request.ChannelPopularizeCouponReq;
 import com.cyksj.model.request.CouponCollectReq;
 import com.cyksj.model.views.CouponUserView;
+import com.cyksj.model.views.CouponView;
+
+import java.util.List;
 
 /*
  *项目名: netflix
@@ -70,4 +73,7 @@ public interface CouponFontService {
 	CouponUserView getCouponDetailById(long userId, Long couponId);
 
 	CouponUserView receiveCoupon(long userId, Long couponId, CouponUser.Channel channel);
+	List<CouponView> getGoodsUserActivityCoupons(long userId) throws Exception;
+
+	void collectAllGoodsActivityCoupons(long userId) throws Exception;
 }

+ 62 - 2
netflix-service/src/main/java/com/cyksj/service/coupon/impl/CouponFontServiceImpl.java

@@ -11,10 +11,10 @@ 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.OrderDonMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.manage.coupon.*;
-import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.ChannelPopularizeCouponReq;
 import com.cyksj.model.request.CouponCollectReq;
@@ -63,7 +63,7 @@ public class CouponFontServiceImpl implements CouponFontService {
 
 	private final UserMapper userMapper;
 
-	private final SysConfigMapper sysConfigMapper;
+	private final OrderDonMapper orderDonMapper;
 
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
@@ -388,4 +388,64 @@ public class CouponFontServiceImpl implements CouponFontService {
 		}
 		return getCouponDetailById(userId, couponId);
 	}
+
+	@Override
+	public List<CouponView> getGoodsUserActivityCoupons(long userId) throws Exception {
+		UserActivityDistributeDetailView goodsActivity = getGoodsActivity();
+		if (goodsActivity == null) {
+			return null;
+		}
+		String couponIds = goodsActivity.getCouponIds();
+		List<Long> couponIdList = Jsons.parseList(couponIds, Long.class);
+		//是否领取过
+		Integer selectCount = couponUserMapper.selectCount(Wrappers.lambdaQuery(CouponUser.class).in(CouponUser::getCouponId, couponIdList).eq(CouponUser::getUserId, userId));
+		if (selectCount == couponIdList.size()) {
+			return null;
+		}
+		//未领取
+		//是否购买过
+		List<Long> skuIdList = couponMapper.getCouponSkuIds(couponIdList);
+		Integer orderCount = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getUserId, userId).notIn(OrderDon::getStatus, Constant.noOrderAllStatus).in(OrderDon::getSkuId, skuIdList));
+		if (orderCount == 0) {
+			return null;
+		}
+		List<CouponView> couponViews = beanSearcher.searchAll(CouponView.class, MapUtils.builder().field(CouponView::getCouponId, couponIdList).op(Operator.InList).orderBy(CouponView::getCouponId).build());
+		return couponViews;
+	}
+
+	@Override
+	public void collectAllGoodsActivityCoupons(long userId) throws Exception {
+		UserActivityDistributeDetailView goodsActivity = getGoodsActivity();
+		if (goodsActivity != null) {
+			String couponIds = goodsActivity.getCouponIds();
+			List<Long> couponIdList = Jsons.parseList(couponIds, Long.class);
+			//是否领取过
+			Integer selectCount = couponUserMapper.selectCount(Wrappers.lambdaQuery(CouponUser.class).in(CouponUser::getCouponId, couponIdList).eq(CouponUser::getUserId, userId));
+			if (selectCount != couponIdList.size()) {
+				//未领取
+				//是否购买过
+				List<Long> skuIdList = couponMapper.getCouponSkuIds(couponIdList);
+				Integer orderCount = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getUserId, userId).notIn(OrderDon::getStatus, Constant.noOrderAllStatus).in(OrderDon::getSkuId, skuIdList));
+				if (orderCount != 0) {
+					//一键领取优惠券
+					couponIdList.forEach(couponId -> {
+						try {
+							receiveCouponUser(couponId, userId, CouponUser.Channel.ptfq);
+						} catch (Exception e) {
+						}
+					});
+				}
+			}
+		}
+	}
+
+	public UserActivityDistributeDetailView getGoodsActivity() {
+		String dateStr = DateTime.now().toString();
+		String time = String.format(" and (ua.start_time is null or (ua.start_time < '%s' and ua.end_time > '%s'))", dateStr, dateStr);
+		UserActivityDistributeDetailView goodsActivity = beanSearcher.searchFirst(UserActivityDistributeDetailView.class, MapUtils.builder()
+				.field(UserActivityDistributeDetailView::getType, 3)
+				.put("time", time)
+				.build());
+		return goodsActivity;
+	}
 }

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

@@ -528,5 +528,46 @@ public class CouponFrontController {
 		couponUserPopupsRecordMapper.insert(couponUserPopupsRecord);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
+
+	/**
+	 * 平台发券活动详情
+	 */
+	@GetMapping("/get/goods/activity")
+	public Result<UserActivityView> getGoodsActivity() throws Exception {
+		String dateStr = DateTime.now().toString();
+		String time = String.format(" and (ua.start_time is null or (ua.start_time < '%s' and ua.end_time > '%s'))", dateStr, dateStr);
+		UserActivityView userActivityView = beanSearcher.searchFirst(UserActivityView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(UserActivityView::getType, 3)
+				.put("time", time)
+				.build());
+		if (StrUtil.isNotBlank(userActivityView.getCouponIds())) {
+			List<Long> couponIds = Jsons.parseList(userActivityView.getCouponIds(), Long.class);
+			userActivityView.setCouponViews(beanSearcher.searchAll(CouponView.class, MapUtils.builder().field(CouponView::getId, couponIds).op(Operator.InList).build()));
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult(userActivityView);
+	}
+
+
+	/**
+	 * 平台发券活动
+	 * 购买特定商品 展示优惠券
+	 */
+	@GetMapping("/get/goods/activity/coupons")
+	public Result<List<CouponView>> getGoodsUserActivityCoupons() throws Exception {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		List<CouponView> couponViews = couponFontService.getGoodsUserActivityCoupons(userId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(couponViews);
+	}
+
+	/**
+	 * 平台发券活动
+	 * 一键领取优惠券
+	 */
+	@PostMapping("/goods/activity/collectAll")
+	public Result<String> collectAllGoodsActivityCoupons() throws Exception {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		couponFontService.collectAllGoodsActivityCoupons(userId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
 }
 

+ 48 - 1
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -15,7 +15,10 @@ import com.cyksj.common.util.StringUtil;
 import com.cyksj.dto.Result;
 import com.cyksj.dto.UserSharedDto;
 import com.cyksj.enums.GatewayResponse;
-import com.cyksj.mapper.*;
+import com.cyksj.mapper.GiftCardGoodsSkuMapper;
+import com.cyksj.mapper.GoodsDonSkuMapper;
+import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.mapper.RegisterOrderDonMapper;
 import com.cyksj.mapper.manage.coupon.CouponUserMapper;
 import com.cyksj.mapper.shop.YhShopGoodsSkuMapper;
 import com.cyksj.mapper.sys.SysConfigMapper;
@@ -977,6 +980,11 @@ public class GoodsDonController {
 					data.setMonths(minPriceUserOwnsSku.getMonths());
 					data.setDays(minPriceUserOwnsSku.getDays());
 				}
+				//未登录
+				if (fUid == null) {
+					//推荐优惠券商品最低折扣
+					setHomeConfigGoodsCouponMoney(data);
+				}
 				return true;
 			}).collect(Collectors.toList());
 			setHomeManageSpecific(list, fUid, dsUserId.get(), discount);
@@ -1152,7 +1160,13 @@ public class GoodsDonController {
 			setGcSpecificPrice(data, fUid, dsUserId.get());
 			//设置用户存在优惠券的优惠商品价格
 			data.setChannelDiscount(discount);
+			//商品优惠折扣
 			setUserCouponGoodsMoney(fUid, data);
+			//未登录
+			if (fUid == null) {
+				//推荐优惠券商品最低折扣
+				setGoodsCouponMoney(data);
+			}
 			return true;
 		}).collect(Collectors.toList());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(goodsFrontListViews);
@@ -1630,4 +1644,37 @@ public class GoodsDonController {
 		return null;
 	}
 
+
+	/**
+	 * 未登录 分类下平台推荐优惠券
+	 */
+	private void setGoodsCouponMoney(GoodsFrontListCategoryView data) {
+		//寻找对应最低规格的推荐优惠券
+		Coupon coupon = couponUserMapper.selectNoLoginRecommendCouponReduce(data.getId(), data.getPrice());
+		if (coupon != null) {
+			data.setDiscount(coupon.getDiscount());
+			data.setReduceMoney(coupon.getReduceMoney());
+			data.setDiscountPrice(data.getPrice().subtract(coupon.getCouponMoney()));
+			data.setValidEndTime(coupon.getValidEndTime());
+			data.setCouponId(coupon.getId());
+			data.setSource(1);
+		}
+	}
+
+	/**
+	 * 未登录 首页推荐推荐优惠券
+	 */
+	private void setHomeConfigGoodsCouponMoney(HomeManagementFrontView data) {
+		//寻找对应最低规格的推荐优惠券
+		Coupon coupon = couponUserMapper.selectNoLoginRecommendCouponReduce(data.getGoodsId(), data.getPrice());
+		if (coupon != null) {
+			data.setDiscount(coupon.getDiscount());
+			data.setReduceMoney(coupon.getReduceMoney());
+			data.setDiscountPrice(data.getPrice().subtract(coupon.getCouponMoney()));
+			data.setValidEndTime(coupon.getValidEndTime());
+			data.setCouponId(coupon.getId());
+			data.setSource(1);
+		}
+	}
+
 }

+ 0 - 1
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -1028,5 +1028,4 @@ public class OrderController {
         orderDonService.receiveGptMirrorDayCard(orderId);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
-
 }