Procházet zdrojové kódy

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

lalala před 1 rokem
rodič
revize
47bb76cf62

+ 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);
+    CompletableFuture<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);

+ 32 - 15
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; // 注入线程池
@@ -327,18 +330,32 @@ 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() + ":" + "不存在相应记录");
-        }
+    public CompletableFuture<String> saveSigment(Long userId, Long assignmentId, MultipartFile file, Double duration) {
+        return CompletableFuture.supplyAsync(() -> {
+            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) {
+                    throw new MyException(HttpStatus.BAD_REQUEST.value(), HttpStatus.BAD_REQUEST.getReasonPhrase() + ":" + "不存在相应记录");
+                }
+                // 如果文档存在,更新 audioSigment 列表
+                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()+ "   文件上传失败");
+            }
+        }).completeOnTimeout(
+                "操作超时,请稍后再试",
+                500,  // 超时时间(秒)
+                TimeUnit.SECONDS
+        );
     }
 
     @Override