package com.njuzr.eaibackend.po; import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.CompoundIndex; import org.springframework.data.mongodb.core.index.CompoundIndexes; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; import java.util.Date; import java.util.List; /** * @Auther: WuZilong * @Date: 2025/8/9 14:51 * @Description: */ @Data @Document(collection = "behaviorOverviews") @CompoundIndexes({ // 复合唯一索引:确保 student_id + assignment_id 的业务唯一性 @CompoundIndex( name = "student_assignment_unique", def = "{'student_id': 1, 'assignment_id': 1}", unique = true, background = true ) }) public class BehaviorOverview { @Id private String id; // MongoDB自动生成的ObjectId @Field("student_id") private Long studentId; // 学生ID @Field("assignment_id") private Long assignmentId; // 作业ID @Field("created_at") // @Indexed private Date createdAt; // (student_id,assignment_id)第一条记录的创建时间 private List events; // 行为事件集合 // 统计信息字段 private Integer insertCount; // type为insert的次数 private Integer deleteCount; // type为delete的次数 private Integer copyCount; // type为copy的次数 private Integer copyCharacterCount; // type为copy的所有条目中,insert字段对应的字符总数 private Integer longPauseCount; // pauseTime大于2000ms的次数 /** * 嵌套行为事件类 */ @Data public static class BehaviorEvent { // 基础事件信息(按JSON顺序排列) private String type; // 事件类型(cursor_move/insert/delete等) private Integer retain; // 光标位置 private Integer length; // 操作长度 private String time; // 事件时间(字符串格式) // 文本操作相关 private String insert; // 插入的文本内容 private Integer docLength; // 文档总长度 private Integer letterCount; // 字母计数 // 键盘输入相关 private String key; // 按键值 private String timeKey; // 按键时间 // 时间戳信息 private Long startStamp; // 开始时间戳 private String startClock; // 开始时钟时间 private String startTime; // 开始时间字符串 // 结束时间信息 private Long endStamp; // 结束时间戳 private String endClock; // 结束时钟时间 private String endTime; // 结束时间字符串 // 时间统计 private Long actionTime; // 操作耗时(毫秒) private Long pauseTime; // 停留时间(毫秒) // 删除操作相关 private String delete; // 删除操作类型 private String oldContent; // 旧内容 private String deletedContent; // 删除的内容 } }