package com.ruoyi.study.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.study.domain.TGame;
import com.ruoyi.study.domain.TGameRecord;
import com.ruoyi.study.domain.TStudy;
import com.ruoyi.study.domain.TUserStudy;
import com.ruoyi.study.dto.CompleteGameDTO;
import com.ruoyi.study.dto.CompleteStudyDTO;
import com.ruoyi.study.mapper.TUserStudyMapper;
import com.ruoyi.study.service.ITGameRecordService;
import com.ruoyi.study.service.ITUserStudyService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* 自主游戏 服务实现类
*
*
* @author 无关风月
* @since 2024-04-26
*/
@Service
public class TUserStudyServiceImpl extends ServiceImpl implements ITUserStudyService {
@Resource
private ITGameRecordService gameRecordService;
/**
* 所属day map
*/
private static final Map DAY_MAP = new HashMap<>(12);
/**
* 所属day map
*/
private static final Map GAME_DIFFICULTY_MAP = new HashMap<>(12);
static {
// 所属day
DAY_MAP.put(Constants.ONE_STR, Constants.TWO);
DAY_MAP.put(Constants.TWO_STR, Constants.THREE);
DAY_MAP.put(Constants.THREE_STR, Constants.FOUR);
DAY_MAP.put(Constants.FOUR_STR, Constants.FIVE);
DAY_MAP.put(Constants.FIVE_STR, Constants.SIX);
DAY_MAP.put(Constants.SIX_STR, Constants.ONE);
// 游戏难度
GAME_DIFFICULTY_MAP.put(Constants.ZERO, Constants.ONE);
GAME_DIFFICULTY_MAP.put(Constants.ONE, Constants.TWO);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void resettingStudyRecord(String time) {
List list = lambdaQuery().eq(TUserStudy::getDisabled, 0).list();
switch (time) {
case Constants.DAY:
list.forEach(data -> data.setTodayStudy(0));
break;
case Constants.WEEK:
list.forEach(data -> data.setWeekStudy(0));
break;
case Constants.MONTH:
list.forEach(data -> data.setMonthStudy(0));
break;
default:
}
// 自旋重试
int number = 0;
boolean update = this.updateBatchById(list);
while (!update) {
if (number >= 3) {
break;
}
update = this.updateBatchById(list);
number++;
}
}
@Override
public Boolean exchangeStudyRecord(TUserStudy userStudyRecord, Integer userId, CompleteStudyDTO completeStudy) {
Integer studyTime = completeStudy.getStudyTime();
// 学习记录
Integer week = userStudyRecord.getWeek();
Integer day = userStudyRecord.getDay();
if (week.equals(completeStudy.getWeek()) && day.equals(completeStudy.getDay())) {
Integer type = completeStudy.getType();
if (Constants.ONE.equals(type)) {
userStudyRecord.setListen(Constants.ONE_HUNDRED);
} else if (Constants.TWO.equals(type)) {
userStudyRecord.setLook(Constants.ONE_HUNDRED);
} else if (Constants.THREE.equals(type)) {
userStudyRecord.setInduction(Constants.ONE_HUNDRED);
} else if (Constants.FOUR.equals(type)) {
userStudyRecord.setAnswer(Constants.ONE_HUNDRED);
} else if (Constants.FIVE.equals(type)) {
userStudyRecord.setPair(Constants.ONE_HUNDRED);
}
if (userStudyRecord.getListen().equals(Constants.ONE_HUNDRED)){
userStudyRecord.setDay(2);
}
if (userStudyRecord.getLook().equals(Constants.ONE_HUNDRED)){
userStudyRecord.setDay(3);
}
if (userStudyRecord.getInduction().equals(Constants.ONE_HUNDRED)){
userStudyRecord.setDay(4);
}
if (userStudyRecord.getAnswer().equals(Constants.ONE_HUNDRED)){
userStudyRecord.setDay(5);
}
if (userStudyRecord.getPair().equals(Constants.ONE_HUNDRED)){
userStudyRecord.setDay(6);
}
if (userStudyRecord.getDay().equals(Constants.SIX)) {
// 游戏难度初始化 0(入门难度)
userStudyRecord.setGameDifficulty(Constants.ZERO);
}
// if (userStudyRecord.getLook().equals(Constants.ONE_HUNDRED) &&
// userStudyRecord.getAnswer().equals(Constants.ONE_HUNDRED) &&
// userStudyRecord.getPair().equals(Constants.ONE_HUNDRED) &&
// userStudyRecord.getInduction().equals(Constants.ONE_HUNDRED) &&
// userStudyRecord.getListen().equals(Constants.ONE_HUNDRED)) {
// // 学习完成,进入下一学习day
// Integer nextDay = DAY_MAP.get(String.valueOf(userStudyRecord.getDay()));
// userStudyRecord.setDay(nextDay);
// // 下一day为 6,进入游戏日
// if (nextDay.equals(Constants.SIX)) {
// // 游戏难度初始化 0(入门难度)
// userStudyRecord.setGameDifficulty(Constants.ZERO);
// } else {
// // 重置学习进度
// userStudyRecord.setListen(Constants.BURDEN_ONE);
// userStudyRecord.setLook(Constants.BURDEN_ONE);
// userStudyRecord.setInduction(Constants.BURDEN_ONE);
// userStudyRecord.setAnswer(Constants.BURDEN_ONE);
// userStudyRecord.setPair(Constants.BURDEN_ONE);
// }
// }
}
// 更新学习时长
userStudyRecord.setTotalStudy(userStudyRecord.getTotalStudy() + studyTime);
userStudyRecord.setTodayStudy(userStudyRecord.getTodayStudy() + studyTime);
userStudyRecord.setWeekStudy(userStudyRecord.getWeekStudy() + studyTime);
userStudyRecord.setMonthStudy(userStudyRecord.getMonthStudy() + studyTime);
// 更新学习进度及学习时长
return this.updateById(userStudyRecord);
}
@Override
public void checkRate(TGame game, Integer userid, CompleteGameDTO completeStudy, List studyList) {
String answerRate = game.getAnswerRate();
String rate = game.getRate().split(",")[Constants.TWO];
// 校验是否完成超级听力
List gameRecordList = gameRecordService.lambdaQuery().eq(TGameRecord::getGameId, game.getId())
.eq(TGameRecord::getGameDifficulty, Constants.TWO)
.ge(TGameRecord::getAccuracy, rate).list();
// 下一周目逻辑
int quarterItem = 1;
Map> studyMap = new HashMap<>(8);
for (TStudy study : studyList) {
Integer quarter = study.getQuarter();
List itemList = studyMap.get(quarter);
if (null == itemList) {
itemList = new ArrayList<>();
}
itemList.add(study);
studyMap.put(quarter, itemList);
// 记录学习季度
if (study.getId().equals(game.getStudyId())) {
quarterItem = quarter;
}
}
// 获取当前季度所有周目
List studyList1 = studyMap.get(quarterItem);
// 正确率达到通关率
if (completeStudy.getAccuracy() >= Integer.parseInt(answerRate)
&& !gameRecordList.isEmpty()) {
// 获取用户超级记忆游戏记录
TUserStudy userStudy = this.lambdaQuery().eq(TUserStudy::getUserId, userid).one();
for (int i = 0; i < studyList1.size(); i++) {
TStudy tStudy = studyList1.get(i);
if (tStudy.getWeek().equals(userStudy.getWeek())) {
if (studyList1.size() == 1 || i + 1 == studyList1.size()) {
// 是否为当前季度最后一周目
List studyList2 = studyMap.get(quarterItem + 1);
// 下一季度数据为空
if (null != studyList2 && !studyList2.isEmpty()) {
TStudy tStudy1 = studyList2.get(Constants.ZERO);
userStudy.setWeek(tStudy1.getWeek());
}
} else {
TStudy tStudy1 = studyList1.get(i + 1);
userStudy.setWeek(tStudy1.getWeek());
}
break;
}
}
userStudy.setDay(DAY_MAP.get(String.valueOf(userStudy.getDay())));
userStudy.setLook(Constants.BURDEN_ONE);
userStudy.setPair(Constants.BURDEN_ONE);
userStudy.setInduction(Constants.BURDEN_ONE);
userStudy.setListen(Constants.BURDEN_ONE);
userStudy.setAnswer(Constants.BURDEN_ONE);
userStudy.setGameDifficulty(Constants.ZERO);
this.updateById(userStudy);
}
}
@Override
public void gameHearing(TGame game, Integer userid, CompleteGameDTO completeStudy, List studyList) {
// 超级听力通关率
String answerRate = game.getRate().split(",")[completeStudy.getDifficulty()];
if (completeStudy.getAccuracy() >= Integer.parseInt(answerRate)) {
// 获取用户超级记忆游戏记录
TUserStudy userStudy = this.lambdaQuery().eq(TUserStudy::getUserId, userid).one();
// 更新游戏难度学习记录
if (!Constants.TWO.equals(userStudy.getGameDifficulty())) {
// 获取用户游戏进度
List list = gameRecordService.lambdaQuery().eq(TGameRecord::getUserId, userid)
.eq(TGameRecord::getGameId, game.getId())
.ge(TGameRecord::getAccuracy, answerRate)
.eq(TGameRecord::getGameDifficulty, completeStudy.getDifficulty()).list();
if (!list.isEmpty()) {
Integer integer = GAME_DIFFICULTY_MAP.get(completeStudy.getDifficulty());
userStudy.setGameDifficulty(integer);
}
} else {
// 游戏难度为2,进入下一周目学习
List gameRecordList = gameRecordService.lambdaQuery().eq(TGameRecord::getGameId, game.getId())
.eq(TGameRecord::getGameName, Constants.MEMORY)
.ge(TGameRecord::getAccuracy, game.getAnswerRate()).list();
// 判断是否完成超级记忆
if (!gameRecordList.isEmpty()) {
int quarterItem = 1;
Map> studyMap = new HashMap<>(8);
for (TStudy study : studyList) {
Integer quarter = study.getQuarter();
List itemList = studyMap.get(quarter);
if (null == itemList) {
itemList = new ArrayList<>();
}
itemList.add(study);
studyMap.put(quarter, itemList);
// 记录学习季度
if (study.getId().equals(game.getStudyId())) {
quarterItem = quarter;
}
}
// 获取当前季度所有周目
List studyList1 = studyMap.get(quarterItem);
// 获取用户超级记忆游戏记录
for (int i = 0; i < studyList1.size(); i++) {
TStudy tStudy = studyList1.get(i);
if (tStudy.getWeek().equals(userStudy.getWeek())) {
if (studyList1.size() == 1 || i + 1 == studyList1.size()) {
// 是否为当前季度最后一周目
List studyList2 = studyMap.get(quarterItem + 1);
// 下一季度数据为空
if (null != studyList2 && !studyList2.isEmpty()) {
TStudy tStudy1 = studyList2.get(Constants.ZERO);
userStudy.setWeek(tStudy1.getWeek());
}
} else {
TStudy tStudy1 = studyList1.get(i + 1);
userStudy.setWeek(tStudy1.getWeek());
}
}
}
userStudy.setDay(DAY_MAP.get(String.valueOf(userStudy.getDay())));
userStudy.setLook(Constants.BURDEN_ONE);
userStudy.setPair(Constants.BURDEN_ONE);
userStudy.setInduction(Constants.BURDEN_ONE);
userStudy.setListen(Constants.BURDEN_ONE);
userStudy.setAnswer(Constants.BURDEN_ONE);
userStudy.setGameDifficulty(Constants.ZERO);
}
}
this.updateById(userStudy);
}
}
}