ClaudeCodeController.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package com.cyksj.web.controller.claude;
  2. import cn.hutool.core.date.DateTime;
  3. import com.cyksj.common.constant.Constant;
  4. import com.cyksj.dto.Result;
  5. import com.cyksj.enums.GatewayResponse;
  6. import com.cyksj.model.manage.views.OrderDonView;
  7. import com.cyksj.model.request.ClaudeCodeApiKeysReq;
  8. import com.cyksj.model.request.ClaudeCodeApiKeysStatusReq;
  9. import com.cyksj.model.request.ClaudeCodeDelReq;
  10. import com.cyksj.model.response.ClaudeCodePointsHistoryResp;
  11. import com.cyksj.model.response.claudecode.ClaudeCodeResp;
  12. import com.cyksj.model.views.ClaudeCodeUserApiKeysView;
  13. import com.cyksj.model.views.ClaudeCodeUserPackageView;
  14. import com.cyksj.model.views.RenewalView;
  15. import com.cyksj.service.claude.ClaudeCodeService;
  16. import com.cyksj.service.user.UserBindRelationService;
  17. import com.cyksj.web.util.StpUserUtil;
  18. import com.ejlchina.searcher.BeanSearcher;
  19. import com.ejlchina.searcher.SearchResult;
  20. import com.ejlchina.searcher.param.Operator;
  21. import com.ejlchina.searcher.util.MapUtils;
  22. import lombok.RequiredArgsConstructor;
  23. import org.springframework.validation.annotation.Validated;
  24. import org.springframework.web.bind.annotation.*;
  25. import javax.servlet.http.HttpServletRequest;
  26. import java.util.List;
  27. /**
  28. * 项目名: yhlxj11111111
  29. * 文件名: ClaudeCodeController
  30. * 创建者: JavaZou
  31. * 创建时间:2025/8/8 11:37
  32. */
  33. @RestController
  34. @RequestMapping("/applet/claude/code")
  35. @RequiredArgsConstructor
  36. public class ClaudeCodeController {
  37. private final ClaudeCodeService claudeCodeService;
  38. private final BeanSearcher beanSearcher;
  39. private final HttpServletRequest request;
  40. private final UserBindRelationService userBindRelationService;
  41. /**
  42. * 用户创建API KEY
  43. */
  44. @PostMapping("/create/apiKeys")
  45. public Result<String> createApiKeys(@RequestBody @Validated ClaudeCodeApiKeysReq req) throws Exception {
  46. long userId = StpUserUtil.getLoginIdAsLong();
  47. req.setUserId(userId);
  48. claudeCodeService.createApiKeys(req);
  49. return GatewayResponse.SUCCESS.newBuilder().toResult();
  50. }
  51. /**
  52. * 更新api key状态
  53. */
  54. // @PutMapping("/update/apiKeys/status")
  55. public Result<String> updateApiKeysStatus(@RequestBody @Validated ClaudeCodeApiKeysStatusReq req) throws Exception {
  56. long userId = StpUserUtil.getLoginIdAsLong();
  57. req.setUserId(userId);
  58. claudeCodeService.updateApiKeysStatus(req);
  59. return GatewayResponse.SUCCESS.newBuilder().toResult();
  60. }
  61. /**
  62. * 用户api keys列表
  63. */
  64. @GetMapping("/get/apiKeys")
  65. public Result<List<ClaudeCodeUserApiKeysView>> getUserApiKeys() throws Exception {
  66. long userId = StpUserUtil.getLoginIdAsLong();
  67. List<ClaudeCodeUserApiKeysView> userApiKeys = claudeCodeService.getUserApiKeys(userId);
  68. return GatewayResponse.SUCCESS.newBuilder().toResult(userApiKeys);
  69. }
  70. /**
  71. * 删除api key
  72. */
  73. @DeleteMapping("/delete/apiKeys")
  74. public Result<String> deleteApiKeysById(@RequestBody ClaudeCodeDelReq delReq) throws Exception {
  75. long userId = StpUserUtil.getLoginIdAsLong();
  76. delReq.setUserId(userId);
  77. claudeCodeService.deleteApiKeysById(delReq);
  78. return GatewayResponse.SUCCESS.newBuilder().toResult();
  79. }
  80. //================================================用户============================================================
  81. /**
  82. * 查询用户套餐信息
  83. */
  84. @GetMapping("/get/user/package")
  85. public Result<ClaudeCodeUserPackageView> getUserPackage() throws Exception {
  86. long userId = StpUserUtil.getLoginIdAsLong();
  87. ClaudeCodeUserPackageView claudeCodeUserPackageView = claudeCodeService.getUserPackage(userId);
  88. return GatewayResponse.SUCCESS.newBuilder().toResult(claudeCodeUserPackageView);
  89. }
  90. /**
  91. * 用户订阅车票信息
  92. */
  93. @GetMapping("/get/user/subs/info")
  94. public Result<RenewalView> getUserSubsInfo() {
  95. long userId = StpUserUtil.getLoginIdAsLong();
  96. List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
  97. RenewalView renewalView = beanSearcher.searchFirst(RenewalView.class, MapUtils.flatBuilder(request.getParameterMap())
  98. .field(RenewalView::getUserId, userIdList).op(Operator.InList)
  99. .field(RenewalView::getGoodsId, Constant.CLAUDE_CODE_GOODS_ID)
  100. .field(RenewalView::getExpiryTime, DateTime.now()).op(Operator.GreaterThan)
  101. .build());
  102. return GatewayResponse.SUCCESS.newBuilder().toResult(renewalView);
  103. }
  104. /**
  105. * 用户订阅历史
  106. */
  107. @GetMapping("/get/user/orders")
  108. public Result<SearchResult<OrderDonView>> getUserOrders() {
  109. long userId = StpUserUtil.getLoginIdAsLong();
  110. List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
  111. SearchResult<OrderDonView> search = beanSearcher.search(OrderDonView.class, MapUtils.flatBuilder(request.getParameterMap())
  112. .field(OrderDonView::getUserId, userIdList).op(Operator.InList)
  113. .field(OrderDonView::getGoodsId, Constant.CLAUDE_CODE_GOODS_ID)
  114. .field(OrderDonView::getStatus, Constant.noOrderAllStatus).op(Operator.NotIn)
  115. .build());
  116. return GatewayResponse.SUCCESS.newBuilder().toResult(search);
  117. }
  118. /**
  119. * 用户积分明细
  120. */
  121. @GetMapping("/get/user/points/detail")
  122. public Result<ClaudeCodePointsHistoryResp> getUserPointsDetail(@RequestParam(defaultValue = "0") Integer page, @RequestParam(defaultValue = "10") Integer limit, String type) throws Exception {
  123. long userId = StpUserUtil.getLoginIdAsLong();
  124. ClaudeCodePointsHistoryResp resp = claudeCodeService.getUserPointsDetail(userId, type, page, limit);
  125. return GatewayResponse.SUCCESS.newBuilder().toResult(resp);
  126. }
  127. /**
  128. * 用户使用数据统计
  129. */
  130. @GetMapping("/get/user/points/statistics/data")
  131. public Result<ClaudeCodeResp> getUserPointsStatisticsData() throws Exception {
  132. long userId = StpUserUtil.getLoginIdAsLong();
  133. ClaudeCodeResp resp = claudeCodeService.getUserPointsStatisticsData(userId);
  134. return GatewayResponse.SUCCESS.newBuilder().toResult(resp);
  135. }
  136. /**
  137. * 仪表盘聚合
  138. * 返回 当前订阅/余额卡片 + 今日汇总 + 今日请求列表
  139. */
  140. @GetMapping("/get/dashboard")
  141. public Result<ClaudeCodeResp> getUserDashboard() throws Exception {
  142. long userId = StpUserUtil.getLoginIdAsLong();
  143. ClaudeCodeResp resp = claudeCodeService.getUserDashboard(userId);
  144. return GatewayResponse.SUCCESS.newBuilder().toResult(resp);
  145. }
  146. /**
  147. * 余额卡片
  148. * 单独返回余额卡片数据
  149. */
  150. @GetMapping("/get/balance")
  151. public Result<ClaudeCodeResp> getUserBalance() throws Exception {
  152. long userId = StpUserUtil.getLoginIdAsLong();
  153. ClaudeCodeResp resp = claudeCodeService.getUserBalance(userId);
  154. return GatewayResponse.SUCCESS.newBuilder().toResult(resp);
  155. }
  156. /**
  157. * 图表 + 明细联动(每小时聚合)
  158. * - `start` (string, required): `YYYY-MM-DD HH:MM:SS`,例如 `2025-08-08 12:00:00`
  159. * - `end` (string, required): `YYYY-MM-DD HH:MM:SS`,需大于 `start`
  160. * - `tz` (string, optional): 时区,默认 `Asia/Shanghai`
  161. * - `page` (int, optional): 明细页码,默认 1
  162. * - `limit` (int, optional): 明细每页数量,默认 20,最大 100
  163. * - `order` (string, optional): `asc|desc`,默认 `desc`
  164. * - `type` (string, optional): 明细类型过滤,`consume|purchase|recovery|refund|reward|adjustment|all`,默认 `all`
  165. */
  166. @GetMapping("/get/credits/analytics")
  167. public Result<ClaudeCodeResp> getCreditsAnalytics(String start, String end, String tz, String page, String limit, String order, String type) throws Exception {
  168. long userId = StpUserUtil.getLoginIdAsLong();
  169. ClaudeCodeResp resp = claudeCodeService.getCreditsAnalytics(userId, start, end, tz, page, limit, order, type);
  170. return GatewayResponse.SUCCESS.newBuilder().toResult(resp);
  171. }
  172. }