Przeglądaj źródła

feat: GET /api/behaviorRecord 返回 BehaviorRecordItemVO,附加统计字段

wuzilong 4 miesięcy temu
rodzic
commit
24c24a7e5b

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

@@ -1,8 +1,8 @@
 package com.njuzr.eaibackend.service;
 
 import com.njuzr.eaibackend.po.BehaviorRecord;
+import com.njuzr.eaibackend.vo.BehaviorRecordItemVO;
 import com.njuzr.eaibackend.vo.BehaviorRecordVO;
-import com.njuzr.eaibackend.vo.BehaviorOverviewVO;
 import com.njuzr.eaibackend.vo.TextAnalysisVO;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -13,7 +13,7 @@ import java.util.List;
  * @date 2025-02-10 17:03
  */
 public interface BehaviorRecordService {
-    List<BehaviorRecord> find(Long assignmentId, Long studentId);
+    List<BehaviorRecordItemVO> find(Long assignmentId, Long studentId);
     String upload(Long assignmentId, Long studentId, MultipartFile file);
 
     BehaviorRecordVO findALL(Long assignmentId, Long studentId);

+ 6 - 3
src/main/java/com/njuzr/eaibackend/service/impl/BehaviorRecordServiceImpl.java

@@ -6,6 +6,7 @@ import com.njuzr.eaibackend.po.BehaviorRecord;
 import com.njuzr.eaibackend.service.BehaviorRecordService;
 import com.njuzr.eaibackend.service.BehaviorOverviewService;
 import com.njuzr.eaibackend.utils.OssUtil;
+import com.njuzr.eaibackend.vo.BehaviorRecordItemVO;
 import com.njuzr.eaibackend.vo.BehaviorRecordVO;
 import com.njuzr.eaibackend.po.TextAnalysis;
 import com.njuzr.eaibackend.vo.TextAnalysisVO;
@@ -55,10 +56,12 @@ public class BehaviorRecordServiceImpl implements BehaviorRecordService {
     }
 
     @Override
-    public List<BehaviorRecord> find(Long assignmentId, Long studentId) {
-        // 创建一个按 created_at 降序排序的 Sort 对象,它不会引起额外的排序开销(因为索引已经支持);显式指定排序确保代码的兼容性
+    public List<BehaviorRecordItemVO> find(Long assignmentId, Long studentId) {
         Sort sort = Sort.by(Sort.Direction.ASC, "created_at");
-        return behaviorRecordMapper.findByAssignmentIdAndStudentId(assignmentId, studentId, sort);
+        return behaviorRecordMapper.findByAssignmentIdAndStudentId(assignmentId, studentId, sort)
+                .stream()
+                .map(BehaviorRecordItemVO::from)
+                .collect(Collectors.toList());
     }
 
     @Override

+ 72 - 0
src/main/java/com/njuzr/eaibackend/vo/BehaviorRecordItemVO.java

@@ -0,0 +1,72 @@
+package com.njuzr.eaibackend.vo;
+
+import com.njuzr.eaibackend.po.BehaviorRecord;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 单次行为记录 VO,在原始记录基础上附加统计字段
+ */
+@Data
+public class BehaviorRecordItemVO {
+
+    private String id;
+    private Long studentId;
+    private Long assignmentId;
+    private Date createdAt;
+    private List<BehaviorRecord.BehaviorEvent> events;
+
+    // 统计字段
+    private Integer insertCount;         // 插入操作次数
+    private Integer deleteCount;         // 删除操作次数
+    private Integer copyCount;           // 复制操作次数
+    private Integer copyCharacterCount;  // 复制字符总数
+    private Integer longPauseCount;      // 长暂停次数(>2000ms)
+
+    public static BehaviorRecordItemVO from(BehaviorRecord record) {
+        BehaviorRecordItemVO vo = new BehaviorRecordItemVO();
+        vo.setId(record.getId());
+        vo.setStudentId(record.getStudentId());
+        vo.setAssignmentId(record.getAssignmentId());
+        vo.setCreatedAt(record.getCreatedAt());
+        vo.setEvents(record.getEvents());
+
+        List<BehaviorRecord.BehaviorEvent> events = record.getEvents();
+        if (events == null || events.isEmpty()) {
+            vo.setInsertCount(0);
+            vo.setDeleteCount(0);
+            vo.setCopyCount(0);
+            vo.setCopyCharacterCount(0);
+            vo.setLongPauseCount(0);
+            return vo;
+        }
+
+        int insertCount = 0, deleteCount = 0, copyCount = 0,
+            copyCharacterCount = 0, longPauseCount = 0;
+
+        for (BehaviorRecord.BehaviorEvent e : events) {
+            String type = e.getType();
+            if (type == null) continue;
+            switch (type) {
+                case "insert" -> insertCount++;
+                case "delete" -> deleteCount++;
+                case "copy" -> {
+                    copyCount++;
+                    if (e.getInsert() != null) copyCharacterCount += e.getInsert().length();
+                }
+            }
+            if (e.getPauseTime() != null && e.getPauseTime() > 2000) {
+                longPauseCount++;
+            }
+        }
+
+        vo.setInsertCount(insertCount);
+        vo.setDeleteCount(deleteCount);
+        vo.setCopyCount(copyCount);
+        vo.setCopyCharacterCount(copyCharacterCount);
+        vo.setLongPauseCount(longPauseCount);
+        return vo;
+    }
+}