Selaa lähdekoodia

Merge remote-tracking branch 'origin/refactor' into refactor

BaiQi 1 vuosi sitten
vanhempi
commit
ae195915ef

+ 4 - 3
src/main/java/com/njuzr/eaibackend/controller/DoubaoController.java

@@ -5,6 +5,7 @@ import com.njuzr.eaibackend.vo.AIReplyVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -54,9 +55,9 @@ public class DoubaoController {
         return MyResponse.success(doubaoService.deleteChatHistory(userId, assignmentId, userQuestion, voiceCode));
     }
 
-    @GetMapping("/saveSigment")
-    public MyResponse saveSigment(@RequestParam Long userId, @RequestParam Long assignmentId, @RequestParam String sigmentUrl, @RequestParam Double duration) {
-        return MyResponse.success(doubaoService.saveSigment(userId, assignmentId, sigmentUrl, duration));
+    @PostMapping("/saveSigment")
+    public MyResponse saveSigment(@RequestParam Long userId, @RequestParam Long assignmentId, @RequestParam("file") MultipartFile file, @RequestParam Double duration) {
+        return MyResponse.success(doubaoService.saveSigment(userId, assignmentId, file, duration));
     }
 
     @GetMapping("/getSigment")

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

@@ -3,8 +3,10 @@ package com.njuzr.eaibackend.service;
 import com.njuzr.eaibackend.po.SpeakingAIDialogue;
 import com.njuzr.eaibackend.vo.AIReplyVo;
 import com.njuzr.eaibackend.vo.RestrictDataVo;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 
 
 /**
@@ -18,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);
 
-    List<String> saveSigment(Long userId, Long assignmentId, String sigmentUrl, Double duration);
+    String saveSigment(Long userId, Long assignmentId, MultipartFile file, Double duration);
 
     List<String> getSigment(Long userId, Long assignmentId);
 

+ 1 - 2
src/main/java/com/njuzr/eaibackend/service/impl/AssignmentServiceImpl.java

@@ -23,7 +23,6 @@ import com.njuzr.eaibackend.vo.UserVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.Cacheable;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -105,7 +104,7 @@ public class AssignmentServiceImpl implements AssignmentService {
 
 
     @Override
-    @Cacheable(value = "assignmentInfo", key = "'assignment_' + #assignmentId")
+//    @Cacheable(value = "assignmentInfo", key = "'assignment_' + #assignmentId")
     public AssignmentVO findAssignmentById(Long assignmentId) {
         QueryWrapper<Assignment> wrapper = new QueryWrapper<>();
         wrapper.eq("assignment_id", assignmentId);

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

@@ -82,7 +82,7 @@ public class CourseServiceImpl implements CourseService {
 
 
     @Override
-    @Cacheable(value = "coursePages", key = "#page.getCurrent() + '_' + #page.getSize() + '_' + #courseQueryDTO.isEmpty()", unless = "#page.getSize() <= 1 || !#courseQueryDTO.isEmpty()")
+//    @Cacheable(value = "coursePages", key = "#page.getCurrent() + '_' + #page.getSize() + '_' + #courseQueryDTO.isEmpty()", unless = "#page.getSize() <= 1 || !#courseQueryDTO.isEmpty()")
     public IPage<CourseVO> findCoursesPage(Page<Course> page, CourseQueryDTO courseQueryDTO) {
         log.info("课程信息从数据库查询: {}", courseQueryDTO.toString());
         QueryWrapper<Course> wrapper = getCourseQueryWrapper(courseQueryDTO);

+ 43 - 16
src/main/java/com/njuzr/eaibackend/service/impl/DoubaoServiceImpl.java

@@ -1,15 +1,13 @@
 package com.njuzr.eaibackend.service.impl;
 
 import com.alibaba.fastjson2.JSONObject;
-import com.njuzr.eaibackend.config.DoubaoConfig;
-import com.njuzr.eaibackend.config.IseClientFactory;
-import com.njuzr.eaibackend.config.OssConfig;
 import com.njuzr.eaibackend.exception.MyException;
 import com.njuzr.eaibackend.mapper.SpeakingAIDialogueMapper;
 import com.njuzr.eaibackend.po.AIEntry;
 import com.njuzr.eaibackend.po.SpeakingAIDialogue;
 import com.njuzr.eaibackend.service.AIRequestService;
 import com.njuzr.eaibackend.service.DoubaoService;
+import com.njuzr.eaibackend.utils.OssUtil;
 import com.njuzr.eaibackend.vo.AIReplyVo;
 import com.njuzr.eaibackend.vo.RestrictDataVo;
 import lombok.extern.slf4j.Slf4j;
@@ -24,6 +22,7 @@ import org.springframework.http.HttpStatus;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -53,6 +52,10 @@ public class DoubaoServiceImpl implements DoubaoService {
     @Autowired
     AIRequestService aiRequestService;
 
+    @Autowired
+    OssUtil ossUtil;
+
+
     @Autowired
     @Qualifier("doubaoTaskExecutor") // 指定 Bean 名称
     private ThreadPoolTaskExecutor doubaoTaskExecutor; // 注入线程池
@@ -317,6 +320,42 @@ public class DoubaoServiceImpl implements DoubaoService {
         return new ArrayList<>();
     }
 
+    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));
+                SpeakingAIDialogue dialogue = mongoTemplate.findOne(query, SpeakingAIDialogue.class);
+
+                if (dialogue == null) {
+                    log.error("不存在相应记录 - userId: {}, assignmentId: {}", userId, assignmentId);
+                    return;
+                }
+                Update update = new Update()
+                        .push("audioSigment", url)
+                        .push("audioDuration", duration);
+                mongoTemplate.updateFirst(query, update, SpeakingAIDialogue.class);
+
+                log.info("后台处理完成 - userId: {}, assignmentId: {}, URL: {}", userId, assignmentId, url);
+            } catch (IOException e) {
+                log.error("后台处理失败 - userId: {}, assignmentId: {}", userId, assignmentId, e);
+            }
+        }).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 查找对话记录
@@ -327,19 +366,7 @@ public class DoubaoServiceImpl implements DoubaoService {
         return startChat(userId, assignmentId, userQuestion, voiceCode);
     }
 
-    public List<String> saveSigment(Long userId, Long assignmentId, String sigmentUrl, Double duration) {
-        Query query = new Query(Criteria.where("userId").is(userId).and("assignmentId").is(assignmentId));
-        // 查询是否存在对应的文档
-        SpeakingAIDialogue dialogue = mongoTemplate.findOne(query, SpeakingAIDialogue.class);
-        if (dialogue != null) {
-            // 如果文档存在,更新 audioSigment 列表
-            Update update = new Update().push("audioSigment", sigmentUrl).push("audioDuration",duration);
-            mongoTemplate.updateFirst(query, update, SpeakingAIDialogue.class);
-            return dialogue.getAudioSigment();
-        } else {
-            throw new MyException(HttpStatus.BAD_REQUEST.value(), HttpStatus.BAD_REQUEST.getReasonPhrase() + ":" + "不存在相应记录");
-        }
-    }
+
 
     @Override
     public List<String> getSigment(Long userId, Long assignmentId) {