无关风月
2024-06-19 0ad43e6a7407eca87cfab23dbcfef65313d2b401
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java
@@ -2,7 +2,6 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.domain.R;
@@ -224,6 +223,8 @@
            } else {
                TGame tGame = new TGame();
                tGame.setWeek(dto.getWeek());
                tGame.setAnswerRate(game.getAnswerRate());
                tGame.setRate(game.getRate());
                tGame.setStudyId(one.getId());
                tGame.setCount(game.getCount());
                tGame.setIntegral(game.getIntegral());
@@ -710,7 +711,8 @@
        if (null == loginStudy) {
            return R.tokenError("登录失效!");
        }
        TUserStudy result = studyService.studySchedule(String.valueOf(loginStudy.getUserid()), week);
        TUserStudy result = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, loginStudy.getUserid())
                .eq(TUserStudy::getDisabled, 0).one();
        if (null != result) {
            // 计算当前周 day 1-5的总进度
            int computeSchedule = studyService.computeSchedule(result, week);
@@ -734,6 +736,42 @@
    public R<List<StudyWeekDTO>> weekList(@RequestParam(defaultValue = "1") Integer type, @RequestParam Integer quarter) {
        List<StudyWeekDTO> result = studyService.weekList(type, quarter);
        return R.ok(result);
    }
    /**
     * 获取在线时间赠送积分信息
     */
    @GetMapping("/onlineDuration")
    @ApiOperation(value = "获取在线时间赠送积分信息(单位分钟)", tags = {"学习端-首页"})
    public R<String> onlineDuration() {
        TSysSet sysSet = managementClient.promptVoice().getData();
        if (null == sysSet) {
            throw new GlobalException("获取在线时间赠送积分信息失败!");
        }
        // 返回在线时长
        return R.ok(sysSet.getTime());
    }
    /**
     * 根据在线时间赠送积分(定时任务)
     */
    @GetMapping("/giveIntegral")
    @ApiOperation(value = "根据在线时间赠送积分(定时任务)", tags = {"学习端-首页"})
    public R<Boolean> giveIntegral() {
        LoginUserParent loginStudy = tokenService.getLoginUserStudy();
        if (null == loginStudy) {
            return R.tokenError("登录失效!");
        }
        TSysSet sysSet = managementClient.promptVoice().getData();
        if (null == sysSet) {
            throw new GlobalException("获取在线时间赠送积分信息失败!");
        }
        String integral = sysSet.getIntegral();
        TUser user = userService.lambdaQuery().eq(TUser::getId, loginStudy.getUserid())
                .eq(TUser::getDisabled, 0).one();
        boolean update = userService.lambdaUpdate().set(TUser::getIntegral, user.getIntegral() + Integer.parseInt(integral))
                .eq(TUser::getId, loginStudy.getUserid()).update();
        return R.ok(update);
    }
    /**
@@ -762,7 +800,6 @@
                .eq(TSubjectRecord::getDisabled, 0).one();
        // 返回结果
        SubjectRecordResultVO result;
        SubjectRecordResultVO data = subjectRecordService.recordResult(subjectRecord, loginStudy.getUserid());
        if (null != subjectRecord) {
            subjectRecordService.lambdaUpdate().set(TSubjectRecord::getDisabled, 1)
                    .eq(TSubjectRecord::getId, subjectRecord.getId()).update();
@@ -803,25 +840,29 @@
            int completionRate = exitLearn.getTopicIds().split(",").length * 5;
            Integer type = exitLearn.getType();
            // 更新用户学习完成率
            LambdaUpdateChainWrapper<TUserStudy> wrapper = userStudyService.lambdaUpdate();
            if (Constants.ONE.equals(type) && userStudy.getListen() < completionRate) {
                // 听音选图
                wrapper.set(TUserStudy::getListen, completionRate);
                userStudy.setListen(completionRate);
            } else if (Constants.TWO.equals(type) && userStudy.getLook() < completionRate) {
                // 看图选音
                wrapper.set(TUserStudy::getLook, completionRate);
                userStudy.setLook(completionRate);
            } else if (Constants.THREE.equals(type) && userStudy.getInduction() < completionRate) {
                // 归纳排除
                wrapper.set(TUserStudy::getInduction, completionRate);
                userStudy.setInduction(completionRate);
            } else if (Constants.FOUR.equals(type) && userStudy.getAnswer() < completionRate) {
                // 有问有答
                wrapper.set(TUserStudy::getAnswer, completionRate);
                userStudy.setAnswer(completionRate);
            } else if (Constants.FIVE.equals(type) && userStudy.getPair() < completionRate) {
                // 音图相配
                wrapper.set(TUserStudy::getPair, completionRate);
                userStudy.setPair(completionRate);
            }
            wrapper.eq(TUserStudy::getUserId, userid).update();
        }
        // 学习时长更新
        userStudy.setTotalStudy(userStudy.getTotalStudy() + exitLearn.getStudyTime());
        userStudy.setTodayStudy(userStudy.getTodayStudy() + exitLearn.getStudyTime());
        userStudy.setWeekStudy(userStudy.getWeekStudy() + exitLearn.getStudyTime());
        userStudy.setMonthStudy(userStudy.getMonthStudy() + exitLearn.getStudyTime());
        userStudyService.updateById(userStudy);
        return R.ok(subjectRecordService.exitLearning(exitLearn, userid));
    }
@@ -1064,6 +1105,10 @@
    })
    public R<StudyGameResultVO> gameHearing(@RequestParam Integer quarter, @RequestParam Integer difficulty,
                                            @RequestParam Integer week) {
        LoginUserParent userStudy = tokenService.getLoginUserStudy();
        if (null == userStudy) {
            return R.tokenError("登录失效!");
        }
        Integer[] array = {0, 1, 2};
        if (!Arrays.stream(array).collect(Collectors.toList()).contains(difficulty)) {
            throw new GlobalException("请选择符合规则的游戏难度!");
@@ -1075,7 +1120,7 @@
        game.setIntegral(game.getIntegral().split(",")[difficulty]);
        game.setTime(game.getTime().split(",")[difficulty]);
        // 检验是否完成难度
        studyService.checkDifficulty(difficulty, week, game);
        studyService.checkDifficulty(difficulty, week, game, userStudy.getUserid());
        List<String> subjectId = getSubjectId(week);
        List<String> newSubjectId = subjectId.stream().map(data -> {
            if (data.startsWith(Constants.REDUCE)) {
@@ -1218,7 +1263,23 @@
            user.setIntegral(user.getIntegral() + availableIntegral);
            add = add && userService.updateById(user);
        }
        return R.ok(add);
        // 超级记忆逻辑
        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);
            return R.ok(add && completeStudy.getAccuracy() >= Integer.parseInt(game.getAnswerRate()));
        } else {
            // 超级听力需根据正确率判断是否允许进入下一难度
            userStudyService.gameHearing(game, userid, completeStudy);
            String rate = game.getRate().split(",")[completeStudy.getDifficulty()];
            return R.ok(add && completeStudy.getAccuracy() >= Integer.parseInt(rate));
        }
    }
    private List<String> getSubjectId(Integer week) {
@@ -1305,21 +1366,35 @@
    @ApiImplicitParams({
            @ApiImplicitParam(value = "故事id", name = "storyId", dataType = "Integer", required = true),
            @ApiImplicitParam(value = "类型(1:看图配音;2:超级记忆)", name = "type", dataType = "Integer", required = true),
            @ApiImplicitParam(value = "正确率", name = "accuracy", dataType = "Integer")
            @ApiImplicitParam(value = "正确率", name = "accuracy", dataType = "Integer"),
            @ApiImplicitParam(value = "学习时长(秒)", name = "studyTime", dataType = "Integer", required = true)
    })
    public R<Boolean> completeStory(@RequestParam Integer storyId, @RequestParam Integer type, Integer accuracy) {
    public R<Boolean> completeStory(@RequestParam Integer storyId, @RequestParam Integer type,
                                    Integer accuracy, @RequestParam Integer studyTime) {
        TStoryListen storyListen = storyListenService.lambdaQuery().eq(TStoryListen::getId, storyId)
                .eq(TStoryListen::getDisabled, 0).one();
        if (null == storyListen) {
            throw new GlobalException("当前故事学习失败,故事信息异常,请重试!");
        }
        LoginUserParent userStudy = tokenService.getLoginUserStudy();
        if (null == userStudy) {
        LoginUserParent loginUserStudy = tokenService.getLoginUserStudy();
        if (null == loginUserStudy) {
            return R.tokenError("登录失效!");
        }
        // 用户信息
        Integer userId = userStudy.getUserid();
        Integer userId = loginUserStudy.getUserid();
        Boolean result = true;
        // 学习时长更新
        TUserStudy userStudy = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, userId)
                .eq(TUserStudy::getDisabled, 0).one();
        userStudy.setTotalStudy(userStudy.getTotalStudy() + studyTime);
        userStudy.setTodayStudy(userStudy.getTodayStudy() + studyTime);
        userStudy.setWeekStudy(userStudy.getWeekStudy() + studyTime);
        userStudy.setMonthStudy(userStudy.getMonthStudy() + studyTime);
        boolean update = userStudyService.updateById(userStudy);
        if (!update) {
            throw new GlobalException("学习时长更新失败!");
        }
        // 根据故事类型不同,逻辑处理
        if (Constants.ONE.equals(type)) {
            if (null == accuracy) {
                throw new GlobalException("自主故事-看图配音正确率异常!");
@@ -1334,7 +1409,8 @@
            if (list.isEmpty()) {
                obtainedIntegral = 0;
            } else {
                obtainedIntegral = list.stream().map(TUserStudyRecord::getObtainedIntegral).mapToInt(Integer::intValue).sum();
                obtainedIntegral = list.stream().map(TUserStudyRecord::getObtainedIntegral)
                        .mapToInt(Integer::intValue).sum();
            }
            // 可获得积分计算
            if (integral > obtainedIntegral) {
@@ -1375,9 +1451,23 @@
        // 学习记录
        TUserStudy studyRecord = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, userId)
                .eq(TUserStudy::getDisabled, 0).one();
        // 游戏测试成绩
        // 学习时长格式转换
        Integer todayStudy = studyRecord.getTodayStudy();
        studyRecord.setTodayStudy(Math.round((float) todayStudy / 3600));
        Integer weekStudy = studyRecord.getWeekStudy();
        studyRecord.setWeekStudy(Math.round((float) weekStudy / 3600));
        Integer monthStudy = studyRecord.getMonthStudy();
        studyRecord.setMonthStudy(Math.round((float) monthStudy / 3600));
        // 总时长还需计算上游戏测试成绩时长
        List<TGameRecord> gameRecordList = gameRecordService.lambdaQuery().eq(TGameRecord::getUserId, userId)
                .eq(TGameRecord::getDisabled, 0).list();
        int sum = gameRecordList.stream().map(TGameRecord::getUseTime).mapToInt(Integer::intValue).sum();
        Integer totalStudy = studyRecord.getTotalStudy();
        studyRecord.setTotalStudy(Math.round((float) (totalStudy + sum) / 3600));
        // 剩余周目
        int size = studyService.list(new QueryWrapper<TStudy>()
                .eq("type", 1)).size();
        studyRecord.setSurplus(size - studyRecord.getWeek());
        return R.ok(new StudyRecordResultVO(studyRecord, gameRecordList));
    }
@@ -1385,6 +1475,7 @@
    @ApiOperation(value = "游戏测试成绩", tags = {"家长端-游戏测试成绩"})
    public R<StudyRecordResultVO> record() {
        LoginUserParent loginUser1 = tokenService.getLoginUser1();
        System.err.println("用户登录信息:"+loginUser1);
        if (loginUser1 == null) {
            return R.tokenError("登陆失效,请重新登录");
        }
@@ -1404,9 +1495,19 @@
                    .eq("type", 1)).size());
            studyRecord = tUserStudy;
        }
        // 游戏测试成绩
        // 学习时长格式转换
        Integer todayStudy = studyRecord.getTodayStudy();
        studyRecord.setTodayStudy(Math.round((float) todayStudy / 3600));
        Integer weekStudy = studyRecord.getWeekStudy();
        studyRecord.setWeekStudy(Math.round((float) weekStudy / 3600));
        Integer monthStudy = studyRecord.getMonthStudy();
        studyRecord.setMonthStudy(Math.round((float) monthStudy / 3600));
        // 总时长还需计算上游戏测试成绩时长
        List<TGameRecord> gameRecordList = gameRecordService.lambdaQuery().eq(TGameRecord::getUserId, userId)
                .eq(TGameRecord::getDisabled, 0).list();
        int sum = gameRecordList.stream().map(TGameRecord::getUseTime).mapToInt(Integer::intValue).sum();
        Integer totalStudy = studyRecord.getTotalStudy();
        studyRecord.setTotalStudy(Math.round((float) (totalStudy + sum) / 3600));
        return R.ok(new StudyRecordResultVO(studyRecord, gameRecordList));
    }
@@ -1443,17 +1544,18 @@
    @GetMapping("/integralDetailParent")
    @ApiOperation(value = "个人中心-积分明细", tags = {"家长端"})
    @ApiImplicitParams({
            @ApiImplicitParam(value = "查询时间 格式yyyy-MM", name = "time", dataType = "Integer"),
            @ApiImplicitParam(value = "页码", name = "pageNum", dataType = "Integer", required = true),
            @ApiImplicitParam(value = "每页显示条数", name = "pageSize", dataType = "Integer", required = true)
            @ApiImplicitParam(value = "查询时间 格式yyyy-MM", name = "time"),
            @ApiImplicitParam(value = "页码", name = "pageNum", required = true),
            @ApiImplicitParam(value = "每页显示条数", name = "pageSize", required = true)
    })
    public R<IPage<TIntegralRecord>> integralDetailParent(String time,
                                                          Integer pageNum,
                                                          Integer pageSize) {
                                                          @RequestParam("pageNum") Integer pageNum,
                                                          @RequestParam("pageSize") Integer pageSize) {
        System.err.println("页码" + pageNum);
        System.err.println("页数" + pageSize);
        if (tokenService.getLoginUser1() == null) {
            return R.tokenError("登录失效");
        }
        return R.ok(integralRecordService.integralDetail(new Page<>(pageNum, pageSize), tokenService.getLoginUser1().getUserid(), time));
    }