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);