Browse Source

feat: 优化导出接口目录结构,新增班级作业组合导出接口

wuzilong 5 months ago
parent
commit
e486e5c097

+ 34 - 0
src/main/java/com/njuzr/eaibackend/controller/ExportController.java

@@ -271,4 +271,38 @@ public class ExportController {
                 .headers(headers)
                 .body(zipBytes);
     }
+
+    @GetMapping("/class_assignment/download")
+    public ResponseEntity<byte[]> downloadClassAssignment(@RequestParam Long classId, @RequestParam Long assignmentId) {
+        byte[] zipBytes = exportCompositionService.downloadClassAssignment(classId, assignmentId);
+
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+        String className = null;
+        String assignmentName = null;
+        try {
+            com.njuzr.eaibackend.po.Class cls = classService.getClassById(classId);
+            className = cls != null ? cls.getClassName() : null;
+        } catch (Exception ignored) { }
+        try {
+            AssignmentVO vo = assignmentService.findAssignmentById(assignmentId);
+            assignmentName = vo != null ? vo.getAssignmentName() : null;
+        } catch (Exception ignored) { }
+
+        String fileName;
+        if (className == null || className.isEmpty() || assignmentName == null || assignmentName.isEmpty()) {
+            fileName = String.format("class_assignment_%d_%d_%s.zip", classId, assignmentId, new java.text.SimpleDateFormat("yyyyMMdd").format(new Date()));
+        } else {
+            fileName = String.format("%s_%s_%s.zip", className, assignmentName, new java.text.SimpleDateFormat("yyyyMMdd").format(new Date()));
+        }
+
+        ContentDisposition contentDisposition = ContentDisposition.builder("attachment")
+                .filename(fileName, StandardCharsets.UTF_8)
+                .build();
+        headers.setContentDisposition(contentDisposition);
+
+        return ResponseEntity.ok()
+                .headers(headers)
+                .body(zipBytes);
+    }
 }

+ 71 - 19
src/main/java/com/njuzr/eaibackend/service/ExportCompositionService.java

@@ -163,23 +163,20 @@ public class ExportCompositionService {
         try {
             List<ZipExport.ZipItem> zipItems = new ArrayList<>();
             for (StudentInfoVO student : students) {
-                // 获取学生ID
                 String officialNumber = student.getOfficialNumber();
                 User user = userMapper.selectOne(new QueryWrapper<User>().eq("official_number", officialNumber));
                 if (user == null) {
                     continue;
                 }
                 Long studentId = user.getId();
-                String studentDir = user.getOfficialNumber() + "_" + user.getName() + "/";
                 
-                // 对每个作业,获取学生的提交历史
                 for (Assignment assignment : courseAssignments) {
                     Long assignmentId = assignment.getAssignmentId();
+                    String assignmentDir = assignment.getAssignmentName() + "/";
+                    String studentDir = assignmentDir + user.getOfficialNumber() + "_" + user.getName() + "/";
                     try {
-                        // 获取作业历史记录
                         List<EngagementHistoryVO> historyList = assignmentService.getEngagementHistory(studentId, assignmentId);
                         for (EngagementHistoryVO history : historyList) {
-                            // 生成Word文档
                             Map<String, Object> model = new HashMap<>();
                             model.put("title", assignment.getAssignmentName());
                             model.put("studentName", user.getName());
@@ -193,7 +190,6 @@ public class ExportCompositionService {
                             zipItems.add(new ZipExport.ZipItem(fileName, wordBytes));
                         }
                     } catch (Exception e) {
-                        // 学生可能未提交该作业,跳过
                         log.warn("学生 {} 未提交作业 {},跳过", studentId, assignmentId);
                     }
                 }
@@ -205,31 +201,87 @@ public class ExportCompositionService {
     }
 
     public byte[] downloadAssignmentSubmissions(Long assignmentId) {
-        // 获取作业信息
         AssignmentVO assignment = assignmentService.findAssignmentById(assignmentId);
         if (assignment == null) {
             throw MyException.create(HttpStatus.BAD_REQUEST, "作业不存在");
         }
 
-        // 获取所有提交该作业的学生
-        List<Engagement> engagements = engagementMapperServiceImpl.getEngagementByAssignmentId(assignmentId);
-        if (engagements.isEmpty()) {
-            throw MyException.create(HttpStatus.BAD_REQUEST, "无学生提交该作业");
+        Long courseId = assignment.getCourseId();
+        List<com.njuzr.eaibackend.po.Class> courseClasses = classService.select(courseId);
+        if (courseClasses.isEmpty()) {
+            throw MyException.create(HttpStatus.BAD_REQUEST, "课程无班级");
         }
 
-        // 生成ZIP文件
         try {
             List<ZipExport.ZipItem> zipItems = new ArrayList<>();
-            for (Engagement engagement : engagements) {
-                Long studentId = engagement.getStudentId();
-                // 获取学生信息
-                UserVO user = userService.searchUsers(new Page<>(1, 1), studentId, null, null, null).getRecords().get(0);
-                String studentDir = user.getOfficialNumber() + "_" + user.getName() + "/";
+            
+            for (com.njuzr.eaibackend.po.Class cls : courseClasses) {
+                String className = cls.getClassName();
+                String classDir = className + "/";
+                
+                List<StudentInfoVO> students = classService.getStudentsByClassId(cls.getClassId());
+                for (StudentInfoVO student : students) {
+                    String officialNumber = student.getOfficialNumber();
+                    User user = userMapper.selectOne(new QueryWrapper<User>().eq("official_number", officialNumber));
+                    if (user == null) continue;
+                    
+                    Long studentId = user.getId();
+                    String studentDir = classDir + user.getOfficialNumber() + "_" + user.getName() + "/";
+                    
+                    List<EngagementHistoryVO> historyList = assignmentService.getEngagementHistory(studentId, assignmentId);
+                    for (EngagementHistoryVO history : historyList) {
+                        Map<String, Object> model = new HashMap<>();
+                        model.put("title", assignment.getAssignmentName());
+                        model.put("studentName", user.getName());
+                        model.put("officialNumber", user.getOfficialNumber());
+                        model.put("assignmentName", assignment.getAssignmentName());
+                        model.put("date", history.getSubmitTime());
+                        model.put("content", processContent(history.getTextContent()));
+                        
+                        byte[] wordBytes = wordExporter.exportCompositionWord(model);
+                        String fileName = studentDir + user.getOfficialNumber() + "_" + user.getName() + "_版本" + history.getVersion() + ".docx";
+                        zipItems.add(new ZipExport.ZipItem(fileName, wordBytes));
+                    }
+                }
+            }
+            return ZipExport.packToZip(zipItems);
+        } catch (IOException e) {
+            throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "ZIP打包失败" + e.getMessage());
+        }
+    }
+
+    public byte[] downloadClassAssignment(Long classId, Long assignmentId) {
+        com.njuzr.eaibackend.po.Class cls = classService.getClassById(classId);
+        if (cls == null) {
+            throw MyException.create(HttpStatus.BAD_REQUEST, "班级不存在");
+        }
+        
+        AssignmentVO assignment = assignmentService.findAssignmentById(assignmentId);
+        if (assignment == null) {
+            throw MyException.create(HttpStatus.BAD_REQUEST, "作业不存在");
+        }
+        
+        String folderName = cls.getClassName() + "_" + assignment.getAssignmentName();
+        String folderDir = folderName + "/";
+        
+        List<StudentInfoVO> students = classService.getStudentsByClassId(classId);
+        if (students.isEmpty()) {
+            throw MyException.create(HttpStatus.BAD_REQUEST, "班级无学生");
+        }
+        
+        try {
+            List<ZipExport.ZipItem> zipItems = new ArrayList<>();
+            
+            for (StudentInfoVO student : students) {
+                String officialNumber = student.getOfficialNumber();
+                User user = userMapper.selectOne(new QueryWrapper<User>().eq("official_number", officialNumber));
+                if (user == null) continue;
+                
+                Long studentId = user.getId();
+                String studentDir = folderDir + user.getOfficialNumber() + "_" + user.getName() + "/";
                 
-                // 获取作业历史记录
                 List<EngagementHistoryVO> historyList = assignmentService.getEngagementHistory(studentId, assignmentId);
                 for (EngagementHistoryVO history : historyList) {
-                    // 生成Word文档
                     Map<String, Object> model = new HashMap<>();
                     model.put("title", assignment.getAssignmentName());
                     model.put("studentName", user.getName());