package com.guo.learningprogresstracker.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.guo.learningprogresstracker.dto.response.StudySessionResponce; import com.guo.learningprogresstracker.entity.StudyReportFragmentsEntity; import com.guo.learningprogresstracker.entity.StudyReportsEntity; import com.guo.learningprogresstracker.entity.StudySessionsEntity; import com.guo.learningprogresstracker.entity.TaskEntity; import com.guo.learningprogresstracker.enums.StudySessionStateEnum; import com.guo.learningprogresstracker.exception.ErrorParameterException; import com.guo.learningprogresstracker.exception.NotFindEntitiesException; import com.guo.learningprogresstracker.mapStruct.StudySessionConvert; import com.guo.learningprogresstracker.mapper.StudyReportFragmentsMapper; import com.guo.learningprogresstracker.mapper.StudyReportsMapper; import com.guo.learningprogresstracker.mapper.StudySessionsMapper; import com.guo.learningprogresstracker.service.StudySessionsService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Optional; import java.util.stream.Collectors; /** * @author guo * @description 针对表【study_sessions(记录每次学习会话的具体数据)】的数据库操作Service实现 * @createDate 2024-06-09 15:28:48 */ @Service @RequiredArgsConstructor public class StudySessionsServiceImpl extends ServiceImpl implements StudySessionsService { private final TasksServiceImpl tasksServiceImpl; private final StudyReportFragmentsServiceImpl studyReportFragmentsServiceImpl; private final StudyReportFragmentsMapper studyReportFragmentsMapper; private final StudyReportsMapper studyReportsMapper; public StudySessionResponce startOrContinueStudySession(String taskNum) throws NotFindEntitiesException { // taskNum是否存在 tasksServiceImpl.getOneOpt(Wrappers.lambdaQuery(TaskEntity.class).eq(TaskEntity::getTaskNum, taskNum)) .orElseThrow(() -> new NotFindEntitiesException(String.format("[%s]不存在",taskNum))); // 任务taskNum下是否存在非"已结束"的学习会话 Optional oneOpt = this.getOneOpt(Wrappers.lambdaQuery() .eq(StudySessionsEntity::getTaskNum, taskNum) .ne(StudySessionsEntity::getSessionState, StudySessionStateEnum.ENDED.name())); // 有则返回该未完成会话,否则创建新的会话 if (oneOpt.isEmpty()) { // 返回一个新的会话 StudySessionsEntity studySessionsEntity = StudySessionsEntity.initNewSession(); studySessionsEntity.setTaskNum(taskNum); studySessionsEntity.setLastStartTime(LocalDateTime.now()); this.save(studySessionsEntity); return StudySessionConvert.MAPPER.toStudySessionResponce(studySessionsEntity); }else { // 返回已经存在的会话 StudySessionsEntity studySessionsEntity = oneOpt.get(); studySessionsEntity.continueStudySession(); this.updateById(studySessionsEntity); return StudySessionConvert.MAPPER.toStudySessionResponce(studySessionsEntity); } } @Override public void pauseStudySession(String sessionNum) throws ErrorParameterException { StudySessionsEntity studySessionsEntity = this.getOneOpt(Wrappers.lambdaQuery(StudySessionsEntity.class) .eq(StudySessionsEntity::getSessionNum, sessionNum)) .orElseThrow(() -> new ErrorParameterException("会话[" + sessionNum + "]不存在")); studySessionsEntity.pausedStudySession(); this.updateById(studySessionsEntity); } @Override public void endedStudySession(String sessionNum, String content) throws ErrorParameterException { StudySessionsEntity studySessionsEntity = this.getOneOpt(Wrappers.lambdaQuery(StudySessionsEntity.class) .eq(StudySessionsEntity::getSessionNum, sessionNum)) .orElseThrow(() -> new ErrorParameterException("会话[" + sessionNum + "]不存在")); studySessionsEntity.endedStudySession(); this.updateById(studySessionsEntity); // 创建学习报告 StudyReportsEntity studyReportsEntity = new StudyReportsEntity(); studyReportsEntity.setSessionNum(sessionNum); studyReportsEntity.setContent(content); studyReportsMapper.insert(studyReportsEntity); } @Override public StudySessionResponce getNotEndedStudySessionByTaskNum(String taskNum) throws ErrorParameterException { StudySessionsEntity studySessionsEntity = this.getOneOpt(Wrappers.lambdaQuery(StudySessionsEntity.class) .eq(StudySessionsEntity::getTaskNum, taskNum) .ne(StudySessionsEntity::getSessionState, StudySessionStateEnum.ENDED.name())) .orElseThrow(() -> new ErrorParameterException("任务[" + taskNum + "]不存在进行中或暂停中的会话")); return StudySessionConvert.MAPPER.toStudySessionResponce(studySessionsEntity); } @Override public ArrayList getAllFragments(String sessionNum) throws ErrorParameterException { if (this.exists(Wrappers.lambdaQuery(StudySessionsEntity.class) .eq(StudySessionsEntity::getSessionNum, sessionNum))) { // todo guo 后续可在此补充更高级的整理方式 return studyReportFragmentsMapper.selectList(Wrappers.lambdaQuery(StudyReportFragmentsEntity.class) .eq(StudyReportFragmentsEntity::getSessionNum, sessionNum)) .stream().map(StudyReportFragmentsEntity::getContent).collect(Collectors.toCollection(ArrayList::new)); }else { throw new ErrorParameterException("会话[" + sessionNum + "]不存在"); } } }