You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
261 lines
10 KiB
261 lines
10 KiB
package com.example;
|
|
|
|
import com.example.entity.Course;
|
|
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.HashMap;
|
|
import java.util.ArrayList;
|
|
import java.util.stream.Collectors;
|
|
|
|
/**
|
|
* 课程分析类
|
|
* 不依赖Spring Boot,使用普通Java类实现
|
|
*/
|
|
public class CourseAnalysis {
|
|
|
|
// 无参构造方法
|
|
public CourseAnalysis() {
|
|
}
|
|
|
|
// 获取课程类型分布
|
|
public Map<String, Integer> getCourseTypeDistribution() {
|
|
return DatabaseUtil.getCourseTypeDistribution();
|
|
}
|
|
|
|
// 获取院系课程分布
|
|
public Map<String, Integer> getDepartmentDistribution() {
|
|
return DatabaseUtil.getDepartmentDistribution();
|
|
}
|
|
|
|
// 获取学分分布
|
|
public Map<Double, Integer> getCreditDistribution() {
|
|
Map<Double, Integer> distribution = new HashMap<>();
|
|
List<Course> courses = DatabaseUtil.getAllCourses();
|
|
|
|
for (Course course : courses) {
|
|
double credit = course.getCredit();
|
|
distribution.put(credit, distribution.getOrDefault(credit, 0) + 1);
|
|
}
|
|
|
|
return distribution;
|
|
}
|
|
|
|
// 获取热门课程
|
|
public List<Map<String, Object>> getTopCourses() {
|
|
return DatabaseUtil.getTopCourses();
|
|
}
|
|
|
|
// 获取课程容量使用率
|
|
public List<Map<String, Object>> getCourseUsageRate() {
|
|
List<Map<String, Object>> usageRates = new ArrayList<>();
|
|
List<Course> courses = DatabaseUtil.getAllCourses();
|
|
|
|
for (Course course : courses) {
|
|
Map<String, Object> usageRate = new HashMap<>();
|
|
usageRate.put("courseName", course.getCourseName());
|
|
usageRate.put("capacity", course.getCapacity());
|
|
usageRate.put("enrolled", course.getEnrolled());
|
|
double rate = course.getCapacity() > 0 ? (double) course.getEnrolled() / course.getCapacity() * 100 : 0;
|
|
usageRate.put("usageRate", rate);
|
|
usageRates.add(usageRate);
|
|
}
|
|
|
|
// 按使用率排序
|
|
usageRates.sort((a, b) -> Double.compare((Double) b.get("usageRate"), (Double) a.get("usageRate")));
|
|
|
|
return usageRates;
|
|
}
|
|
|
|
// 获取整体统计信息
|
|
public Map<String, Object> getOverallStatistics() {
|
|
Map<String, Object> statistics = new HashMap<>();
|
|
try {
|
|
List<Course> allCourses = DatabaseUtil.getAllCourses();
|
|
|
|
// 总课程数
|
|
statistics.put("totalCourses", allCourses.size());
|
|
|
|
// 总学分
|
|
double totalCredits = allCourses.stream()
|
|
.mapToDouble(Course::getCredit)
|
|
.sum();
|
|
statistics.put("totalCredits", totalCredits);
|
|
|
|
// 平均学分
|
|
double avgCredit = allCourses.isEmpty() ? 0 : totalCredits / allCourses.size();
|
|
statistics.put("averageCredit", avgCredit);
|
|
|
|
// 总容量
|
|
int totalCapacity = allCourses.stream()
|
|
.mapToInt(Course::getCapacity)
|
|
.sum();
|
|
statistics.put("totalCapacity", totalCapacity);
|
|
|
|
// 总已选人数
|
|
int totalEnrolled = allCourses.stream()
|
|
.mapToInt(Course::getEnrolled)
|
|
.sum();
|
|
statistics.put("totalEnrolled", totalEnrolled);
|
|
|
|
// 总体使用率
|
|
double overallUsageRate = totalCapacity > 0 ? (double) totalEnrolled / totalCapacity * 100 : 0;
|
|
statistics.put("overallUsageRate", overallUsageRate);
|
|
|
|
// 课程类型数量
|
|
long requiredCourses = allCourses.stream()
|
|
.filter(course -> "必修课".equals(course.getCourseType()))
|
|
.count();
|
|
statistics.put("requiredCourses", requiredCourses);
|
|
|
|
long electiveCourses = allCourses.stream()
|
|
.filter(course -> "选修课".equals(course.getCourseType()))
|
|
.count();
|
|
statistics.put("electiveCourses", electiveCourses);
|
|
|
|
// 院系数量
|
|
long departmentCount = allCourses.stream()
|
|
.map(Course::getDepartment)
|
|
.distinct()
|
|
.count();
|
|
statistics.put("departmentCount", departmentCount);
|
|
} catch (Exception e) {
|
|
System.err.println("获取整体统计信息失败:" + e.getMessage());
|
|
// 返回默认值
|
|
statistics.put("totalCourses", 0);
|
|
statistics.put("totalCredits", 0.0);
|
|
statistics.put("averageCredit", 0.0);
|
|
statistics.put("totalCapacity", 0);
|
|
statistics.put("totalEnrolled", 0);
|
|
statistics.put("overallUsageRate", 0.0);
|
|
statistics.put("requiredCourses", 0);
|
|
statistics.put("electiveCourses", 0);
|
|
statistics.put("departmentCount", 0);
|
|
}
|
|
return statistics;
|
|
}
|
|
|
|
// 获取按院系分组的课程统计
|
|
public Map<String, Map<String, Object>> getDepartmentStatistics() {
|
|
Map<String, Map<String, Object>> deptStats = new HashMap<>();
|
|
try {
|
|
List<Course> allCourses = DatabaseUtil.getAllCourses();
|
|
|
|
// 按院系分组
|
|
Map<String, List<Course>> coursesByDept = allCourses.stream()
|
|
.collect(Collectors.groupingBy(Course::getDepartment));
|
|
|
|
for (Map.Entry<String, List<Course>> entry : coursesByDept.entrySet()) {
|
|
String department = entry.getKey();
|
|
List<Course> deptCourses = entry.getValue();
|
|
|
|
Map<String, Object> stats = new HashMap<>();
|
|
stats.put("courseCount", deptCourses.size());
|
|
|
|
double deptCredits = deptCourses.stream()
|
|
.mapToDouble(Course::getCredit)
|
|
.sum();
|
|
stats.put("totalCredits", deptCredits);
|
|
|
|
int deptCapacity = deptCourses.stream()
|
|
.mapToInt(Course::getCapacity)
|
|
.sum();
|
|
stats.put("totalCapacity", deptCapacity);
|
|
|
|
int deptEnrolled = deptCourses.stream()
|
|
.mapToInt(Course::getEnrolled)
|
|
.sum();
|
|
stats.put("totalEnrolled", deptEnrolled);
|
|
|
|
double deptUsageRate = deptCapacity > 0 ? (double) deptEnrolled / deptCapacity * 100 : 0;
|
|
stats.put("usageRate", deptUsageRate);
|
|
|
|
deptStats.put(department, stats);
|
|
}
|
|
} catch (Exception e) {
|
|
System.err.println("获取院系统计信息失败:" + e.getMessage());
|
|
}
|
|
return deptStats;
|
|
}
|
|
|
|
// 获取教师课程统计
|
|
public Map<String, Map<String, Object>> getTeacherStatistics() {
|
|
Map<String, Map<String, Object>> teacherStats = new HashMap<>();
|
|
try {
|
|
List<Course> allCourses = DatabaseUtil.getAllCourses();
|
|
|
|
// 按教师分组
|
|
Map<String, List<Course>> coursesByTeacher = allCourses.stream()
|
|
.collect(Collectors.groupingBy(Course::getTeacher));
|
|
|
|
for (Map.Entry<String, List<Course>> entry : coursesByTeacher.entrySet()) {
|
|
String teacher = entry.getKey();
|
|
List<Course> teacherCourses = entry.getValue();
|
|
|
|
Map<String, Object> stats = new HashMap<>();
|
|
stats.put("courseCount", teacherCourses.size());
|
|
|
|
double totalCredits = teacherCourses.stream()
|
|
.mapToDouble(Course::getCredit)
|
|
.sum();
|
|
stats.put("totalCredits", totalCredits);
|
|
|
|
int totalEnrolled = teacherCourses.stream()
|
|
.mapToInt(Course::getEnrolled)
|
|
.sum();
|
|
stats.put("totalEnrolled", totalEnrolled);
|
|
|
|
teacherStats.put(teacher, stats);
|
|
}
|
|
} catch (Exception e) {
|
|
System.err.println("获取教师统计信息失败:" + e.getMessage());
|
|
}
|
|
return teacherStats;
|
|
}
|
|
|
|
// 获取课程容量利用率分析
|
|
public Map<String, Object> getCapacityAnalysis() {
|
|
Map<String, Object> analysis = new HashMap<>();
|
|
try {
|
|
List<Course> allCourses = DatabaseUtil.getAllCourses();
|
|
|
|
int totalCapacity = allCourses.stream()
|
|
.mapToInt(Course::getCapacity)
|
|
.sum();
|
|
|
|
int totalEnrolled = allCourses.stream()
|
|
.mapToInt(Course::getEnrolled)
|
|
.sum();
|
|
|
|
int availableCapacity = totalCapacity - totalEnrolled;
|
|
|
|
// 计算不同使用率区间的课程数量
|
|
long highUsage = allCourses.stream()
|
|
.filter(course -> course.getCapacity() > 0 &&
|
|
(double) course.getEnrolled() / course.getCapacity() >= 0.9)
|
|
.count();
|
|
|
|
long mediumUsage = allCourses.stream()
|
|
.filter(course -> course.getCapacity() > 0 &&
|
|
(double) course.getEnrolled() / course.getCapacity() >= 0.5 &&
|
|
(double) course.getEnrolled() / course.getCapacity() < 0.9)
|
|
.count();
|
|
|
|
long lowUsage = allCourses.stream()
|
|
.filter(course -> course.getCapacity() > 0 &&
|
|
(double) course.getEnrolled() / course.getCapacity() < 0.5)
|
|
.count();
|
|
|
|
analysis.put("totalCapacity", totalCapacity);
|
|
analysis.put("totalEnrolled", totalEnrolled);
|
|
analysis.put("availableCapacity", availableCapacity);
|
|
analysis.put("highUsageCourses", highUsage);
|
|
analysis.put("mediumUsageCourses", mediumUsage);
|
|
analysis.put("lowUsageCourses", lowUsage);
|
|
|
|
} catch (Exception e) {
|
|
System.err.println("获取容量分析失败:" + e.getMessage());
|
|
}
|
|
return analysis;
|
|
}
|
|
}
|