package com.ruoyi.study.service.impl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.common.core.constant.Constants;
|
import com.ruoyi.common.core.exception.GlobalException;
|
import com.ruoyi.common.core.utils.bean.BeanUtils;
|
import com.ruoyi.common.security.service.TokenService;
|
import com.ruoyi.study.domain.*;
|
import com.ruoyi.study.dto.StudyWeekDTO;
|
import com.ruoyi.study.mapper.TStudyMapper;
|
import com.ruoyi.study.service.ITGameRecordService;
|
import com.ruoyi.study.service.ITStudyService;
|
import com.ruoyi.study.service.ITSubjectService;
|
import com.ruoyi.study.service.ITUserStudyService;
|
import com.ruoyi.study.vo.*;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* <p>
|
* 学习类型 听 周目配置 服务实现类
|
* </p>
|
*
|
* @author 无关风月
|
* @since 2024-04-26
|
*/
|
@Service
|
public class TStudyServiceImpl extends ServiceImpl<TStudyMapper, TStudy> implements ITStudyService {
|
|
@Resource
|
private ITUserStudyService userStudyService;
|
@Resource
|
private ITSubjectService subjectService;
|
@Resource
|
private ITGameRecordService gameRecordService;
|
@Resource
|
private TokenService tokenService;
|
|
private final static Map<String, Integer> GAME_DIFFICULTY_MAP = new HashMap<>();
|
|
static {
|
GAME_DIFFICULTY_MAP.put("1", 0);
|
GAME_DIFFICULTY_MAP.put("2", 1);
|
}
|
|
@Override
|
public List<StudyWeekDTO> weekList(Integer type, Integer quarter) {
|
return baseMapper.weekList(type, quarter);
|
}
|
|
@Override
|
public TUserStudy studySchedule(String userId, Integer week) {
|
return userStudyService.studySchedule(userId, week);
|
}
|
|
@Override
|
public void checkDifficulty(Integer difficulty, Integer week, TGame game) {
|
// 判断用户是否完成上一个等级
|
if (!Constants.ZERO.equals(difficulty)) {
|
Integer level = GAME_DIFFICULTY_MAP.get(String.valueOf(difficulty));
|
if (null == level) {
|
throw new GlobalException("游戏等级异常,请重试!");
|
}
|
// 获取用户游戏进度
|
Integer userId = tokenService.getLoginUserStudy().getUserid();
|
List<TGameRecord> list = gameRecordService.lambdaQuery().eq(TGameRecord::getUserId, userId).eq(TGameRecord::getGameId, game.getId()).list();
|
boolean contains = list.stream().map(TGameRecord::getGameDifficulty).collect(Collectors.toList()).contains(level);
|
if (!contains) {
|
throw new GlobalException("请先完成上一难度再挑战当前难度!");
|
}
|
}
|
}
|
|
@Override
|
public StudyListenResultVO listenSelectPicture(Integer week, Integer day, List<TStudyListen> studyListens) {
|
if (studyListens.isEmpty()) {
|
throw new GlobalException("当前学习周目题目数量不足!");
|
}
|
// 随机获取一组题
|
Random rand = new Random();
|
TStudyListen data;
|
if (studyListens.size() == 1) {
|
data = studyListens.get(0);
|
} else {
|
data = studyListens.get(rand.nextInt(studyListens.size()));
|
}
|
List<TSubject> subjectList = getSubjects(data.getSubject().split(","));
|
return new StudyListenResultVO(data, subjectList);
|
}
|
|
@Override
|
public StudyLookResultVO pictureSelectVoice(Integer week, Integer day, List<TStudyLook> lookList) {
|
if (lookList.isEmpty()) {
|
throw new GlobalException("当前学习周目题目数量不足!");
|
}
|
// 随机获取一组题
|
Random rand = new Random();
|
TStudyLook data;
|
if (lookList.size() == 1) {
|
data = lookList.get(0);
|
} else {
|
data = lookList.get(rand.nextInt(lookList.size()));
|
}
|
List<TSubject> subjectList = getSubjects(data.getSubject().split(","));
|
return new StudyLookResultVO(data, subjectList);
|
}
|
|
@Override
|
public StudyInductionResultVO induceExclude(Integer week, Integer day, List<TStudyInduction> inductionList) {
|
if (inductionList.isEmpty()) {
|
throw new GlobalException("当前学习周目题目数量不足!");
|
}
|
// 随机获取一组题
|
Random rand = new Random();
|
TStudyInduction data;
|
if (inductionList.size() == 1) {
|
data = inductionList.get(0);
|
} else {
|
data = inductionList.get(rand.nextInt(inductionList.size()));
|
}
|
String[] ids = data.getSubject().split(",");
|
List<TSubject> subjectList = new ArrayList<>();
|
for (String id : ids) {
|
if (id.startsWith("-")) {
|
id = id.replace("-", "");
|
}
|
subjectList.add(subjectService.getById(id));
|
}
|
return new StudyInductionResultVO(data, subjectList);
|
}
|
|
@Override
|
public StudyAnswerResultVO questionsAndAnswers(Integer week, Integer day, List<TStudyAnswer> answerList) {
|
if (answerList.isEmpty()) {
|
throw new GlobalException("当前学习周目题目数量不足!");
|
}
|
// 随机获取一组题
|
Random rand = new Random();
|
TStudyAnswer data;
|
TStudyAnswer dataTwo;
|
if (answerList.size() == 1) {
|
data = answerList.get(0);
|
dataTwo = answerList.get(0);
|
} else {
|
data = answerList.get(rand.nextInt(answerList.size()));
|
dataTwo = answerList.get(rand.nextInt(answerList.size()));
|
}
|
AnswerVO one = new AnswerVO();
|
BeanUtils.copyProperties(data, one);
|
answerList.remove(data);
|
AnswerVO two = new AnswerVO();
|
BeanUtils.copyProperties(dataTwo, two);
|
// 获取问题题目 和 回答题目
|
List<String> ids = new ArrayList<>();
|
ids.add(String.valueOf(one.getSubject()));
|
ids.add(String.valueOf(one.getAnswerSubject()));
|
// 有问有答
|
List<TStudyAnswer> answers = new ArrayList<>();
|
answers.add(one);
|
one.setSubjectList(getSubjects(ids.toArray(new String[0])));
|
// 第二题信息
|
List<String> twoIds = new ArrayList<>();
|
answers.add(two);
|
twoIds.add(String.valueOf(two.getSubject()));
|
twoIds.add(String.valueOf(two.getAnswerSubject()));
|
two.setSubjectList(getSubjects(twoIds.toArray(new String[0])));
|
return new StudyAnswerResultVO(answers);
|
}
|
|
@Override
|
public StudyPairResultVO pictureMateVoice(Integer week, Integer day, List<TStudyPair> pair) {
|
if (pair.isEmpty()) {
|
throw new GlobalException("当前学习周目题目数量不足!");
|
}
|
// 随机获取一组题
|
Random rand = new Random();
|
TStudyPair data;
|
if (pair.size() == 1) {
|
data = pair.get(0);
|
} else {
|
data = pair.get(rand.nextInt(pair.size()));
|
}
|
List<TSubject> subjectList = getSubjects(data.getSubject().split(","));
|
return new StudyPairResultVO(data, subjectList);
|
}
|
|
/**
|
* 根据参数id查询图片及语音
|
*
|
* @param ids 多个id
|
* @return 图片及语音集合
|
*/
|
private List<TSubject> getSubjects(String[] ids) {
|
List<TSubject> list = new ArrayList<>();
|
for (String id : ids) {
|
TSubject data = subjectService.lambdaQuery().eq(TSubject::getId, id)
|
.eq(TSubject::getDisabled, 0).one();
|
list.add(data);
|
}
|
return list;
|
}
|
|
}
|