Prechádzať zdrojové kódy

Merge branch 'fix/nextstudent_api_and_engagementnumber_api' of FanYanPeng/EAI-Backend into refactor

JiangPengYu 4 mesiacov pred
rodič
commit
3cdca5d293

+ 3 - 0
src/main/java/com/njuzr/eaibackend/mapper/StudentAssignmentMapper.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.njuzr.eaibackend.po.Engagement;
 import com.njuzr.eaibackend.po.StudentAssignment;
 import com.njuzr.eaibackend.po.StudentAssignmentHistory;
+import com.njuzr.eaibackend.vo.EngageNumberVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -25,6 +26,8 @@ public interface StudentAssignmentMapper extends BaseMapper<Engagement> {
 
     List<Engagement> findEngagementByAssignmentId(Long assignmentId);
 
+    EngageNumberVo countEngageNumberByCurrentClassStudents(@Param("assignmentId") Long assignmentId);
+
     void delete(Long studentId, Long assignmentId);
 
     String getTextContent(Long studentId, Long assignmentId);

+ 13 - 7
src/main/java/com/njuzr/eaibackend/service/impl/AssignmentServiceImpl.java

@@ -519,8 +519,18 @@ public class AssignmentServiceImpl implements AssignmentService {
         List<Engagement> allRecords = studentAssignmentMapper.selectList(
                 new QueryWrapper<Engagement>()
                         .eq("assignment_id", assignmentId)
-                // 可以在此添加其他查询条件
+                        .exists("""
+                                SELECT 1
+                                FROM assignment a
+                                JOIN course_student cs ON cs.course_id = a.course_id
+                                WHERE a.assignment_id = student_assignment.assignment_id
+                                  AND cs.student_id = student_assignment.student_id
+                                """)
         );
+        if (allRecords.isEmpty()) {
+            throw MyException.create(HttpStatus.BAD_REQUEST, "当前作业没有可批改的在课学生");
+        }
+
         // 对记录进行排序:status为4或6的记录排到最后,其他记录保持原始顺序
         List<Engagement> sortedList = allRecords.stream()
                 .sorted(Comparator.comparing(
@@ -535,7 +545,7 @@ public class AssignmentServiceImpl implements AssignmentService {
                 break;
             }
         }
-        if (currentIndex == allRecords.size() - 1 || currentIndex == -1) {
+        if (currentIndex == sortedList.size() - 1 || currentIndex == -1) {
             return sortedList.get(0).getStudentId();
         }
 
@@ -548,11 +558,7 @@ public class AssignmentServiceImpl implements AssignmentService {
         if(assignment == null){
             throw MyException.create(HttpStatus.BAD_REQUEST, "作业不存在");
         }
-        if(assignment.getEngageNumber() != null && assignment.getCorrectNumber() != null){
-            return new EngageNumberVo(assignment.getEngageNumber(), assignment.getCorrectNumber());
-        } else {
-            throw MyException.create(HttpStatus.BAD_REQUEST, "未建立作业统计");
-        }
+        return studentAssignmentMapper.countEngageNumberByCurrentClassStudents(assignmentId);
     }
 
     private Assignment convertToPO(AssignmentDTO assignmentDTO) {

+ 17 - 0
src/main/resources/mapper/StudentAssignmentMapper.xml

@@ -14,6 +14,23 @@
         WHERE assignment_id = #{assignmentId}
     </select>
 
+    <select id="countEngageNumberByCurrentClassStudents" resultType="com.njuzr.eaibackend.vo.EngageNumberVo">
+        SELECT
+            COUNT(*) AS engageNumber,
+            COALESCE(SUM(CASE WHEN sa.status IN (4, 6, 8) THEN 1 ELSE 0 END), 0) AS correctNumber
+        FROM student_assignment sa
+        WHERE sa.assignment_id = #{assignmentId}
+          AND EXISTS (
+              SELECT 1
+              FROM assignment a
+              JOIN `class` c ON c.course_id = a.course_id
+              JOIN class_student cs ON cs.class_id = c.class_id
+              JOIN users u ON u.official_number = cs.official_number
+              WHERE a.assignment_id = sa.assignment_id
+                AND u.id = sa.student_id
+          )
+    </select>
+
     <!--  通过studentId和assignmentID查找text_content  -->
     <select id="getTextContent" resultType="java.lang.String">
         SELECT text_content