zoujiajian 1 an în urmă
părinte
comite
fc9eff57fb

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ClaudeCodeUserRenewExpiryRecord;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: ClaudeCodeUserRenewExpiryRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/8/11 13:39
+ */
+public interface ClaudeCodeUserRenewExpiryRecordMapper extends BaseMapper<ClaudeCodeUserRenewExpiryRecord> {
+}

+ 31 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ClaudeCodeUserRenewExpiryRecord.java

@@ -0,0 +1,31 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: ClaudeCodeUserRenewExpiryRecord
+ * 创建者: JavaZou
+ * 创建时间:2025/8/11 13:37
+ */
+@Getter
+@Setter
+public class ClaudeCodeUserRenewExpiryRecord extends BaseEntity{
+	private Long userId;
+
+	private Long relationId;
+
+	private Long renewSkuId;
+
+	private Long orderId;
+
+	private Date expiryTime;
+
+	/**
+	 * 是否有效 默认有效 true
+	 */
+	private Boolean isValid;
+}

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelation.java

@@ -172,6 +172,12 @@ public class GroupsRelation extends BaseEntity {
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Integer codeCreditRecovery;
 
+    /**
+     * claude code套餐skuId
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Long codeSkuId;
+
 	@AllArgsConstructor
     @Getter
     public enum Status{

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/claude/ClaudeCodeService.java

@@ -22,7 +22,7 @@ public interface ClaudeCodeService {
 	/**
 	 * 生成claude code用户套餐信息
 	 */
-	void generateOrUpdateClaudeCodeUserInfo(Long relationId, Long userId, GoodsDonSku sku, Integer orderType);
+	void generateOrUpdateClaudeCodeUserInfo(Long orderId, Long relationId, Long userId, GoodsDonSku sku, Integer orderType);
 
 	/**
 	 * 用户创建api keys

+ 30 - 2
netflix-service/src/main/java/com/cyksj/service/claude/impl/ClaudeCodeServiceImpl.java

@@ -2,6 +2,7 @@ package com.cyksj.service.claude.impl;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.http.Method;
@@ -9,7 +10,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Jsons;
+import com.cyksj.mapper.ClaudeCodeUserRenewExpiryRecordMapper;
 import com.cyksj.mapper.GroupsRelationMapper;
+import com.cyksj.model.entity.ClaudeCodeUserRenewExpiryRecord;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.entity.GroupsRelation;
 import com.cyksj.model.manage.views.GroupsRelationView;
@@ -50,26 +53,37 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 
 	private final BeanSearcher beanSearcher;
 
+	private final ClaudeCodeUserRenewExpiryRecordMapper claudeCodeUserRenewExpiryRecordMapper;
+
 	private final static String CLAUDE_CODE_API_PREFIX = "https://relay01.yhlxj.com/";
 
 	public static final String CLAUDE_CODE_API_ADMIN_KEY = "claudecodeyhlxjclaude";
 
 	@Override
-	public void generateOrUpdateClaudeCodeUserInfo(Long relationId, Long userId, GoodsDonSku sku, Integer orderType) {
+	public void generateOrUpdateClaudeCodeUserInfo(Long orderId, Long relationId, Long userId, GoodsDonSku sku, Integer orderType) {
 		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
 		GroupsRelation relation = relationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).eq(GroupsRelation::getId, relationId).in(GroupsRelation::getUserId, userIdList));
+		Long relationUserId = relation.getUserId();
+		Integer relationCodePoints = relation.getCodePoints();
+		Long relationCodeSkuId = relation.getCodeSkuId();
 		Date expiryTime = relation.getExpiryTime();
 		Integer codePoints = sku.getCodePoints();
 		Integer codeCreditRecovery = sku.getCodeCreditRecovery();
+		Long skuId = sku.getId();
 		//生成claude code用户套餐
 		try {
 			createOrUpdateClaudeCodeUserPackage(relation.getUserId(), sku.getSpecVal(), codePoints, codeCreditRecovery, expiryTime);
 			//设置车位的套餐
 			relation.setCodePoints(codePoints);
 			relation.setCodeCreditRecovery(codeCreditRecovery);
+			relation.setCodeSkuId(skuId);
 			relationMapper.updateById(relation);
 			if (orderType == 2) {
-				invalidateUserCache(userId);
+				invalidateUserCache(relationUserId);
+				//若是续费升级 记录此时续费升级的过期时间
+				if (relationCodePoints != null && relationCodePoints <= codePoints && !ObjectUtil.equal(relationCodeSkuId, skuId)) {
+					saveClaudeCodeRenewExpiryRecord(orderId, relationUserId, relationId, expiryTime, skuId);
+				}
 			}
 		} catch (Exception e) {
 
@@ -324,4 +338,18 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 				.execute();
 		return execute.body();
 	}
+
+	/**
+	 * 记录claude code 续费升级的过期时间
+	 */
+	private void saveClaudeCodeRenewExpiryRecord(Long orderId, Long relationUserId, Long relationId, Date expiryTime, Long skuId) {
+		ClaudeCodeUserRenewExpiryRecord renewExpiryRecord = new ClaudeCodeUserRenewExpiryRecord();
+		renewExpiryRecord.setOrderId(orderId);
+		renewExpiryRecord.setUserId(relationUserId);
+		renewExpiryRecord.setRelationId(relationId);
+		renewExpiryRecord.setRenewSkuId(skuId);
+		renewExpiryRecord.setExpiryTime(expiryTime);
+		claudeCodeUserRenewExpiryRecordMapper.insert(renewExpiryRecord);
+	}
+
 }

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

@@ -3156,7 +3156,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		//购买claude code
 		if (orderDon.getGoodsId() == Constant.CLAUDE_CODE_GOODS_ID) {
 			//生成所需的claude code用户信息
-			claudeCodeService.generateOrUpdateClaudeCodeUserInfo(orderDon.getRelationId(), orderDon.getUserId(), sku, orderDon.getOrderType());
+			claudeCodeService.generateOrUpdateClaudeCodeUserInfo(orderDon.getId(), orderDon.getRelationId(), orderDon.getUserId(), sku, orderDon.getOrderType());
 		}
 	}