hjl
2024-07-19 a3d6cf8f21a042365cdd4033f4bf8c097f34469e
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TUserStudyServiceImpl.java
@@ -1,18 +1,21 @@
package com.ruoyi.study.service.impl;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
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;
@@ -27,6 +30,9 @@
 */
@Service
public class TUserStudyServiceImpl extends ServiceImpl<TUserStudyMapper, TUserStudy> implements ITUserStudyService {
    @Resource
    private ITGameRecordService gameRecordService;
    /**
     * 所属day map
@@ -49,14 +55,6 @@
        // 游戏难度
        GAME_DIFFICULTY_MAP.put(Constants.ZERO, Constants.ONE);
        GAME_DIFFICULTY_MAP.put(Constants.ONE, Constants.TWO);
        GAME_DIFFICULTY_MAP.put(Constants.TWO, Constants.ZERO);
    }
    @Override
    public TUserStudy studySchedule(String userId) {
        LambdaQueryChainWrapper<TUserStudy> wrapper = lambdaQuery().eq(TUserStudy::getUserId, userId);
        return wrapper.eq(TUserStudy::getDisabled, 0).one();
    }
    @Override
@@ -88,40 +86,44 @@
    }
    @Override
    public Boolean exchangeStudyRecord(Integer userId, CompleteStudyDTO completeStudy) {
    public Boolean exchangeStudyRecord(TUserStudy userStudyRecord, Integer userId, CompleteStudyDTO completeStudy) {
        Integer studyTime = completeStudy.getStudyTime();
        // 学习记录
        TUserStudy userStudyRecord = lambdaQuery().eq(TUserStudy::getUserId, userId)
                .eq(TUserStudy::getDisabled, 0).one();
        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);
                userStudyRecord.setLook(Constants.BURDEN_ONE);
                userStudyRecord.setInduction(Constants.BURDEN_ONE);
                userStudyRecord.setAnswer(Constants.BURDEN_ONE);
                userStudyRecord.setPair(Constants.BURDEN_ONE);
            } else if (Constants.TWO.equals(type)) {
                userStudyRecord.setLook(Constants.ONE_HUNDRED);
                userStudyRecord.setInduction(Constants.BURDEN_ONE);
                userStudyRecord.setAnswer(Constants.BURDEN_ONE);
                userStudyRecord.setPair(Constants.BURDEN_ONE);
            } else if (Constants.THREE.equals(type)) {
                userStudyRecord.setInduction(Constants.ONE_HUNDRED);
                userStudyRecord.setAnswer(Constants.BURDEN_ONE);
                userStudyRecord.setPair(Constants.BURDEN_ONE);
            } else if (Constants.FOUR.equals(type)) {
                userStudyRecord.setAnswer(Constants.ONE_HUNDRED);
                userStudyRecord.setPair(Constants.BURDEN_ONE);
            } else if (Constants.FIVE.equals(type)) {
                userStudyRecord.setPair(Constants.ONE_HUNDRED);
                // type为5并且day为5应该进入游戏日
            }
            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);
                // 游戏难度初始化 0(入门难度)
                userStudyRecord.setGameDifficulty(Constants.ZERO);
                // 下一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);
                }
            }
        }
        // 更新学习时长
@@ -136,39 +138,132 @@
    @Override
    public void checkRate(TGame game, Integer userid, CompleteGameDTO completeStudy, List<TStudy> studyList) {
        String answerRate = game.getAnswerRate();
        String rate = game.getRate().split(",")[Constants.TWO];
        // 校验是否完成超级听力
        List<TGameRecord> gameRecordList = gameRecordService.lambdaQuery().eq(TGameRecord::getGameId, game.getId())
                .eq(TGameRecord::getGameDifficulty, Constants.TWO)
                .ge(TGameRecord::getAccuracy, rate).list();
        // 下一周目逻辑
        int quarterItem = 1;
        Map<Integer, List<TStudy>> studyMap = new HashMap<>(8);
        for (TStudy study : studyList) {
            Integer quarter = study.getQuarter();
            List<TStudy> 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<TStudy> studyList1 = studyMap.get(quarterItem);
        // 正确率达到通关率
        if (completeStudy.getAccuracy() >= Integer.parseInt(answerRate)) {
        if (completeStudy.getAccuracy() >= Integer.parseInt(answerRate)
                && !gameRecordList.isEmpty()) {
            // 获取用户超级记忆游戏记录
            TUserStudy userStudy = this.lambdaQuery().eq(TUserStudy::getUserId, userid).one();
            Integer nextDay = DAY_MAP.get(String.valueOf(userStudy.getDay()));
            userStudy.setDay(nextDay);
            if (Constants.ONE.equals(nextDay)) {
                // 获取下一周目信息
                int index = -1;
                for (int i = 0; i < studyList.size(); i++) {
                    if (studyList.get(i).getWeek().equals(userStudy.getWeek())) {
                        index = i;
                        break;
            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<TStudy> 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;
                }
                int nextIndex = (index + 1) % studyList.size();
                TStudy nextStudy = studyList.get(nextIndex);
                // 更新学习进度及学习时长
                userStudy.setWeek(nextStudy.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);
        }
    }
    @Override
    public void gameHearing(TGame game, Integer userid, CompleteGameDTO completeStudy) {
    public void gameHearing(TGame game, Integer userid, CompleteGameDTO completeStudy, List<TStudy> studyList) {
        // 超级听力通关率
        String answerRate = game.getRate().split(",")[completeStudy.getDifficulty()];
        if (completeStudy.getAccuracy() >= Integer.parseInt(answerRate)) {
            // 获取用户超级记忆游戏记录
            TUserStudy userStudy = this.lambdaQuery().eq(TUserStudy::getUserId, userid).one();
            // 更新游戏难度学习记录
            userStudy.setGameDifficulty(GAME_DIFFICULTY_MAP.get(completeStudy.getDifficulty()));
            if (!Constants.TWO.equals(userStudy.getGameDifficulty())) {
                // 获取用户游戏进度
                List<TGameRecord> 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<TGameRecord> 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<Integer, List<TStudy>> studyMap = new HashMap<>(8);
                    for (TStudy study : studyList) {
                        Integer quarter = study.getQuarter();
                        List<TStudy> 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<TStudy> 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<TStudy> 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);
        }
    }