Ver código fonte

GPT镜像天卡

zoujiajian 1 ano atrás
pai
commit
3c056a6fd6
18 arquivos alterados com 507 adições e 133 exclusões
  1. 6 1
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/GptMirrorDayCardActivityRecordMapper.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/GptMirrorDayCardGiveawayActivityMapper.java
  4. 27 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GptMirrorDayCardActivityRecord.java
  5. 19 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GptMirrorDayCardGiveawayActivity.java
  6. 59 0
      netflix-dao/src/main/java/com/cyksj/model/views/CategoryGoodsCascadeView.java
  7. 7 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryFrontView.java
  8. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListCategoryView.java
  9. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListView.java
  10. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementFrontView.java
  11. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java
  12. 2 0
      netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java
  13. 50 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  14. 157 123
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  15. 41 6
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  16. 29 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java
  17. 9 0
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java
  18. 51 0
      netflix-web/src/main/java/com/cyksj/web/controller/sys/SysGptMirrorDayGiveawayController.java

+ 6 - 1
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -345,7 +345,12 @@ public interface Constant {
 	String EP_INTENTION_GROUP_NAME= "设备群发标签";
 
 	/**
-	 * 大学生快递站 体验车票规格
+	 * gpt日卡活动 体验车票基础规格
+	 */
+	Long GPT_MIRROR_COMMON_SKU_ID = 426l;
+
+	/**
+	 * 大学生快递站 体验车票标准规格
 	 */
 	Long GPT_MIRROR_SKU_ID = 429l;
 

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GptMirrorDayCardActivityRecord;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GptMirrorDayCardActivityRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/3/14 11:51
+ */
+public interface GptMirrorDayCardActivityRecordMapper extends BaseMapper<GptMirrorDayCardActivityRecord> {
+}

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GptMirrorDayCardGiveawayActivity;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GptMirrorDayCardGiveawayActivityMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/3/5 15:33
+ */
+public interface GptMirrorDayCardGiveawayActivityMapper extends BaseMapper<GptMirrorDayCardGiveawayActivity> {
+}

+ 27 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GptMirrorDayCardActivityRecord.java

@@ -0,0 +1,27 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GptMIrrorDayCardActivityRecord
+ * 创建者: JavaZou
+ * 创建时间:2025/3/14 11:49
+ */
+@Getter
+@Setter
+public class GptMirrorDayCardActivityRecord extends BaseEntity{
+	/**
+	 * 参与订单id
+	 */
+	private Long orderId;
+
+	private Long userId;
+
+	/**
+	 * 赠送车票id
+	 */
+	private Long relationId;
+
+}

+ 19 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GptMirrorDayCardGiveawayActivity.java

@@ -0,0 +1,19 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GptMirrorDayCardGiveawayActivity
+ * 创建者: JavaZou
+ * 创建时间:2025/3/5 15:32
+ */
+@Getter
+@Setter
+public class GptMirrorDayCardGiveawayActivity extends BaseEntity{
+	/**
+	 * 下单平台ids
+	 */
+	private String buyGoodsIds;
+}

+ 59 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CategoryGoodsCascadeView.java

@@ -0,0 +1,59 @@
+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.JsonInclude;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CategoryGoodsCascadeView
+ * 创建者: JavaZou
+ * 创建时间:2025/3/14 14:37
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don g inner join goods_don_category_relate gcr on gcr.goods_id = g.id" +
+		" inner join goods_don_category gc on gc.id = gcr.category",
+		where = "g.status is true",
+		orderBy = "gc.id,g.id")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class CategoryGoodsCascadeView {
+	@DbField("gc.id")
+	private Long category;
+
+	@DbField("gc.name")
+	private String categoryName;
+
+	@DbIgnore
+	private String label;
+
+	@DbIgnore
+	private String value;
+
+	@DbField("g.id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbIgnore
+	private List<ChildGoods> children;
+
+	@Getter
+	@Setter
+	@JsonInclude(JsonInclude.Include.NON_NULL)
+	public static class ChildGoods {
+		private Long goodsId;
+
+		private String title;
+
+		private String label;
+
+		private Long value;
+	}
+}

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryFrontView.java

@@ -1,6 +1,7 @@
 package com.cyksj.model.views;
 
 import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
@@ -22,4 +23,10 @@ public class GoodsDonCategoryFrontView {
 
 	@DbField("gc.name")
 	private String name;
+
+	/**
+	 * gpt赠送天卡活动标识 默认false
+	 */
+	@DbIgnore
+	private Boolean isGptGift = false;
 }

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListCategoryView.java

@@ -166,6 +166,12 @@ public class GoodsFrontListCategoryView {
 	@DbIgnore
 	private String notifyMsg;
 
+	/**
+	 * gpt赠送天卡活动标识 默认false
+	 */
+	@DbIgnore
+	private Boolean isGptGift = false;
+
 	@DbIgnore
 	private List<GoodsDonSkuFrontView> skuList;
 

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListView.java

@@ -178,4 +178,10 @@ public class GoodsFrontListView {
 	 */
 	@DbIgnore
 	private Boolean isGift = false;
+
+	/**
+	 * gpt赠送天卡活动标识 默认false
+	 */
+	@DbIgnore
+	private Boolean isGptGift = false;
 }

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementFrontView.java

@@ -229,4 +229,10 @@ public class HomeManagementFrontView {
 
 	@DbIgnore
 	private List<RealGoodsConfigDto> subInfoList;
+
+	/**
+	 * gpt赠送天卡活动标识 默认false
+	 */
+	@DbIgnore
+	private Boolean isGptGift = false;
 }

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java

@@ -387,4 +387,10 @@ public class RenewalView {
      */
     @DbIgnore
     private Integer model;
+
+    /**
+     * 是否领取过GPT日卡
+     */
+    @DbIgnore
+    private Boolean receivedGptGift;
 }

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java

@@ -111,4 +111,6 @@ public interface OrderDonService extends IService<OrderDon> {
     AliPayParams aliPaySpotifyUpgrade(AlipayOrderDonReq alipayOrderDonReq, String productCode, String qrPayMode) throws Exception;
 
     void aliPaySpotifyUpgradeNotify(Map<String, String> params) throws Exception;
+
+	void receiveGptMirrorDayCard(Long orderId) throws Exception;
 }

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

@@ -364,6 +364,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final SpotifyUserUpgradeOrderMapper spotifyUserUpgradeOrderMapper;
 
+	private final GptMirrorDayCardGiveawayActivityMapper gptMirrorDayCardGiveawayActivityMapper;
+
+	private final GptMirrorDayCardActivityRecordMapper gptMirrorDayCardActivityRecordMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -4434,6 +4438,17 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		spotifyUserUpgradeOrderMapper.updateById(orderDon);
 	}
 
+	@Override
+	public void receiveGptMirrorDayCard(Long orderId) throws Exception {
+		OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
+				.eq(OrderDon::getId, orderId)
+				.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
+				.last("limit 1"));
+		if (orderDon != null) {
+			sendGptMirrorDayTicket(orderDon);
+		}
+	}
+
 	private void checkUserBenefitsStatus(UserBenefits userBenefits, List<Long> userIdList) {
 		UserBenefits.Type type = userBenefits.getType();
 		int fhCount = 0;
@@ -4738,4 +4753,39 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		}
 	}
+
+	/**
+	 * 赠送gpt镜像天卡
+	 */
+	private void sendGptMirrorDayTicket(OrderDon orderDon) throws Exception {
+		Long userId = orderDon.getUserId();
+		Long orderId = orderDon.getId();
+		Long goodsId = orderDon.getGoodsId();
+		GptMirrorDayCardGiveawayActivity gptMirrorDayCardGiveawayActivity = gptMirrorDayCardGiveawayActivityMapper.selectOne(Wrappers.lambdaQuery(GptMirrorDayCardGiveawayActivity.class)
+				.last("limit 1"));
+		if (orderDon.getCreatedTime().compareTo(gptMirrorDayCardGiveawayActivity.getCreatedTime()) < 0) {
+			return;
+		}
+		if (gptMirrorDayCardGiveawayActivity != null) {
+			String buyGoodsIds = gptMirrorDayCardGiveawayActivity.getBuyGoodsIds();
+			if (StrUtil.isNotBlank(buyGoodsIds)) {
+				List<Long> cyGoodsIds = Jsons.parseList(buyGoodsIds, Long.class);
+				if (cyGoodsIds.contains(goodsId)) {
+					try {
+						GptMirrorDayCardActivityRecord gptMirrorDayCardActivityRecord = new GptMirrorDayCardActivityRecord();
+						gptMirrorDayCardActivityRecord.setOrderId(orderId);
+						gptMirrorDayCardActivityRecord.setUserId(userId);
+						gptMirrorDayCardActivityRecordMapper.insert(gptMirrorDayCardActivityRecord);
+
+						//发送GPT天卡
+						Long relationId = groupRelationFrontService.getTrialTicketByUserIdAndGoodsId(userId, Constant.GPT_MIRROR_COMMON_SKU_ID, 2);
+						gptMirrorDayCardActivityRecord.setRelationId(relationId);
+						gptMirrorDayCardActivityRecordMapper.updateById(gptMirrorDayCardActivityRecord);
+					} catch (DuplicateKeyException e) {
+
+					}
+				}
+			}
+		}
+	}
 }

+ 157 - 123
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -36,7 +36,8 @@ import com.cyksj.service.chatgpt.ChatGptAuthService;
 import com.cyksj.service.claude.ClaudeService;
 import com.cyksj.service.groups.GroupsFuncService;
 import com.cyksj.service.luma.LumaService;
-import com.cyksj.service.mail.*;
+import com.cyksj.service.mail.CommonMailService;
+import com.cyksj.service.mail.MailService;
 import com.cyksj.service.mange.coupon.CouponCommonService;
 import com.cyksj.service.midjourney.MidjourneyAccountService;
 import com.cyksj.service.relation.GroupRelationFrontService;
@@ -166,6 +167,8 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 
 	private final CommonMailService commonMailService;
 
+	private final GptMirrorDayCardGiveawayActivityMapper gptMirrorDayCardGiveawayActivityMapper;
+
 	@Override
 	public SearchResult<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize, String customId, String account, String orderNo, Integer cmt) {
 		User u = userMapper.selectById(userId);
@@ -208,146 +211,160 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 				.field(RenewalView::getStatus, List.of("validity", "overdue", "outside")).op(Operator.InList)
 				.orderBy(RenewalView::getExpiryTime).asc()
 				.build());
-		//过滤邀请制、已失效的车位
-		Integer size = list.getTotalCount().intValue();
-
-		List<Long> renewReduceSkuIds = userBenefitsMapper.selectList(Wrappers.lambdaQuery(UserBenefits.class)
-				.eq(UserBenefits::getType, UserBenefits.Type.RENEW).eq(UserBenefits::getStatus, 1).select(UserBenefits::getSkuId)).stream().map(UserBenefits::getSkuId).collect(Collectors.toList());
-
-		list.getDataList().forEach(ticket -> {
-			if (ticket.getSkuId() == null || ticket.getGoodsId() == null) {
-				return;
-			}
-			if (ticket.getGoodsId() == 18 && ticket.getSkuNum() > 1) {
-				ticket.setPassword(null);
-			}
-			ticket.setIsMulti(false);
-			if (ticket.getSkuNum() > 1) {
-				ticket.setIsMulti(true);
-			}
-			//chatGPT直连
-			if (ticket.getGoodsId().equals(42l)) {
-				if (StrUtil.isNotBlank(ticket.getAccount())) {
-					String accessToken;
-					try {
-						accessToken = chatGptAuthService.getAccessToken(ticket.getAccount());
-						ticket.setGptRefreshToken(accessToken);
-					} catch (Exception e) {
-						redisService.set(RedisService.key.CHAT_GPT_TOKEN_EXCEPTION_KEY.getName() + ticket.getAccount(), ticket.getAccount());
-					}
+		if (list.getDataList().size() > 0) {
+			//过滤邀请制、已失效的车位
+			Integer size = list.getTotalCount().intValue();
+			//赠送GPT日卡 参与平台ids
+			List<Long> renewReduceSkuIds = userBenefitsMapper.selectList(Wrappers.lambdaQuery(UserBenefits.class)
+					.eq(UserBenefits::getType, UserBenefits.Type.RENEW).eq(UserBenefits::getStatus, 1).select(UserBenefits::getSkuId)).stream().map(UserBenefits::getSkuId).collect(Collectors.toList());
+			List<Long> gptBuyGids = getGptMirrorGiveawayBuyGids();
+			//gpt日卡活动
+			GptMirrorDayCardGiveawayActivity gptMirrorDayCardGiveawayActivity = gptMirrorDayCardGiveawayActivityMapper.selectOne(Wrappers.lambdaQuery(GptMirrorDayCardGiveawayActivity.class)
+					.last("limit 1"));
+			list.getDataList().forEach(ticket -> {
+				if (ticket.getSkuId() == null || ticket.getGoodsId() == null) {
+					return;
 				}
-				ticket.setAccount(null);
-				ticket.setPassword(null);
-			} else {
-				ticket.setGptRefreshToken(null);
-			}
-			if (ticket.getSecondType() == 1) {
-				ticket.setAccount(null);
-				ticket.setPassword(null);
-			}
-			if (ticket.getGoodsId() != 30l) {
-				ticket.setGptEmailPwd(null);
-			}
-			if (isLoginPopularize != null && isLoginPopularize) {
-				GoodsDonViews views = beanSearcher.searchFirst(GoodsDonViews.class, MapUtils.builder().field(GoodsDonViews::getId, ticket.getGoodsId()).build());
-				views.setSpecs(beanSearcher.searchFirst(GoodsDonSpecFrontView.class, MapUtils.builder().field(GoodsDonSpecFrontView::getGoodsId, views.getId()).build()));
-				views.setSkuList(beanSearcher.searchAll(GoodsDonSkuFrontView.class, MapUtils.builder().field(GoodsDonSkuFrontView::getGoodsId, views.getId()).field(GoodsDonSkuFrontView::getStatus, true).build()));
-				ticket.setGoodsDonViews(views);
-			}
-			if (ticket.getMonths() != null && ticket.getMonths() >= 300) {
-				ticket.setExpiryTime(null);
-			}
-			if (ticket.getExpiryTime() != null && ticket.getGoodsType() == 1) {
-				String remainDays = DateUtil.formatBetween(now, ticket.getExpiryTime(), BetweenFormater.Level.DAY);
-				if ("0天".equals(remainDays)) {
-					remainDays = "小于1天";
+				if (ticket.getGoodsId() == 18 && ticket.getSkuNum() > 1) {
+					ticket.setPassword(null);
+				}
+				ticket.setIsMulti(false);
+				if (ticket.getSkuNum() > 1) {
+					ticket.setIsMulti(true);
+				}
+				//chatGPT直连
+				if (ticket.getGoodsId().equals(42l)) {
+					if (StrUtil.isNotBlank(ticket.getAccount())) {
+						String accessToken;
+						try {
+							accessToken = chatGptAuthService.getAccessToken(ticket.getAccount());
+							ticket.setGptRefreshToken(accessToken);
+						} catch (Exception e) {
+							redisService.set(RedisService.key.CHAT_GPT_TOKEN_EXCEPTION_KEY.getName() + ticket.getAccount(), ticket.getAccount());
+						}
+					}
+					ticket.setAccount(null);
+					ticket.setPassword(null);
 				} else {
-					//当天也算
-					int days = Integer.parseInt(remainDays.substring(0, remainDays.indexOf("天")));
-					remainDays = days + 1 + "天";
+					ticket.setGptRefreshToken(null);
 				}
-				ticket.setRemainDays(remainDays);
-				ticket.setTotal(DateUtil.betweenDay(ticket.getStartTime(), ticket.getExpiryTime(), false));
-			}
-			OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
-					.eq(OrderDon::getRelationId, ticket.getRelationId())
-					.eq(OrderDon::getUserId, ticket.getUserId())
-					.eq(OrderDon::getOrderType, 1)
-					.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
-					.orderByDesc(OrderDon::getId)
-					.last("limit 1"));
-			if (orderDon != null) {
-				ticket.setOrderNo(orderDon.getOrderNo());
-				ticket.setOrderId(orderDon.getId());
-				ticket.setTransactionId(orderDon.getTransactionId());
 				if (ticket.getSecondType() == 1) {
-					//是否完成邀请 根据订单状态
-					ticket.setIsComplete(orderDon.getStatus() == OrderDon.Status.complete ? true : false);
+					ticket.setAccount(null);
+					ticket.setPassword(null);
 				}
-			}
-
-			if (size > 1 && ticket.getGoodsId() != 18) {
-				Date payTime = null;
+				if (ticket.getGoodsId() != 30l) {
+					ticket.setGptEmailPwd(null);
+				}
+				if (isLoginPopularize != null && isLoginPopularize) {
+					GoodsDonViews views = beanSearcher.searchFirst(GoodsDonViews.class, MapUtils.builder().field(GoodsDonViews::getId, ticket.getGoodsId()).build());
+					views.setSpecs(beanSearcher.searchFirst(GoodsDonSpecFrontView.class, MapUtils.builder().field(GoodsDonSpecFrontView::getGoodsId, views.getId()).build()));
+					views.setSkuList(beanSearcher.searchAll(GoodsDonSkuFrontView.class, MapUtils.builder().field(GoodsDonSkuFrontView::getGoodsId, views.getId()).field(GoodsDonSkuFrontView::getStatus, true).build()));
+					ticket.setGoodsDonViews(views);
+				}
+				if (ticket.getMonths() != null && ticket.getMonths() >= 300) {
+					ticket.setExpiryTime(null);
+				}
+				if (ticket.getExpiryTime() != null && ticket.getGoodsType() == 1) {
+					String remainDays = DateUtil.formatBetween(now, ticket.getExpiryTime(), BetweenFormater.Level.DAY);
+					if ("0天".equals(remainDays)) {
+						remainDays = "小于1天";
+					} else {
+						//当天也算
+						int days = Integer.parseInt(remainDays.substring(0, remainDays.indexOf("天")));
+						remainDays = days + 1 + "天";
+					}
+					ticket.setRemainDays(remainDays);
+					ticket.setTotal(DateUtil.betweenDay(ticket.getStartTime(), ticket.getExpiryTime(), false));
+				}
+				OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
+						.eq(OrderDon::getRelationId, ticket.getRelationId())
+						.eq(OrderDon::getUserId, ticket.getUserId())
+						.eq(OrderDon::getOrderType, 1)
+						.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
+						.orderByDesc(OrderDon::getId)
+						.last("limit 1"));
 				if (orderDon != null) {
-					payTime = Optional.ofNullable(orderDon.getPayTime()).orElse(orderDon.getCreatedTime());
+					ticket.setOrderNo(orderDon.getOrderNo());
+					ticket.setOrderId(orderDon.getId());
+					ticket.setTransactionId(orderDon.getTransactionId());
+					if (ticket.getSecondType() == 1) {
+						//是否完成邀请 根据订单状态
+						ticket.setIsComplete(orderDon.getStatus() == OrderDon.Status.complete ? true : false);
+					}
 				}
-				//加购订单
-				if (orderDon == null) {
-					List<OrderDiscountPlusPurchaseSkuRelation> plusPurchaseSkuRelations = orderDiscountPlusPurchaseSkuRelationMapper.selectPlusRelationByIdAndUserId(ticket.getRelationId(), ticket.getUserId());
-					for (OrderDiscountPlusPurchaseSkuRelation data : plusPurchaseSkuRelations) {
-						String relationIds = data.getRelationIds();
-						if (StrUtil.isEmpty(relationIds)) {
-							return;
-						}
-						try {
-							List<Long> relationList = Jsons.parseList(relationIds, Long.class);
-							if (relationList.contains(ticket.getRelationId())) {
-								OrderDon plusOrder = orderDonMapper.selectById(data.getOrderId());
-								if (plusOrder != null) {
-									payTime = Optional.ofNullable(plusOrder.getPayTime()).orElse(plusOrder.getCreatedTime());
+
+				if (size > 1 && ticket.getGoodsId() != 18) {
+					Date payTime = null;
+					if (orderDon != null) {
+						payTime = Optional.ofNullable(orderDon.getPayTime()).orElse(orderDon.getCreatedTime());
+					}
+					//加购订单
+					if (orderDon == null) {
+						List<OrderDiscountPlusPurchaseSkuRelation> plusPurchaseSkuRelations = orderDiscountPlusPurchaseSkuRelationMapper.selectPlusRelationByIdAndUserId(ticket.getRelationId(), ticket.getUserId());
+						for (OrderDiscountPlusPurchaseSkuRelation data : plusPurchaseSkuRelations) {
+							String relationIds = data.getRelationIds();
+							if (StrUtil.isEmpty(relationIds)) {
+								return;
+							}
+							try {
+								List<Long> relationList = Jsons.parseList(relationIds, Long.class);
+								if (relationList.contains(ticket.getRelationId())) {
+									OrderDon plusOrder = orderDonMapper.selectById(data.getOrderId());
+									if (plusOrder != null) {
+										payTime = Optional.ofNullable(plusOrder.getPayTime()).orElse(plusOrder.getCreatedTime());
+									}
+									break;
 								}
-								break;
+							} catch (Exception e) {
 							}
-						} catch (Exception e) {
-						}
 
+						}
 					}
+					ticket.setPayTime(payTime);
 				}
-				ticket.setPayTime(payTime);
-			}
-			if (ticket.getSkuNum() != null && ticket.getSkuNum() == 1) {
+				if (ticket.getSkuNum() != null && ticket.getSkuNum() == 1) {
 
-			}
-			//奈飞、gpt
-			if (ticket.getGoodsId() == 1 || ticket.getGoodsId() == 18 || ticket.getGoodsId() == 33l) {
-				ticket.setEmail(null);
-			}
-			//设置镜像车票信息
-			setMirrorTicketInfo(ticket);
+				}
+				//奈飞、gpt
+				if (ticket.getGoodsId() == 1 || ticket.getGoodsId() == 18 || ticket.getGoodsId() == 33l) {
+					ticket.setEmail(null);
+				}
+				//设置镜像车票信息
+				setMirrorTicketInfo(ticket);
 
 //			List<GroupsRelationUserView> relationUserViews = groupsRelationMapper.getUserRelationUserViews(ticket.getGroupId(), ticket.getRelationId(), ticket.getUserId(), List.of(GroupsRelation.Status.validity, GroupsRelation.Status.outside));
 //			ticket.setRelationViews(relationUserViews);
-			if (ticket.getExpiryTime() != null) {
-				ticket.setExpiryTimeStr(DateUtil.format(ticket.getExpiryTime(), "yyyy-MM-dd"));
-			}
-			//查看双重验证码
-			if (StrUtil.isNotEmpty(ticket.getApiSecret())) {
-				Boolean isHasVerifyCode = StrUtil.isNotBlank(ticket.getVerifyCode()) ? true : false;
-				Integer codeNum = getUserCodeNumBySkuId(ticket.getUserId(), ticket.getSkuId(), isHasVerifyCode);
-				ticket.setCodeNum(codeNum);
-			}
-			Long qaId = groupsRelationMapper.selectGoodsDonQaByGoodsId(ticket.getGoodsId());
-			ticket.setQa(qaId > 0 ? true : false);
-			//是否存在海报
-			ticket.setPosterInfo(setGoodsPoster(ticket, u, userIds));
+				if (ticket.getExpiryTime() != null) {
+					ticket.setExpiryTimeStr(DateUtil.format(ticket.getExpiryTime(), "yyyy-MM-dd"));
+				}
+				//查看双重验证码
+				if (StrUtil.isNotEmpty(ticket.getApiSecret())) {
+					Boolean isHasVerifyCode = StrUtil.isNotBlank(ticket.getVerifyCode()) ? true : false;
+					Integer codeNum = getUserCodeNumBySkuId(ticket.getUserId(), ticket.getSkuId(), isHasVerifyCode);
+					ticket.setCodeNum(codeNum);
+				}
+				Long qaId = groupsRelationMapper.selectGoodsDonQaByGoodsId(ticket.getGoodsId());
+				ticket.setQa(qaId > 0 ? true : false);
+				//是否存在海报
+				ticket.setPosterInfo(setGoodsPoster(ticket, u, userIds));
 
-			//续费升级折扣
-			setRenewDiscount(ticket);
+				//续费升级折扣
+				setRenewDiscount(ticket);
 
-			if (CollUtil.isNotEmpty(renewReduceSkuIds) && renewReduceSkuIds.contains(ticket.getSkuId())) {
-				ticket.setIsRenewReduce(true);
-			}
-		});
+				if (CollUtil.isNotEmpty(renewReduceSkuIds) && renewReduceSkuIds.contains(ticket.getSkuId())) {
+					ticket.setIsRenewReduce(true);
+				}
+
+				if (CollUtil.isNotEmpty(gptBuyGids) && gptBuyGids.contains(ticket.getGoodsId())) {
+					if (gptMirrorDayCardGiveawayActivity != null && orderDon.getCreatedTime().compareTo(gptMirrorDayCardGiveawayActivity.getCreatedTime()) > 0) {
+						//是否领取过GPT日卡
+						Long orderId = orderDon.getId();
+						Number count = beanSearcher.searchCount(GptMirrorDayCardActivityRecord.class, MapUtils.builder().field(GptMirrorDayCardActivityRecord::getOrderId, orderId).build());
+						ticket.setReceivedGptGift(count.intValue() > 0);
+					}
+				}
+			});
+		}
 		userLoginRecordService.saveUserLoginDayRecord(userId);
 		return list;
 	}
@@ -1413,4 +1430,21 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		}
 	}
 
+	/**
+	 * 获取gpt镜像天卡活动参与平台ids
+	 * @return
+	 */
+	private List<Long> getGptMirrorGiveawayBuyGids() {
+		GptMirrorDayCardGiveawayActivity gptMirrorDayCardGiveawayActivity = beanSearcher.searchFirst(GptMirrorDayCardGiveawayActivity.class, MapUtils.builder().build());
+		if (gptMirrorDayCardGiveawayActivity != null) {
+			String buyGoodsIds = gptMirrorDayCardGiveawayActivity.getBuyGoodsIds();
+			try {
+				return Jsons.parseList(buyGoodsIds, Long.class);
+			} catch (Exception e) {
+
+			}
+		}
+		return null;
+	}
+
 }

+ 41 - 6
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -15,10 +15,7 @@ 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.GiftCardGoodsSkuMapper;
-import com.cyksj.mapper.GoodsDonSkuMapper;
-import com.cyksj.mapper.OrderDonMapper;
-import com.cyksj.mapper.RegisterOrderDonMapper;
+import com.cyksj.mapper.*;
 import com.cyksj.mapper.manage.coupon.CouponUserMapper;
 import com.cyksj.mapper.shop.YhShopGoodsSkuMapper;
 import com.cyksj.mapper.sys.SysConfigMapper;
@@ -90,6 +87,8 @@ public class GoodsDonController {
 
 	private final GiftCardGoodsSkuMapper giftCardGoodsSkuMapper;
 
+	private final GoodsDonCategoryRelateMapper goodsDonCategoryRelateMapper;
+
 	/**
      * 获取平台商品分类
      */
@@ -119,7 +118,15 @@ public class GoodsDonController {
 		    redisService.setNx(key, list, 30 * 60l);
 		    o = redisService.get(key);
 	    }
+	    List<Long> gptBuyGids = getGptMirrorGiveawayBuyGids();
 	    list = Jsons.parseList(o, GoodsDonCategoryFrontView.class);
+	    for (GoodsDonCategoryFrontView data : list) {
+		    List<GoodsDonCategoryGoodsView> goodsDonCategoryGoodsViews = beanSearcher.searchAll(GoodsDonCategoryGoodsView.class, MapUtils.builder().field(GoodsDonCategoryGoodsView::getCategory, data.getId()).field(GoodsDonCategoryGoodsView::getStatus, 1).onlySelect(GoodsDonCategoryGoodsView::getGoodsId).build());
+		    List<Long> collect = goodsDonCategoryGoodsViews.stream().map(GoodsDonCategoryGoodsView::getGoodsId).distinct().collect(Collectors.toList());
+		    if (CollUtil.isNotEmpty(gptBuyGids) && gptBuyGids.containsAll(collect)) {
+				data.setIsGptGift(true);
+		    }
+	    }
 	    return GatewayResponse.SUCCESS.newBuilder().toResult(list);
     }
 
@@ -370,6 +377,10 @@ public class GoodsDonController {
 			}
 			views.setSkuList(beanSearcher.searchAll(GoodsDonSkuFrontView.class, builder.build()));
 			views.setSold(getGoodsSold(views.getId(), views.getSold()));
+			List<Long> gptBuyGids = getGptMirrorGiveawayBuyGids();
+			if (CollUtil.isNotEmpty(gptBuyGids) && gptBuyGids.contains(views.getId())) {
+				views.setIsGptGift(true);
+			}
 			List<GoodsDonQaFrontView> donQaFrontViews = beanSearcher.searchAll(GoodsDonQaFrontView.class, MapUtils.builder().field(GoodsDonQaFrontView::getGoodsId, id).field(GoodsDonQaFrontView::getType, 1).build());
 			views.setQuestions(donQaFrontViews);
 			redisService.setNx(goodsDetailKey, views, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout() + 60 * RandomUtil.randomInt(10));
@@ -899,8 +910,12 @@ public class GoodsDonController {
 
 	public void setHomeConfigGoods(Map<String, List<HomeManagementFrontView>> map, HomeManagementConfig.Type type, List<HomeManagementFrontView> list, AtomicLong dsUserId, AtomicBoolean existsChannel, Long fUid, BigDecimal discount) throws Exception {
 		//设置特定价格
+		List<Long> gptBuyGids = getGptMirrorGiveawayBuyGids();
 		if (CollUtil.isNotEmpty(list)) {
 			list = list.stream().filter(data -> {
+				if (CollUtil.isNotEmpty(gptBuyGids) && gptBuyGids.contains(data.getGoodsId())) {
+					data.setIsGptGift(true);
+				}
 				if (data.getIsOwns()) {
 					if (dsUserId.get() == 0 && fUid != null && existsChannel.get()) {
 						Long sharedId = userService.getSharedIdByUserId(fUid);
@@ -942,7 +957,7 @@ public class GoodsDonController {
             MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
             builder.put("condition", String.format("and yhs_id = %s", yhsId));
             list = beanSearcher.searchAll(YhShopGoodsFrontView.class, builder.build());
-            redisService.setNx(yhShopCacheKey, list, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout());
+            redisService.setNx(yhShopCacheKey, list, RedisService.key.YH_HOME_PAGHE_CACHE_SHOP.getTimeout());
         }
         DateTime now = DateTime.now();
 	    list.forEach(data -> {
@@ -1026,10 +1041,13 @@ public class GoodsDonController {
 				mapBuilder.field(GoodsFrontListCategoryView::getId, filter_goodsIds).op(Operator.NotIn);
 			}
 			List<GoodsFrontListCategoryView> goodsFrontListViews = beanSearcher.searchAll(GoodsFrontListCategoryView.class, mapBuilder.build());
+			List<Long> gptBuyGids = getGptMirrorGiveawayBuyGids();
 			goodsFrontListViews.forEach(data -> {
 				data.setSold(getGoodsSold(data.getId(), data.getSold()));
-				;
 				data.setNotifyMsg(getPayMsgTime(data.getId(), now, 1, null));
+				if (CollUtil.isNotEmpty(gptBuyGids) && gptBuyGids.contains(data.getId())) {
+					data.setIsGptGift(true);
+				}
 			});
 			redisService.setNx(categoryGoodsKey, goodsFrontListViews, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout() + 10 * 60);
 			o = redisService.get(categoryGoodsKey);
@@ -1540,4 +1558,21 @@ public class GoodsDonController {
 		}
 	}
 
+	/**
+	 * 获取gpt镜像天卡活动参与平台ids
+	 * @return
+	 */
+	private List<Long> getGptMirrorGiveawayBuyGids() {
+		GptMirrorDayCardGiveawayActivity gptMirrorDayCardGiveawayActivity = beanSearcher.searchFirst(GptMirrorDayCardGiveawayActivity.class, MapUtils.builder().build());
+		if (gptMirrorDayCardGiveawayActivity != null) {
+			String buyGoodsIds = gptMirrorDayCardGiveawayActivity.getBuyGoodsIds();
+			try {
+				return Jsons.parseList(buyGoodsIds, Long.class);
+			} catch (Exception e) {
+
+			}
+		}
+		return null;
+	}
+
 }

+ 29 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java

@@ -17,6 +17,7 @@ import com.cyksj.model.entity.GoodsDonCategory;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.manage.request.ReqGoodsSpuInsert;
 import com.cyksj.model.manage.views.GoodsDonViewer;
+import com.cyksj.model.views.CategoryGoodsCascadeView;
 import com.cyksj.model.views.GoodsDetailView;
 import com.cyksj.model.views.GoodsDonCategoryDetailView;
 import com.cyksj.service.mange.CmsGoodsDonService;
@@ -33,9 +34,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -261,4 +260,31 @@ public class CmsGoodsDonController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDons);
     }
 
+    /**
+     * 所有分类平台 级联
+     */
+    @GetMapping("/get/category/goods/cascade")
+    public Result<List<CategoryGoodsCascadeView>> getCategoryGoodsCascade() {
+        List<CategoryGoodsCascadeView> categoryGoodsCascadeViews = beanSearcher.searchAll(CategoryGoodsCascadeView.class, MapUtils.builder().build());
+        //按分类分组
+        Map<String, List<CategoryGoodsCascadeView>> byType = categoryGoodsCascadeViews.stream()
+                .collect(Collectors.groupingBy(CategoryGoodsCascadeView::getCategoryName));
+        List<CategoryGoodsCascadeView> result = new ArrayList<>();
+        byType.forEach((categoryName, data) -> {
+            CategoryGoodsCascadeView cascadeView = new CategoryGoodsCascadeView();
+            cascadeView.setLabel(categoryName);
+            cascadeView.setValue(categoryName);
+            List<CategoryGoodsCascadeView.ChildGoods> child = data.stream().map(view -> coverToChildGoods(view)).collect(Collectors.toList());
+            cascadeView.setChildren(child);
+            result.add(cascadeView);
+        });
+        return GatewayResponse.SUCCESS.newBuilder().toResult(result);
+    }
+
+    private CategoryGoodsCascadeView.ChildGoods coverToChildGoods(CategoryGoodsCascadeView cascadeView) {
+        CategoryGoodsCascadeView.ChildGoods childGoods = new CategoryGoodsCascadeView.ChildGoods();
+        childGoods.setValue(cascadeView.getGoodsId());
+        childGoods.setLabel(cascadeView.getTitle());
+        return childGoods;
+    }
 }

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

@@ -975,4 +975,13 @@ public class OrderController {
         response.sendRedirect(paypalV2Service.successPayment(token,PayerID,paypalPayConfig));
     }
 
+    /**
+     * 领取GPT镜像天卡
+     */
+    @PostMapping("/receive/gptMirror/dayCard/{orderId}")
+    public Result<String> receiveGptMirrorDayCard(@PathVariable Long orderId) throws Exception {
+        orderDonService.receiveGptMirrorDayCard(orderId);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
 }

+ 51 - 0
netflix-web/src/main/java/com/cyksj/web/controller/sys/SysGptMirrorDayGiveawayController.java

@@ -0,0 +1,51 @@
+package com.cyksj.web.controller.sys;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.GptMirrorDayCardGiveawayActivityMapper;
+import com.cyksj.model.entity.GptMirrorDayCardGiveawayActivity;
+import com.cyksj.service.mange.RefreshCacheService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: SysGptMirrorDayGiveawayController
+ * 创建者: JavaZou
+ * 创建时间:2025/3/5 15:42
+ */
+@RequestMapping("/sys/mirror")
+@RestController
+@RequiredArgsConstructor
+public class SysGptMirrorDayGiveawayController {
+	private final GptMirrorDayCardGiveawayActivityMapper gptMirrorDayCardGiveawayActivityMapper;
+
+	private final RefreshCacheService refreshCacheService;
+
+
+	/**
+	 * 配置参与GPT镜像天卡平台
+	 */
+	@PutMapping("/set/gpt/giveaway/buy/goods")
+	public Result<String> setGptMirrorBuyGoods(@RequestBody GptMirrorDayCardGiveawayActivity giveawayActivity) {
+		GptMirrorDayCardGiveawayActivity db = gptMirrorDayCardGiveawayActivityMapper.selectOne(Wrappers.lambdaQuery(GptMirrorDayCardGiveawayActivity.class)
+				.last("limit 1"));
+		if (db != null) {
+			giveawayActivity.setId(db.getId());
+			gptMirrorDayCardGiveawayActivityMapper.updateById(giveawayActivity);
+		} else gptMirrorDayCardGiveawayActivityMapper.insert(giveawayActivity);
+		refreshCacheService.refreshYhHomePageCache();
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 返回参与Gpt镜像天卡平台
+	 */
+	@GetMapping("/get/gpt/giveaway/buy/goods")
+	public Result<GptMirrorDayCardGiveawayActivity> getGptMirrorBuyGoods() {
+		GptMirrorDayCardGiveawayActivity db = gptMirrorDayCardGiveawayActivityMapper.selectOne(Wrappers.lambdaQuery(GptMirrorDayCardGiveawayActivity.class)
+				.last("limit 1"));
+		return GatewayResponse.SUCCESS.newBuilder().toResult(db);
+	}
+}