|
|
@@ -21,6 +21,7 @@ import com.yingyangfly.core.service.*;
|
|
|
import com.yingyangfly.core.service.impl.AppUserService;
|
|
|
import com.yingyangfly.core.service.impl.SysDictDataService;
|
|
|
import com.yingyangfly.redis.client.RedisClient;
|
|
|
+import io.swagger.models.auth.In;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.jacoco.agent.rt.internal_035b120.core.internal.flow.IFrame;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
@@ -28,6 +29,9 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.transaction.support.TransactionSynchronizationManager;
|
|
|
import javax.annotation.Resource;
|
|
|
+import java.lang.reflect.Array;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.temporal.ChronoUnit;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.ThreadPoolExecutor;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
@@ -73,16 +77,7 @@ public class RecommendFacade {
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
- ReviewTaskService reviewTaskService;
|
|
|
-
|
|
|
- @Resource
|
|
|
- ReviewRecordMapper reviewRecordMapper;
|
|
|
-
|
|
|
- @Resource
|
|
|
- ReviewService reviewService;
|
|
|
-
|
|
|
- @Resource
|
|
|
- GameRecommendationRecordService gameRecommendationRecordService;
|
|
|
+ GameTaskDetailService gameTaskDetailService;
|
|
|
|
|
|
/**
|
|
|
* 给用户推荐 畅游蓝豚和 首页推荐
|
|
|
@@ -195,7 +190,7 @@ public class RecommendFacade {
|
|
|
log.info("<<<<<<<<<<<<保存推荐游戏记录响应:{}>>>>>>>>>>>>>>",gameRecommend);
|
|
|
}
|
|
|
/**
|
|
|
- * 推荐 蓝豚 或者 首页
|
|
|
+ * 推荐 首页
|
|
|
*
|
|
|
* @param rule
|
|
|
* @throws InterruptedException
|
|
|
@@ -216,7 +211,7 @@ public class RecommendFacade {
|
|
|
String thName = Thread.currentThread().getName();
|
|
|
log.info("形成gameUser Thread: {}", thName);
|
|
|
for (AppUser appUser : appUsers) {
|
|
|
- List<Game> games = getGameAccordingByRules(rule, appUser);
|
|
|
+ List<Game> games = recommendationB(appUser);
|
|
|
if (CollectionUtil.isEmpty(games)) {
|
|
|
continue;
|
|
|
}
|
|
|
@@ -233,6 +228,9 @@ public class RecommendFacade {
|
|
|
log.info("<<<<<<<<<<<<保存推荐游戏记录>>>>>>>>>>>>>>");
|
|
|
boolean gameRecommend = gameRecommendRecordService.saveBatch(allGameUsers, rule.getOrgCode(), rule.getOrgName(), rule.getRecommendPlayClass());
|
|
|
log.info("<<<<<<<<<<<<保存推荐游戏记录响应:{}>>>>>>>>>>>>>>",gameRecommend);
|
|
|
+ log.info("<<<<<<<<<<<<<<<<删除已经通关数据开始>>>>>>>>>>>>>>>>>>");
|
|
|
+ gameUserService.removeDelUserGameDone();
|
|
|
+ log.info("<<<<<<<<<<<<<<<<删除已经通关数据结束>>>>>>>>>>>>>>>>>>");
|
|
|
}
|
|
|
|
|
|
private void recommendUserBorCByRule(GameRecommendRule rule, AppUser appUser) {
|
|
|
@@ -378,176 +376,313 @@ public class RecommendFacade {
|
|
|
* @return
|
|
|
*/
|
|
|
private List<Game> recommendationA(AppUser appUser){
|
|
|
- // 以生成理疗任务的返回空
|
|
|
- List<Game> gameList = Lists.newArrayList();
|
|
|
-
|
|
|
- QueryWrapper<GameTask> gameTaskWrapper = new QueryWrapper();
|
|
|
- gameTaskWrapper.eq("user_id", appUser.getId());
|
|
|
- gameTaskWrapper.eq("task_start_time", DateUtil.today());
|
|
|
- GameTask gameTasks = gameTaskService.getOne(gameTaskWrapper);
|
|
|
- if (ObjectUtils.isNotNull(gameTasks)){
|
|
|
+ String tags = appUser.getTags();
|
|
|
+ if (ObjectUtils.isNull(tags)){
|
|
|
return null;
|
|
|
}
|
|
|
- log.info("=======================今日理疗任务为空继续执行======================");
|
|
|
- // 测评有问题的 类型
|
|
|
- Set<String> typeSet = new HashSet<>();
|
|
|
- // 查询用户最近测评任务
|
|
|
- LambdaQueryWrapper<ReviewTask> mocaWrapper = new LambdaQueryWrapper<>();
|
|
|
- mocaWrapper.eq(ReviewTask::getUserId,appUser.getId());
|
|
|
- mocaWrapper.orderByDesc(ReviewTask::getReviewTime)
|
|
|
- .last("limit 1");
|
|
|
- mocaWrapper.eq(ReviewTask::getType,"MOCA");
|
|
|
- mocaWrapper.eq(ReviewTask::getStatus,"1");
|
|
|
- ReviewTask mocaReviewTask = reviewTaskService.getOne(mocaWrapper);
|
|
|
-
|
|
|
- LambdaQueryWrapper<ReviewTask> mmseWrapper = new LambdaQueryWrapper<>();
|
|
|
- mmseWrapper.eq(ReviewTask::getUserId,appUser.getId());
|
|
|
- mmseWrapper.orderByDesc(ReviewTask::getReviewTime)
|
|
|
- .last("limit 1");
|
|
|
- mmseWrapper.eq(ReviewTask::getType,"MMSE");
|
|
|
- mmseWrapper.eq(ReviewTask::getStatus,"1");
|
|
|
- ReviewTask mmseReviewTask = reviewTaskService.getOne(mmseWrapper);
|
|
|
-
|
|
|
- String reviewTaskId = null;
|
|
|
-
|
|
|
- if (ObjectUtils.isNotNull(mocaReviewTask)){
|
|
|
- reviewTaskId = mocaReviewTask.getReviewTaskId();
|
|
|
- LambdaQueryWrapper<ReviewRecord> mocaReviewRecordWrapper = new LambdaQueryWrapper<>();
|
|
|
- mocaReviewRecordWrapper.eq(ReviewRecord::getUserId,appUser.getId());
|
|
|
- mocaReviewRecordWrapper.eq(ReviewRecord::getReviewTaskId,mocaReviewTask.getId());
|
|
|
- mocaReviewRecordWrapper.eq(ReviewRecord::getCorrect,"0");
|
|
|
- List<ReviewRecord> mocaReviewRecords = reviewRecordMapper.selectList(mocaReviewRecordWrapper);
|
|
|
- for (ReviewRecord mocaReviewRecord : mocaReviewRecords) {
|
|
|
- Review mocaReview = reviewService.getById(mocaReviewRecord.getReviewId());
|
|
|
- typeSet.add(mocaReview.getViewType());
|
|
|
+ List<Game> gameList = new ArrayList<>();
|
|
|
+ // 用户认知障碍 标签
|
|
|
+ List<String> tagLsis = Arrays.stream(tags.split(",")).collect(Collectors.toList());
|
|
|
+ // 获取游戏难度
|
|
|
+ String difficultyLevel = difficultyLevel(appUser);
|
|
|
+ // 获取游戏
|
|
|
+ for (String tag : tagLsis) {
|
|
|
+ LambdaQueryWrapper<Game> gameLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ gameLambdaQueryWrapper.eq(Game::getGameType,tag);
|
|
|
+ gameLambdaQueryWrapper.eq(Game::getGameDifficulty,difficultyLevel);
|
|
|
+ List<Game> list = gameService.list(gameLambdaQueryWrapper);
|
|
|
+ // 大于等于4时去掉上次推荐的游戏
|
|
|
+ if (list.size() >= 4){
|
|
|
+ LambdaQueryWrapper<GameTask> gameTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ gameTaskLambdaQueryWrapper.eq(GameTask::getUserId,appUser.getId());
|
|
|
+ gameTaskLambdaQueryWrapper.orderByDesc(GameTask::getTaskStartTime).last("limit 1");
|
|
|
+ GameTask gameTask = gameTaskService.getOne(gameTaskLambdaQueryWrapper);
|
|
|
+ if (gameTask != null){
|
|
|
+ LambdaQueryWrapper<GameTaskDetail> gameTaskDetailLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ gameTaskDetailLambdaQueryWrapper.eq(GameTaskDetail::getTaskId,gameTask.getId());
|
|
|
+ gameTaskDetailLambdaQueryWrapper.eq(GameTaskDetail::getGameType,tag);
|
|
|
+ List<GameTaskDetail> gameTaskDetailList = gameTaskDetailService.list(gameTaskDetailLambdaQueryWrapper);
|
|
|
+ if (!gameTaskDetailList.isEmpty() && gameTaskDetailList.size() <= 2){
|
|
|
+ Set<String> gameCodesToDelete = gameTaskDetailList.stream()
|
|
|
+ .map(GameTaskDetail::getGameCode)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ List<Game> filteredGameList = list.stream()
|
|
|
+ .filter(game -> !gameCodesToDelete.contains(game.getGameCode()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ list.clear(); // 清空原始列表
|
|
|
+ list.addAll(filteredGameList); // 将过滤后的列表添加到原始列表中
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- if (ObjectUtils.isNotNull(mmseReviewTask)){
|
|
|
- reviewTaskId = mmseReviewTask.getReviewTaskId();
|
|
|
- LambdaQueryWrapper<ReviewRecord> mocaReviewRecordWrapper = new LambdaQueryWrapper<>();
|
|
|
- mocaReviewRecordWrapper.eq(ReviewRecord::getUserId,appUser.getId());
|
|
|
- mocaReviewRecordWrapper.eq(ReviewRecord::getReviewTaskId,mmseReviewTask.getId());
|
|
|
- mocaReviewRecordWrapper.eq(ReviewRecord::getCorrect,"0");
|
|
|
- List<ReviewRecord> mmseReviewRecords = reviewRecordMapper.selectList(mocaReviewRecordWrapper);
|
|
|
- for (ReviewRecord mmseReviewRecord : mmseReviewRecords) {
|
|
|
- Review mocaReview = reviewService.getById(mmseReviewRecord.getReviewId());
|
|
|
- typeSet.add(mocaReview.getViewType());
|
|
|
+ // 去除之后 小于等于2时 之间添加 否则随机获取两个
|
|
|
+ if (list.size() <= 2){
|
|
|
+ gameList.addAll(list);
|
|
|
+ }else {
|
|
|
+ // 打乱集合,获取前两个
|
|
|
+ Collections.shuffle(list);
|
|
|
+ gameList.add(list.get(0));
|
|
|
+ gameList.add(list.get(1));
|
|
|
}
|
|
|
}
|
|
|
- if (ObjectUtils.isNull(reviewTaskId)){
|
|
|
+ return gameList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 推荐 认知训练游戏
|
|
|
+ * @param appUser
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<Game> recommendationB(AppUser appUser) {
|
|
|
+ String tags = appUser.getTags();
|
|
|
+ if (ObjectUtils.isNull(tags)){
|
|
|
return null;
|
|
|
}
|
|
|
+ List<Game> gameList = new ArrayList<>();
|
|
|
+ List<String> tagList = Arrays.stream(tags.split(",")).collect(Collectors.toList());
|
|
|
+ // 获取游戏难度
|
|
|
+ String difficultyLevel = difficultyLevel(appUser);
|
|
|
+
|
|
|
+ // 获取所以游戏 并按认知域进行划分
|
|
|
+ LambdaQueryWrapper<Game> gameLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ gameLambdaQueryWrapper.eq(Game::getGameDifficulty,difficultyLevel);
|
|
|
+ List<Game> games = gameService.list(gameLambdaQueryWrapper);
|
|
|
+ Map<String, List<Game>> typeToGameMap = games.stream().collect(Collectors.groupingBy(Game::getGameType));
|
|
|
+
|
|
|
+ //判断是否三天时间都没有通关游戏,如果是就删除以前的游戏,重新随机推荐
|
|
|
+ LambdaQueryWrapper<GameUser> wrapper = new LambdaQueryWrapper();
|
|
|
+ wrapper.eq(GameUser::getPlayClass, "B");
|
|
|
+ wrapper.eq(GameUser::getUserId,appUser.getId());
|
|
|
+ wrapper.eq(GameUser::getStatus,StatusEnums.OK.getCode());
|
|
|
+ wrapper.le(GameUser::getCreateTime, LocalDate.now().atStartOfDay());
|
|
|
+ LocalDate threeDaysAgo = LocalDate.now().minus(3, ChronoUnit.DAYS);
|
|
|
+ wrapper.ge(GameUser::getCreateTime, threeDaysAgo.atStartOfDay()); // 大于等于三天前的开始时间
|
|
|
+ long count = gameUserService.count(wrapper);
|
|
|
+ if (count==0){
|
|
|
+ LambdaQueryWrapper<GameUser> deleteWrapper = new LambdaQueryWrapper();
|
|
|
+ deleteWrapper.eq(GameUser::getPlayClass, "B");
|
|
|
+ deleteWrapper.eq(GameUser::getUserId,appUser.getId());
|
|
|
+ deleteWrapper.eq(GameUser::getStatus,StatusEnums.DISABLE.getCode());
|
|
|
+ gameUserService.remove(deleteWrapper);
|
|
|
+ }
|
|
|
|
|
|
- Integer frequency = 1;
|
|
|
- Integer recommendNum = 1;
|
|
|
-
|
|
|
- // 获取这个评估任务以前推荐的游戏
|
|
|
- LambdaQueryWrapper<GameRecommendationRecord> gameRecommendationRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
- gameRecommendationRecordLambdaQueryWrapper.eq(GameRecommendationRecord::getReviewTaskId,reviewTaskId);
|
|
|
- gameRecommendationRecordLambdaQueryWrapper.eq(GameRecommendationRecord::getPlayClass,"A");
|
|
|
- gameRecommendationRecordLambdaQueryWrapper.orderByDesc(GameRecommendationRecord::getCreateTime)
|
|
|
- .last("limit 1");
|
|
|
- GameRecommendationRecord one = gameRecommendationRecordService.getOne(gameRecommendationRecordLambdaQueryWrapper);
|
|
|
- if (ObjectUtils.isNotNull(one)){
|
|
|
- // 不为空,判断是否推荐了7次
|
|
|
- if (one.getRecommendNum() != 7) {
|
|
|
- List<String> GameCodes = Arrays.stream(one.getGameCodes().split(","))
|
|
|
- .collect(Collectors.toList());
|
|
|
- for (String gameCode : GameCodes) {
|
|
|
- LambdaQueryWrapper<Game> gameWrapper = new LambdaQueryWrapper<>();
|
|
|
- gameWrapper.eq(Game::getGameCode,gameCode).last("limit 1");
|
|
|
- Game game = gameService.getOne(gameWrapper);
|
|
|
- if (ObjectUtils.isNotNull(game)){
|
|
|
- gameList.add(game);
|
|
|
+ // 判断用户 认知障碍对应的认知域 是否有两个未通关的游戏,缺少了进行添加
|
|
|
+ // 获取未通过的 专属训练游戏(原 推荐游戏)
|
|
|
+ LambdaQueryWrapper<GameUser> gameUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ gameUserLambdaQueryWrapper.eq(GameUser::getUserId,appUser.getId());
|
|
|
+ gameUserLambdaQueryWrapper.eq(GameUser::getStatus,StatusEnums.DISABLE.getCode());
|
|
|
+ gameUserLambdaQueryWrapper.eq(GameUser::getPlayClass,"B");
|
|
|
+ List<GameUser> gameUserList = gameUserService.list(gameUserLambdaQueryWrapper);
|
|
|
+ Map<String, List<GameUser>> typeToUsersMap = gameUserList.stream()
|
|
|
+ .collect(Collectors.groupingBy(GameUser::getGameType));
|
|
|
+ // 判断每个认知域 是否有两个未完成的游戏
|
|
|
+ for (String tag : tagList) {
|
|
|
+ List<GameUser> gameUsers = typeToUsersMap.getOrDefault(tag, Collections.emptyList());
|
|
|
+ LambdaQueryWrapper<GameUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ lambdaQueryWrapper.eq(GameUser::getUserId,appUser.getId());
|
|
|
+ lambdaQueryWrapper.eq(GameUser::getStatus,StatusEnums.OK.getCode());
|
|
|
+ lambdaQueryWrapper.eq(GameUser::getPlayClass,"B");
|
|
|
+
|
|
|
+ List<Game> tagGameList = typeToGameMap.getOrDefault(tag, Collections.emptyList());
|
|
|
+ // 该认知域 游戏少于两个补全到两个
|
|
|
+ if (gameUsers.size() == 1) {
|
|
|
+ // 排除已经存在的
|
|
|
+ List<Game> tagGamesList1 = tagGameList.stream().filter(game -> !game.getGameCode().equals(gameUsers.get(0).getGameCode())).collect(Collectors.toList());
|
|
|
+
|
|
|
+ lambdaQueryWrapper.orderByDesc(GameUser::getUpdateTime).last("limit 1");
|
|
|
+ GameUser gameUser = gameUserService.getOne(lambdaQueryWrapper);
|
|
|
+ // 判读是否为空
|
|
|
+ if (ObjectUtils.isNull(gameUser)){
|
|
|
+ // 为空直接随机获取
|
|
|
+ if (!tagGamesList1.isEmpty()){
|
|
|
+ if (tagGamesList1.size() > 1){
|
|
|
+ Collections.shuffle(tagGamesList1);
|
|
|
+ }
|
|
|
+ gameList.add(tagGamesList1.get(0));
|
|
|
}
|
|
|
- }
|
|
|
- frequency = one.getFrequency();
|
|
|
- recommendNum = one.getRecommendNum() + 1;
|
|
|
- } else {
|
|
|
- // 为空当作已经推荐了7次,排除已经推荐后的游戏再推荐
|
|
|
- // 存在两种情况 一种 所有游戏已经全部推荐完了,再次随机推荐, 第二种情况 还有游戏没有推荐,排除已经推荐的,对没有推荐的游戏随机推荐
|
|
|
-
|
|
|
- // 获取已推荐的所有游戏
|
|
|
- LambdaQueryWrapper<GameRecommendationRecord> gameRecommendationRecordQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
- gameRecommendationRecordQueryWrapper.eq(GameRecommendationRecord::getReviewTaskId,reviewTaskId);
|
|
|
- gameRecommendationRecordQueryWrapper.eq(GameRecommendationRecord::getFrequency,one.getFrequency());
|
|
|
- gameRecommendationRecordQueryWrapper.eq(GameRecommendationRecord::getPlayClass,"A");
|
|
|
- List<GameRecommendationRecord> gameRecommendationRecordList = gameRecommendationRecordService.list(gameRecommendationRecordLambdaQueryWrapper);
|
|
|
- List<String> gameCodes = new ArrayList<>();
|
|
|
- for (GameRecommendationRecord gameRecommendationRecord : gameRecommendationRecordList) {
|
|
|
- gameCodes.addAll(Arrays.stream(gameRecommendationRecord.getGameCodes().split(",")).collect(Collectors.toList()));
|
|
|
- }
|
|
|
- Map<String,Game> gameMap = new HashMap<>();
|
|
|
- // 测评有问题的 类型的所有游戏
|
|
|
- for (String type : typeSet) {
|
|
|
- LambdaQueryWrapper<Game> gameLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
- gameLambdaQueryWrapper.eq(Game::getGameType,type);
|
|
|
- List<Game> gameTypes = gameService.list(gameLambdaQueryWrapper);
|
|
|
- if (CollectionUtil.isNotEmpty(gameTypes)){
|
|
|
- Map<String, Game> map = gameTypes.stream().collect(Collectors.toMap(Game::getGameCode, game -> game));
|
|
|
- gameMap.putAll(map);
|
|
|
+ } else {
|
|
|
+ // 不为空 获取对应认知域 难度的所有游戏 去除上次完成的游戏 后如果超过1个进行随机获取, 如果没有了 查询所以随机获取
|
|
|
+ List<Game> excludeLastGame = new ArrayList<>();
|
|
|
+ if (!tagGamesList1.isEmpty()){
|
|
|
+ if (tagGamesList1.size() > 1){
|
|
|
+ // 大于1 排除上次刚完成的游戏
|
|
|
+ excludeLastGame = tagGamesList1.stream().filter(game -> !game.getGameCode().equals(gameUser.getGameCode())).collect(Collectors.toList());
|
|
|
+ }else {
|
|
|
+ excludeLastGame.addAll(tagGamesList1);
|
|
|
+ }
|
|
|
+ if (excludeLastGame.size() <= 1){
|
|
|
+ gameList.addAll(excludeLastGame);
|
|
|
+ }else{
|
|
|
+ Collections.shuffle(excludeLastGame);
|
|
|
+ gameList.add(excludeLastGame.get(0));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
- // 清除已经推荐的游戏
|
|
|
- gameCodes.forEach(gameMap::remove);
|
|
|
- // 判断是否已经全部推荐过一次了
|
|
|
- if (gameMap.isEmpty()){
|
|
|
- // 已全部推荐过一次 ,重新随机推荐
|
|
|
- frequency = one.getFrequency()+1;
|
|
|
- for (String type : typeSet) {
|
|
|
- LambdaQueryWrapper<Game> gameLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
- gameLambdaQueryWrapper.eq(Game::getGameType,type).last("limit 1");
|
|
|
- Game game = gameService.getOne(gameLambdaQueryWrapper);
|
|
|
- if (ObjectUtils.isNotNull(game)){
|
|
|
- gameList.add(game);
|
|
|
+ }
|
|
|
+ if (gameUsers.isEmpty()){
|
|
|
+ lambdaQueryWrapper.orderByDesc(GameUser::getUpdateTime).last("limit 2");
|
|
|
+ List<GameUser> list = gameUserService.list(lambdaQueryWrapper);
|
|
|
+ if (list.isEmpty()){
|
|
|
+ // 为空直接随机获取
|
|
|
+ if (!tagGameList.isEmpty()){
|
|
|
+ if (tagGameList.size() > 2){
|
|
|
+ Collections.shuffle(tagGameList);
|
|
|
+ }
|
|
|
+ gameList.add(tagGameList.get(0));
|
|
|
+ if (tagGameList.size()>1){
|
|
|
+ gameList.add(tagGameList.get(1));
|
|
|
}
|
|
|
}
|
|
|
}else {
|
|
|
- // 从剩余的里面 根据缺陷类型各随机选取一款
|
|
|
- frequency = one.getFrequency();
|
|
|
- List<Game> games = gameMap.values().stream().collect(Collectors.toList());
|
|
|
- for (String type : typeSet) {
|
|
|
- int i = 0;
|
|
|
- for (Game game : games) {
|
|
|
- if (game.getGameType().equals(type)){
|
|
|
- if (i == 0){
|
|
|
- gameList.add(game);
|
|
|
- i++;
|
|
|
+ if (!tagGameList.isEmpty()){
|
|
|
+ if (tagGameList.size() > 2){
|
|
|
+ if (tagGameList.size() == 3){
|
|
|
+ List<Game> collect = tagGameList.stream().filter(game -> !game.getGameCode().equals(list.get(0).getGameCode())).collect(Collectors.toList());
|
|
|
+ gameList.addAll(collect);
|
|
|
+ }else {
|
|
|
+ Set<String> gameCodesToDelete = list.stream()
|
|
|
+ .map(GameUser::getGameCode)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ List<Game> filteredGameList = tagGameList.stream()
|
|
|
+ .filter(game -> !gameCodesToDelete.contains(game.getGameCode()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (filteredGameList.size() > 2){
|
|
|
+ Collections.shuffle(filteredGameList);
|
|
|
}
|
|
|
+ gameList.add(filteredGameList.get(0));
|
|
|
+ if (filteredGameList.size()>1){
|
|
|
+ gameList.add(filteredGameList.get(1));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ gameList.add(tagGameList.get(0));
|
|
|
+ if (tagGameList.size()>1){
|
|
|
+ gameList.add(tagGameList.get(1));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
}
|
|
|
- }else {
|
|
|
- // 为空 代表该评估任务没有推荐记录 随机进行推荐
|
|
|
- if (typeSet.size() == 0){
|
|
|
- return null;
|
|
|
- }
|
|
|
- for (String type : typeSet) {
|
|
|
- LambdaQueryWrapper<Game> gameLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
- gameLambdaQueryWrapper.eq(Game::getGameType,type).last("limit 1");
|
|
|
- Game game = gameService.getOne(gameLambdaQueryWrapper);
|
|
|
- if (ObjectUtils.isNotNull(game)){
|
|
|
- gameList.add(game);
|
|
|
+ }
|
|
|
+ return gameList;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断推荐游戏的困难等级
|
|
|
+ * @param appUser
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String difficultyLevel(AppUser appUser) {
|
|
|
+ // 获取基础信息
|
|
|
+ Integer mentalEnergy = appUser.getMentalEnergy();
|
|
|
+ Integer age = appUser.getAge();
|
|
|
+ String education = appUser.getEducation();
|
|
|
+
|
|
|
+ // 根据脑力值获取难度
|
|
|
+ Integer gameDifficulty = getGameMentalEnergyDifficulty(mentalEnergy);
|
|
|
+
|
|
|
+ // 根据年龄调整难度
|
|
|
+ Integer gameAgeDifficulty = getGameAgeDifficulty(age);
|
|
|
+ if (gameAgeDifficulty < gameDifficulty) {
|
|
|
+ gameDifficulty--;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据学历调整难度
|
|
|
+ Integer gameEducation = getGameEducation(education);
|
|
|
+ if (gameEducation < gameDifficulty) {
|
|
|
+ gameDifficulty--;
|
|
|
+ }
|
|
|
+ // 获取最近一次的 专属任务(原理疗任务)
|
|
|
+ LambdaQueryWrapper<GameTask> gameTaskWrapper = new LambdaQueryWrapper<>();
|
|
|
+ gameTaskWrapper.eq(GameTask::getUserId,appUser.getId());
|
|
|
+ gameTaskWrapper.orderByDesc(GameTask::getTaskStartTime).last("limit 7");
|
|
|
+ List<GameTask> list = gameTaskService.list(gameTaskWrapper);
|
|
|
+ // 判断7天内 用户游戏是否全部无法通关
|
|
|
+ if (!list.isEmpty() && list.size() == 7) {
|
|
|
+ List<Long> ids = list.stream().map(gameTask -> gameTask.getId()).collect(Collectors.toList());
|
|
|
+ LambdaQueryWrapper<GameTaskDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ lambdaQueryWrapper.in(GameTaskDetail::getTaskId,ids);
|
|
|
+ long gameTaskDetailCount = gameTaskDetailService.count(lambdaQueryWrapper);
|
|
|
+ lambdaQueryWrapper.eq(GameTaskDetail::getStatus,"0");
|
|
|
+ long gameTaskDetailByStatusCount = gameTaskDetailService.count(lambdaQueryWrapper);
|
|
|
+ if (gameTaskDetailCount == gameTaskDetailByStatusCount){
|
|
|
+ lambdaQueryWrapper.eq(GameTaskDetail::getIsPass,"0");
|
|
|
+ long count = gameTaskDetailService.count(lambdaQueryWrapper);
|
|
|
+ if (count == 0 && gameDifficulty != 1) {
|
|
|
+ gameDifficulty--;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- gameRecommendationRecordService.saveBatch(gameList,appUser.getId(),"A",reviewTaskId,recommendNum,frequency);
|
|
|
|
|
|
- return gameList;
|
|
|
+ // 根据调整后的难度返回对应的等级
|
|
|
+ switch (gameDifficulty) {
|
|
|
+ case 1:
|
|
|
+ return "A";
|
|
|
+ case 2:
|
|
|
+ return "B";
|
|
|
+ default:
|
|
|
+ return "C";
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 推荐 认知训练游戏
|
|
|
- * @param appUser
|
|
|
+ * 根据学历获取困难等级
|
|
|
+ * @param education
|
|
|
* @return
|
|
|
*/
|
|
|
- private List<Game> recommendationB(AppUser appUser) {
|
|
|
- List<Game> gameList = new ArrayList<>();
|
|
|
- return gameList;
|
|
|
+ public Integer getGameEducation(String education){
|
|
|
+ if (ObjectUtils.isNull(education)){
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ if (education.equals("A")) {
|
|
|
+ return 1;
|
|
|
+ }else if (education.equals("B")) {
|
|
|
+ return 2;
|
|
|
+ } else if (education.equals("C")){
|
|
|
+ return 3;
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据脑力值获取困难程度
|
|
|
+ * @param mentalEnergy
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Integer getGameMentalEnergyDifficulty(Integer mentalEnergy){
|
|
|
+ if(mentalEnergy == null){
|
|
|
+ mentalEnergy = 0;
|
|
|
+ }
|
|
|
+ if(mentalEnergy< 300){
|
|
|
+ return 1;
|
|
|
+ }else if(mentalEnergy > 300 && mentalEnergy < 500){
|
|
|
+ return 2;
|
|
|
+ }else if(mentalEnergy > 500 && mentalEnergy <= 1000){
|
|
|
+ return 3;
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据年龄获取困难程度
|
|
|
+ */
|
|
|
+ public Integer getGameAgeDifficulty(Integer age){
|
|
|
+ if (age == null){
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ if (age > 70){
|
|
|
+ return 1;
|
|
|
+ } else if (age <= 70 && age > 60) {
|
|
|
+ return 2;
|
|
|
+ } else if (age <= 60){
|
|
|
+ return 3;
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|