Ver Fonte

fix:修改视频片段的上传为异步

lalala há 1 ano atrás
pai
commit
9cd0439743

+ 1 - 1
src/main/java/com/njuzr/eaibackend/service/DoubaoService.java

@@ -20,7 +20,7 @@ public interface DoubaoService {
     List<SpeakingAIDialogue.DialogueEntry> getChatHistory(Long userId, Long assignmentId);
     List<SpeakingAIDialogue.DialogueEntry> deleteChatHistory(Long userId, Long assignmentId, String userQuestion, Integer voiceCode);
 
-    CompletableFuture<String> saveSigment(Long userId, Long assignmentId, MultipartFile file, Double duration);
+    String saveSigment(Long userId, Long assignmentId, MultipartFile file, Double duration);
 
     List<String> getSigment(Long userId, Long assignmentId);
 

+ 37 - 27
src/main/java/com/njuzr/eaibackend/service/impl/DoubaoServiceImpl.java

@@ -320,44 +320,54 @@ public class DoubaoServiceImpl implements DoubaoService {
         return new ArrayList<>();
     }
 
-    @Override
-    public List<SpeakingAIDialogue.DialogueEntry> deleteChatHistory(Long userId, Long assignmentId, String userQuestion, Integer voiceCode) {
-        // 构建查询条件,根据 userId 和 assignmentId 查找对话记录
-        Query query = Query.query(Criteria.where("userId").is(userId).and("assignmentId").is(assignmentId));
-        // 执行删除操作,获取删除的结果
-        SpeakingAIDialogue result = mongoTemplate.findAndRemove(query, SpeakingAIDialogue.class);
-        // 如果删除操作返回的结果不为空,说明成功删除,返回 true;否则返回 false
-        return startChat(userId, assignmentId, userQuestion, voiceCode);
-    }
-
-    public CompletableFuture<String> saveSigment(Long userId, Long assignmentId, MultipartFile file, Double duration) {
-        return CompletableFuture.supplyAsync(() -> {
+    public String saveSigment(Long userId, Long assignmentId, MultipartFile file, Double duration) {
+        // 1. 立即返回响应
+        String immediateResponse = "请求已接收,系统正在处理您的文件";
+        // 2. 在后台异步执行上传和保存操作
+        CompletableFuture.runAsync(() -> {
             try {
-                // 第一步:上传文件
+                // 上传文件
                 String filePath = "uploads/" + file.getOriginalFilename();
                 String url = ossUtil.uploadFile(file.getInputStream(), filePath);
                 log.info("文件上传成功,URL: {}", url);
-                Query query = new Query(Criteria.where("userId").is(userId).and("assignmentId").is(assignmentId));
-                // 查询是否存在对应的文档
+
+                // 保存到数据库
+                Query query = new Query(Criteria.where("userId").is(userId)
+                        .and("assignmentId").is(assignmentId));
                 SpeakingAIDialogue dialogue = mongoTemplate.findOne(query, SpeakingAIDialogue.class);
+
                 if (dialogue == null) {
-                    throw new MyException(HttpStatus.BAD_REQUEST.value(), HttpStatus.BAD_REQUEST.getReasonPhrase() + ":" + "不存在相应记录");
+                    log.error("不存在相应记录 - userId: {}, assignmentId: {}", userId, assignmentId);
+                    return;
                 }
-                // 如果文档存在,更新 audioSigment 列表
-                Update update = new Update().push("audioSigment", url).push("audioDuration", duration);
+                Update update = new Update()
+                        .push("audioSigment", url)
+                        .push("audioDuration", duration);
                 mongoTemplate.updateFirst(query, update, SpeakingAIDialogue.class);
-                System.out.println(dialogue);
-                return url;
-            }catch (IOException e){
-                throw new MyException(500 ,e.getMessage()+ "   文件上传失败");
+
+                log.info("后台处理完成 - userId: {}, assignmentId: {}, URL: {}", userId, assignmentId, url);
+            } catch (IOException e) {
+                log.error("后台处理失败 - userId: {}, assignmentId: {}", userId, assignmentId, e);
             }
-        }).completeOnTimeout(
-                "操作超时,请稍后再试",
-                500,  // 超时时间(秒)
-                TimeUnit.SECONDS
-        );
+        }).exceptionally(ex -> {
+            log.error("后台任务执行异常", ex);
+            return null;
+        });
+        return immediateResponse;
+    }
+
+    @Override
+    public List<SpeakingAIDialogue.DialogueEntry> deleteChatHistory(Long userId, Long assignmentId, String userQuestion, Integer voiceCode) {
+        // 构建查询条件,根据 userId 和 assignmentId 查找对话记录
+        Query query = Query.query(Criteria.where("userId").is(userId).and("assignmentId").is(assignmentId));
+        // 执行删除操作,获取删除的结果
+        SpeakingAIDialogue result = mongoTemplate.findAndRemove(query, SpeakingAIDialogue.class);
+        // 如果删除操作返回的结果不为空,说明成功删除,返回 true;否则返回 false
+        return startChat(userId, assignmentId, userQuestion, voiceCode);
     }
 
+
+
     @Override
     public List<String> getSigment(Long userId, Long assignmentId) {
         Query query = new Query(Criteria.where("userId").is(userId).and("assignmentId").is(assignmentId));