117 lines
6.0 KiB
Java
117 lines
6.0 KiB
Java
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<StudySessionsMapper, StudySessionsEntity>
|
|
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<StudySessionsEntity> oneOpt = this.getOneOpt(Wrappers.<StudySessionsEntity>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<String> 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 + "]不存在");
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|