zoujiajian 1 年間 前
コミット
5ae5adea9a

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

@@ -159,6 +159,13 @@ public class GroupsRelation extends BaseEntity {
      */
     private Boolean isVip;
 
+    /**
+     * 是否是claude code 续费升级
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    private Boolean isClaudeCodeUpgrade;
+
 	@AllArgsConstructor
     @Getter
     public enum Status{

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

@@ -2,6 +2,7 @@ package com.cyksj.service.claude;
 
 import com.cyksj.model.entity.ClaudeCodeUser;
 import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.GroupsRelation;
 import com.cyksj.model.request.ClaudeCodeApiKeysReq;
 import com.cyksj.model.request.ClaudeCodeDelReq;
 import com.cyksj.model.response.ClaudeCodePointsHistoryResp;
@@ -60,4 +61,9 @@ public interface ClaudeCodeService {
 	 * 删除用户claude code 套餐
 	 */
 	Boolean delUserPackages(Long userId);
+
+	/**
+	 * 处理续费升级 TODO
+	 */
+	void handleClaudeCodeUserPackageSku(GroupsRelation relation, GoodsDonSku sku, Long orderId);
 }

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

@@ -95,13 +95,13 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 		Date renewExpiryTime = null;
 		//若是续费升级 记录此时续费升级的过期时间
 		if (thisRelationCodePoints != null && thisRelationCodePoints <= codePoints && !ObjectUtil.equal(thisCodeOriSkuId, skuId)) {
-			saveClaudeCodeRenewExpiryRecord(orderId, relationUserId, relationId, expiryTime, skuId);
 			if (sku.getDays() != null) {
 				renewExpiryTime = DateUtil.offsetDay(DateTime.now(), sku.getDays());
 			} else {
 				renewExpiryTime = DateUtil.offsetMonth(DateTime.now(), sku.getMonths());
 			}
 			isUpgrade = true;
+			saveClaudeCodeRenewExpiryRecord(orderId, relationUserId, relationId, renewExpiryTime, skuId);
 		}
 		generateOrUpdateClaudeCodeUser(relationUserId, relationId, codePoints, codeCreditRecovery, expiryTime, isUpgrade, orderId, skuId, renewExpiryTime, sku.getSpecVal());
 		try {
@@ -386,6 +386,7 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 		parmas.put("amount", amount);
 		parmas.put("description", description);
 		parmas.put("type", type);
+		parmas.put("reason", description);
 		String url = String.format(CLAUDE_CODE_API_PREFIX + "/api/users/%s/credits/adjust", userId);
 		try {
 			ClaudeCodeResp claudeCodeResp = executeClaudeCodePostApi(url, Jsons.toJson(parmas));
@@ -413,6 +414,29 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 		return Boolean.FALSE;
 	}
 
+	@Override
+	public void handleClaudeCodeUserPackageSku(GroupsRelation relation, GoodsDonSku sku, Long orderId) {
+		Long groupsId = relation.getGroupsId();
+		GroupsTrips groupsTrips = groupsMapper.selectById(groupsId);
+		GoodsDonSku oriRelationSku = skuMapper.selectById(groupsTrips.getSkuId());
+		Integer oriRelationSkuCodePoints = oriRelationSku.getCodePoints();
+		Integer presentCodePoints = sku.getCodePoints();
+		Long oriRelationSkuId = oriRelationSku.getId();
+		Long toUseSkuId = sku.getId();
+		//若是续费升级 记录此时续费升级的过期时间
+		Boolean isUpgrade = false;
+		Date renewExpiryTime = null;
+		if (oriRelationSkuCodePoints <= presentCodePoints && !ObjectUtil.equal(oriRelationSkuId, toUseSkuId)) {
+			if (sku.getDays() != null) {
+				renewExpiryTime = DateUtil.offsetDay(DateTime.now(), sku.getDays());
+			} else {
+				renewExpiryTime = DateUtil.offsetMonth(DateTime.now(), sku.getMonths());
+			}
+			isUpgrade = true;
+			saveClaudeCodeRenewExpiryRecord(orderId, relation.getUserId(), relation.getId(), renewExpiryTime, sku.getId());
+		}
+	}
+
 	/**
 	 * 获取claude code用户id
 	 */

+ 35 - 0
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -23,14 +23,19 @@ import com.cyksj.mapper.manage.exchange.ExchangeCodeMapper;
 import com.cyksj.mapper.market.draw.LuckyDrawRecordMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelExchangeCodeData;
+import com.cyksj.model.manage.views.GroupsRelationView;
 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.exchange.ExchangeCodeService;
 import com.cyksj.service.relation.GroupRelationFrontService;
 import com.cyksj.service.relation.GroupsRelationExpiryRecordService;
 import com.cyksj.service.shop.YhShopFrontService;
+import com.cyksj.service.user.UserBindRelationService;
 import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
@@ -92,6 +97,12 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 
 	private final UserDistributeExchangeCodeUseRecordMapper userDistributeExchangeCodeUseRecordMapper;
 
+	private final UserBindRelationService userBindRelationService;
+
+	private final ClaudeCodeUserMapper claudeCodeUserMapper;
+
+	private final ClaudeCodeService claudeCodeService;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public List<ExcelExchangeCodeData> createExchangeCode(ExchangeCodeReq exchangeCodeReq) throws Exception {
@@ -379,6 +390,11 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			orderDon.setPayTitle(payTitle.toString());
 			orderDonMapper.insert(orderDon);
 			log.info("用户{}兑换规格:{}车位成功", user.getId(), orderDon.getSkuId());
+
+			if (relation.getIsClaudeCodeUpgrade() != null && relation.getIsClaudeCodeUpgrade()) {
+				//claude code 是否升级
+				claudeCodeService.handleClaudeCodeUserPackageSku(relation, sku, orderDon.getId());
+			}
 		}
 		if (orderDonTye == OrderDon.Type.EX_CODE) {
 			//同步车票是否重购 记录
@@ -406,6 +422,25 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 
 	@Override
 	public GroupsRelation getRelationNoOrder(GoodsDonSku sku, Long userId, Long yhsId) {
+		//claude code商品兑换 只能兑换一次 后续兑换增加车票时长
+		if (sku.getGoodsId() == Constant.CLAUDE_CODE_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.CLAUDE_CODE_GOODS_ID).field(GroupsRelationView::getExpiryTime, DateTime.now()).op(Operator.GreaterThan).build());
+			if (groupsRelationView != null) {
+//				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.setIsClaudeCodeUpgrade(true);
+//				return relation;
+				throw BusinessRuntimeException.getInstance("您当前已有车票,暂时无法兑换");
+			}
+		}
 		Integer retryNum = 1;
 		List<Long> errorsRelationIds = new ArrayList<>();
 		GroupsRelation relation = getFinalRelation(sku, userId, retryNum, yhsId, errorsRelationIds);