hjl
2024-06-24 253ee614523ba4baa756cf209333d4528a4386b1
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java
@@ -79,6 +79,8 @@
    private IUserStudyRecordService studyRecordService;
    @Resource
    private ManagementClient managementClient;
    @Resource
    private ITUserPresentRecordService userPresentRecordService;
    @PostMapping("/storyList")
//    @ApiOperation(value = "配置学习类型选择故事", tags = {"题目管理"})
@@ -751,7 +753,11 @@
            @ApiImplicitParam(value = "季度 首次进入季度quarter默认传1", name = "quarter", dataType = "Integer", required = true)
    })
    public R<List<StudyWeekDTO>> weekList(@RequestParam(defaultValue = "1") Integer type, @RequestParam Integer quarter) {
        List<StudyWeekDTO> result = studyService.weekList(type, quarter);
        LoginUserParent loginUserStudy = tokenService.getLoginUserStudy();
        if (null == loginUserStudy) {
            return R.tokenError("登录失效!");
        }
        List<StudyWeekDTO> result = studyService.weekList(type, quarter, loginUserStudy.getUserid());
        return R.ok(result);
    }
@@ -784,11 +790,39 @@
            throw new GlobalException("获取在线时间赠送积分信息失败!");
        }
        String integral = sysSet.getIntegral();
        // 计算时间间隔
        TUserPresentRecord record = userPresentRecordService.lambdaQuery()
                .eq(TUserPresentRecord::getUserId, loginStudy.getUserid())
                .orderByDesc(TUserPresentRecord::getPresentTime)
                .eq(TUserPresentRecord::getIsDelete, 0).last("limit 1").one();
        boolean result = true;
        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);
        if (null == record) {
            // 赠送积分
            result = userService.lambdaUpdate().set(TUser::getIntegral, user.getIntegral() + Integer.parseInt(integral))
                    .eq(TUser::getId, loginStudy.getUserid()).update();
            // 添加赠送积分记录
            TUserPresentRecord data = new TUserPresentRecord();
            data.setUserId(loginStudy.getUserid());
            data.setPresentTime(new Date());
            data.setIsDelete(0);
            result = result && userPresentRecordService.save(data);
        } else {
            if (System.currentTimeMillis() - record.getPresentTime().getTime() >= 10 * 60 * 1000) {
                // 赠送积分
                result = userService.lambdaUpdate()
                        .set(TUser::getIntegral, user.getIntegral() + Integer.parseInt(integral))
                        .eq(TUser::getId, loginStudy.getUserid()).update();
                // 添加赠送积分记录
                TUserPresentRecord data = new TUserPresentRecord();
                data.setUserId(loginStudy.getUserid());
                data.setPresentTime(new Date());
                data.setIsDelete(0);
                result = result && userPresentRecordService.save(data);
            }
        }
        return R.ok(result);
    }
    /**
@@ -850,28 +884,64 @@
        TUserStudy userStudy = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, userid)
                .eq(TUserStudy::getDisabled, 0).one();
        if (null == userStudy) {
            throw new GlobalException("登录用户学习记录不存在!");
            userStudy = createUserStudy(userid);
        }
        Integer quarter = exitLearn.getQuarter();
        Integer week = exitLearn.getWeek();
        Integer day = exitLearn.getDay();
        int schedule = exitLearn.getSchedule() == null ? 0 : exitLearn.getSchedule();
        if (userStudy.getWeek().equals(exitLearn.getWeek()) && userStudy.getDay().equals(exitLearn.getDay())) {
            // 计算完成率
            int completionRate = exitLearn.getTopicIds().split(",").length * 5;
            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 = (int) ((double) (exitLearn.getTopicIds().split(",").length / item) * 100);
                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 = (int) ((double) (schedule / item)) * 100;
                    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 = (int) ((double) (schedule / item)) * 100;
                    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 = (int) ((double) (schedule / (answerList.size() / 2))) * 100;
                    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 = (int) ((double) (schedule / item)) * 100;
                if (i > userStudy.getPair()) {
                    userStudy.setPair(100 - i);
                }
            }
        }
        // 学习时长更新
@@ -903,7 +973,7 @@
        // 非会员只能查看非会员题目,会员可以查看所有题目
        List<TStudyListen> studyListens = studyListenService.listenSelectPicture(quarter, week, day);
        for (TStudyListen studyListen : studyListens) {
            if (studyListen.getIsVip() == 1) {
            if (studyListen.getIsVip() == 0) {
                // 需要会员查看
                if (!isVip) {
                    // 不是会员
@@ -934,7 +1004,7 @@
        // 非会员只能查看非会员题目,会员可以查看所有题目
        List<TStudyLook> lookList = studyLookService.pictureSelectVoice(quarter, week, day);
        for (TStudyLook studyListen : lookList) {
            if (studyListen.getIsVip() == 1) {
            if (studyListen.getIsVip() == 0) {
                // 需要会员查看
                if (!isVip) {
                    // 不是会员
@@ -965,7 +1035,7 @@
        // 非会员只能查看非会员题目,会员可以查看所有题目
        List<TStudyInduction> inductionList = studyInductionService.induceExclude(quarter, week, day);
        for (TStudyInduction studyListen : inductionList) {
            if (studyListen.getIsVip() == 1) {
            if (studyListen.getIsVip() == 0) {
                // 需要会员查看
                if (!isVip) {
                    // 不是会员
@@ -996,7 +1066,7 @@
        // 非会员只能查看非会员题目,会员可以查看所有题目
        List<TStudyAnswer> answerList = studyAnswerService.questionsAndAnswers(quarter, week, day);
        for (TStudyAnswer studyListen : answerList) {
            if (studyListen.getIsVip() == 1) {
            if (studyListen.getIsVip() == 0) {
                // 需要会员查看
                if (!isVip) {
                    // 不是会员
@@ -1027,7 +1097,7 @@
        // 非会员只能查看非会员题目,会员可以查看所有题目
        List<TStudyPair> pairList = studyPairService.pictureMateVoice(quarter, week, day);
        for (TStudyPair pair : pairList) {
            if (pair.getIsVip() == 1) {
            if (pair.getIsVip() == 0) {
                // 需要会员查看
                if (!isVip) {
                    // 不是会员
@@ -1045,7 +1115,7 @@
     */
    @PostMapping("/completeLearning")
    @ApiOperation(value = "完成学习", tags = {"学习端-听-自主学习"})
    public R<Boolean> completeLearning(@RequestBody CompleteStudyDTO completeStudy) {
    public R<Integer> completeLearning(@RequestBody CompleteStudyDTO completeStudy) {
        LoginUserParent userStudy = tokenService.getLoginUserStudy();
        if (null == userStudy) {
            return R.tokenError("登录失效!");
@@ -1066,6 +1136,7 @@
                .eq(TUserStudyRecord::getWeek, completeStudy.getWeek())
                .eq(TUserStudyRecord::getDay, completeStudy.getDay())
                .eq(TUserStudyRecord::getType, 0)
                .eq(TUserStudyRecord::getStudyType, completeStudy.getType())
                .eq(TUserStudyRecord::getUserId, userId).list();
        if (list.isEmpty()) {
            obtainedIntegral = 0;
@@ -1092,6 +1163,8 @@
            record.setQuarter(completeStudy.getQuarter());
            record.setWeek(completeStudy.getWeek());
            record.setDay(completeStudy.getDay());
            // 学习类型
            record.setStudyType(completeStudy.getType());
            record.setObtainedIntegral(integral);
            record.setType(Constants.ZERO);
            update = update && studyRecordService.save(record);
@@ -1103,7 +1176,7 @@
            userStudyRecord = createUserStudy(userId);
        }
        Boolean updateStudyRecord = userStudyService.exchangeStudyRecord(userStudyRecord, userId, completeStudy);
        return R.ok(update && updateStudyRecord);
        return R.ok(sum > obtainedIntegral ? sum - obtainedIntegral : 0);
    }
    /**
@@ -1149,7 +1222,7 @@
            throw new GlobalException("当前周目下day1 - day5题目不足!");
        }
        // 根据游戏设置数量获取图片及语音
        List<String> subjectData = getData(game, newSubjectId);
        List<String> subjectData = getData(game, newSubjectId, 1);
        List<TSubject> subjectList = getSubjectList(subjectData);
        return R.ok(new StudyGameResultVO(game, subjectList));
    }
@@ -1198,16 +1271,22 @@
            throw new GlobalException("当前周目下day1 - day5题目不足!");
        }
        // 根据游戏设置数量获取图片及语音
        return getData(game, newSubjectId);
        return getData(game, newSubjectId, 2);
    }
    private List<String> getData(TGame game, List<String> newSubjectId) {
    private List<String> getData(TGame game, List<String> newSubjectId, int num) {
        List<String> subjectData = new ArrayList<>();
        Random random = new Random();
        // 获取列表大小
        int dataSize = newSubjectId.size();
        // 生成随机索引并获取数据
        for (int i = 0; i < game.getCount(); i++) {
        int index;
        if (1 == num) {
            index = game.getCount();
        } else {
            index = game.getAnswerCount();
        }
        for (int i = 0; i < index; i++) {
            // 生成随机索引
            int randomIndex = random.nextInt(dataSize);
            // 获取对应的数据并加入结果列表
@@ -1239,7 +1318,7 @@
     */
    @PostMapping("/gameAchievement")
    @ApiOperation(value = "完成游戏-记录游戏测试成绩", tags = {"学习端-听-自主游戏"})
    public R<Boolean> gameAchievement(@RequestBody CompleteGameDTO completeStudy) {
    public R<Integer> gameAchievement(@RequestBody CompleteGameDTO completeStudy) {
        LoginUserParent loginUserStudy = tokenService.getLoginUserStudy();
        if (null == loginUserStudy) {
            return R.tokenError("登录失效!");
@@ -1279,6 +1358,18 @@
            user.setIntegral(user.getIntegral() + availableIntegral);
            add = add && userService.updateById(user);
        }
        // 学习时长更新
        TUserStudy userStudy = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, userid)
                .eq(TUserStudy::getDisabled, 0).one();
        if (null == userStudy) {
            userStudy = createUserStudy(userid);
        }
        // 学习时长
        userStudy.setTotalStudy(userStudy.getTotalStudy() + completeStudy.getUseTime());
        userStudy.setTodayStudy(userStudy.getTodayStudy() + completeStudy.getUseTime());
        userStudy.setWeekStudy(userStudy.getWeekStudy() + completeStudy.getUseTime());
        userStudy.setMonthStudy(userStudy.getMonthStudy() + completeStudy.getUseTime());
        userStudyService.updateById(userStudy);
        // 超级记忆逻辑
        if (Constants.MEMORY.equals(completeStudy.getGameName())) {
            // 学习配置列表
@@ -1296,18 +1387,7 @@
            String rate = game.getRate().split(",")[completeStudy.getDifficulty()];
            add = add && completeStudy.getAccuracy() >= Integer.parseInt(rate);
        }
        // 学习时长更新
        TUserStudy userStudy = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, userid)
                .eq(TUserStudy::getDisabled, 0).one();
        if (null == userStudy) {
            userStudy = createUserStudy(userid);
            userStudy.setTotalStudy(userStudy.getTotalStudy() + completeStudy.getUseTime());
            userStudy.setTodayStudy(userStudy.getTodayStudy() + completeStudy.getUseTime());
            userStudy.setWeekStudy(userStudy.getWeekStudy() + completeStudy.getUseTime());
            userStudy.setMonthStudy(userStudy.getMonthStudy() + completeStudy.getUseTime());
        }
        boolean update = userStudyService.updateById(userStudy);
        return R.ok(add && update);
        return R.ok(availableIntegral);
    }
    private TUserStudy createUserStudy(Integer userid) {
@@ -1418,7 +1498,7 @@
            @ApiImplicitParam(value = "正确率", name = "accuracy", dataType = "Integer"),
            @ApiImplicitParam(value = "学习时长(秒)", name = "studyTime", dataType = "Integer", required = true)
    })
    public R<Boolean> completeStory(@RequestParam Integer storyId, @RequestParam Integer type,
    public R<Integer> 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();
@@ -1447,6 +1527,7 @@
            throw new GlobalException("学习时长更新失败!");
        }
        // 根据故事类型不同,逻辑处理
        int sum = 0;
        if (Constants.ONE.equals(type)) {
            if (null == accuracy) {
                throw new GlobalException("自主故事-看图配音正确率异常!");
@@ -1472,6 +1553,7 @@
                data.setType(Constants.ONE);
                data.setStoryId(storyId);
                result = studyRecordService.save(data);
                sum = integral - obtainedIntegral;
            }
        } else {
            // 超级记忆只有首次才能获取积分
@@ -1487,9 +1569,10 @@
                // 添加积分
                user.setIntegral(user.getIntegral() + storyListen.getIntegral());
                result = result && userService.updateById(user);
                sum = storyListen.getIntegral();
            }
        }
        return R.ok(result);
        return R.ok(sum);
    }
    @GetMapping("/studyRecord")
@@ -1519,9 +1602,11 @@
            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());
            List<TStudy> studyList = studyService.lambdaQuery().eq(TStudy::getDisabled, 0)
                    .eq(TStudy::getType, Constants.ONE)
                    .orderByAsc(TStudy::getWeek).list();
            int size = studyService.residueWeek(studyRecord, studyList);
            studyRecord.setSurplus(size);
        }
        return R.ok(new StudyRecordResultVO(studyRecord, gameRecordList));
    }
@@ -1597,7 +1682,14 @@
        if (tokenService.getLoginUserStudy() == null) {
            return R.tokenError("登录失效");
        }
        return R.ok(integralRecordService.integralDetail(new Page<>(pageNum, pageSize), tokenService.getLoginUserStudy().getUserid(), time));
        IPage<TIntegralRecord> page = integralRecordService.integralDetail(new Page<>(pageNum, pageSize),
                tokenService.getLoginUserStudy().getUserid(), time);
        for (TIntegralRecord record : page.getRecords()) {
            if (!record.getIntegral().startsWith("-")) {
                record.setIntegral("+" + record.getIntegral());
            }
        }
        return R.ok(page);
    }
    @GetMapping("/integralDetailParent")