Browse Source

Merge branch 'feature/writing-assignment-version-history-merge-refactor' of FanYanPeng/EAI-Backend into refactor

JiangPengYu 5 months ago
parent
commit
730985b100

+ 20 - 0
eai.sql

@@ -294,9 +294,29 @@ CREATE TABLE `student_assignment`  (
   `text_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '纯文本内容',
   `html_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT 'HTML格式内容',
   PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_assignment_student_latest`(`assignment_id`, `student_id`) USING BTREE,
   INDEX `idx_student_assignment`(`student_id`, `assignment_id`) USING BTREE
 ) ENGINE = InnoDB AUTO_INCREMENT = 95 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '学生作业关联表' ROW_FORMAT = Dynamic;
 
+-- ----------------------------
+-- Table structure for student_assignment_history
+-- ----------------------------
+DROP TABLE IF EXISTS `student_assignment_history`;
+CREATE TABLE `student_assignment_history`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID(自增)',
+  `assignment_id` bigint NOT NULL COMMENT '作业ID',
+  `student_id` bigint NOT NULL COMMENT '学生ID',
+  `version` int NOT NULL COMMENT '提交版本号',
+  `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '提交状态',
+  `quill_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT 'Quill富文本内容',
+  `text_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '纯文本内容',
+  `html_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT 'HTML格式内容',
+  `submit_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '提交时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_assignment_student_version`(`assignment_id`, `student_id`, `version`) USING BTREE,
+  INDEX `idx_assignment_student_submit_time`(`assignment_id`, `student_id`, `submit_time`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '学生作业历史版本表' ROW_FORMAT = Dynamic;
+
 -- ----------------------------
 -- Table structure for translations
 -- ----------------------------

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

@@ -185,6 +185,14 @@ public class AssignmentController {
         return MyResponse.success(assignmentService.getDetailEngagement(studentId, assignmentId));
     }
 
+    @GetMapping("/engage/history")
+    public MyResponse getEngagementHistory(
+            @RequestParam Long studentId,
+            @RequestParam Long assignmentId
+    ) {
+        return MyResponse.success(assignmentService.getEngagementHistory(studentId, assignmentId));
+    }
+
     /**
      已完成onlyOffice向Quill的更新
      */

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 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 org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -28,6 +29,10 @@ public interface StudentAssignmentMapper extends BaseMapper<Engagement> {
 
     String getTextContent(Long studentId, Long assignmentId);
 
+    void insertHistory(StudentAssignmentHistory history);
+
+    List<StudentAssignmentHistory> findHistoryByStudentIdAndAssignmentId(Long studentId, Long assignmentId);
+
     /**
      * 根据作业ID和学生ID列表查询作业提交情况
      * @param assignmentId 作业ID

+ 22 - 0
src/main/java/com/njuzr/eaibackend/po/StudentAssignmentHistory.java

@@ -0,0 +1,22 @@
+package com.njuzr.eaibackend.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.njuzr.eaibackend.enums.AssignmentCompletionStatus;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class StudentAssignmentHistory {
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    private Long assignmentId;
+    private Long studentId;
+    private Integer version;
+    private AssignmentCompletionStatus status;
+    private String quillContent;
+    private String textContent;
+    private String htmlContent;
+    private Date submitTime;
+}

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

@@ -40,6 +40,8 @@ public interface AssignmentService {
 
     EngagementDetailVO getDetailEngagement(Long studentId, Long assignmentId);
 
+    List<EngagementHistoryVO> getEngagementHistory(Long studentId, Long assignmentId);
+
     void engagementSubmit(Long studentId, Long assignmentId);
 
     /**

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

@@ -308,6 +308,31 @@ public class AssignmentServiceImpl implements AssignmentService {
         return detailVO;
     }
 
+    @Override
+    public List<EngagementHistoryVO> getEngagementHistory(Long studentId, Long assignmentId) {
+        Engagement engagement = studentAssignmentMapper.findEngagementByStudentIdAndAssignmentId(studentId, assignmentId);
+        if (engagement == null) {
+            throw MyException.create(HttpStatus.BAD_REQUEST, "参与作业情况不存在");
+        }
+
+        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();
+    }
+
     /**
      * 作业提交,更新文件版本和作业状态
      *
@@ -315,6 +340,7 @@ public class AssignmentServiceImpl implements AssignmentService {
      * @param assignmentId
      */
     @Override
+    @Transactional
     public void engagementSubmit(Long studentId, Long assignmentId) {
         Engagement engagement = studentAssignmentMapper.findEngagementByStudentIdAndAssignmentId(studentId, assignmentId);
         if (engagement == null)
@@ -326,6 +352,7 @@ public class AssignmentServiceImpl implements AssignmentService {
             int code = studentAssignmentMapper.updateById(engagement);
             if (code == 0)
                 throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "更新文件版本失败");
+            recordHistorySnapshot(engagement);
         } catch (Exception e) {
             log.error(e.getMessage());
             throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "更新文件版本失败");
@@ -339,6 +366,7 @@ public class AssignmentServiceImpl implements AssignmentService {
      * @param assignmentId
      */
     @Override
+    @Transactional
     public void engagementLateSubmit(Long studentId, Long assignmentId) {
         Engagement engagement = studentAssignmentMapper.findEngagementByStudentIdAndAssignmentId(studentId, assignmentId);
         if (engagement == null)
@@ -350,6 +378,7 @@ public class AssignmentServiceImpl implements AssignmentService {
             int code = studentAssignmentMapper.updateById(engagement);
             if (code == 0)
                 throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "更新文件版本失败");
+            recordHistorySnapshot(engagement);
         } catch (Exception e) {
             log.error(e.getMessage());
             throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "更新文件版本失败");
@@ -368,11 +397,9 @@ public class AssignmentServiceImpl implements AssignmentService {
         Engagement engagement = studentAssignmentMapper.findEngagementByStudentIdAndAssignmentId(studentId, assignmentId);
         if (engagement == null)
             throw MyException.create(HttpStatus.BAD_REQUEST, "参与作业情况不存在");
-        int originalVersion = engagement.getVersion();
         String quillContent = jsonObject.getString("quillContent");
         String textContent = jsonObject.getString("textContent");
         String htmlContent = jsonObject.getString("htmlContent");
-        engagement.setVersion(originalVersion + 1);
         engagement.setQuillContent(quillContent);
         engagement.setTextContent(textContent);
         engagement.setHtmlContent(htmlContent);
@@ -508,6 +535,19 @@ public class AssignmentServiceImpl implements AssignmentService {
         return res;
     }
 
+    private void recordHistorySnapshot(Engagement engagement) {
+        StudentAssignmentHistory history = new StudentAssignmentHistory();
+        history.setAssignmentId(engagement.getAssignmentId());
+        history.setStudentId(engagement.getStudentId());
+        history.setVersion(engagement.getVersion());
+        history.setStatus(engagement.getStatus());
+        history.setQuillContent(engagement.getQuillContent());
+        history.setTextContent(engagement.getTextContent());
+        history.setHtmlContent(engagement.getHtmlContent());
+        history.setSubmitTime(new Date());
+        studentAssignmentMapper.insertHistory(history);
+    }
+
     private AssignmentStatus calculateStatus(Date startTime, Date endTime) {
         Date now = new Date();
         if (now.before(startTime)) {

+ 12 - 0
src/main/java/com/njuzr/eaibackend/vo/AssignmentCompletionStatusVO.java

@@ -0,0 +1,12 @@
+package com.njuzr.eaibackend.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class AssignmentCompletionStatusVO {
+    private Integer code;
+    private String status;
+}
+

+ 15 - 0
src/main/java/com/njuzr/eaibackend/vo/EngagementHistoryVO.java

@@ -0,0 +1,15 @@
+package com.njuzr.eaibackend.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class EngagementHistoryVO {
+	private Integer version;
+	private AssignmentCompletionStatusVO status;
+	private String quillContent;
+	private String textContent;
+	private String htmlContent;
+	private Date submitTime;
+}

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

@@ -21,6 +21,20 @@
         WHERE student_id = #{studentId} AND assignment_id = #{assignmentId}
     </select>
 
+    <insert id="insertHistory" parameterType="com.njuzr.eaibackend.po.StudentAssignmentHistory">
+        INSERT INTO student_assignment_history
+        (assignment_id, student_id, version, status, quill_content, text_content, html_content, submit_time)
+        VALUES
+        (#{assignmentId}, #{studentId}, #{version}, #{status}, #{quillContent}, #{textContent}, #{htmlContent}, #{submitTime})
+    </insert>
+
+    <select id="findHistoryByStudentIdAndAssignmentId" resultType="com.njuzr.eaibackend.po.StudentAssignmentHistory">
+        SELECT *
+        FROM student_assignment_history
+        WHERE student_id = #{studentId} AND assignment_id = #{assignmentId}
+        ORDER BY version DESC
+    </select>
+
     <delete id="delete">
         DELETE FROM student_assignment
         WHERE student_id = #{studentId} AND assignment_id = #{assignmentId}