Prechádzať zdrojové kódy

修复了若学生没有写作业则下载文本时报错的问题

Jiang Pengyu 4 mesiacov pred
rodič
commit
434b3303ca

+ 18 - 1
src/main/java/com/njuzr/eaibackend/config/ThreadPoolConfig.java

@@ -3,8 +3,11 @@ package com.njuzr.eaibackend.config;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskDecorator;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
 
 import java.util.concurrent.ThreadPoolExecutor;
 
@@ -47,8 +50,22 @@ public class ThreadPoolConfig {
         executor.setMaxPoolSize(50);
         executor.setQueueCapacity(100);
         executor.setThreadNamePrefix("ai-eval-");
-        executor.initialize();
+        executor.setTaskDecorator(runnable -> {
+        var auth = SecurityContextHolder.getContext().getAuthentication();
+        var context = SecurityContextHolder.createEmptyContext();
+        context.setAuthentication(auth);
+
+        return () -> {
+            try {
+                SecurityContextHolder.setContext(context);
+                runnable.run();
+            } finally {
+                SecurityContextHolder.clearContext();
+            }
+        };
+        });
         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        executor.initialize();
         return executor;
     }
 

+ 3 - 0
src/main/java/com/njuzr/eaibackend/service/AssignmentService.java

@@ -42,6 +42,9 @@ public interface AssignmentService {
 
     List<EngagementHistoryVO> getEngagementHistory(Long studentId, Long assignmentId);
 
+    List<EngagementHistoryVO> getEngagementHistoryAllowEmpty(Long studentId, Long assignmentId);
+
+
     void engagementSubmit(Long studentId, Long assignmentId);
 
     /**

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

@@ -280,7 +280,12 @@ public class ExportCompositionService {
                 Long studentId = user.getId();
                 String studentDir = folderDir + user.getOfficialNumber() + "_" + user.getName() + "/";
                 
-                List<EngagementHistoryVO> historyList = assignmentService.getEngagementHistory(studentId, assignmentId);
+                List<EngagementHistoryVO> historyList = assignmentService.getEngagementHistoryAllowEmpty(studentId, assignmentId);
+
+                if (historyList.isEmpty()) {
+                    zipItems.add(new ZipExport.ZipItem(studentDir, new byte[0]));
+                    continue; // 直接下一个学生
+                }
                 for (EngagementHistoryVO history : historyList) {
                     Map<String, Object> model = new HashMap<>();
                     model.put("title", assignment.getAssignmentName());

+ 25 - 0
src/main/java/com/njuzr/eaibackend/service/impl/AssignmentServiceImpl.java

@@ -333,6 +333,31 @@ public class AssignmentServiceImpl implements AssignmentService {
                 .toList();
     }
 
+    @Override
+    public List<EngagementHistoryVO> getEngagementHistoryAllowEmpty(Long studentId, Long assignmentId) {
+        Engagement engagement = studentAssignmentMapper.findEngagementByStudentIdAndAssignmentId(studentId, assignmentId);
+        if (engagement == null) {
+            return Collections.emptyList();
+        }
+
+        List<StudentAssignmentHistory> historyRecords =
+                studentAssignmentMapper.findHistoryByStudentIdAndAssignmentId(studentId, assignmentId);
+        return historyRecords.stream()
+                .map(item -> {
+                    EngagementHistoryVO vo = new EngagementHistoryVO();
+                    vo.setVersion(item.getVersion());
+                    vo.setQuillContent(item.getQuillContent());
+                    vo.setTextContent(item.getTextContent());
+                    vo.setHtmlContent(item.getHtmlContent());
+                    vo.setSubmitTime(item.getSubmitTime());
+                    if (item.getStatus() != null) {
+                        vo.setStatus(new AssignmentCompletionStatusVO(item.getStatus().getCode(), item.getStatus().getStatus()));
+                    }
+                    return vo;
+                })
+                .toList();
+    }
+
     /**
      * 作业提交,更新文件版本和作业状态
      *

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

@@ -167,7 +167,7 @@ public class DoubaoServiceImpl implements DoubaoService {
 
 
     private static final String TSS_URL = "http://8.130.28.19:2002/tts";
-    @Async("doubaoTaskExecutor")
+    @Async("doubaoTaskExecutor") //无效注解
     private CompletableFuture<String> getMessageAudio(String message, int code, Long userId, Long assignmentId) {
         return CompletableFuture.supplyAsync(() -> {
             OkHttpClient httpClient = new OkHttpClient.Builder()

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

@@ -147,7 +147,7 @@ public class MediaAnalysisServiceImpl implements MediaAnalysisService {
                     }
                 });
 
-                return future.get();
+                return future.get(); //伪异步
             } catch (IOException | SignatureException e) {
                 log.error("{} 音频评分处理IO异常", AUDIO_SCORE_HEADER, e);
                 throw new MyException(HttpStatus.INTERNAL_SERVER_ERROR.value(), "ISEService调用失败:" + e.getMessage());
@@ -239,7 +239,7 @@ public class MediaAnalysisServiceImpl implements MediaAnalysisService {
         }
     }
 
-    @Async("doubaoTaskExecutor")
+    @Async("doubaoTaskExecutor") //这个注解没必要,因为方法内部已经使用了CompletableFuture.supplyAsync,并且指定了线程池
     public CompletableFuture<String> getSpeakingSuggestionAsync(Long userId, Long assignmentId) {
         return CompletableFuture.supplyAsync(() -> getSpeakingSuggestion(userId, assignmentId), doubaoTaskExecutor);
     }