浏览代码

用户奖励info api

zoujiajian 1 年之前
父节点
当前提交
adc1e2f0f6

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponRecommendMapper.java

@@ -3,6 +3,7 @@ package com.cyksj.mapper.manage.coupon;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.model.entity.Coupon;
 import com.cyksj.model.entity.CouponRecommend;
 import com.cyksj.model.views.CouponAvailableRecommendView;
 import com.cyksj.model.views.CouponRecommendView;
@@ -29,4 +30,6 @@ public interface CouponRecommendMapper extends BaseMapper<CouponRecommend> {
 	 * 该优惠券是否处于推荐中
 	 */
 	int checkPresentRecommendByCouponId(Long couponId);
+
+	Coupon getRecommendCouponByGoodsId(Long goodsId);
 }

+ 38 - 0
netflix-dao/src/main/java/com/cyksj/model/response/ClaudeCodeRewardDetailsResp.java

@@ -0,0 +1,38 @@
+package com.cyksj.model.response;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: ClaudeCodeRewardDetailsResp
+ * 创建者: Claude
+ * 创建时间:2025/8/26
+ * 描述: ClaudeCode奖励明细响应
+ */
+@Getter
+@Setter
+public class ClaudeCodeRewardDetailsResp {
+    
+    /**
+     * 可用积分卡数量
+     */
+    private Integer availableCreditCards;
+    
+    /**
+     * 用户可重置次数
+     */
+    private Integer resetCount;
+
+    /**
+     * 可提现金额
+     */
+    private BigDecimal gotMoney;
+
+    /**
+     * 带入账金额
+     */
+    private BigDecimal waitingMoney;
+}

+ 11 - 0
netflix-dao/src/main/resources/mapper/CouponRecommendMapper.xml

@@ -69,4 +69,15 @@
           and (cr.up_time is null or cr.up_time &lt;= now())
           and (cr.down_time is null or cr.down_time > now())
     </select>
+
+    <select id="getRecommendCouponByGoodsId" resultType="com.cyksj.model.entity.Coupon">
+        select c.id as couponId,
+        c.scope,
+        cr.id as recommendId
+        from coupon_recommend cr inner join coupon c on c.id = cr.coupon_id
+        where cr.deleted is true and c.deleted is true and cr.status is true
+        and (cr.up_time is null or cr.up_time &lt;= now()) and (cr.down_time is null or cr.down_time > now())
+        and (select count(1) from coupon_sku cs where cs.coupon_id = cr.coupon_id and cs.goods_id = #{goodsId}) > 0
+        limit 1
+    </select>
 </mapper>

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

@@ -132,4 +132,9 @@ public interface ClaudeCodeService {
 	 * 获取用户积分卡使用明细
 	 */
 	SearchResult<ClaudeCodeUserCreditCardRecordView> getUserCreditCardRecords(Long userId, Integer page, Integer limit);
+
+	/**
+	 * 获取用户奖励明细
+	 */
+	ClaudeCodeRewardDetailsResp getUserRewardDetails(Long userId);
 }

+ 82 - 12
netflix-service/src/main/java/com/cyksj/service/claude/impl/ClaudeCodeServiceImpl.java

@@ -14,22 +14,20 @@ import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.mapper.*;
-import com.cyksj.mapper.claudecode.ClaudeCodeUserResetRecordMapper;
-import com.cyksj.mapper.claudecode.ClaudeCodeUserCreditCardRecordMapper;
 import com.cyksj.mapper.claudecode.ClaudeCodeCreditCardMapper;
+import com.cyksj.mapper.claudecode.ClaudeCodeUserCreditCardRecordMapper;
+import com.cyksj.mapper.claudecode.ClaudeCodeUserResetRecordMapper;
+import com.cyksj.mapper.manage.distribute.DistributePointsExchangeMoneyMapper;
+import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.GroupsRelationView;
-import com.cyksj.model.request.ClaudeCodeApiKeysReq;
-import com.cyksj.model.request.ClaudeCodeCreditCardUseReq;
-import com.cyksj.model.request.ClaudeCodeDelReq;
-import com.cyksj.model.request.CreditResetReq;
-import com.cyksj.model.request.TimeRateConfigReq;
+import com.cyksj.model.request.*;
 import com.cyksj.model.response.*;
 import com.cyksj.model.response.claudecode.ClaudeCodeResp;
 import com.cyksj.model.views.ClaudeCodeUserApiKeysView;
+import com.cyksj.model.views.ClaudeCodeUserCreditCardRecordView;
 import com.cyksj.model.views.ClaudeCodeUserInfoView;
 import com.cyksj.model.views.ClaudeCodeUserResetRecordView;
-import com.cyksj.model.views.ClaudeCodeUserCreditCardRecordView;
 import com.cyksj.service.claude.ClaudeCodeService;
 import com.cyksj.service.user.UserBindRelationService;
 import com.ejlchina.searcher.BeanSearcher;
@@ -42,10 +40,9 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 
@@ -81,6 +78,12 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 
 	private final ClaudeCodeCreditCardMapper claudeCodeCreditCardMapper;
 
+	private final UserMapper userMapper;
+
+	private final DistributeWaitingSendPointsMapper distributeWaitingSendPointsMapper;
+
+	private final DistributePointsExchangeMoneyMapper distributePointsExchangeMoneyMapper;
+
 	private final static String CLAUDE_CODE_API_PREFIX = "https://relay01.yhlxj.com/";
 
 	public static final String CLAUDE_CODE_API_ADMIN_KEY = "claudecodeyhlxjclaude";
@@ -868,4 +871,71 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 			.build());
 	}
 
+	@Override
+	public ClaudeCodeRewardDetailsResp getUserRewardDetails(Long userId) {
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		
+		ClaudeCodeRewardDetailsResp response = new ClaudeCodeRewardDetailsResp();
+		
+		// 获取用户Claude Code信息
+		ClaudeCodeUser claudeCodeUser = claudeCodeUserMapper.selectOne(
+			Wrappers.lambdaQuery(ClaudeCodeUser.class)
+				.in(ClaudeCodeUser::getUserId, userIdList)
+				.last("limit 1")
+		);
+		
+		// 设置可重置次数
+		if (claudeCodeUser != null) {
+			Integer resetCount = claudeCodeUser.getResetCount();
+			response.setResetCount(resetCount != null ? resetCount : 0);
+		} else {
+			response.setResetCount(0);
+		}
+		
+		// 获取可用积分卡数量
+		Integer availableCreditCards = claudeCodeCreditCardMapper.selectCount(
+			Wrappers.lambdaQuery(ClaudeCodeCreditCard.class)
+				.eq(ClaudeCodeCreditCard::getStatus, 0)
+				.isNull(ClaudeCodeCreditCard::getUsedUserId)
+		);
+		response.setAvailableCreditCards(availableCreditCards != null ? availableCreditCards : 0);
+		
+		// 获取分销相关数据
+		try {
+			User user = userMapper.selectById(userId);
+			List<DistributeWaitingSendPoints> distributeWaitingSendPoints = distributeWaitingSendPointsMapper.selectList(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class).eq(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.waiting).eq(DistributeWaitingSendPoints::getSharedId, userId).select(DistributeWaitingSendPoints::getPoints));
+			BigDecimal waitingPoints = BigDecimal.ZERO;
+			if (!distributeWaitingSendPoints.isEmpty()) {
+				Optional<BigDecimal> points = distributeWaitingSendPoints.stream().map(DistributeWaitingSendPoints::getPoints).reduce(BigDecimal::add);
+				if (points.isPresent()) {
+					waitingPoints = points.get();
+				}
+			}
+
+			if (user.getPoints().compareTo(BigDecimal.ZERO) <= 0 && waitingPoints.compareTo(BigDecimal.ZERO) <= 0) {
+				response.setGotMoney(BigDecimal.ZERO);
+				response.setWaitingMoney(BigDecimal.ZERO);
+			} else {
+				DistributePointsExchangeMoney distributePointsExchangeMoney = distributePointsExchangeMoneyMapper.selectOne(Wrappers.lambdaQuery(DistributePointsExchangeMoney.class).orderByDesc(DistributePointsExchangeMoney::getPoints).last("limit 1"));
+				BigDecimal points = BigDecimal.valueOf(distributePointsExchangeMoney.getPoints());
+				BigDecimal money = distributePointsExchangeMoney.getMoney();
+				BigDecimal oneHundred = BigDecimal.valueOf(100);
+				if (user.getPoints().compareTo(BigDecimal.ZERO) >= 0) {
+					response.setGotMoney(user.getPoints().divide(points).multiply(money).divide(oneHundred, 2, RoundingMode.HALF_DOWN));
+				}
+				if (user.getPoints().compareTo(BigDecimal.ZERO) >= 0) {
+					response.setWaitingMoney(waitingPoints.divide(points).multiply(money).divide(oneHundred, 2, RoundingMode.DOWN));
+				}
+			}
+
+		} catch (Exception e) {
+			log.warn("获取用户{}分销数据异常", userId, e);
+			// 设置默认值
+			response.setGotMoney(BigDecimal.ZERO);
+			response.setWaitingMoney(BigDecimal.ZERO);
+		}
+		
+		return response;
+	}
+
 }

+ 12 - 2
netflix-web/src/main/java/com/cyksj/web/controller/claude/ClaudeCodeController.java

@@ -427,8 +427,8 @@ public class ClaudeCodeController {
 			}
 		}
 		//非推广链接
-		if (coupon == null) {
-			coupon = couponMapper.selectById(Constant.DISTRIBUTE_CLAUDE_CODE_NO_CODE_COUPON_ID);
+		if (dsCode == null && coupon == null) {
+			coupon = couponRecommendMapper.getRecommendCouponByGoodsId(Constant.CLAUDE_CODE_GOODS_ID);
 		}
 		if (coupon == null) {
 			return;
@@ -581,4 +581,14 @@ public class ClaudeCodeController {
 		SearchResult<ClaudeCodeUserCreditCardRecordView> result = claudeCodeService.getUserCreditCardRecords(userId, page, limit);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(result);
 	}
+
+	/**
+	 * 获取用户奖励ino
+	 */
+	@GetMapping("/reward-details")
+	public Result<ClaudeCodeRewardDetailsResp> getUserRewardDetails() {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		ClaudeCodeRewardDetailsResp result = claudeCodeService.getUserRewardDetails(userId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(result);
+	}
 }