Bläddra i källkod

Merge branch 'grok_inner' into pre

zoujiajian 2 månader sedan
förälder
incheckning
44737bbb1d

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/response/GrokConversationCountResponse.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.response;
+
+import lombok.Data;
+
+/**
+ * Grok conversation count response.
+ */
+@Data
+public class GrokConversationCountResponse {
+
+    private Long count;
+
+    private Integer limit;
+
+    private Long remaining;
+
+    private Long time;
+
+    private Boolean isVip;
+}

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/grok/GrokService.java

@@ -1,6 +1,7 @@
 package com.cyksj.service.grok;
 
 import com.cyksj.model.entity.GrokUser;
+import com.cyksj.model.response.GrokConversationCountResponse;
 import com.cyksj.model.views.GrokCarInfoView;
 import com.cyksj.model.views.GrokUserView;
 import com.ejlchina.searcher.SearchResult;
@@ -24,4 +25,6 @@ public interface GrokService {
     String getCarLoginUrl(String domain, Long userId, Long relationId);
 
     SearchResult<GrokCarInfoView> getCarInfoList(Map<String, String[]> parameterMap, Integer limit);
+
+    GrokConversationCountResponse getConversationCountDetail(String userToken);
 }

+ 37 - 0
netflix-service/src/main/java/com/cyksj/service/grok/impl/GrokServiceImpl.java

@@ -12,6 +12,7 @@ import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.mapper.*;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.response.GrokConversationCountResponse;
 import com.cyksj.model.views.GrokCarInfoView;
 import com.cyksj.model.views.GrokUserView;
 import com.cyksj.service.grok.GrokService;
@@ -172,6 +173,42 @@ public class GrokServiceImpl implements GrokService {
      * @param relationId
      * @return
      */
+    @Override
+    public GrokConversationCountResponse getConversationCountDetail(String userToken) {
+        GrokUser grokUser = grokUserMapper.selectOne(Wrappers.lambdaQuery(GrokUser.class)
+                .eq(GrokUser::getUserToken, userToken)
+                .last("limit 1"));
+        if (grokUser == null) {
+            throw BusinessRuntimeException.getInstance("用户不存在或已过期");
+        }
+        try {
+            JSONObject json = getConversationCount(userToken);
+            if (json.containsKey("message")) {
+                throw BusinessRuntimeException.getInstance(json.getStr("message"));
+            }
+
+            Long count = Optional.ofNullable(json.getLong("count")).orElse(0L);
+            Integer limit = Optional.ofNullable(json.getInt("limit")).orElse(grokUser.getLimitNum());
+            Long time = Optional.ofNullable(json.getLong("time")).orElse(grokUser.getLimitTime());
+            Boolean isVip = Optional.ofNullable(json.getBool("isVip")).orElse(Boolean.TRUE.equals(grokUser.getIsVip()));
+            Long remaining = Optional.ofNullable(json.getLong("remaining"))
+                    .orElse(limit == null ? 0L : Math.max(0L, limit - count));
+
+            GrokConversationCountResponse response = new GrokConversationCountResponse();
+            response.setCount(count);
+            response.setLimit(limit);
+            response.setRemaining(remaining);
+            response.setTime(time);
+            response.setIsVip(isVip);
+            return response;
+        } catch (BusinessRuntimeException e) {
+            throw e;
+        } catch (Exception e) {
+            log.error("调用Grok getConversationCount接口失败: {}", StringUtil.getErrorText(e));
+            throw BusinessRuntimeException.getInstance("获取对话次数失败");
+        }
+    }
+
     private GroupsRelation getGroupsRelation(Long userId, Long relationId) {
         List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
         GroupsRelation groupsRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).in(GroupsRelation::getUserId, userIdList).eq(GroupsRelation::getId, relationId));

+ 23 - 0
netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java

@@ -22,6 +22,7 @@ import com.cyksj.model.entity.*;
 import com.cyksj.model.request.GeminiOauthReq;
 import com.cyksj.model.request.GrokAuthReq;
 import com.cyksj.model.response.GeminiConversationCountResponse;
+import com.cyksj.model.response.GrokConversationCountResponse;
 import com.cyksj.model.views.*;
 import com.cyksj.service.chatgpt.ChatGptAccountService;
 import com.cyksj.service.claude.ClaudeService;
@@ -652,6 +653,28 @@ public class MirrorController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(carInfoList);
     }
 
+    /**
+     * Grok 查询用户对话次数
+     */
+    @GetMapping("/grok/getConversationCount")
+    public String grokGetConversationCount(String userToken) {
+        try {
+            GrokConversationCountResponse response = grokService.getConversationCountDetail(userToken);
+            JSONObject result = new JSONObject();
+            result.put("count", response.getCount());
+            result.put("limit", response.getLimit());
+            result.put("remaining", response.getRemaining());
+            result.put("time", response.getTime());
+            result.put("isVip", response.getIsVip());
+            return result.toString();
+        } catch (Exception e) {
+            log.error("Grok getConversationCount error", e);
+            JSONObject result = new JSONObject();
+            result.put("message", e.getMessage());
+            return result.toString();
+        }
+    }
+
 
     //------------------------ Gemini -------------------------------