Jelajahi Sumber

Merge branch 'claude_renew'

# Conflicts:
#	netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
zoujiajian 1 tahun lalu
induk
melakukan
1fb545d4ad

+ 10 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -450,4 +450,14 @@ public interface Constant {
 	 * 镜像店铺用户头像
 	 */
 	String USER_MIRROR_SHOP_USER_DEFAULT_IMG = "https://cdn2.yicanggongyi.com/picture/08944798d95e42f62f3bb63d8109dcf1-1732169951288.png";
+
+	/**
+	 * Claude pro
+	 */
+	Long CLAUDE_PRO_GID = 75L;
+
+	/**
+	 * GPT PLUS
+	 */
+	Long GPT_PLUS_GID = 18L;
 }

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ClaudeUser.java

@@ -1,5 +1,6 @@
 package com.cyksj.model.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.ejlchina.searcher.bean.DbField;
 import lombok.Data;
@@ -49,4 +50,27 @@ public class ClaudeUser extends BaseEntity {
      * 是否封禁
      */
     private Boolean isBlock;
+
+    /**
+     * 目前套餐包id
+     */
+    private Long packageId;
+
+    /**
+     * 续费升级订单id
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Long renewOrderId;
+
+    /**
+     * 目前续费规格id
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Long renewSkuId;
+
+    /**
+     * 续费升级过期时间
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Date renewExpiryTime;
 }

+ 15 - 1
netflix-dao/src/main/java/com/cyksj/model/views/ClaudeUserView.java

@@ -3,7 +3,6 @@ package com.cyksj.model.views;
 import lombok.Builder;
 import lombok.Data;
 
-import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -38,4 +37,19 @@ public class ClaudeUserView {
      * 使用次数
      */
     private Long use;
+
+    /**
+     * 是否是续费升级
+     */
+    private Boolean isRenewPackage;
+
+    /**
+     * 续费升级规格id
+     */
+    private Long renewSkuId;
+
+    /**
+     * 续费升级订单id
+     */
+    private Long renewOrderId;
 }

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/claude/impl/ClaudeServiceImpl.java

@@ -70,6 +70,9 @@ public class ClaudeServiceImpl implements ClaudeService {
                     .expireTime(claudeUser.getExpireTime())
                     .limitNum(claudeUser.getLimitNum())
                     .limitTime(claudeUser.getLimitTime())
+                    .isRenewPackage(claudeUser.getRenewOrderId() != null ? true : false)
+                    .renewSkuId(claudeUser.getRenewSkuId())
+                    .renewOrderId(claudeUser.getRenewOrderId())
                     .use(Math.min(claudeUser.getLimitNum(), getConversationCount(claudeUser.getUserToken(), claudeUser.getLimitTime())))
                     .build();
         } else {

+ 28 - 9
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -214,6 +214,8 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final UserMirrorShopDistributeWaitingSendPointsMapper userMirrorShopDistributeWaitingSendPointsMapper;
 
+    private final ClaudeUserMapper claudeUserMapper;
+
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -1436,15 +1438,32 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 .eq(OrderDonRenewRecord::getOrderId, orderId)
                 .last("limit 1"));
         if (orderDonRenewRecord != null) {
-            ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class)
-                    .eq(ChatgptUser::getRelationId, orderDon.getRelationId())
-                    .last("limit 1"));
-            Long presentRenewSkuId = chatgptUser.getRenewSkuId();
-            if (presentRenewSkuId != null) {
-                //存在不同升级套餐
-                GoodsDonSku presentRenewSku = skuMapper.selectById(presentRenewSkuId);
-                if (!ObjectUtil.equal(presentRenewSkuId, skuId)) {
-                    throw BusinessRuntimeException.getInstance("请先退掉用户目前续费升级的{0}规格", presentRenewSku.getSpecVal());
+            //gpt
+            if (orderDon.getGoodsId() == 18) {
+                ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class)
+                        .eq(ChatgptUser::getRelationId, orderDon.getRelationId())
+                        .last("limit 1"));
+                Long presentRenewSkuId = chatgptUser.getRenewSkuId();
+                if (presentRenewSkuId != null) {
+                    //存在不同升级套餐
+                    GoodsDonSku presentRenewSku = skuMapper.selectById(presentRenewSkuId);
+                    if (!ObjectUtil.equal(presentRenewSkuId, skuId)) {
+                        throw BusinessRuntimeException.getInstance("请先退掉用户目前续费升级的{0}规格", presentRenewSku.getSpecVal());
+                    }
+                }
+            }
+            //claude pro
+            if (orderDon.getGoodsId() == 75) {
+                ClaudeUser claudeUser = claudeUserMapper.selectOne(Wrappers.lambdaQuery(ClaudeUser.class)
+                        .eq(ClaudeUser::getRelationId, orderDon.getRelationId())
+                        .last("limit 1"));
+                Long presentRenewSkuId = claudeUser.getRenewSkuId();
+                if (presentRenewSkuId != null) {
+                    //存在不同升级套餐
+                    GoodsDonSku presentRenewSku = skuMapper.selectById(presentRenewSkuId);
+                    if (!ObjectUtil.equal(presentRenewSkuId, skuId)) {
+                        throw BusinessRuntimeException.getInstance("请先退掉用户目前续费升级的{0}规格", presentRenewSku.getSpecVal());
+                    }
                 }
             }
         }

+ 53 - 8
netflix-service/src/main/java/com/cyksj/service/mange/impl/MirrorUserCleatServiceImpl.java

@@ -99,8 +99,53 @@ public class MirrorUserCleatServiceImpl implements MirrorUserCleatService {
 		OrderDonRenewRecord orderDonRenewRecord = orderDonRenewRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonRenewRecord.class)
 				.eq(OrderDonRenewRecord::getOrderId, orderId)
 				.last("limit 1"));
+		if (orderDonRenewRecord == null) {
+			return;
+		}
 		List<Long> userIdList = userBindRelationService.getRelationUserIdList(orderDon.getUserId(), null);
-		if (orderDonRenewRecord != null) {
+		//Claude pro
+		if (orderDon.getGoodsId() == 75) {
+			ClaudeUser claudeUser = claudeUserMapper.selectOne(Wrappers.lambdaQuery(ClaudeUser.class)
+					.eq(ClaudeUser::getRelationId, orderDon.getRelationId())
+					.last("limit 1"));
+			Long presentRenewSkuId = claudeUser.getRenewSkuId();
+			if (presentRenewSkuId == null) {
+				return;
+			}
+			GroupsRelation relation = groupsRelationMapper.selectById(orderDon.getRelationId());
+			GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
+			GoodsDonSku finalSku = skuMapper.selectById(groupsTrips.getSkuId());
+			//是否存在其他续费升级
+			OrderDon otherRenewOrderDon = orderDonRenewRecordMapper.getOtherRenewSku(orderDon.getId(), relation.getId(), userIdList);
+			GoodsDonSku otherRenewSku = null;
+			if (otherRenewOrderDon != null) {
+				otherRenewSku = skuMapper.selectById(otherRenewOrderDon.getSkuId());
+			}
+			Date renewExpiryTime = null;
+			claudeUser.setRenewSkuId(null);
+			claudeUser.setRenewOrderId(null);
+			//续费升级
+			if (otherRenewSku != null) {
+				finalSku = otherRenewSku;
+				log.info("claude pro 续费升级订单退款,relation_id:{}存在次级续费升级订单", orderDon.getUserId());
+				Date payTime = Optional.ofNullable(otherRenewOrderDon.getPayTime()).orElse(otherRenewOrderDon.getCreatedTime());
+				renewExpiryTime = DateUtil.offsetMonth(payTime, otherRenewSku.getMonths());
+				claudeUser.setRenewOrderId(otherRenewOrderDon.getId());
+				claudeUser.setRenewSkuId(otherRenewOrderDon.getSkuId());
+			}
+			//还原镜像user
+			claudeUser.setLimitTime(finalSku.getGptLimitTime());
+			claudeUser.setLimitNum(finalSku.getGptLimitNum());
+			claudeUser.setRenewExpiryTime(renewExpiryTime);
+			claudeUserMapper.updateById(claudeUser);
+			log.info("还原镜像claude user套餐成功");
+			//将续费有效置为过期
+			orderDonRenewRecord.setIsValid(true);
+			orderDonRenewRecordMapper.updateById(orderDonRenewRecord);
+			return;
+		}
+
+		if (orderDon.getGoodsId() == 18) {
 			ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class)
 					.eq(ChatgptUser::getRelationId, orderDon.getRelationId())
 					.last("limit 1"));
@@ -128,7 +173,7 @@ public class MirrorUserCleatServiceImpl implements MirrorUserCleatService {
 			}
 			//套餐升级
 			if (upgradeOrderDonSku != null) {
-				log.info("续费升级订单退款,relation_id:{}存在套餐升级", orderDon.getUserId());
+				log.info("GPT续费升级订单退款,relation_id:{}存在套餐升级", orderDon.getUserId());
 				finalSku = upgradeOrderDonSku;
 			}
 			chatgptUser.setRenewSkuId(null);
@@ -136,11 +181,11 @@ public class MirrorUserCleatServiceImpl implements MirrorUserCleatService {
 			//续费升级
 			if (otherRenewSku != null) {
 				finalSku = otherRenewSku;
-				log.info("续费升级订单退款,relation_id:{}存在次级续费升级订单", orderDon.getUserId());
+				log.info("GPT续费升级订单退款,relation_id:{}存在次级续费升级订单", orderDon.getUserId());
 				if (upgradeOrderDonSku != null) {
 					//套餐升级高于其他续费升级
 					if (upgradeOrderDonSku.getMonths() >= otherRenewSku.getMonths() && upgradeOrderDonSku.getGptLimitNum() >= otherRenewSku.getGptLimitNum() && upgradeOrderDonSku.getGptLimitTime() <= otherRenewSku.getGptLimitTime()) {
-						log.info("续费升级订单退款,relation_id:{}存在更高级套餐升级", orderDon.getUserId());
+						log.info("GPT续费升级订单退款,relation_id:{}存在更高级套餐升级", orderDon.getUserId());
 						finalSku = upgradeOrderDonSku;
 					}
 				}
@@ -159,11 +204,11 @@ public class MirrorUserCleatServiceImpl implements MirrorUserCleatService {
 			//将续费有效置为过期
 			orderDonRenewRecord.setIsValid(true);
 			orderDonRenewRecordMapper.updateById(orderDonRenewRecord);
-		}
 
-		if (orderDonRenewRecord == null && orderDon.getOrderType() == 2) {
-			//退款续费 套餐升级订单
-			handleGptMirrorRenewOrderRefund(orderDon, sku);
+			if (orderDon.getOrderType() == 2) {
+				//退款续费 套餐升级订单
+				handleGptMirrorRenewOrderRefund(orderDon, sku);
+			}
 		}
 	}
 

+ 11 - 1
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderCommonServiceImpl.java

@@ -84,7 +84,17 @@ public class OrderCommonServiceImpl implements OrderCommonService {
 				if (otherOrder != null) {
 					Long otherSkuId = otherOrder.getSkuId();
 					GoodsDonSku otherGoodsSku = goodsDonSkuMapper.selectById(otherSkuId);
-					DateTime endTime = DateUtil.offsetMonth(otherOrder.getCreatedTime(), otherGoodsSku.getMonths() * num);
+					DateTime endTime;
+					Date otherOrderCreatedTime = otherOrder.getCreatedTime();
+					if (otherGoodsSku.getDays() != null && otherGoodsSku.getDays() > 0) {
+						endTime = DateUtil.offsetDay(otherOrderCreatedTime, otherGoodsSku.getDays() * num);
+					} else {
+						if (otherGoodsSku.getGoodsId() == 1 && otherGoodsSku.getMonths() == 1) {
+							endTime = DateUtil.offsetDay(otherOrderCreatedTime, 30);
+						} else{
+							endTime = DateUtil.offsetMonth(otherOrderCreatedTime, otherGoodsSku.getMonths() * num);
+						}
+					}
 					if (now.isBefore(endTime)) {
 						isFlag = false;
 					}

+ 101 - 30
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -358,6 +358,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final ZfbShopOrderDayLimitMapper zfbShopOrderDayLimitMapper;
 
+	private final ClaudeUserMapper claudeUserMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -1195,35 +1197,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 			corpInteractiveUserOrderRelationMapper.insert(corpInteractiveUserOrderRelation);
 		}
-		//GPT续费升级 目前升级套餐续费
-		if (orderDon.getGoodsId() == 18 && sku.getIsMirror()) {
-			try {
-				//记录续费升级订单 目前升级规格续费
-				ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class)
-						.eq(ChatgptUser::getRelationId, orderDon.getRelationId())
-						.last("limit 1"));
-				if (chatgptUser != null && tripsSkuId.intValue() != renewSkuId.intValue()) {
-					//是续费升级的规格
-					//全部归纳到续费升级的关联订单
-					if (chatgptUser.getLimitNum() == sku.getGptLimitNum() && chatgptUser.getLimitTime() == sku.getGptLimitTime()) {
-						renewUpgradeIndependentPackage = renewUpgradePackageMapper.selectOne(Wrappers.lambdaQuery(RenewUpgradePackage.class)
-								.eq(RenewUpgradePackage::getSkuId, tripsSkuId)
-								.apply("JSON_CONTAINS(upgrade_sku_ids,'\"" + renewSkuId + "\"')")
-								.eq(RenewUpgradePackage::getStatus, 1)
-								.eq(RenewUpgradePackage::getDeleted, 1)
-								.last("limit 1"));
-						//无优惠折扣 但订单可使用优惠码
-						RenewUpgradePackage renewUpgradePackage = new RenewUpgradePackage();
-						renewUpgradePackage.setId(renewUpgradeIndependentPackage.getId());
-						renewUpgradePackage.setDiscount(BigDecimal.ONE);
-						recordRenewOrderDon(orderDon, renewUpgradePackage, groupsTrips);
-					}
-				}
-			} catch (Exception e) {
-				log.error("记录续费升级错误:{}", StringUtil.getErrorText(e));
-			}
-		}
 
+		//处理镜像规格续费目前升级的规格
+		handlerMirrorRenewPresentPackage(orderDon, sku, tripsSkuId, renewSkuId, groupsTrips);
 		//记录订单ip关联
 		recordOrderDonLocationRelate(orderDon.getId(), payRequest.getIp());
 		if (renewUpgradeIndependentPackage != null) {
@@ -4133,6 +4109,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDon.setOriMoney(price);
 		orderDon.setRealMoney(price);
 		BigDecimal discountPrice = price.multiply(renewUpgradePackage.getDiscount());
+		//去掉小数
+		if (orderDon.getGoodsId() == 75) {
+			discountPrice = discountPrice.divide(BigDecimal.valueOf(100), 0, RoundingMode.DOWN).multiply(BigDecimal.valueOf(100));
+		}
 		orderDon.setMoney(discountPrice);
 
 		StringBuilder payTitle = new StringBuilder();
@@ -4405,7 +4385,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	//镜像续费升级
 	private void handleMirrorRenew(GoodsDonSku sku, OrderDon order, GroupsTrips groupsTrips, Long relationId, Date newDate) {
-		if (sku.getGoodsId() == 18 && sku.getIsMirror() && order.getOrderType() == 2) {
+		if (sku.getGoodsId() == Constant.GPT_PLUS_GID && sku.getIsMirror() && order.getOrderType() == 2) {
 			OrderDonRenewRecord orderDonRenewRecord = orderDonRenewRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonRenewRecord.class)
 					.eq(OrderDonRenewRecord::getOrderId, order.getId())
 					.last("limit 1"));
@@ -4429,7 +4409,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					if (chatgptUser.getRenewSkuId() != null && chatgptUser.getRenewSkuId().equals(order.getSkuId())) {
 						return;
 					}
-					log.info("用户续费升级订单skuId:{}将用户车票relationId:{}套餐续费升级", order.getSkuId(), relationId);
+					log.info("GPT用户续费升级订单skuId:{}将用户车票relationId:{}套餐续费升级", order.getSkuId(), relationId);
 					chatgptUser.setLimitTime(sku.getGptLimitTime());
 					chatgptUser.setLimitNum(sku.getGptLimitNum());
 					//记录续费升级过期的时间
@@ -4454,6 +4434,43 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 			chatgptUserMapper.updateById(chatgptUser);
 		}
+
+		//claude pro续费升级
+		if (sku.getGoodsId() == Constant.CLAUDE_PRO_GID && sku.getIsMirror() && order.getOrderType() == 2) {
+			OrderDonRenewRecord orderDonRenewRecord = orderDonRenewRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonRenewRecord.class)
+					.eq(OrderDonRenewRecord::getOrderId, order.getId())
+					.last("limit 1"));
+			if (orderDonRenewRecord != null) {
+				//升级gptUser次数
+				ClaudeUser claudeUser = claudeUserMapper.selectOne(Wrappers.lambdaQuery(ClaudeUser.class)
+						.eq(ClaudeUser::getRelationId, relationId)
+						.last("limit 1"));
+				if (claudeUser == null) {
+					return;
+				}
+				//同规格续费新或者同属性低规格 无需更新
+				if (!ObjectUtil.equal(groupsTrips.getSkuId(), order.getSkuId())) {
+					Long gtSkuId = groupsTrips.getSkuId();
+					GoodsDonSku groupsSku = goodsDonSkuMapper.selectById(gtSkuId);
+					//同属性 低规格 只增加车票时长
+					if (sku.getGptLimitNum() <= groupsSku.getGptLimitNum()) {
+						return;
+					}
+					//同规格续费不处理
+					if (claudeUser.getRenewSkuId() != null && claudeUser.getRenewSkuId().equals(order.getSkuId())) {
+						return;
+					}
+					log.info("CLAUDE PRO用户续费升级订单skuId:{}将用户车票relationId:{}套餐续费升级", order.getSkuId(), relationId);
+					claudeUser.setLimitTime(sku.getGptLimitTime());
+					claudeUser.setLimitNum(sku.getGptLimitNum());
+					//记录续费升级过期的时间
+					claudeUser.setRenewExpiryTime(newDate);
+					claudeUser.setRenewOrderId(order.getId());
+					claudeUser.setRenewSkuId(order.getSkuId());
+					claudeUserMapper.updateById(claudeUser);
+				}
+			}
+		}
 	}
 
 	/**
@@ -4513,4 +4530,58 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		}
 	}
+
+	/**
+	 * 处理镜像车票续费升级后的规格
+	 */
+	private void handlerMirrorRenewPresentPackage(OrderDon orderDon, GoodsDonSku sku, Long tripsSkuId, Long renewSkuId, GroupsTrips groupsTrips) {
+		//GPT续费升级 目前升级套餐续费
+		//Claude pro
+		if ((orderDon.getGoodsId() == 18 || orderDon.getGoodsId() == 75) && sku.getIsMirror()) {
+			try {
+				//记录续费升级订单 目前升级规格续费
+				Integer limitNum = null;
+				Long limitTime = null;
+				if (orderDon.getGoodsId() == 18) {
+					ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class)
+							.eq(ChatgptUser::getRelationId, orderDon.getRelationId())
+							.last("limit 1"));
+					if (chatgptUser == null) {
+						return;
+					}
+					limitNum = chatgptUser.getLimitNum();
+					limitTime = chatgptUser.getLimitTime();
+				}
+				if (orderDon.getGoodsId() == 75) {
+					ClaudeUser claudeUser = claudeUserMapper.selectOne(Wrappers.lambdaQuery(ClaudeUser.class)
+							.eq(ClaudeUser::getRelationId, orderDon.getRelationId())
+							.last("limit 1"));
+					if (claudeUser == null) {
+						return;
+					}
+					limitNum = claudeUser.getLimitNum();
+					limitTime = claudeUser.getLimitTime();
+				}
+				if (tripsSkuId.intValue() != renewSkuId.intValue()) {
+					//是续费升级的规格
+					//全部归纳到续费升级的关联订单
+					if (limitNum == sku.getGptLimitNum() && limitTime == sku.getGptLimitTime()) {
+						RenewUpgradePackage upgradePackage = renewUpgradePackageMapper.selectOne(Wrappers.lambdaQuery(RenewUpgradePackage.class)
+								.eq(RenewUpgradePackage::getSkuId, tripsSkuId)
+								.apply("JSON_CONTAINS(upgrade_sku_ids,'\"" + renewSkuId + "\"')")
+								.eq(RenewUpgradePackage::getStatus, 1)
+								.eq(RenewUpgradePackage::getDeleted, 1)
+								.last("limit 1"));
+						//无优惠折扣 但订单可使用优惠码
+						RenewUpgradePackage renewUpgradePackage = new RenewUpgradePackage();
+						renewUpgradePackage.setId(upgradePackage.getId());
+						renewUpgradePackage.setDiscount(BigDecimal.ONE);
+						recordRenewOrderDon(orderDon, renewUpgradePackage, groupsTrips);
+					}
+				}
+			} catch (Exception e) {
+				log.error("记录续费升级错误:{}", StringUtil.getErrorText(e));
+			}
+		}
+	}
 }

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -1403,6 +1403,11 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 				ticket.setGptUserLimitNum(userInfo.getLimitNum());
 				ticket.setGptUserLimitTime(userInfo.getLimitTime());
 				ticket.setUse(userInfo.getUse());
+				Long renewSkuId = userInfo.getRenewSkuId();
+				if (renewSkuId != null) {
+					GoodsDonSkuRenewView renewSku = beanSearcher.searchFirst(GoodsDonSkuRenewView.class, MapUtils.builder().field(GoodsDonSkuRenewView::getSkuId, renewSkuId).build());
+					ticket.setRenewSku(renewSku);
+				}
 			} catch (Exception e) {
 			}
 		}

+ 41 - 1
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -137,6 +137,8 @@ public class GroupRelationController {
 
     private final UserBenefitsOrderRecordMapper userBenefitsOrderRecordMapper;
 
+    private final ClaudeUserMapper claudeUserMapper;
+
     private final static Sequence SEQUENCE = new Sequence(0);
 
 	@RequestMapping("/get/renewal")
@@ -948,7 +950,8 @@ public class GroupRelationController {
         long userId = StpUserUtil.getLoginIdAsLong();
         List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
         ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class)
-                .eq(ChatgptUser::getRelationId, relationId));
+                .eq(ChatgptUser::getRelationId, relationId)
+                .last("limit 1"));
         if (chatgptUser == null) return GatewayResponse.SUCCESS.newBuilder().toResult();
         //目前续费升级的规格
         Long renewSkuId = chatgptUser.getRenewSkuId();
@@ -1035,6 +1038,43 @@ public class GroupRelationController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(renewUpgradePackageFrontViews);
     }
 
+    /**
+     * claude pro续费升级
+     */
+    @GetMapping("/get/claude/renew/skus/{relationId}/{skuId}")
+    public Result<List<RenewUpgradePackageFrontView> > getClaudeRenewSkus(@PathVariable Long relationId, @PathVariable Long skuId) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        ClaudeUser claudeUser = claudeUserMapper.selectOne(Wrappers.lambdaQuery(ClaudeUser.class)
+                .eq(ClaudeUser::getRelationId, relationId)
+                .last("limit 1"));
+        if (claudeUser == null) return GatewayResponse.SUCCESS.newBuilder().toResult();
+        List<RenewUpgradePackageFrontView> renewUpgradePackageFrontViews = beanSearcher.searchAll(RenewUpgradePackageFrontView.class, MapUtils.builder().field(RenewUpgradePackageFrontView::getSkuId, skuId).build());
+        renewUpgradePackageFrontViews.forEach(renew -> {
+            try {
+                List<Long> upgradeSkuIds = Jsons.parseList(renew.getUpgradeSkuIds(), Long.class);
+                MapBuilder builder = MapUtils.builder();
+                List<RenewUpgradePackageFrontView.RenewSkuView> renewSkuViews = beanSearcher.searchAll(RenewUpgradePackageFrontView.RenewSkuView.class, builder
+                        .field(RenewUpgradePackageFrontView.RenewSkuView::getSkuId, upgradeSkuIds).op(Operator.InList)
+                        .field(RenewUpgradePackageFrontView.RenewSkuView::getGptLimitNum, claudeUser.getLimitNum()).op(Operator.GreaterEqual)
+                        .build());
+                renew.setRenewSkus(renewSkuViews);
+            } catch (Exception e) {
+            }
+        });
+        return GatewayResponse.SUCCESS.newBuilder().toResult(renewUpgradePackageFrontViews);
+    }
+
+    /**
+     * 已配置的续费升级规格ids
+     */
+    @GetMapping("/get/renew/skus/configured")
+    public Result<List<Long> > getClaudeRenewSkus() {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        List<RenewUpgradePackageFrontView> renewUpgradePackageFrontViews = beanSearcher.searchAll(RenewUpgradePackageFrontView.class, MapUtils.builder().onlySelect(RenewUpgradePackageFrontView::getSkuId).build());
+        List<Long> collect = renewUpgradePackageFrontViews.stream().map(RenewUpgradePackageFrontView::getSkuId).collect(Collectors.toList());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(collect);
+    }
+
     /**
      * 获取GPT PLUS登录验证码
      */

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

@@ -134,6 +134,9 @@ public class OrderController {
     @Autowired
     private UserBindRelationService userBindRelationService;
 
+    @Autowired
+    private GroupsRelationMapper relationMapper;
+
     /**
      * 支付
      * @author chan
@@ -889,10 +892,15 @@ public class OrderController {
         if (relationId != null) {
             builder.field(OrderDonView::getRelationId, relationId);
         }
+        GroupsRelation relation = relationMapper.selectById(relationId);
+        if (relation == null) {
+            return GatewayResponse.SUCCESS.newBuilder().toResult();
+        }
         List<Long> userIds = UserBindRelationService.getRelationUserIdList(userId, null);
         List<OrderDonView> list = beanSearcher.searchAll(OrderDonView.class, builder
                 .field(OrderDonView::getUserId, userIds).op(Operator.InList)
                 .field(OrderDonView::getOrderType, 2)
+                .field(OrderDonView::getCreatedTime, relation.getStartTime()).op(Operator.GreaterThan)
                 .orderBy(OrderDonView::getId).desc()
                 .build());
         return GatewayResponse.SUCCESS.newBuilder().toResult(list);