hjl
2024-06-25 6c6d875de1d0537acfa5edf4eb976e87625bd859
fix: 学习端bug
9个文件已修改
162 ■■■■ 已修改文件
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TGameRecord.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TIntegralRecord.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/ITIntegralRecordService.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/ITUserStudyService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TGameRecordServiceImpl.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TGameServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TIntegralRecordServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TUserStudyServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java
@@ -1259,7 +1259,7 @@
            voiceList.add(new GameMemoryVoiceVO(tSubject.getId(), tSubject.getCorrect()));
        }
        // 校验超级听力是否通过
        studyService.checkClearance(game,userStudy.getUserid());
        // studyService.checkClearance(game,userStudy.getUserid());
        // 框架记忆数量翻倍,前端需要根据数量画格子
        game.setAnswerCount(game.getAnswerCount() * 2);
        return R.ok(new StudyGameMemoryVO(game, photoList, voiceList));
@@ -1340,14 +1340,23 @@
            throw new GlobalException("游戏信息异常!");
        }
        // 积分明细
        List<TIntegralRecord> integralRecordList = integralRecordService.lambdaQuery().eq(TIntegralRecord::getUserId, userid)
                .eq(TIntegralRecord::getGameId, game.getId()).eq(TIntegralRecord::getDisabled, 0).list();
        Integer difficulty = completeStudy.getDifficulty();
        List<TIntegralRecord> integralRecordList = integralRecordService.lambdaQuery()
                .eq(TIntegralRecord::getUserId, userid)
                .eq(TIntegralRecord::getGameId, game.getId())
                .eq(TIntegralRecord::getDisabled, 0)
                .eq(TIntegralRecord::getGameDifficulty, difficulty).list();
        // 本次游戏总共能获取的积分数量
        Integer integral;
        if (completeStudy.getGameName().equals(Constants.HEARING)) {
            // 本次游戏总积分
            integral = Integer.parseInt(game.getIntegral().split(",")[completeStudy.getDifficulty()]);
            integral = Integer.parseInt(game.getIntegral().split(",")[difficulty]);
        } else if (completeStudy.getGameName().equals(Constants.MEMORY)) {
            integralRecordList = integralRecordService.lambdaQuery()
                    .eq(TIntegralRecord::getUserId, userid)
                    .eq(TIntegralRecord::getGameId, game.getId())
                    .eq(TIntegralRecord::getDisabled, 0)
                    .eq(TIntegralRecord::getGameDifficulty, null).list();
            integral = game.getAnswerIntegral();
        } else {
            throw new GlobalException("该次游戏积分计算异常!");
@@ -1357,8 +1366,9 @@
        // 游戏测试记录
        Boolean add = gameRecordService.add(completeStudy);
        // 可获得积分不为null时,才添加积分明细记录
        if (null != availableIntegral) {
            add = add && integralRecordService.add(String.valueOf(availableIntegral), Constants.COMPLETE_GAME, completeStudy.getGameId(), null);
        if (null != availableIntegral && !Constants.ZERO.equals(availableIntegral)) {
            add = add && integralRecordService.add(String.valueOf(availableIntegral),
                    Constants.COMPLETE_GAME, completeStudy.getGameId(), null, difficulty);
            // 用户账户添加积分
            TUser user = userService.getById(userid);
            user.setIntegral(user.getIntegral() + availableIntegral);
@@ -1376,22 +1386,20 @@
        userStudy.setWeekStudy(userStudy.getWeekStudy() + completeStudy.getUseTime());
        userStudy.setMonthStudy(userStudy.getMonthStudy() + completeStudy.getUseTime());
        userStudyService.updateById(userStudy);
        // 学习配置列表
        List<TStudy> studyList = studyService.lambdaQuery().eq(TStudy::getDisabled, 0)
                .orderByAsc(TStudy::getWeek).list();
        if (studyList.isEmpty()) {
            throw new GlobalException("学习配置列表未配置或数据失效!");
        }
        // 超级记忆逻辑
        if (Constants.MEMORY.equals(completeStudy.getGameName())) {
            // 学习配置列表
            List<TStudy> studyList = studyService.lambdaQuery().eq(TStudy::getDisabled, 0)
                    .orderByAsc(TStudy::getWeek).list();
            if (studyList.isEmpty()) {
                throw new GlobalException("学习配置列表未配置或数据失效!");
            }
            // 超级记忆正确率达到通关率标准,才能进入下一周目学习
            // 校验是否通关超级听力与超级记忆,通关则学习记录更新为下一周目
            userStudyService.checkRate(game, userid, completeStudy, studyList);
            add = add && completeStudy.getAccuracy() >= Integer.parseInt(game.getAnswerRate());
        } else {
            // 超级听力需根据正确率判断是否允许进入下一难度
            userStudyService.gameHearing(game, userid, completeStudy);
            String rate = game.getRate().split(",")[completeStudy.getDifficulty()];
            add = add && completeStudy.getAccuracy() >= Integer.parseInt(rate);
            userStudyService.gameHearing(game, userid, completeStudy, studyList);
        }
        return R.ok(availableIntegral);
    }
@@ -1570,7 +1578,7 @@
            if (null == integralRecord) {
                // 添加积分明细记录
                result = integralRecordService.add(String.valueOf(storyListen.getIntegral()),
                        Constants.COMPLETE_STORY, null, storyId);
                        Constants.COMPLETE_STORY, null, storyId, null);
                TUser user = userService.lambdaQuery().eq(TUser::getId, userId).one();
                // 添加积分
                user.setIntegral(user.getIntegral() + storyListen.getIntegral());
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TGameRecord.java
@@ -1,12 +1,13 @@
package com.ruoyi.study.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * <p>
@@ -60,5 +61,13 @@
    @ApiModelProperty(value = "游戏难度(0入门、1中级、2高级)")
    private Integer gameDifficulty;
    /**
     * 创建时间
     */
    @ApiModelProperty(value = "记录创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    @TableField(value = "createTime", fill = FieldFill.INSERT)
    private Date createTime;
}
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TIntegralRecord.java
@@ -53,6 +53,12 @@
    private Integer gameId;
    /**
     * 游戏难度
     */
    @ApiModelProperty("游戏难度")
    private Integer gameDifficulty;
    /**
     * 故事id
     */
    @ApiModelProperty("故事id 对应t_story_listen")
@@ -63,6 +69,8 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    private Date time;
    /**
     * 前端用,返回积分变动类型
     *
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/ITIntegralRecordService.java
@@ -28,11 +28,12 @@
    /**
     * 生成积分明细
     *
     * @param integral 积分 (增加积分+ 、减少积分-)
     * @param method   积分来源
     * @param gameId   游戏id
     * @param storyId  故事id
     * @param integral   积分 (增加积分+ 、减少积分-)
     * @param method     积分来源
     * @param gameId     游戏id
     * @param storyId    故事id
     * @param difficulty 游戏难度
     * @return 操作结果
     */
    Boolean add(String integral, String method, Integer gameId, Integer storyId);
    Boolean add(String integral, String method, Integer gameId, Integer storyId, Integer difficulty);
}
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/ITUserStudyService.java
@@ -60,6 +60,7 @@
     * @param game          游戏信息
     * @param userid        用户id
     * @param completeStudy 游戏完成信息
     * @param studyList     学习列表
     */
    void gameHearing(TGame game, Integer userid, CompleteGameDTO completeStudy);
    void gameHearing(TGame game, Integer userid, CompleteGameDTO completeStudy, List<TStudy> studyList);
}
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TGameRecordServiceImpl.java
@@ -1,6 +1,7 @@
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.security.service.TokenService;
import com.ruoyi.study.domain.TGameRecord;
import com.ruoyi.study.dto.CompleteGameDTO;
@@ -33,8 +34,10 @@
        data.setAccuracy(gameAchievement.getAccuracy());
        data.setGameName(gameAchievement.getGameName());
        data.setUseTime(gameAchievement.getUseTime());
        if (Constants.HEARING.equals(gameAchievement.getGameName())) {
            data.setGameDifficulty(gameAchievement.getDifficulty());
        }
        data.setGameId(gameAchievement.getGameId());
        data.setGameDifficulty(gameAchievement.getDifficulty());
        return this.save(data);
    }
}
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TGameServiceImpl.java
@@ -2,19 +2,14 @@
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.study.domain.TGame;
import com.ruoyi.study.domain.TIntegralRecord;
import com.ruoyi.study.domain.TSubject;
import com.ruoyi.study.dto.CompleteGameDTO;
import com.ruoyi.study.mapper.TGameMapper;
import com.ruoyi.study.service.ITGameService;
import com.ruoyi.study.vo.StudyGameMemoryVO;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
/**
@@ -36,13 +31,14 @@
            return gameAvailableIntegral;
        } else {
            // 积分明细不为空,根据正确率及已获取积分数量计算本次答题可获取的积分数量
            List<Integer> integralList = integralRecordList.stream().map(TIntegralRecord::getIntegral).collect(Collectors.toList())
            List<Integer> integralList = integralRecordList.stream()
                    .map(TIntegralRecord::getIntegral).collect(Collectors.toList())
                    .stream().map(Integer::parseInt).collect(Collectors.toList());
            int sumIntegral = integralList.stream().mapToInt(Integer::intValue).sum();
            if (gameAvailableIntegral > sumIntegral) {
                return gameAvailableIntegral - sumIntegral;
            } else {
                return null;
                return Constants.ZERO;
            }
        }
    }
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TIntegralRecordServiceImpl.java
@@ -33,13 +33,14 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean add(String integral, String method, Integer gameId, Integer storyId) {
    public Boolean add(String integral, String method, Integer gameId, Integer storyId, Integer difficulty) {
        TIntegralRecord integralRecord = new TIntegralRecord();
        integralRecord.setIntegral(integral);
        integralRecord.setMethod(method);
        integralRecord.setUserId(tokenService.getLoginUserStudy().getUserid());
        integralRecord.setGameId(gameId);
        integralRecord.setStoryId(storyId);
        integralRecord.setGameDifficulty(difficulty);
        return this.save(integralRecord);
    }
}
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TUserStudyServiceImpl.java
@@ -147,6 +147,11 @@
    @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);
@@ -166,13 +171,14 @@
        // 获取当前季度所有周目
        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();
            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() - 1) {
                    if (studyList1.size() == 1 || i + 1 == studyList1.size()) {
                        // 是否为当前季度最后一周目
                        List<TStudy> studyList2 = studyMap.get(quarterItem + 1);
                        // 下一季度数据为空
@@ -198,7 +204,7 @@
    }
    @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)) {
@@ -212,7 +218,58 @@
                        .ge(TGameRecord::getAccuracy, answerRate)
                        .eq(TGameRecord::getGameDifficulty, completeStudy.getDifficulty()).list();
                if (!list.isEmpty()) {
                    userStudy.setGameDifficulty(GAME_DIFFICULTY_MAP.get(completeStudy.getDifficulty()));
                    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);