/** * 自然写互动课堂教学管理云平台软件 V1.0 * * 数据模型 - 设备实体 / 作业实体 / 笔迹数据实体 * 设备表(device):MySQL * 作业表(assignment):MySQL * 笔迹数据(stroke_data):MongoDB */ package com.writech.cloud.model; import javax.persistence.*; import java.time.LocalDateTime; import java.util.*; // ==================== 设备实体 ==================== /** * 设备注册表实体(MySQL) * 管理点阵笔、网关、终端设备、算力盒 */ @Entity @Table(name = "device", indexes = { @Index(name = "idx_mac", columnList = "macAddr", unique = true), @Index(name = "idx_school_type", columnList = "schoolId, type"), @Index(name = "idx_classroom", columnList = "classroomId") }) class Device { @Id @Column(length = 32) private String id; /** 设备类型:pen/gateway/terminal/edge_box */ @Column(nullable = false, length = 16) private String type; /** 设备MAC地址(全局唯一) */ @Column(nullable = false, length = 17, unique = true) private String macAddr; /** 设备序列号 */ @Column(length = 32) private String serialNumber; /** 固件版本号 */ @Column(length = 16) private String firmwareVersion; /** 绑定用户ID */ @Column(length = 32) private String bindUserId; /** 所属学校ID */ @Column(length = 32) private String schoolId; /** 所属教室ID */ @Column(length = 32) private String classroomId; /** 设备状态:1=在线, 0=离线, -1=故障 */ @Column(nullable = false) private int status = 0; /** 电池电量百分比(0-100,仅笔设备) */ private Integer batteryLevel; /** 当前连接的笔数量(仅网关设备) */ private Integer connectedPenCount; /** CPU使用率(仅网关/算力盒) */ private Double cpuUsage; /** 内存使用率(仅网关/算力盒) */ private Double memoryUsage; /** 注册时间 */ @Column(nullable = false) private LocalDateTime registerTime; /** 最后心跳时间 */ private LocalDateTime lastHeartbeat; // Getter/Setter public String getId() { return id; } public void setId(String id) { this.id = id; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getMacAddr() { return macAddr; } public void setMacAddr(String macAddr) { this.macAddr = macAddr; } public String getSerialNumber() { return serialNumber; } public void setSerialNumber(String sn) { this.serialNumber = sn; } public String getFirmwareVersion() { return firmwareVersion; } public void setFirmwareVersion(String v) { this.firmwareVersion = v; } public String getBindUserId() { return bindUserId; } public void setBindUserId(String id) { this.bindUserId = id; } public String getSchoolId() { return schoolId; } public void setSchoolId(String id) { this.schoolId = id; } public String getClassroomId() { return classroomId; } public void setClassroomId(String id) { this.classroomId = id; } public int getStatus() { return status; } public void setStatus(int s) { this.status = s; } public Integer getBatteryLevel() { return batteryLevel; } public void setBatteryLevel(Integer l) { this.batteryLevel = l; } public Integer getConnectedPenCount() { return connectedPenCount; } public void setConnectedPenCount(Integer c) { this.connectedPenCount = c; } public Double getCpuUsage() { return cpuUsage; } public void setCpuUsage(Double u) { this.cpuUsage = u; } public Double getMemoryUsage() { return memoryUsage; } public void setMemoryUsage(Double u) { this.memoryUsage = u; } public LocalDateTime getRegisterTime() { return registerTime; } public void setRegisterTime(LocalDateTime t) { this.registerTime = t; } public LocalDateTime getLastHeartbeat() { return lastHeartbeat; } public void setLastHeartbeat(LocalDateTime t) { this.lastHeartbeat = t; } } // ==================== 作业实体 ==================== /** * 作业/试卷发布表实体(MySQL) */ @Entity @Table(name = "assignment", indexes = { @Index(name = "idx_class_status", columnList = "classId, status"), @Index(name = "idx_teacher", columnList = "teacherId") }) class Assignment { @Id @Column(length = 32) private String id; /** 发布教师ID */ @Column(nullable = false, length = 32) private String teacherId; /** 班级ID */ @Column(nullable = false, length = 32) private String classId; /** 作业标题 */ @Column(nullable = false, length = 128) private String title; /** 类型:homework(作业)/exam(考试)/practice(练习) */ @Column(nullable = false, length = 16) private String type; /** 学科 */ @Column(length = 32) private String subject; /** 截止时间 */ private LocalDateTime deadline; /** 状态:draft/published/closed/graded */ @Column(nullable = false, length = 16) private String status; /** 发布时间 */ private LocalDateTime publishTime; /** 满分值 */ private double totalScore; /** 题目总数 */ private int questionCount; /** 关联的点阵码页面ID列表(JSON数组) */ @Column(columnDefinition = "TEXT") private String dotCodePagesJson; @Transient private List dotCodePages; // Getter/Setter public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTeacherId() { return teacherId; } public void setTeacherId(String id) { this.teacherId = id; } public String getClassId() { return classId; } public void setClassId(String id) { this.classId = id; } public String getTitle() { return title; } public void setTitle(String t) { this.title = t; } public String getType() { return type; } public void setType(String t) { this.type = t; } public String getSubject() { return subject; } public void setSubject(String s) { this.subject = s; } public LocalDateTime getDeadline() { return deadline; } public void setDeadline(LocalDateTime d) { this.deadline = d; } public String getStatus() { return status; } public void setStatus(String s) { this.status = s; } public LocalDateTime getPublishTime() { return publishTime; } public void setPublishTime(LocalDateTime t) { this.publishTime = t; } public double getTotalScore() { return totalScore; } public void setTotalScore(double s) { this.totalScore = s; } public int getQuestionCount() { return questionCount; } public void setQuestionCount(int c) { this.questionCount = c; } public List getDotCodePages() { return dotCodePages; } public void setDotCodePages(List p) { this.dotCodePages = p; } } // ==================== 笔迹数据实体 ==================== /** * 笔迹原始数据实体(MongoDB) * * JSON文档结构: * { * student_id: "...", * assignment_id: "...", * pen_id: "...", * page_id: "...", * strokes: [{x, y, pressure, timestamp, penUp}, ...], * createTime: "...", * processingStatus: "received/processing/completed/failed" * } */ class StrokeData { private String id; private String studentId; private String assignmentId; private String penId; private String pageId; private List> strokes; private LocalDateTime createTime; private LocalDateTime processedTime; private String processingStatus; // received/processing/completed/failed public String getId() { return id; } public void setId(String id) { this.id = id; } public String getStudentId() { return studentId; } public void setStudentId(String id) { this.studentId = id; } public String getAssignmentId() { return assignmentId; } public void setAssignmentId(String id) { this.assignmentId = id; } public String getPenId() { return penId; } public void setPenId(String id) { this.penId = id; } public String getPageId() { return pageId; } public void setPageId(String id) { this.pageId = id; } public List> getStrokes() { return strokes; } public void setStrokes(List> s) { this.strokes = s; } public LocalDateTime getCreateTime() { return createTime; } public void setCreateTime(LocalDateTime t) { this.createTime = t; } public LocalDateTime getProcessedTime() { return processedTime; } public void setProcessedTime(LocalDateTime t) { this.processedTime = t; } public String getProcessingStatus() { return processingStatus; } public void setProcessingStatus(String s) { this.processingStatus = s; } }