Procházet zdrojové kódy

获取Claude调用趋势

zoujiajian před 11 měsíci
rodič
revize
25f2c97143

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

@@ -55,7 +55,7 @@ public interface ClaudeCodeService {
 
 	ClaudeCodeResp getUserBalance(Long userId) throws Exception;
 
-	ClaudeCodeResp getCreditsAnalytics(Long userId, String start, String end, String tz, Integer page, Integer limit, String order, String type) throws Exception;
+	ClaudeCodeResp getCreditsAnalytics(Long userId, String start, String end, Integer page, Integer limit, String order, String status, String model) throws Exception;
 
 	void invalidateUserCache(Long relationUserId);
 
@@ -127,4 +127,6 @@ public interface ClaudeCodeService {
 	 * 用户是否存在订阅
 	 */
 	Boolean getUserSubs(long userId);
+
+	ClaudeCodeResp getTimeseriesRequests(Long userId, String period, String granularity, String model);
 }

+ 14 - 3
netflix-service/src/main/java/com/cyksj/service/claude/impl/ClaudeCodeServiceImpl.java

@@ -271,7 +271,7 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 	public ClaudeCodeResp getUserBalance(Long userId) throws Exception {
 		Long claudeCodeUserId = getClaudeCodeUserId(userId);
 		if (claudeCodeUserId != null) {
-			String url = String.format(Constant.CLAUDE_CODE_API_PREFIX + "api/users/%s/balance", claudeCodeUserId);
+			String url = String.format(Constant.CLAUDE_CODE_API_PREFIX + "adminapi/users/%s/claude/summary", claudeCodeUserId);
 			ClaudeCodeResp claudeCodeResp = executeClaudeCodeGetApi(url);
 			return claudeCodeResp;
 		}
@@ -279,7 +279,7 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 	}
 
 	@Override
-	public ClaudeCodeResp getCreditsAnalytics(Long userId, String start, String end, String tz, Integer page, Integer limit, String order, String type) throws Exception {
+	public ClaudeCodeResp getCreditsAnalytics(Long userId, String start, String end, Integer page, Integer limit, String order, String status, String model) throws Exception {
 		Long claudeCodeUserId = getClaudeCodeUserId(userId);
 		if (start == null) {
 			DateTime now = DateTime.now();
@@ -287,7 +287,7 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 			end = now.toString();
 		}
 		if (claudeCodeUserId != null) {
-			String url = String.format(Constant.CLAUDE_CODE_API_PREFIX + "api/users/%s/credits/analytics?start=%s&end=%s&tz=%s&page=%s&limit=%s&order=%s&type=%s", claudeCodeUserId, start, end, tz, page, limit, order, type);
+			String url = String.format(Constant.CLAUDE_CODE_API_PREFIX + "/adminapi/users/%s/claude/requests?start=%s&end=%s&page=%s&page_size=%s&order=%s&status=%s&model=%s", claudeCodeUserId, start, end, page, limit, order, status, model);
 			ClaudeCodeResp claudeCodeResp = executeClaudeCodeGetApi(url);
 			return claudeCodeResp;
 		}
@@ -1044,6 +1044,17 @@ public class ClaudeCodeServiceImpl implements ClaudeCodeService {
 		return true;
 	}
 
+	@Override
+	public ClaudeCodeResp getTimeseriesRequests(Long userId, String period, String granularity, String model) {
+		Long claudeCodeUserId = getClaudeCodeUserId(userId);
+		if (claudeCodeUserId != null) {
+			String url = String.format(Constant.CLAUDE_CODE_API_PREFIX + "/adminapi/claude/system/timeseries/requests?period=%s&granularity=%s&user_id=%s&model=%s", period, granularity, claudeCodeUserId, model);
+			ClaudeCodeResp claudeCodeResp = executeClaudeCodeGetApi(url);
+			return claudeCodeResp;
+		}
+		return null;
+	}
+
 	private void adjClaudeCodeUserPoints(Long userId, Integer points, String type, String description) throws Exception {
 		String apiKeyUrl = String.format(Constant.CLAUDE_CODE_API_PREFIX + "api/users/%s/credits/adjust", userId);
 		Map<String, Object> parmas = new HashMap<>();

+ 13 - 3
netflix-web/src/main/java/com/cyksj/web/controller/claude/ClaudeCodeController.java

@@ -198,7 +198,7 @@ public class ClaudeCodeController {
 	}
 
 	/**
-	 * 图表 + 明细联动(每小时聚合)
+	 * 获取Claude请求明细
 	 * - `start` (string, required): `YYYY-MM-DD HH:MM:SS`,例如 `2025-08-08 12:00:00`
 	 * - `end` (string, required): `YYYY-MM-DD HH:MM:SS`,需大于 `start`
 	 * - `tz` (string, optional): 时区,默认 `Asia/Shanghai`
@@ -208,9 +208,19 @@ public class ClaudeCodeController {
 	 * - `type` (string, optional): 明细类型过滤,`consume|purchase|recovery|refund|reward|adjustment|all`,默认 `all`
 	 */
 	@GetMapping("/get/credits/analytics")
-	public ClaudeCodeResp getCreditsAnalytics(String start, String end, @RequestParam(defaultValue = "Asia/Shanghai") String tz, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer limit, @RequestParam(defaultValue = "desc") String order, @RequestParam(defaultValue = "all") String type) throws Exception {
+	public ClaudeCodeResp getCreditsAnalytics(String start, String end, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer limit, @RequestParam(defaultValue = "desc") String order, String status, String model) throws Exception {
 		long userId = StpUserUtil.getLoginIdAsLong();
-		ClaudeCodeResp resp = claudeCodeService.getCreditsAnalytics(userId, start, end, tz, page, limit, order, type);
+		ClaudeCodeResp resp = claudeCodeService.getCreditsAnalytics(userId, start, end, page, limit, order, status, model);
+		return resp;
+	}
+
+	/**
+	 * 获取Claude调用趋势
+	 */
+	@GetMapping("/get/timeseries/requests")
+	public ClaudeCodeResp getTimeseriesRequests(@RequestParam(defaultValue = "today") String period, @RequestParam(defaultValue = "1h")String granularity, String model) throws Exception {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		ClaudeCodeResp resp = claudeCodeService.getTimeseriesRequests(userId, period, granularity, model);
 		return resp;
 	}