zoujiajian hai 1 ano
pai
achega
30b5bbb2bb

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/CouponUserPopupsMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CouponUserPopups;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CouponUserPopupsMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/4/27 17:20
+ */
+public interface CouponUserPopupsMapper extends BaseMapper<CouponUserPopups> {
+}

+ 17 - 0
netflix-dao/src/main/java/com/cyksj/mapper/CouponUserPopupsOrderRelateMapper.java

@@ -0,0 +1,17 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CouponUserPopupsOrderRelate;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CouponUserPopupsOrderRelateMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/5/6 16:21
+ */
+public interface CouponUserPopupsOrderRelateMapper extends BaseMapper<CouponUserPopupsOrderRelate> {
+
+	@Select("select count(1) from (select order_id from coupon_user_popups_order_relate where popups_id = #{popupsId}) cr inner join order_don o on o.id = cr.order_id where o.status not in ('close','noPayment','refund')")
+	Integer selectCountOrders(Long popupsId);
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/CouponUserPopupsRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CouponUserPopupsRecord;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CouponUserPopupsRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/4/27 17:43
+ */
+public interface CouponUserPopupsRecordMapper extends BaseMapper<CouponUserPopupsRecord> {
+}

+ 54 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CouponUserPopups.java

@@ -0,0 +1,54 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CouponUserPopups
+ * 创建者: JavaZou
+ * 创建时间:2025/4/27 17:18
+ */
+@Getter
+@Setter
+public class CouponUserPopups extends BaseEntity{
+	/**
+	 * 优惠券ids 实例"[1,2]"
+	 */
+	private String couponIds;
+
+	@DbIgnore
+	@TableField(exist = false)
+	private String couponNames;
+
+	/**
+	 * 触发页面
+	 */
+	private String triggerPage;
+
+	/**
+	 * 弹窗频率 0仅一次 1每日一次
+	 */
+	private Integer frequency;
+
+	/**
+	 * 有效开始时间
+	 */
+	private Date startTime;
+
+	/**
+	 * 有效结束时间
+	 */
+	private Date endTime;
+
+	private Boolean status;
+
+	@DbIgnore
+	@TableField(exist = false)
+	private Integer orderNum;
+
+}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CouponUserPopupsOrderRelate.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CouponUserPopupsOrderRelate
+ * 创建者: JavaZou
+ * 创建时间:2025/5/6 16:20
+ */
+@Getter
+@Setter
+public class CouponUserPopupsOrderRelate extends BaseEntity{
+	private Long popupsId;
+
+	private Long orderId;
+
+	private Long userId;
+}

+ 21 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CouponUserPopupsRecord.java

@@ -0,0 +1,21 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CouponUserPopupsRecord
+ * 创建者: JavaZou
+ * 创建时间:2025/4/27 17:42
+ */
+@Getter
+@Setter
+public class CouponUserPopupsRecord extends BaseEntity{
+	private Long userId;
+
+	/**
+	 * 弹窗id
+	 */
+	private Long popupsId;
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java

@@ -202,4 +202,9 @@ public class OrderPayRequest {
      * 1.普通店铺(默认) 2.镜像店铺
      */
     private Integer cmt = 1;
+
+    /**
+     * 优惠弹窗id
+     */
+    private Long popupsId;
 }

+ 60 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CouponUserPopupsView.java

@@ -0,0 +1,60 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CouponUserPopupsView
+ * 创建者: JavaZou
+ * 创建时间:2025/4/27 17:38
+ */
+@Getter
+@Setter
+@SearchBean(tables = "coupon_user_popups cup",
+		where = "status is true")
+public class CouponUserPopupsView {
+	@DbField("cup.id")
+	private Long popupsId;
+
+	@DbField("cup.coupon_ids")
+	@JsonIgnore
+	private String couponIds;
+
+	/**
+	 * 触发页面
+	 */
+	@DbField("cup.trigger_page")
+	private String triggerPage;
+
+	/**
+	 * 弹窗频率 0仅一次 1每日一次
+	 */
+	@DbField("cup.frequency")
+	@JsonIgnore
+	private Integer frequency;
+
+	/**
+	 * 有效开始时间
+	 */
+	@DbField("cup.start_time")
+	@JsonIgnore
+	private Date startTime;
+
+	/**
+	 * 有效结束时间
+	 */
+	@DbField("cup.end_time")
+	@JsonIgnore
+	private Date endTime;
+
+	@DbIgnore
+	private List<CouponUserView> couponUserViews;
+}

+ 13 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -368,6 +368,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final GptMirrorDayCardActivityRecordMapper gptMirrorDayCardActivityRecordMapper;
 
+	private final CouponUserPopupsOrderRelateMapper couponUserPopupsOrderRelateMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -794,6 +796,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		recordPosterUserOrder(orderId, payRequest.getRid());
 		//记录用户镜像店铺订单
 		recordUserMirrorShopOrderRelate(orderId, payRequest.getUserId(), payRequest.getCmt(), payRequest.getCustomId());
+		//记录优惠弹窗下单关联
+		recordCouponPopupOrderRelate(orderId, payRequest.getUserId(), payRequest.getPopupsId());
 	}
 
 	/**
@@ -826,6 +830,15 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			userMirrorShopOrderRelateMapper.insert(userMirrorShopOrderRelate);
 		}
 	}
+	private void recordCouponPopupOrderRelate(Long orderId, Long userId, Long popupsId) {
+		if (popupsId != null) {
+			CouponUserPopupsOrderRelate relate = new CouponUserPopupsOrderRelate();
+			relate.setUserId(userId);
+			relate.setOrderId(orderId);
+			relate.setPopupsId(popupsId);
+			couponUserPopupsOrderRelateMapper.insert(relate);
+		}
+	}
 
 	private Boolean checkIsNeedGroupsRelation(GoodsDon goodsDon) {
 		if (goodsDon.getType() == 1) {

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

@@ -3,6 +3,7 @@ package com.cyksj.web.controller.coupon;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.annotation.NoSubmit;
@@ -11,6 +12,7 @@ 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.CouponUserPopupsRecordMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.coupon.CouponRecommendMapper;
@@ -73,6 +75,8 @@ public class CouponFrontController {
 
 	private final SysConfigService sysConfigService;
 
+	private final CouponUserPopupsRecordMapper couponUserPopupsRecordMapper;
+
 	/**
 	 * 优惠券领取中心列表
 	 */
@@ -461,5 +465,68 @@ public class CouponFrontController {
 		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult(couponUserView);
 	}
+
+	//==================================================优惠券弹窗======================================================================================
+
+	/**
+	 * 用户存在弹窗列表
+	 * @return
+	 */
+	@GetMapping("/get/popups")
+	public Result<List<CouponUserPopupsView>> getCouponPopups() {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		DateTime now = DateTime.now();
+		List<CouponUserPopupsView> couponUserPopups = beanSearcher.searchAll(CouponUserPopupsView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(CouponUserPopupsView::getStartTime, now).op(Operator.LessEqual)
+				.field(CouponUserPopupsView::getEndTime, now).op(Operator.GreaterThan)
+				.build());
+		couponUserPopups = couponUserPopups.stream().filter(cu -> {
+			try {
+				List<Long> couponIds = Jsons.parseList(cu.getCouponIds(), Long.class);
+				Integer selectCount = couponUserMapper.selectCount(Wrappers.lambdaQuery(CouponUser.class)
+						.eq(CouponUser::getUserId, userId)
+						.in(CouponUser::getCouponId, couponIds)
+						.le(CouponUser::getValidStartTime, now)
+						.gt(CouponUser::getValidEndTime, now)
+						.eq(CouponUser::getStatus, CouponUser.Status.unused));
+				//是否符合条件
+				if (selectCount > 0) {
+					Integer frequency = cu.getFrequency();
+					LambdaQueryWrapper<CouponUserPopupsRecord> wrapper = Wrappers.lambdaQuery(CouponUserPopupsRecord.class);
+					if (frequency != 0) {
+						wrapper.between(CouponUserPopupsRecord::getCreatedTime, DateUtil.beginOfDay(now), DateUtil.endOfDay(now));
+					}
+					Integer popupsRecordCount = couponUserPopupsRecordMapper.selectCount(wrapper.eq(CouponUserPopupsRecord::getUserId, userId).eq(CouponUserPopupsRecord::getPopupsId, cu.getPopupsId()));
+					//未有弹窗记录
+					if (popupsRecordCount == 0) {
+						List<CouponUserView> couponUserViews = beanSearcher.searchAll(CouponUserView.class, MapUtils.builder().field(CouponUserView::getUserId, userId)
+								.field(CouponUserView::getCouponId, couponIds).op(Operator.InList)
+								.orderBy(CouponUserView::getDiscount).asc()
+								.build());
+						cu.setCouponUserViews(couponUserViews);
+						return true;
+					}
+				}
+				return false;
+			} catch (Exception e) {
+
+			}
+			return false;
+		}).collect(Collectors.toList());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(couponUserPopups);
+	}
+
+	/**
+	 * 优惠弹窗记录
+	 */
+	@PostMapping("/record/popups/{popupsId}")
+	public Result<String> recordPopups(@PathVariable Long popupsId) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		CouponUserPopupsRecord couponUserPopupsRecord = new CouponUserPopupsRecord();
+		couponUserPopupsRecord.setPopupsId(popupsId);
+		couponUserPopupsRecord.setUserId(userId);
+		couponUserPopupsRecordMapper.insert(couponUserPopupsRecord);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
 }
 

+ 67 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/coupon/CouponController.java

@@ -7,10 +7,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.Log;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.config.corp.WeChatCorpFactory;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.CouponUserPopupsMapper;
+import com.cyksj.mapper.CouponUserPopupsOrderRelateMapper;
 import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.corp.CorpUserAuthMapper;
 import com.cyksj.mapper.corp.CorpUserMapper;
@@ -84,6 +87,10 @@ public class CouponController {
 
 	private final EquipmentActivityReduceService equipmentActivityReduceService;
 
+	private final CouponUserPopupsMapper couponUserPopupsMapper;
+
+	private final CouponUserPopupsOrderRelateMapper couponUserPopupsOrderRelateMapper;
+
 	/**
 	 * 新增优惠券
 	 */
@@ -584,4 +591,64 @@ public class CouponController {
 		couponChild.setValue(view.getId());
 		return couponChild;
 	}
+
+	//===================================================优惠券弹窗===========================================================================================
+
+	/**
+	 * 新增优惠弹窗
+	 */
+	@PostMapping("/post/popups")
+	public Result<String> insertPopups(@RequestBody CouponUserPopups popups) {
+		couponUserPopupsMapper.insert(popups);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 编辑优惠弹窗
+	 */
+	@PutMapping("/update/popups")
+	public Result<String> updatePopups(@RequestBody CouponUserPopups popups) {
+		couponUserPopupsMapper.updateById(popups);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 删除优惠弹窗
+	 */
+	@DeleteMapping("/delete/popups/{id}")
+	public Result<String> updatePopups(@PathVariable Long id) {
+		couponUserPopupsMapper.deleteById(id);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 上下架优惠弹窗
+	 */
+	@PutMapping("/update/popups/status/{id}")
+	public Result<String> updatePopupsStatusById(@PathVariable Long id) {
+		Optional.ofNullable(couponUserPopupsMapper.selectById(id)).ifPresent(en->{
+			en.setStatus(!en.getStatus());
+			couponUserPopupsMapper.updateById(en);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 优惠弹窗列表
+	 */
+	@GetMapping("/get/popups")
+	public Result<SearchResult<CouponUserPopups>> getPopups() {
+		SearchResult<CouponUserPopups> search = beanSearcher.search(CouponUserPopups.class, MapUtils.flatBuilder(request.getParameterMap()).orderBy(CouponUserPopups::getUpdateTime).desc().build());
+		search.getDataList().forEach(pop->{
+			try {
+				String couponNames = couponMapper.selectList(Wrappers.lambdaQuery(Coupon.class)
+						.in(Coupon::getId, Jsons.parseList(pop.getCouponIds(), Long.class))).stream().map(Coupon::getName).collect(Collectors.joining("、"));
+				pop.setCouponNames(couponNames);
+				pop.setOrderNum(couponUserPopupsOrderRelateMapper.selectCountOrders(pop.getId()));
+			} catch (Exception e) {
+
+			}
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
 }