zoujiajian преди 1 година
родител
ревизия
3f1d0352a1

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ClaudeCodeUser.java

@@ -2,6 +2,7 @@ package com.cyksj.model.entity;
 
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -25,6 +26,10 @@ public class ClaudeCodeUser extends BaseEntity{
 
 	private Long relationId;
 
+	@DbIgnore
+	@TableField(exist = false)
+	private Integer oriCodePoints;
+
 	/**
 	 * claude code积分上限
 	 */

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

@@ -53,7 +53,7 @@ public interface ClaudeCodeService {
 
 	Boolean checkClaudeCodeUser(Long userId);
 
-	void updateClaudeCodeUserPackageInfo(ClaudeCodeUser claudeCodeUser);
+	void updateClaudeCodeUserPackageInfo(ClaudeCodeUser claudeCodeUser,Integer oriCodePoints, String description, String type);
 
 	/**
 	 * 删除用户claude code 套餐

+ 34 - 1
netflix-service/src/main/java/com/cyksj/service/claude/impl/ClaudeCodeServiceImpl.java

@@ -114,6 +114,10 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 			}
 			//清缓存
 			if (orderType == 2) {
+				//记录变更积分
+				if (isUpgrade) {
+					recordCodePointsChangeRecord(claudeCodeUser.getUserId(), codePoints - thisRelationCodePoints, "升级", "adjustment");
+				}
 				invalidateUserCache(relationUserId);
 			}
 		} catch (Exception e) {
@@ -358,10 +362,15 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 	}
 
 	@Override
-	public void updateClaudeCodeUserPackageInfo(ClaudeCodeUser claudeCodeUser) {
+	public void updateClaudeCodeUserPackageInfo(ClaudeCodeUser claudeCodeUser, Integer oriCodePoints, String description, String type) {
 		try {
 			ClaudeCodeResp codeUserPackage = createOrUpdateClaudeCodeUserPackage(claudeCodeUser.getUserId(), claudeCodeUser.getPlanName(), claudeCodeUser.getCodePoints(), claudeCodeUser.getCodeCreditRecovery(), claudeCodeUser.getExpiryTime());
 			if (!Constant.SUCCESS.equals(codeUserPackage.getMessage())) {
+				Integer codePoints = claudeCodeUser.getCodePoints();
+				//变更积分
+				Integer amount = codePoints - oriCodePoints;
+				//记录变更积分
+				recordCodePointsChangeRecord(claudeCodeUser.getUserId(), amount, description, type);
 				//重试标记
 				claudeCodeUser.setIsRetry(Boolean.TRUE);
 				claudeCodeUserMapper.updateById(claudeCodeUser);
@@ -375,6 +384,30 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 		}
 	}
 
+	/**
+	 *
+	 * @param userId
+	 * @param amount
+	 * @param description
+	 * @param type consume refund adjustment
+	 */
+	private void recordCodePointsChangeRecord(Long userId, Integer amount, String description, String type) {
+		Map<String, Object> parmas = new HashMap<>();
+		parmas.put("amount", amount);
+		parmas.put("description", description);
+		parmas.put("type", type);
+		String url = String.format(CLAUDE_CODE_API_PREFIX + "/api/users/%s/credits/adjust", userId);
+		try {
+			String responseBody = executeClaudeCodePostApi(url, Jsons.toJson(parmas));
+			ClaudeCodeResp claudeCodeResp = Jsons.parseObject(responseBody, ClaudeCodeResp.class);
+			if (!Constant.SUCCESS.equals(claudeCodeResp.getMessage())) {
+				log.error("变更用户:{}积分记录失败", userId);
+			}
+		} catch (Exception e) {
+
+		}
+	}
+
 	@Override
 	public Boolean delUserPackages(Long userId) {
 		String url = String.format(CLAUDE_CODE_API_PREFIX + "api/users/%s/plan", userId);

+ 3 - 1
netflix-service/src/main/java/com/cyksj/service/mange/impl/MirrorUserCleatServiceImpl.java

@@ -151,6 +151,8 @@ public class MirrorUserCleatServiceImpl implements MirrorUserCleatService {
 			GoodsDonSku finalSku = skuMapper.selectById(groupsTrips.getSkuId());
 			ClaudeCodeUserRenewExpiryRecord renewExpiryRecord = claudeCodeUserRenewExpiryRecordMapper.selectOne(Wrappers.lambdaQuery(ClaudeCodeUserRenewExpiryRecord.class).eq(ClaudeCodeUserRenewExpiryRecord::getOrderId, orderId).eq(ClaudeCodeUserRenewExpiryRecord::getIsValid, Boolean.FALSE).last("limit 1"));
 			Date renewExpiryTime = null;
+			Integer oriCodePoints = claudeCodeUser.getCodePoints();
+			claudeCodeUser.setOriCodePoints(oriCodePoints);
 			claudeCodeUser.setRenewSkuId(null);
 			claudeCodeUser.setRenewOrderId(null);
 			if (renewExpiryRecord != null) {
@@ -179,7 +181,7 @@ public class MirrorUserCleatServiceImpl implements MirrorUserCleatService {
 			claudeCodeUserMapper.updateById(claudeCodeUser);
 			log.info("还原镜像claude code user套餐成功");
 			//调用api更新claude code用户信息
-			claudeCodeService.updateClaudeCodeUserPackageInfo(claudeCodeUser);
+			claudeCodeService.updateClaudeCodeUserPackageInfo(claudeCodeUser, oriCodePoints, "退款", "refund");
 			return;
 		}
 		OrderDonRenewRecord orderDonRenewRecord = orderDonRenewRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonRenewRecord.class)