hjl
2024-06-19 68aa7c66071339064dfd300a8e3d7540db09075d
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TUserStudyServiceImpl.java
@@ -1,13 +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.TStudy;
import com.ruoyi.study.domain.TUserStudy;
import com.ruoyi.study.mapper.TGameMapper;
import com.ruoyi.study.dto.CompleteGameDTO;
import com.ruoyi.study.dto.CompleteStudyDTO;
import com.ruoyi.study.mapper.TUserStudyMapper;
import com.ruoyi.study.service.ITGameService;
import com.ruoyi.study.service.ITUserStudyService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * <p>
@@ -20,4 +28,149 @@
@Service
public class TUserStudyServiceImpl extends ServiceImpl<TUserStudyMapper, TUserStudy> implements ITUserStudyService {
    /**
     * 所属day map
     */
    private static final Map<String, Integer> DAY_MAP = new HashMap<>(12);
    /**
     * 所属day map
     */
    private static final Map<Integer, Integer> 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);
        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
    @Transactional(rollbackFor = Exception.class)
    public void resettingStudyRecord(String time) {
        List<TUserStudy> 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(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应该进入游戏日
                Integer nextDay = DAY_MAP.get(String.valueOf(userStudyRecord.getDay()));
                userStudyRecord.setDay(nextDay);
                // 游戏难度初始化 0(入门难度)
                userStudyRecord.setGameDifficulty(Constants.ZERO);
            }
        }
        // 更新学习时长
        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<TStudy> studyList) {
        String answerRate = game.getAnswerRate();
        // 正确率达到通关率
        if (completeStudy.getAccuracy() >= Integer.parseInt(answerRate)) {
            // 获取用户超级记忆游戏记录
            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;
                    }
                }
                int nextIndex = (index + 1) % studyList.size();
                TStudy nextStudy = studyList.get(nextIndex);
                // 更新学习进度及学习时长
                userStudy.setWeek(nextStudy.getWeek());
            }
            this.updateById(userStudy);
        }
    }
    @Override
    public void gameHearing(TGame game, Integer userid, CompleteGameDTO completeStudy) {
        // 超级听力通关率
        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()));
            this.updateById(userStudy);
        }
    }
}