Преглед изворни кода

ai方法修改为异步处理

zhangchen пре 10 часа
родитељ
комит
6937646b91

+ 48 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/config/AsyncConfig.java

@@ -0,0 +1,48 @@
+package shop.alien.lawyer.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+
+/**
+ * 异步任务配置类
+ * 用于配置异步任务的线程池
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Configuration
+@EnableAsync
+public class AsyncConfig {
+
+    /**
+     * 配置异步任务执行器
+     * 用于执行AI审核等异步任务
+     *
+     * @return 异步任务执行器
+     */
+    @Bean(name = "lawyerTaskExecutor")
+    public Executor taskExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        // 核心线程数
+        executor.setCorePoolSize(5);
+        // 最大线程数
+        executor.setMaxPoolSize(10);
+        // 队列容量
+        executor.setQueueCapacity(100);
+        // 线程名前缀
+        executor.setThreadNamePrefix("async-task-lawyer-");
+        // 拒绝策略:调用者运行策略
+        executor.setRejectedExecutionHandler(new java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy());
+        // 等待所有任务结束后再关闭线程池
+        executor.setWaitForTasksToCompleteOnShutdown(true);
+        // 等待时间
+        executor.setAwaitTerminationSeconds(60);
+        executor.initialize();
+        return executor;
+    }
+}
+

+ 43 - 18
alien-lawyer/src/main/java/shop/alien/lawyer/controller/AiAutoReview.java

@@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.client.RestTemplate;
+import shop.alien.lawyer.service.AiUserAuditTaskService;
 import shop.alien.lawyer.util.ai.AiAuthTokenUtil;
 
 import java.util.Map;
@@ -31,11 +32,10 @@ public class AiAutoReview {
 
     private final RestTemplate restTemplate;
 
-    @Value("${third-party-ai-auto-review.base-url:http://192.168.2.250:9100/ai/auto-review/api/v1/lawyer_complaint_audit_task/submit}")
-    private String aiAutoReviewUrl;
+    private final AiUserAuditTaskService aiUserAuditTaskService;
 
-    @Value("${third-party-ai-auto-review.base-url:http://192.168.2.250:9100/ai/auto-review/api/v1/lawyer_user_complaint_audit_task/submit}")
-    private String aiUserAuditTaskUrl;
+    @Value("${third-party-ai-auto-review.lawyer-complaint-url:http://192.168.2.250:9100/ai/auto-review/api/v1/lawyer_complaint_audit_task/submit}")
+    private String aiAutoReviewUrl;
 
     /**
      * 调用 AI 服务,获取申诉结果
@@ -66,27 +66,52 @@ public class AiAutoReview {
         return  ResponseEntity.badRequest().body(null);
     }
 
+    /**
+     * 用户申诉任务接口(异步处理)
+     * <p>
+     * 接口立即返回,AI服务调用在后台异步执行
+     * </p>
+     *
+     * @param requestBody 请求参数
+     * @return 立即返回成功响应
+     */
     @RequestMapping("/userAuditTask")
-    public ResponseEntity<String> userAuditTask(@RequestBody Map<String, Object> requestBody){
+    public ResponseEntity<String> userAuditTask(@RequestBody Map<String, Object> requestBody) {
+        log.info("接收用户申诉任务请求,请求参数:{}", requestBody);
+
+        // 参数校验
+        if (requestBody == null || requestBody.isEmpty()) {
+            log.warn("用户申诉任务请求参数为空");
+            JSONObject errorData = new JSONObject();
+            errorData.put("code", 400);
+            errorData.put("message", "请求参数不能为空");
+            return ResponseEntity.badRequest().body(errorData.toJSONString());
+        }
+
+        // 同步获取访问令牌(不在异步中执行)
         String accessToken = aiAuthTokenUtil.getAccessToken();
-        JSONObject data = new JSONObject();
         if (!StringUtils.hasText(accessToken)) {
-            data.put("fail","登录失败");
-            return ResponseEntity.badRequest().body(data.toJSONString());
+            log.error("调用AI用户申诉接口失败,获取accessToken失败");
+            JSONObject errorData = new JSONObject();
+            errorData.put("code", 500);
+            errorData.put("message", "获取访问令牌失败");
+            return ResponseEntity.status(500).body(errorData.toJSONString());
         }
 
-        // 初始化请求体Map
-        HttpHeaders aiHeaders = new HttpHeaders();
-        aiHeaders.setContentType(MediaType.APPLICATION_JSON);
-        aiHeaders.set("Authorization", "Bearer " + accessToken);
-
-        HttpEntity<Map<String, Object>> request = new HttpEntity<>(requestBody, aiHeaders);
+        // 异步调用AI服务(传递已获取的访问令牌)
         try {
-            ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(aiUserAuditTaskUrl, request, String.class);
-            return stringResponseEntity;
+            aiUserAuditTaskService.asyncCallUserAuditTask(requestBody, accessToken);
+            log.info("用户申诉任务已提交异步处理,请求参数:{}", requestBody);
         } catch (Exception e) {
-            log.error("调用AI用户申诉接口 接口异常------", e);
+            log.error("提交用户申诉任务异步处理失败,请求参数:{},异常信息:{}", requestBody, e.getMessage(), e);
         }
-        return  ResponseEntity.badRequest().body(null);
+
+        // 立即返回成功响应
+        JSONObject responseData = new JSONObject();
+        responseData.put("code", 200);
+        responseData.put("message", "用户申诉任务已提交,正在后台处理");
+        responseData.put("data", new JSONObject());
+
+        return ResponseEntity.ok(responseData.toJSONString());
     }
 }

+ 21 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/AiUserAuditTaskService.java

@@ -0,0 +1,21 @@
+package shop.alien.lawyer.service;
+
+import java.util.Map;
+
+/**
+ * AI用户申诉任务服务接口
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+public interface AiUserAuditTaskService {
+
+    /**
+     * 异步调用AI用户申诉接口
+     *
+     * @param requestBody 请求参数
+     * @param accessToken 访问令牌(已同步获取)
+     */
+    void asyncCallUserAuditTask(Map<String, Object> requestBody, String accessToken);
+}
+

+ 65 - 0
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/AiUserAuditTaskServiceImpl.java

@@ -0,0 +1,65 @@
+package shop.alien.lawyer.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+import shop.alien.lawyer.service.AiUserAuditTaskService;
+
+import java.util.Map;
+
+/**
+ * AI用户申诉任务服务实现类
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class AiUserAuditTaskServiceImpl implements AiUserAuditTaskService {
+
+    private final RestTemplate restTemplate;
+
+    @Value("${third-party-ai-auto-review.user-complaint-url:http://192.168.2.250:9100/ai/auto-review/api/v1/lawyer_user_complaint_audit_task/submit}")
+    private String aiUserAuditTaskUrl;
+
+    @Override
+    @Async("lawyerTaskExecutor")
+    public void asyncCallUserAuditTask(Map<String, Object> requestBody, String accessToken) {
+        log.info("开始异步调用AI用户申诉接口,请求URL:{},请求参数:{}", aiUserAuditTaskUrl, requestBody);
+
+        try {
+            // 初始化请求头(使用已获取的访问令牌)
+            HttpHeaders aiHeaders = new HttpHeaders();
+            aiHeaders.setContentType(MediaType.APPLICATION_JSON);
+            aiHeaders.set("Authorization", "Bearer " + accessToken);
+
+            HttpEntity<Map<String, Object>> request = new HttpEntity<>(requestBody, aiHeaders);
+
+            log.info("异步调用AI用户申诉接口,URL:{},请求头:{}", aiUserAuditTaskUrl, aiHeaders);
+
+            // 调用AI服务
+            org.springframework.http.ResponseEntity<String> responseEntity = restTemplate.postForEntity(
+                    aiUserAuditTaskUrl, request, String.class);
+
+            log.info("异步调用AI用户申诉接口成功,响应状态:{},响应体:{}",
+                    responseEntity.getStatusCode(), responseEntity.getBody());
+
+        } catch (org.springframework.web.client.HttpServerErrorException e) {
+            log.error("异步调用AI用户申诉接口返回服务器错误,状态码:{},响应体:{},URL:{}",
+                    e.getStatusCode(), e.getResponseBodyAsString(), aiUserAuditTaskUrl, e);
+        } catch (org.springframework.web.client.HttpClientErrorException e) {
+            log.error("异步调用AI用户申诉接口返回客户端错误,状态码:{},响应体:{},URL:{}",
+                    e.getStatusCode(), e.getResponseBodyAsString(), aiUserAuditTaskUrl, e);
+        } catch (Exception e) {
+            log.error("异步调用AI用户申诉接口异常,URL:{},异常信息:{}", aiUserAuditTaskUrl, e.getMessage(), e);
+        }
+    }
+}
+