Files
system-design/software-copyright/01-writech-cloud-platform/controller/AssignmentController.java
T
2026-03-22 15:24:40 +08:00

457 lines
19 KiB
Java

/**
* 自然写互动课堂教学管理云平台软件 V1.0
*
* 作业管理控制器
* 负责作业/试卷的发布、回收、批改结果查询等接口
*/
package com.writech.cloud.controller;
import com.writech.cloud.WritechCloudApplication.ApiResponse;
import com.writech.cloud.WritechCloudApplication.BusinessException;
import com.writech.cloud.model.Assignment;
import com.writech.cloud.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;
import java.util.*;
/**
* 作业控制器 - /api/v1/assignment
*
* 教师发布作业/试卷 → 学生纸上作答(笔迹通过点阵笔采集)
* → 系统自动收集 → AI引擎识别批改 → 结果推送教师和家长
*/
@RestController
@RequestMapping("/api/v1/assignment")
public class AssignmentController {
@Autowired
private UserService userService;
/**
* 发布作业
* POST /api/v1/assignment/publish
*
* 教师创建并发布作业/试卷,指定班级、截止时间、题目内容
* 发布后自动推送通知至学生端和家长端
*/
@PostMapping("/publish")
public ApiResponse<AssignmentPublishResponse> publishAssignment(
@Valid @RequestBody AssignmentPublishRequest request,
@RequestHeader("Authorization") String auth) {
// 验证教师身份
String teacherId = extractUserIdFromToken(auth);
// 校验截止时间
if (request.getDeadline() != null && request.getDeadline().isBefore(LocalDateTime.now())) {
throw new BusinessException(400, "截止时间不能早于当前时间");
}
// 校验题目列表
if (request.getQuestions() == null || request.getQuestions().isEmpty()) {
throw new BusinessException(400, "作业题目不能为空");
}
// 创建作业记录
Assignment assignment = new Assignment();
assignment.setId(UUID.randomUUID().toString().replace("-", ""));
assignment.setTeacherId(teacherId);
assignment.setClassId(request.getClassId());
assignment.setTitle(request.getTitle());
assignment.setType(request.getType()); // homework/exam/practice
assignment.setSubject(request.getSubject());
assignment.setDeadline(request.getDeadline());
assignment.setStatus("published");
assignment.setPublishTime(LocalDateTime.now());
assignment.setTotalScore(calculateTotalScore(request.getQuestions()));
assignment.setQuestionCount(request.getQuestions().size());
// 关联点阵码页面(每道题对应特定点阵码区域)
if (request.getDotCodePages() != null) {
assignment.setDotCodePages(request.getDotCodePages());
}
// 保存作业及题目
// assignmentService.saveWithQuestions(assignment, request.getQuestions());
// 异步推送通知至学生端和家长端
// messageService.pushAssignmentNotification(assignment);
AssignmentPublishResponse response = new AssignmentPublishResponse();
response.setAssignmentId(assignment.getId());
response.setTitle(assignment.getTitle());
response.setPublishTime(assignment.getPublishTime());
response.setStudentCount(getClassStudentCount(request.getClassId()));
return ApiResponse.success(response);
}
/**
* 获取作业列表
* GET /api/v1/assignment/list
*
* 教师查看已发布的作业列表,支持按班级、状态、时间筛选
*/
@GetMapping("/list")
public ApiResponse<Page<AssignmentSummary>> listAssignments(
@RequestParam(required = false) String classId,
@RequestParam(required = false) String status,
@RequestParam(required = false) String subject,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size,
@RequestHeader("Authorization") String auth) {
String userId = extractUserIdFromToken(auth);
// Page<AssignmentSummary> result = assignmentService.queryList(...)
return ApiResponse.success(null);
}
/**
* 获取作业详情
* GET /api/v1/assignment/{id}
*/
@GetMapping("/{id}")
public ApiResponse<AssignmentDetailResponse> getAssignment(@PathVariable String id) {
// Assignment assignment = assignmentService.findById(id);
return ApiResponse.success(null);
}
/**
* 获取批改结果
* GET /api/v1/result/{assignmentId}
*
* 查询指定作业的AI批改结果,包含每个学生的识别文本、
* 得分、错误详情及AI反馈建议
*/
@GetMapping("/result/{assignmentId}")
public ApiResponse<AssignmentResultResponse> getResult(
@PathVariable String assignmentId,
@RequestParam(required = false) String studentId) {
AssignmentResultResponse response = new AssignmentResultResponse();
response.setAssignmentId(assignmentId);
response.setTotalStudents(40);
response.setSubmittedCount(38);
response.setGradedCount(38);
response.setAverageScore(85.5);
response.setHighestScore(100.0);
response.setLowestScore(45.0);
// 每个学生的批改结果
List<StudentResult> studentResults = new ArrayList<>();
// studentResults = resultService.getStudentResults(assignmentId, studentId);
response.setStudentResults(studentResults);
return ApiResponse.success(response);
}
/**
* 教师人工复核批改
* PUT /api/v1/assignment/review/{assignmentId}
*
* AI批改后教师可进行人工复核,修正AI评分或添加评语
*/
@PutMapping("/review/{assignmentId}")
public ApiResponse<Void> reviewAssignment(
@PathVariable String assignmentId,
@Valid @RequestBody ReviewRequest request,
@RequestHeader("Authorization") String auth) {
String teacherId = extractUserIdFromToken(auth);
// 遍历教师的复核修改
for (ReviewItem item : request.getReviewItems()) {
// resultService.updateReview(assignmentId, item.getStudentId(),
// item.getQuestionId(), item.getManualScore(),
// item.getTeacherComment(), teacherId);
}
return ApiResponse.success();
}
/**
* 学情报告接口
* GET /api/v1/report/student/{id}
*
* 获取指定学生的学情报告,包含知识点掌握度、
* 书写能力评估、成绩趋势等多维度分析数据
*/
@GetMapping("/report/student/{studentId}")
public ApiResponse<StudentReportResponse> getStudentReport(
@PathVariable String studentId,
@RequestParam(required = false) String subject,
@RequestParam(required = false) String dateRange) {
StudentReportResponse report = new StudentReportResponse();
report.setStudentId(studentId);
report.setReportDate(LocalDateTime.now());
// 知识点掌握度
List<KnowledgePoint> knowledgePoints = new ArrayList<>();
// knowledgePoints = analyticsService.getKnowledgeMastery(studentId, subject);
report.setKnowledgePoints(knowledgePoints);
// 书写能力评估
WritingAbility writingAbility = new WritingAbility();
writingAbility.setStrokeOrderScore(88.5);
writingAbility.setStructureScore(82.3);
writingAbility.setNeatnessScore(90.1);
writingAbility.setOverallScore(86.9);
report.setWritingAbility(writingAbility);
return ApiResponse.success(report);
}
// ==================== 内部方法 ====================
private String extractUserIdFromToken(String auth) {
// 从JWT Token解析用户ID
return "teacher_001";
}
private double calculateTotalScore(List<QuestionItem> questions) {
return questions.stream()
.mapToDouble(QuestionItem::getScore)
.sum();
}
private int getClassStudentCount(String classId) {
return 40; // 查询班级学生数
}
// ==================== DTO 定义 ====================
public static class AssignmentPublishRequest {
@NotBlank private String classId;
@NotBlank private String title;
private String type; // homework/exam/practice
private String subject;
private LocalDateTime deadline;
private List<QuestionItem> questions;
private List<String> dotCodePages; // 关联的点阵码页面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 List<QuestionItem> getQuestions() { return questions; }
public void setQuestions(List<QuestionItem> q) { this.questions = q; }
public List<String> getDotCodePages() { return dotCodePages; }
public void setDotCodePages(List<String> p) { this.dotCodePages = p; }
}
public static class QuestionItem {
private int questionNo;
private String type; // choice/fill/short_answer/essay/math
private String content;
private String answer;
private double score;
private String knowledgePointId;
public int getQuestionNo() { return questionNo; }
public void setQuestionNo(int n) { this.questionNo = n; }
public String getType() { return type; }
public void setType(String t) { this.type = t; }
public String getContent() { return content; }
public void setContent(String c) { this.content = c; }
public String getAnswer() { return answer; }
public void setAnswer(String a) { this.answer = a; }
public double getScore() { return score; }
public void setScore(double s) { this.score = s; }
public String getKnowledgePointId() { return knowledgePointId; }
public void setKnowledgePointId(String id) { this.knowledgePointId = id; }
}
public static class AssignmentPublishResponse {
private String assignmentId;
private String title;
private LocalDateTime publishTime;
private int studentCount;
public String getAssignmentId() { return assignmentId; }
public void setAssignmentId(String id) { this.assignmentId = id; }
public String getTitle() { return title; }
public void setTitle(String t) { this.title = t; }
public LocalDateTime getPublishTime() { return publishTime; }
public void setPublishTime(LocalDateTime t) { this.publishTime = t; }
public int getStudentCount() { return studentCount; }
public void setStudentCount(int c) { this.studentCount = c; }
}
public static class AssignmentSummary {
private String id;
private String title;
private String type;
private String status;
private int submittedCount;
private int totalCount;
private LocalDateTime publishTime;
public String getId() { return id; }
public void setId(String id) { this.id = 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 getStatus() { return status; }
public void setStatus(String s) { this.status = s; }
public int getSubmittedCount() { return submittedCount; }
public void setSubmittedCount(int c) { this.submittedCount = c; }
public int getTotalCount() { return totalCount; }
public void setTotalCount(int c) { this.totalCount = c; }
public LocalDateTime getPublishTime() { return publishTime; }
public void setPublishTime(LocalDateTime t) { this.publishTime = t; }
}
public static class AssignmentDetailResponse {
private Assignment assignment;
private List<QuestionItem> questions;
public Assignment getAssignment() { return assignment; }
public void setAssignment(Assignment a) { this.assignment = a; }
public List<QuestionItem> getQuestions() { return questions; }
public void setQuestions(List<QuestionItem> q) { this.questions = q; }
}
public static class AssignmentResultResponse {
private String assignmentId;
private int totalStudents;
private int submittedCount;
private int gradedCount;
private double averageScore;
private double highestScore;
private double lowestScore;
private List<StudentResult> studentResults;
public String getAssignmentId() { return assignmentId; }
public void setAssignmentId(String id) { this.assignmentId = id; }
public int getTotalStudents() { return totalStudents; }
public void setTotalStudents(int c) { this.totalStudents = c; }
public int getSubmittedCount() { return submittedCount; }
public void setSubmittedCount(int c) { this.submittedCount = c; }
public int getGradedCount() { return gradedCount; }
public void setGradedCount(int c) { this.gradedCount = c; }
public double getAverageScore() { return averageScore; }
public void setAverageScore(double s) { this.averageScore = s; }
public double getHighestScore() { return highestScore; }
public void setHighestScore(double s) { this.highestScore = s; }
public double getLowestScore() { return lowestScore; }
public void setLowestScore(double s) { this.lowestScore = s; }
public List<StudentResult> getStudentResults() { return studentResults; }
public void setStudentResults(List<StudentResult> r) { this.studentResults = r; }
}
public static class StudentResult {
private String studentId;
private String studentName;
private double totalScore;
private List<QuestionResult> questionResults;
public String getStudentId() { return studentId; }
public void setStudentId(String id) { this.studentId = id; }
public String getStudentName() { return studentName; }
public void setStudentName(String n) { this.studentName = n; }
public double getTotalScore() { return totalScore; }
public void setTotalScore(double s) { this.totalScore = s; }
public List<QuestionResult> getQuestionResults() { return questionResults; }
public void setQuestionResults(List<QuestionResult> r) { this.questionResults = r; }
}
public static class QuestionResult {
private int questionNo;
private String ocrText;
private double score;
private boolean isCorrect;
private String aiFeedback;
public int getQuestionNo() { return questionNo; }
public void setQuestionNo(int n) { this.questionNo = n; }
public String getOcrText() { return ocrText; }
public void setOcrText(String t) { this.ocrText = t; }
public double getScore() { return score; }
public void setScore(double s) { this.score = s; }
public boolean isCorrect() { return isCorrect; }
public void setCorrect(boolean c) { this.isCorrect = c; }
public String getAiFeedback() { return aiFeedback; }
public void setAiFeedback(String f) { this.aiFeedback = f; }
}
public static class ReviewRequest {
private List<ReviewItem> reviewItems;
public List<ReviewItem> getReviewItems() { return reviewItems; }
public void setReviewItems(List<ReviewItem> items) { this.reviewItems = items; }
}
public static class ReviewItem {
private String studentId;
private int questionId;
private Double manualScore;
private String teacherComment;
public String getStudentId() { return studentId; }
public void setStudentId(String id) { this.studentId = id; }
public int getQuestionId() { return questionId; }
public void setQuestionId(int id) { this.questionId = id; }
public Double getManualScore() { return manualScore; }
public void setManualScore(Double s) { this.manualScore = s; }
public String getTeacherComment() { return teacherComment; }
public void setTeacherComment(String c) { this.teacherComment = c; }
}
public static class StudentReportResponse {
private String studentId;
private LocalDateTime reportDate;
private List<KnowledgePoint> knowledgePoints;
private WritingAbility writingAbility;
public String getStudentId() { return studentId; }
public void setStudentId(String id) { this.studentId = id; }
public LocalDateTime getReportDate() { return reportDate; }
public void setReportDate(LocalDateTime d) { this.reportDate = d; }
public List<KnowledgePoint> getKnowledgePoints() { return knowledgePoints; }
public void setKnowledgePoints(List<KnowledgePoint> kp) { this.knowledgePoints = kp; }
public WritingAbility getWritingAbility() { return writingAbility; }
public void setWritingAbility(WritingAbility wa) { this.writingAbility = wa; }
}
public static class KnowledgePoint {
private String id;
private String name;
private double masteryRate;
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getName() { return name; }
public void setName(String n) { this.name = n; }
public double getMasteryRate() { return masteryRate; }
public void setMasteryRate(double r) { this.masteryRate = r; }
}
public static class WritingAbility {
private double strokeOrderScore;
private double structureScore;
private double neatnessScore;
private double overallScore;
public double getStrokeOrderScore() { return strokeOrderScore; }
public void setStrokeOrderScore(double s) { this.strokeOrderScore = s; }
public double getStructureScore() { return structureScore; }
public void setStructureScore(double s) { this.structureScore = s; }
public double getNeatnessScore() { return neatnessScore; }
public void setNeatnessScore(double s) { this.neatnessScore = s; }
public double getOverallScore() { return overallScore; }
public void setOverallScore(double s) { this.overallScore = s; }
}
}