zoujiajian 11 maanden geleden
bovenliggende
commit
8f5567d346

+ 9 - 2
netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelation.java

@@ -171,11 +171,11 @@ public class GroupsRelation extends BaseEntity {
 
 
     /**
-     * 是否是claude code 续费
+     * 是否是claude code/codex 续费
      */
     @DbIgnore
     @TableField(exist = false)
-    private Boolean isClaudeCodeRenew;
+    private Boolean isRenew;
 
     /**
      * 是否是claude code 续费升级
@@ -184,6 +184,13 @@ public class GroupsRelation extends BaseEntity {
     @TableField(exist = false)
     private Boolean isClaudeCodeUpgrade;
 
+    /**
+     * 是否是codex 续费升级
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    private Boolean isCodexUpgrade;
+
     /**
      * 是否被冻结
      * 默认false

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/codex/CodexService.java

@@ -2,6 +2,7 @@ package com.cyksj.service.codex;
 
 import com.cyksj.model.entity.CodexUser;
 import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.GroupsRelation;
 import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.request.ClaudeCodeApiKeysReq;
 import com.cyksj.model.request.ClaudeCodeDelReq;
@@ -83,4 +84,14 @@ public interface CodexService {
     List<ClaudeCodeUserApiKeysView> getUserApiKeys(long userId) throws Exception;
 
     void deleteApiKeysById(ClaudeCodeDelReq delReq) throws Exception;
+
+    /**
+     * 删除用户套餐
+     */
+    boolean delUserPackages(Long userId);
+
+    /**
+     * 续费升级
+     */
+    void handleClaudeCodeUserPackageSku(GroupsRelation relation, GoodsDonSku sku, Long id);
 }

+ 8 - 1
netflix-service/src/main/java/com/cyksj/service/codex/impl/CodexServiceImpl.java

@@ -1323,7 +1323,8 @@ public class CodexServiceImpl implements CodexService {
 		}
 	}
 
-	private boolean delUserPackages(Long userId) {
+	@Override
+	public boolean delUserPackages(Long userId) {
 		String url = String.format(Constant.CLAUDE_CODE_API_PREFIX + "api/users/%s/plan?service_type=openai", userId);
 		try {
 			ClaudeCodeResp claudeCodeResp = executeClaudeCodeDeletedApi(url);
@@ -1338,6 +1339,12 @@ public class CodexServiceImpl implements CodexService {
 		return Boolean.FALSE;
 	}
 
+	@Override
+	public void handleClaudeCodeUserPackageSku(GroupsRelation relation, GoodsDonSku sku, Long orderId) {
+		//更新套餐
+		createOrUpdateCodexUserInfo(orderId, relation.getId(), relation.getUserId(), sku, 2);
+	}
+
 	/**
 	 * claude code DELETE请求
 	 */

+ 39 - 6
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -28,6 +28,7 @@ import com.cyksj.model.request.ExchangeCodeReq;
 import com.cyksj.model.request.ExchangeCodeTicket;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.claude.ClaudeCodeService;
+import com.cyksj.service.codex.CodexService;
 import com.cyksj.service.exchange.ExchangeCodeService;
 import com.cyksj.service.relation.GroupRelationFrontService;
 import com.cyksj.service.relation.GroupsRelationExpiryRecordService;
@@ -99,10 +100,10 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 
 	private final UserBindRelationService userBindRelationService;
 
-	private final ClaudeCodeUserMapper claudeCodeUserMapper;
-
 	private final ClaudeCodeService claudeCodeService;
 
+	private final CodexService codexService;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public List<ExcelExchangeCodeData> createExchangeCode(ExchangeCodeReq exchangeCodeReq) throws Exception {
@@ -391,14 +392,18 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			orderDonMapper.insert(orderDon);
 			log.info("用户{}兑换规格:{}车位成功", user.getId(), orderDon.getSkuId());
 
-			if (relation.getIsClaudeCodeRenew() != null && relation.getIsClaudeCodeRenew()) {
-				//claude code续费
+			if (relation.getIsRenew() != null && relation.getIsRenew()) {
+				//claude code/codex续费
 				orderDon.setOrderType(2);
 				orderDonMapper.updateById(orderDon);
-				//续费且升级
+				//claude code续费且升级
 				if (relation.getIsClaudeCodeUpgrade() != null && relation.getIsClaudeCodeUpgrade()) {
 					claudeCodeService.handleClaudeCodeUserPackageSku(relation, sku, orderDon.getId());
 				}
+				//codex 续费且升级
+				if (relation.getIsClaudeCodeUpgrade() != null && relation.getIsClaudeCodeUpgrade()) {
+					codexService.handleClaudeCodeUserPackageSku(relation, sku, orderDon.getId());
+				}
 			}
 		}
 		if (orderDonTye == OrderDon.Type.EX_CODE) {
@@ -447,13 +452,41 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 				relation.setExpiryTime(expiryTime);
 				groupsRelationMapper.updateById(relation);
 				//同规格只加时长
-				relation.setIsClaudeCodeRenew(Boolean.TRUE);
+				relation.setIsRenew(Boolean.TRUE);
 				if (relationSku.getClaudeDailyLimit() != sku.getClaudeDailyLimit()) {
 					relation.setIsClaudeCodeUpgrade(true);
 				}
 				return relation;
 			}
 		}
+
+		//codex 商品兑换
+		if (sku.getGoodsId() == Constant.CODEX_GOODS_ID) {
+			List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+			GroupsRelationView groupsRelationView = beanSearcher.searchFirst(GroupsRelationView.class, MapUtils.builder().field(GroupsRelationView::getUserId, userIdList).op(Operator.InList).field(GroupsRelationView::getGoodsId, Constant.CODEX_GOODS_ID).field(GroupsRelationView::getExpiryTime, DateTime.now()).op(Operator.GreaterThan).build());
+			if (groupsRelationView != null) {
+				GoodsDonSku relationSku = goodsDonSkuMapper.selectById(groupsRelationView.getSkuId());
+				//兑换的规格 低于当前规格 不让兑换
+				if (relationSku.getOpenaiDailyLimit() > sku.getOpenaiDailyLimit()) {
+					throw BusinessRuntimeException.getInstance("请在codex当前版本过期后再兑换");
+				}
+				Date expiryTime = groupsRelationView.getExpiryTime();
+				if (sku.getDays() != null) {
+					expiryTime = DateUtil.offsetDay(expiryTime, sku.getDays());
+				} else {
+					expiryTime = DateUtil.offsetMonth(expiryTime, sku.getMonths());
+				}
+				GroupsRelation relation = groupsRelationMapper.selectById(groupsRelationView.getId());
+				relation.setExpiryTime(expiryTime);
+				groupsRelationMapper.updateById(relation);
+				//同规格只加时长
+				relation.setIsRenew(Boolean.TRUE);
+				if (relationSku.getOpenaiDailyLimit() != sku.getOpenaiDailyLimit()) {
+					relation.setIsCodexUpgrade(true);
+				}
+				return relation;
+			}
+		}
 		Integer retryNum = 1;
 		List<Long> errorsRelationIds = new ArrayList<>();
 		GroupsRelation relation = getFinalRelation(sku, userId, retryNum, yhsId, errorsRelationIds);

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

@@ -7,6 +7,7 @@ import com.cyksj.mapper.claudecode.OAuthTokenMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.service.claude.ClaudeCodeService;
+import com.cyksj.service.codex.CodexService;
 import com.cyksj.service.mange.MirrorUserCleatService;
 import com.cyksj.service.relation.GroupRelationClearService;
 import com.ejlchina.searcher.BeanSearcher;
@@ -49,6 +50,8 @@ public class GroupRelationClearServiceImpl implements GroupRelationClearService
 
 	private final CodexUserMapper codexUserMapper;
 
+	private final CodexService codexService;
+
 	@Override
 	public void clearTicket(GroupsRelation relation, UserTicketClearedRecord.Source source) {
 		Long relationId = relation.getId();
@@ -158,6 +161,8 @@ public class GroupRelationClearServiceImpl implements GroupRelationClearService
 
 				//codex
 				if (groupsRelation.getGoodsId() != null && groupsRelation.getGoodsId() == Constant.CODEX_GOODS_ID) {
+					//清除套餐
+					codexService.delUserPackages(groupsRelation.getUserId());
 					//清除codex
 					codexUserMapper.delete(Wrappers.lambdaQuery(CodexUser.class).eq(CodexUser::getRelationId, relationId));
 				}