|
|
@@ -5,7 +5,9 @@ import cn.hutool.core.lang.Assert;
|
|
|
import cn.hutool.core.thread.ThreadUtil;
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
import com.google.common.collect.Lists;
|
|
|
import com.google.common.collect.Sets;
|
|
|
import com.yingyangfly.common.utils.DateUtils;
|
|
|
@@ -13,12 +15,14 @@ import com.yingyangfly.core.domain.*;
|
|
|
import com.yingyangfly.core.dto.RuleDto;
|
|
|
import com.yingyangfly.core.enums.RecommendRuleEnums;
|
|
|
import com.yingyangfly.core.enums.StatusEnums;
|
|
|
+import com.yingyangfly.core.mapper.ReviewRecordMapper;
|
|
|
import com.yingyangfly.core.security.util.TokenUtil;
|
|
|
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 lombok.extern.slf4j.Slf4j;
|
|
|
+import org.jacoco.agent.rt.internal_035b120.core.internal.flow.IFrame;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
@@ -67,6 +71,19 @@ public class RecommendFacade {
|
|
|
@Resource
|
|
|
RecommendRandom recommendRandom;
|
|
|
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ ReviewTaskService reviewTaskService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ ReviewRecordMapper reviewRecordMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ ReviewService reviewService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ GameRecommendationRecordService gameRecommendationRecordService;
|
|
|
+
|
|
|
/**
|
|
|
* 给用户推荐 畅游蓝豚和 首页推荐
|
|
|
*
|
|
|
@@ -113,7 +130,7 @@ public class RecommendFacade {
|
|
|
log.info("{}", TransactionSynchronizationManager.getCurrentTransactionName());
|
|
|
GameRecommendRule ruleA = getRule("A");
|
|
|
GameRecommendRule ruleB = getRule("B");
|
|
|
- GameRecommendRule ruleC = getRule("C");
|
|
|
+// GameRecommendRule ruleC = getRule("C");
|
|
|
try {
|
|
|
log.info("<<<<<<<<<<<<<<<推荐理疗任务开始>>>>>>>>>>>>>>");
|
|
|
recommendTaskByRule(ruleA);
|
|
|
@@ -160,7 +177,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 = recommendationA(appUser);
|
|
|
if (CollectionUtil.isEmpty(games)) {
|
|
|
continue;
|
|
|
}
|
|
|
@@ -354,4 +371,167 @@ public class RecommendFacade {
|
|
|
}
|
|
|
return randomElements;
|
|
|
}
|
|
|
-}
|
|
|
+
|
|
|
+ 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)){
|
|
|
+ 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());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ 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());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ObjectUtils.isNull(reviewTaskId)){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer frequency = 1;
|
|
|
+ Integer recommendNum = 1;
|
|
|
+
|
|
|
+ // 获取这个评估任务以前推荐的游戏
|
|
|
+ LambdaQueryWrapper<GameRecommendationRecord> gameRecommendationRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ gameRecommendationRecordLambdaQueryWrapper.eq(GameRecommendationRecord::getReviewTaskId,reviewTaskId);
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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());
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 清除已经推荐的游戏
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }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++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (CollectionUtil.isNotEmpty(gameList)){
|
|
|
+ gameRecommendationRecordService.saveBatch(gameList,appUser.getId(),"A",reviewTaskId,recommendNum,frequency);
|
|
|
+ }
|
|
|
+ return gameList;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|