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.
SmartGymManagementSystem/CourseService.java

159 lines
6.0 KiB

package com.gym.service;
import com.gym.model.Course;
import com.gym.model.User;
import com.gym.repository.CourseRepository;
import com.gym.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
@Service
public class CourseService {
@Autowired
private CourseRepository courseRepository;
@Autowired
private UserRepository userRepository;
// 创建课程
public Course createCourse(Course course, Long coachId) {
// 验证教练是否存在
User coach = userRepository.findById(coachId)
.orElseThrow(() -> new RuntimeException("教练不存在"));
// 验证教练角色
if (!"COACH".equals(coach.getRole())) {
throw new RuntimeException("该用户不是教练");
}
course.setCoach(coach);
course.setCurrentParticipants(0);
course.setIsAvailable(true);
course.setStatus("UPCOMING");
course.setCreateTime(LocalDateTime.now());
return courseRepository.save(course);
}
// 获取所有课程
public List<Course> getAllCourses() {
return courseRepository.findAll();
}
// 获取可用课程
public List<Course> getAvailableCourses() {
return courseRepository.findAvailableCourses();
}
// 根据ID获取课程
public Optional<Course> getCourseById(Long id) {
return courseRepository.findById(id);
}
// 更新课程信息
public Course updateCourse(Long id, Course updatedCourse) {
return courseRepository.findById(id)
.map(course -> {
if (updatedCourse.getName() != null) {
course.setName(updatedCourse.getName());
}
if (updatedCourse.getType() != null) {
course.setType(updatedCourse.getType());
}
if (updatedCourse.getStartTime() != null) {
course.setStartTime(updatedCourse.getStartTime());
}
if (updatedCourse.getEndTime() != null) {
course.setEndTime(updatedCourse.getEndTime());
}
if (updatedCourse.getDurationMinutes() != null) {
course.setDurationMinutes(updatedCourse.getDurationMinutes());
}
if (updatedCourse.getLocation() != null) {
course.setLocation(updatedCourse.getLocation());
}
if (updatedCourse.getMaxParticipants() != null) {
course.setMaxParticipants(updatedCourse.getMaxParticipants());
}
if (updatedCourse.getPrice() != null) {
course.setPrice(updatedCourse.getPrice());
}
if (updatedCourse.getDescription() != null) {
course.setDescription(updatedCourse.getDescription());
}
if (updatedCourse.getIsAvailable() != null) {
course.setIsAvailable(updatedCourse.getIsAvailable());
}
return courseRepository.save(course);
})
.orElseThrow(() -> new RuntimeException("课程不存在"));
}
// 删除课程
public void deleteCourse(Long id) {
courseRepository.deleteById(id);
}
// 预约课程(增加参与人数)
public Course enrollCourse(Long courseId) {
return courseRepository.findById(courseId)
.map(course -> {
if (!course.getIsAvailable()) {
throw new RuntimeException("该课程不可预约");
}
if (course.getCurrentParticipants() >= course.getMaxParticipants()) {
throw new RuntimeException("课程已满");
}
if ("COMPLETED".equals(course.getStatus()) || "CANCELLED".equals(course.getStatus())) {
throw new RuntimeException("该课程已结束或取消");
}
course.setCurrentParticipants(course.getCurrentParticipants() + 1);
return courseRepository.save(course);
})
.orElseThrow(() -> new RuntimeException("课程不存在"));
}
// 取消预约(减少参与人数)
public Course cancelEnrollment(Long courseId) {
return courseRepository.findById(courseId)
.map(course -> {
if (course.getCurrentParticipants() <= 0) {
throw new RuntimeException("没有可取消的预约");
}
course.setCurrentParticipants(course.getCurrentParticipants() - 1);
return courseRepository.save(course);
})
.orElseThrow(() -> new RuntimeException("课程不存在"));
}
// 设置课程状态
public Course setCourseStatus(Long id, String status) {
return courseRepository.findById(id)
.map(course -> {
course.setStatus(status);
return courseRepository.save(course);
})
.orElseThrow(() -> new RuntimeException("课程不存在"));
}
// 搜索课程
public List<Course> searchCourses(String keyword) {
return courseRepository.findByNameContaining(keyword);
}
// 获取教练的课程
public List<Course> getCoachCourses(Long coachId) {
return courseRepository.findByCoachId(coachId);
}
// 获取按类型分类的课程
public List<Course> getCoursesByType(String type) {
return courseRepository.findByType(type);
}
}