Просмотр исходного кода

feat:添加获取下一个批改对象接口和批改状态接口

lalala 1 год назад
Родитель
Сommit
8a5b48e9db

+ 2 - 0
eaidb.sql

@@ -134,6 +134,8 @@ CREATE TABLE IF NOT EXISTS `eai`.`assignment` (
   `start_time` datetime NOT NULL COMMENT '开始时间',
   `end_time` datetime NOT NULL COMMENT '截止时间',
   `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `engage_number` int  COMMENT '参与人数',
+  `correct_number` int  COMMENT '批改人数',
   PRIMARY KEY (`assignment_id`),
   KEY `idx_time_range` (`start_time`, `end_time`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课程作业表';

+ 10 - 0
src/main/java/com/njuzr/eaibackend/controller/AssignmentController.java

@@ -161,6 +161,16 @@ public class AssignmentController {
         return MyResponse.success(assignmentService.findEngagementPage(page, assignmentId));
     }
 
+    @GetMapping("/engage/next")
+    public MyResponse getNextStudentId(@RequestParam Long assignmentId, @RequestParam Long studentId){
+        return MyResponse.success(assignmentService.getNextStudentId(assignmentId, studentId));
+    }
+
+    @GetMapping("/engage/number")
+    public MyResponse getEngageNumber(@RequestParam Long assignmentId){
+        return MyResponse.success(assignmentService.getEngageNumber(assignmentId));
+    }
+
     /**
         已完成onlyOffice向Quill的更新
      */

+ 3 - 0
src/main/java/com/njuzr/eaibackend/dto/AssignmentDTO.java

@@ -35,4 +35,7 @@ public class AssignmentDTO {
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss",timezone = "Asia/Shanghai")
     @NotNull(message = "结束时间不能缺失")
     private Date endTime;
+
+    private Integer engageNumber;
+    private Integer correctNumber;
 }

+ 2 - 0
src/main/java/com/njuzr/eaibackend/enums/AssignmentCompletionStatus.java

@@ -2,6 +2,7 @@ package com.njuzr.eaibackend.enums;
 
 import com.baomidou.mybatisplus.annotation.EnumValue;
 import lombok.Getter;
+import org.springframework.data.mongodb.core.aggregation.BooleanOperators;
 
 /**
  * @author: Leonezhurui
@@ -20,6 +21,7 @@ public enum AssignmentCompletionStatus {
     CORRECTED(6, "CORRECTED") //已批改、但还未发布(状态仅老师可见)
     ;
 
+
     @EnumValue
     private final int code;
     private final String status;

+ 4 - 0
src/main/java/com/njuzr/eaibackend/po/Assignment.java

@@ -43,4 +43,8 @@ public class Assignment {
     private Date endTime;
 
     private Date createTime;
+
+    private Integer engageNumber;
+
+    private Integer correctNumber;
 }

+ 5 - 1
src/main/java/com/njuzr/eaibackend/service/AssignmentService.java

@@ -11,6 +11,7 @@ import com.njuzr.eaibackend.po.Assignment;
 import com.njuzr.eaibackend.po.Engagement;
 import com.njuzr.eaibackend.po.MyUserDetails;
 import com.njuzr.eaibackend.vo.AssignmentVO;
+import com.njuzr.eaibackend.vo.EngageNumberVo;
 import com.njuzr.eaibackend.vo.EngagementDetailVO;
 import com.njuzr.eaibackend.vo.EngagementVO;
 
@@ -47,5 +48,8 @@ public interface AssignmentService {
     void engagementStage(Long studentId, Long assignmentId, JSONObject jsonObject);
 
     void engagementCorrect(Long teacherId, Long studentId, Long assignmentId, CorrectDTO correctDTO);
-    
+
+    long getNextStudentId(Long assignmentId, Long studentId);
+
+    EngageNumberVo getEngageNumber(Long assignmentId);
 }

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

@@ -26,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author: Leonezhurui
@@ -84,6 +85,8 @@ public class AssignmentServiceImpl implements AssignmentService {
         Assignment target = convertToPO(assignmentDTO);
         target.setCourseId(courseId);
         target.setTeacherId(user.getId());
+        target.setEngageNumber(0);
+        target.setCorrectNumber(0);
         // TODO:权宜之计
 //        target.setTeacherId(Long.valueOf(user.getPid()));
         target.setCreateTime(new Date());
@@ -206,6 +209,8 @@ public class AssignmentServiceImpl implements AssignmentService {
         if(studentAssignmentMapper.findEngagementByStudentIdAndAssignmentId(studentId, assignmentId) != null){
             return;
         }
+
+
         // 1创建Engagement实体类,初始化基本信息
         Engagement engagement = new Engagement();
         engagement.setStudentId(studentId);
@@ -213,6 +218,10 @@ public class AssignmentServiceImpl implements AssignmentService {
         engagement.setVersion(1); // 设置这是version
         engagement.setStatus(AssignmentCompletionStatus.NOT_SUBMITTED); // 已经进入到页面编辑,但是还没有提交
 
+        Assignment assignment = assignmentMapper.selectById(assignmentId);
+        assignment.setEngageNumber(assignment.getEngageNumber() + 1);
+
+
 //        // 2通过FileUtil创建一个空的docx文件
 //        InputStream inputStream = fileUtil.createEmptyDocx();
 //
@@ -223,7 +232,8 @@ public class AssignmentServiceImpl implements AssignmentService {
 
         try {
             int code = studentAssignmentMapper.insert(engagement);
-            if (code == 0)
+            int code1 = assignmentMapper.updateById(assignment);
+            if (code == 0 || code1 == 0)
                 throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "参加作业失败");
         } catch (Exception e) {
             log.error(e.getMessage());
@@ -248,6 +258,8 @@ public class AssignmentServiceImpl implements AssignmentService {
         return convertToVO(engagement);
     }
 
+
+    // 返回顺序: 先是未批改的,然后是批改的按照成绩从高到低返回
     @Override
     public IPage<EngagementVO> findEngagementPage(Page<Engagement> page, Long assignmentId) {
         IPage<Engagement> engagements = studentAssignmentMapper.findEngagementByAssignmentId(page, assignmentId);
@@ -255,6 +267,8 @@ public class AssignmentServiceImpl implements AssignmentService {
     }
 
 
+
+
     @Override
     public EngagementDetailVO getDetailEngagement(Long studentId, Long assignmentId) {
         // 1 获取用户详细信息
@@ -354,9 +368,13 @@ public class AssignmentServiceImpl implements AssignmentService {
         engagement.setScore(correctDTO.getScore());
         engagement.setRemark(correctDTO.getRemark());
 
+        assignment.setCorrectNumber(assignment.getCorrectNumber() + 1);
+
+
         try {
             int code = studentAssignmentMapper.updateById(engagement);
-            if (code == 0)
+            int code1 = assignmentMapper.updateById(assignment);
+            if (code == 0 || code1 == 0)
                 throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "批改作业失败");
         } catch (Exception e) {
             log.error(e.getMessage());
@@ -365,6 +383,47 @@ public class AssignmentServiceImpl implements AssignmentService {
 
     }
 
+    @Override
+    public long getNextStudentId(Long assignmentId, Long studentId) {
+        List<Engagement> allRecords = studentAssignmentMapper.selectList(
+                new QueryWrapper<Engagement>()
+                        .eq("assignment_id", assignmentId)
+                // 可以在此添加其他查询条件
+        );
+        // 对记录进行排序:status为4或6的记录排到最后,其他记录保持原始顺序
+        List<Engagement> sortedList = allRecords.stream()
+                .sorted(Comparator.comparing(
+                        e -> e.getStatus() == AssignmentCompletionStatus.PUBLISHED ||
+                                e.getStatus() == AssignmentCompletionStatus.CORRECTED
+                )).toList();
+
+        int currentIndex = -1;
+        for (int i = 0; i < sortedList.size(); i++) {
+            if (sortedList.get(i).getStudentId().equals(studentId)) {
+                currentIndex = i;
+                break;
+            }
+        }
+        if (currentIndex == allRecords.size() - 1 || currentIndex == -1) {
+            return sortedList.get(0).getStudentId();
+        }
+
+        return sortedList.get(currentIndex + 1).getStudentId();
+    }
+
+    @Override
+    public EngageNumberVo getEngageNumber(Long assignmentId) {
+        Assignment assignment = assignmentMapper.selectById(assignmentId);
+        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, "未建立作业统计");
+        }
+    }
+
     private Assignment convertToPO(AssignmentDTO assignmentDTO) {
         Assignment assignment = new Assignment();
         BeanUtils.copyProperties(assignmentDTO, assignment);

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

@@ -8,6 +8,7 @@ import com.njuzr.eaibackend.dto.course.CourseDTO;
 import com.njuzr.eaibackend.dto.course.CourseQueryDTO;
 import com.njuzr.eaibackend.dto.course.CourseUpdateDTO;
 import com.njuzr.eaibackend.dto.course.EnrollDTO;
+import com.njuzr.eaibackend.enums.AssignmentCompletionStatus;
 import com.njuzr.eaibackend.enums.Role;
 import com.njuzr.eaibackend.exception.MyException;
 import com.njuzr.eaibackend.mapper.*;
@@ -369,6 +370,13 @@ public class CourseServiceImpl implements CourseService {
         List<Assignment> assignments = assignmentMapper.selectList(wrapper);
         // 删除学生的所有作业记录
         for(Assignment assignment : assignments) {
+            // 修改对应参与数量和批改数量
+            Engagement engage = studentAssignmentMapper.findEngagementByStudentIdAndAssignmentId(studentId, assignment.getAssignmentId());
+            if(engage.getStatus() == AssignmentCompletionStatus.CORRECTED || engage.getStatus() == AssignmentCompletionStatus.PUBLISHED){
+                assignment.setCorrectNumber(assignment.getCorrectNumber() - 1);
+            }
+            assignment.setEngageNumber(assignment.getEngageNumber() - 1);
+            assignmentMapper.updateById(assignment);
             studentAssignmentMapper.delete(studentId, assignment.getAssignmentId());
         }
         // 学生退课

+ 5 - 0
src/main/java/com/njuzr/eaibackend/vo/AssignmentVO.java

@@ -40,4 +40,9 @@ public class AssignmentVO implements Serializable {
     private Date createTime;
 
     private AssignmentStatus status; // 根据startTime和endTime计算出来的status,共有三种:未开始、进行中、已结束
+
+    private Integer engageNumber;
+
+    private Integer correctNumber;
+
 }

+ 18 - 0
src/main/java/com/njuzr/eaibackend/vo/EngageNumberVo.java

@@ -0,0 +1,18 @@
+package com.njuzr.eaibackend.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * @author Liululin
+ * @date 2025/6/9 - 19:24
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class EngageNumberVo {
+    private Integer engageNumber;
+    private Integer correctNumber;
+}