hjl
2024-06-20 b9c9e52187fd8f47218ddefa514987c59d98f72c
fix: 学习端bug
6个文件已修改
144 ■■■■ 已修改文件
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TStudyServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TUserServiceImpl.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/vo/ExitLearnVO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
@@ -220,17 +220,17 @@
            String userkey = JwtUtils.getUserKeyStudy(token);
            user = redisService.getCacheObject(getTokenKeyStudy(userkey));
            // 再次判断登录状态是否已过期
            if (null == user) {
                throw new StudyLoginException("登录信息已过期,请重新登录!", 504);
            }
            // 优先判断当前账号是否已在其他设备登录
            if (!user.getIsCanLogin()) {
                throw new StudyLoginException("当前登录账号在其他设备登录!", 505);
            }
            // 再次判断登录状态是否已过期
            if (System.currentTimeMillis() > user.getExpireTime()) {
                throw new StudyLoginException("登录信息已过期,请重新登录!", 504);
            }
//            if (null == user) {
//                throw new StudyLoginException("登录信息已过期,请重新登录!", 504);
//            }
//            // 优先判断当前账号是否已在其他设备登录
//            if (!user.getIsCanLogin()) {
//                throw new StudyLoginException("当前登录账号在其他设备登录!", 505);
//            }
//            // 再次判断登录状态是否已过期
//            if (System.currentTimeMillis() > user.getExpireTime()) {
//                throw new StudyLoginException("登录信息已过期,请重新登录!", 504);
//            }
            return user;
        }
        return user;
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java
@@ -852,26 +852,62 @@
        if (null == userStudy) {
            userStudy = createUserStudy(userid);
        }
        Integer quarter = exitLearn.getQuarter();
        Integer week = exitLearn.getWeek();
        Integer day = exitLearn.getDay();
        if (userStudy.getWeek().equals(exitLearn.getWeek()) && userStudy.getDay().equals(exitLearn.getDay())) {
            // 计算完成率
            int completionRate = exitLearn.getTopicIds().split(",").length * 5;
            List<String> teamList = Arrays.stream(exitLearn.getTeamIds().split(",")).collect(Collectors.toList());
            Integer type = exitLearn.getType();
            // 更新用户学习完成率
            if (Constants.ONE.equals(type) && userStudy.getListen() < completionRate) {
            if (Constants.ONE.equals(type)) {
                // 听音选图
                userStudy.setListen(completionRate);
            } else if (Constants.TWO.equals(type) && userStudy.getLook() < completionRate) {
                List<TStudyListen> studyListens = studyListenService.listenSelectPicture(quarter, week, day);
                int item = 0;
                for (TStudyListen studyListen : studyListens) {
                    item += studyListen.getSubject().split(",").length;
                }
                int i = exitLearn.getTopicIds().split(",").length / item;
                if (i > userStudy.getListen()) {
                    userStudy.setListen(100 - i);
                }
            } else if (Constants.TWO.equals(type)) {
                // 看图选音
                userStudy.setLook(completionRate);
            } else if (Constants.THREE.equals(type) && userStudy.getInduction() < completionRate) {
                List<TStudyLook> lookList = studyLookService.pictureSelectVoice(quarter, week, day);
                if (!lookList.isEmpty()) {
                    int item = lookList.size();
                    int i = exitLearn.getSchedule() / item;
                    if (i > userStudy.getLook()) {
                        userStudy.setLook(100 - i);
                    }
                }
            } else if (Constants.THREE.equals(type)) {
                // 归纳排除
                userStudy.setInduction(completionRate);
            } else if (Constants.FOUR.equals(type) && userStudy.getAnswer() < completionRate) {
                List<TStudyInduction> inductionList = studyInductionService.induceExclude(quarter, week, day);
                if (!inductionList.isEmpty()) {
                    int item = inductionList.size();
                    int i = exitLearn.getSchedule() / item;
                    if (i > userStudy.getInduction()) {
                        userStudy.setInduction(100 - i);
                    }
                }
            } else if (Constants.FOUR.equals(type)) {
                // 有问有答
                userStudy.setAnswer(completionRate);
            } else if (Constants.FIVE.equals(type) && userStudy.getPair() < completionRate) {
                List<TStudyAnswer> answerList = studyAnswerService.questionsAndAnswers(quarter, week, day);
                if (answerList.size() % Constants.TWO == Constants.ZERO) {
                    int i = exitLearn.getSchedule() / (answerList.size() / 2);
                    if (i > userStudy.getAnswer()) {
                        userStudy.setAnswer(100 - i);
                    }
                }
            } else if (Constants.FIVE.equals(type)) {
                // 音图相配
                userStudy.setPair(completionRate);
                List<TStudyPair> pairList = studyPairService.pictureMateVoice(quarter, week, day);
                int item = pairList.size();
                int i = exitLearn.getSchedule() / item;
                if (i > userStudy.getPair()) {
                    userStudy.setPair(100 - i);
                }
            }
        }
        // 学习时长更新
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java
@@ -691,6 +691,9 @@
        }
        TUser user = userService.lambdaQuery().eq(TUser::getId, loginUserStudy.getUserid()).one();
        TUserStudy userStudy = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, user.getId()).eq(TUserStudy::getDisabled, 0).one();
        if (null == userStudy) {
            userStudy = createUserStudy(loginUserStudy.getUserid());
        }
        // 学习时长格式转换
        Integer todayStudy = userStudy.getTodayStudy();
        userStudy.setTodayStudy(Math.round((float) todayStudy / 3600));
@@ -708,6 +711,27 @@
        return R.ok(new UserPersonalCenterVO(user, userStudy));
    }
    private TUserStudy createUserStudy(Integer userid) {
        TUserStudy userStudy = new TUserStudy();
        userStudy.setUserId(userid);
        // 学习周目
        TStudy tStudy = studyService.lambdaQuery().eq(TStudy::getQuarter, Constants.ONE)
                .orderByAsc(TStudy::getWeek).last("limit 1").one();
        userStudy.setWeek(tStudy.getWeek());
        userStudy.setDay(Constants.ONE);
        userStudy.setTotalStudy(Constants.ZERO);
        userStudy.setTodayStudy(Constants.ZERO);
        userStudy.setWeekStudy(Constants.ZERO);
        userStudy.setMonthStudy(Constants.ZERO);
        userStudy.setListen(Constants.BURDEN_ONE);
        userStudy.setLook(Constants.BURDEN_ONE);
        userStudy.setInduction(Constants.BURDEN_ONE);
        userStudy.setAnswer(Constants.BURDEN_ONE);
        userStudy.setPair(Constants.BURDEN_ONE);
        userStudyService.save(userStudy);
        return userStudy;
    }
    @GetMapping("/userInfoParent")
    @ApiOperation(value = "用户详情", tags = {"家长端-用户详情"})
    public R<TUser> userInfoParent() {
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TStudyServiceImpl.java
@@ -375,7 +375,8 @@
                defaultSchedule = 0;
            }
            // 进度学习完成度计算总学习进度
            if (!Constants.ZERO.equals(listen) && !Constants.BURDEN_ONE.equals(listen)) {
            // todo 不确定是否需要累计计算 中途退出的进度
            /*if (!Constants.ZERO.equals(listen) && !Constants.BURDEN_ONE.equals(listen)) {
                defaultSchedule += 4 * (100 / listen);
            }
            if (!Constants.ZERO.equals(look) && !Constants.BURDEN_ONE.equals(look)) {
@@ -389,7 +390,7 @@
            }
            if (!Constants.ZERO.equals(pair) && !Constants.BURDEN_ONE.equals(pair)) {
                defaultSchedule += 4 * (100 / pair);
            }
            }*/
        }
        return defaultSchedule;
    }
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TUserServiceImpl.java
@@ -17,6 +17,7 @@
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
@@ -89,16 +90,15 @@
    @Override
    public Boolean isVip() {
//        TUser user = lambdaQuery().eq(TUser::getId, tokenService.getLoginUserStudy().getUserid())
//                .eq(TUser::getDisabled, 0).eq(TUser::getState,1).one();
//        // 是否为vip 逻辑
//        if (null == user) {
//            return false;
//        }
//        // vip过期时间,字段为空也表示 当前用户不是vip
//        Date vipEndTime = user.getVipEndTime();
//        return null != vipEndTime && System.currentTimeMillis() <= vipEndTime.getTime();
        return true;
        TUser user = lambdaQuery().eq(TUser::getId, tokenService.getLoginUserStudy().getUserid())
                .eq(TUser::getDisabled, 0).eq(TUser::getState,1).one();
        // 是否为vip 逻辑
        if (null == user) {
            return false;
        }
        // vip过期时间,字段为空也表示 当前用户不是vip
        Date vipEndTime = user.getVipEndTime();
        return null != vipEndTime && System.currentTimeMillis() <= vipEndTime.getTime();
    }
}
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/vo/ExitLearnVO.java
@@ -3,6 +3,8 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
 * @author HJL
 * @version 1.0
@@ -10,6 +12,12 @@
 */
@Data
public class ExitLearnVO {
    /**
     * 所属季度
     */
    @ApiModelProperty("所属季度")
    private Integer quarter;
    /**
     * 所属week
@@ -59,4 +67,11 @@
    @ApiModelProperty("完成学习所用时长(秒)")
    private Integer studyTime;
    /**
     * 答题进度
     */
    @ApiModelProperty("答题进度")
    @NotNull(message = "答题进度不能为空!")
    private Integer schedule;
}