MetaTaskToUserNewService.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package com.izouma.nineth.service;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import com.alibaba.excel.util.CollectionUtils;
  4. import com.izouma.nineth.config.Constants;
  5. import com.izouma.nineth.domain.*;
  6. import com.izouma.nineth.dto.MetaRestResult;
  7. import com.izouma.nineth.dto.MetaServiceResult;
  8. import com.izouma.nineth.dto.PageQuery;
  9. import com.izouma.nineth.enums.MetaAwardTypeEnum;
  10. import com.izouma.nineth.enums.MetaTaskStatus;
  11. import com.izouma.nineth.enums.MetaTaskType;
  12. import com.izouma.nineth.exception.BusinessException;
  13. import com.izouma.nineth.repo.*;
  14. import com.izouma.nineth.utils.JpaUtils;
  15. import com.izouma.nineth.utils.SecurityUtils;
  16. import lombok.AllArgsConstructor;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.apache.commons.lang3.StringUtils;
  19. import org.springframework.data.domain.Page;
  20. import org.springframework.stereotype.Service;
  21. import javax.transaction.Transactional;
  22. import java.time.LocalDateTime;
  23. import java.util.List;
  24. import java.util.Objects;
  25. @Service
  26. @AllArgsConstructor
  27. @Slf4j
  28. public class MetaTaskToUserNewService {
  29. private MetaTaskToUserNewRepo metaTaskToUserNewRepo;
  30. private MetaAtomTaskRepo metaAtomTaskRepo;
  31. private MetaTaskNewRepo metaTaskNewRepo;
  32. private MetaPropRepo metaPropRepo;
  33. private MetaTaskBindRepo metaTaskBindRepo;
  34. private MetaUserTaskProgressNewRepo metaUserTaskProgressNewRepo;
  35. private final String PREFIX = "0/";
  36. public Page<MetaTaskToUserNew> all(PageQuery pageQuery) {
  37. return metaTaskToUserNewRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaTaskToUserNew.class), JpaUtils.toPageRequest(pageQuery));
  38. }
  39. @Transactional
  40. public MetaRestResult<Void> autoReceiveTask() {
  41. Long userId = SecurityUtils.getAuthenticatedUser().getId();
  42. List<MetaTaskNew> metaTaskNews = metaTaskNewRepo.findUnReceivedAndAutoReceivedTask(userId);
  43. if (CollectionUtil.isNotEmpty(metaTaskNews)) {
  44. metaTaskNews.forEach(metaTaskNew -> {
  45. MetaTaskToUserNew metaTaskToUserNew = new MetaTaskToUserNew();
  46. metaTaskToUserNew.setUserId(userId);
  47. metaTaskToUserNew.setTaskId(metaTaskNew.getId());
  48. // 设置主动领取第一个索引的基础任务
  49. if (MetaTaskType.MAIN_LINE.equals(metaTaskNew.getType())) {
  50. Long atomTaskId = metaTaskBindRepo.findAtomTaskId(metaTaskNew.getId(), MetaTaskType.NODE.toString());
  51. if (Objects.nonNull(atomTaskId)) {
  52. metaTaskToUserNew.setAtomTaskId(atomTaskId);
  53. }
  54. }
  55. if (MetaTaskType.BRANCH_LINE.equals(metaTaskNew.getType())) {
  56. Long atomTaskId = metaTaskBindRepo.findAtomTaskId(metaTaskNew.getId(), MetaTaskType.BRANCH_LINE.toString());
  57. if (Objects.nonNull(atomTaskId)) {
  58. metaTaskToUserNew.setAtomTaskId(atomTaskId);
  59. }
  60. }
  61. if (MetaTaskType.DAILY.equals(metaTaskNew.getType())) {
  62. Long atomTaskId = metaTaskBindRepo.findAtomTaskId(metaTaskNew.getId(), MetaTaskType.DAILY.toString());
  63. if (Objects.nonNull(atomTaskId)) {
  64. metaTaskToUserNew.setAtomTaskId(atomTaskId);
  65. }
  66. }
  67. MetaRestResult<MetaTaskToUserNew> result = receiveTask(metaTaskToUserNew, false);
  68. if (Constants.MetaRestCode.success != result.getCode()) {
  69. throw new BusinessException(result.getMessage());
  70. }
  71. });
  72. return MetaRestResult.returnSuccess("主动任务领取成功");
  73. }
  74. return MetaRestResult.returnSuccess("玩家主动领取任务已经全部领取");
  75. }
  76. @Transactional
  77. public MetaRestResult<MetaTaskToUserNew> receiveTask(MetaTaskToUserNew metaTaskToUserNew, boolean progress) {
  78. if (Objects.isNull(metaTaskToUserNew.getUserId())) {
  79. return MetaRestResult.returnError("Illegal parameter : userId can not be null");
  80. }
  81. if (Objects.isNull(metaTaskToUserNew.getTaskId())) {
  82. return MetaRestResult.returnError("Illegal parameter : taskId can not be null");
  83. }
  84. if (Objects.isNull(metaTaskToUserNew.getAtomTaskId())) {
  85. return MetaRestResult.returnError("Illegal parameter : atomTaskId can not be null");
  86. }
  87. MetaTaskNew metaTaskNew = metaTaskNewRepo.findByIdAndDel(metaTaskToUserNew.getTaskId(), false);
  88. MetaServiceResult checkMetaTaskNewResult = checkMetaTaskNew(metaTaskNew);
  89. if (!checkMetaTaskNewResult.isSuccess()) {
  90. return MetaRestResult.returnError(checkMetaTaskNewResult.getMessage());
  91. }
  92. MetaAtomTask metaAtomTask = metaAtomTaskRepo.findByIdAndDel(metaTaskToUserNew.getAtomTaskId(), false);
  93. MetaServiceResult checkMetaAtomTaskResult = checkMetaAtomTask(metaAtomTask);
  94. if (!checkMetaAtomTaskResult.isSuccess()) {
  95. return MetaRestResult.returnError(checkMetaAtomTaskResult.getMessage());
  96. }
  97. // 判断当前玩家是否领取过基础任务
  98. MetaTaskToUserNew dbMetaTaskToUserNew = metaTaskToUserNewRepo.findByUserIdAndTaskIdAndAtomTaskIdAndDel(metaTaskToUserNew.getUserId(), metaTaskToUserNew.getTaskId(), metaTaskToUserNew.getAtomTaskId(), false);
  99. if (Objects.nonNull(dbMetaTaskToUserNew)) {
  100. return MetaRestResult.returnError(String.format("当前用户已在[%S]领取过该任务", dbMetaTaskToUserNew.getGetTime()));
  101. }
  102. metaTaskToUserNew.setGetTime(LocalDateTime.now());
  103. metaTaskToUserNew.setStatus(MetaTaskStatus.PROGRESS);
  104. metaTaskToUserNew.setChannelId(metaTaskNew.getChannelId());
  105. if (MetaAwardTypeEnum.META_PROP.equals(metaAtomTask.getAwardType())) {
  106. MetaProp metaProp = metaPropRepo.findByIdAndDel(Long.parseLong(metaAtomTask.getAwardConfig()), false);
  107. if (Objects.isNull(metaProp)) {
  108. return MetaRestResult.returnError(String.format("基础任务[%S]奖励配置的道具不存在", metaTaskToUserNew.getAtomTaskId()));
  109. }
  110. metaTaskToUserNew.setMetaProp(metaProp);
  111. }
  112. metaTaskToUserNew.setMetaTaskNew(metaTaskNew);
  113. metaTaskToUserNew.setMetaAtomTask(metaAtomTask);
  114. MetaTaskToUserNew save = metaTaskToUserNewRepo.save(metaTaskToUserNew);
  115. save.setMetaTaskNew(metaTaskNew);
  116. save.setMetaAtomTask(metaAtomTask);
  117. if (progress) {
  118. setProgress(save);
  119. }
  120. return MetaRestResult.returnSuccess(save);
  121. }
  122. public MetaRestResult<List<MetaTaskToUserNew>> findByStatus(Long userId, Long channelId, MetaTaskStatus status) {
  123. List<MetaTaskToUserNew> metaTaskToUsers = metaTaskToUserNewRepo.findAllByUserIdAndChannelIdAndStatusAndDel(userId, channelId, status, false);
  124. metaTaskToUsers.forEach(this::setSingleProgress);
  125. return MetaRestResult.returnSuccess(metaTaskToUsers);
  126. }
  127. public MetaRestResult<MetaTaskToUserNew> setSingleProgress(MetaTaskToUserNew metaTaskToUserNew) {
  128. MetaAtomTask metaAtomTask = metaAtomTaskRepo.findByIdAndDel(metaTaskToUserNew.getAtomTaskId(), false);
  129. MetaServiceResult checkMetaAtomTaskResult = checkMetaAtomTask(metaAtomTask);
  130. if (!checkMetaAtomTaskResult.isSuccess()) {
  131. return MetaRestResult.returnError(checkMetaAtomTaskResult.getMessage());
  132. }
  133. metaTaskToUserNew.setMetaAtomTask(metaAtomTask);
  134. MetaTaskNew metaTaskNew = metaTaskNewRepo.findByIdAndDel(metaTaskToUserNew.getTaskId(), false);
  135. MetaServiceResult checkMetaTaskNewResult = checkMetaTaskNew(metaTaskNew);
  136. if (!checkMetaTaskNewResult.isSuccess()) {
  137. return MetaRestResult.returnError(checkMetaTaskNewResult.getMessage());
  138. }
  139. metaTaskToUserNew.setMetaTaskNew(metaTaskNew);
  140. setProgress(metaTaskToUserNew);
  141. return MetaRestResult.returnSuccess(metaTaskToUserNew);
  142. }
  143. /**
  144. * 设置任务进度
  145. *
  146. * @param metaTaskToUserNew 任务领取信息
  147. */
  148. private void setProgress(MetaTaskToUserNew metaTaskToUserNew) {
  149. MetaAtomTask metaAtomTask = metaTaskToUserNew.getMetaAtomTask();
  150. List<Long> atomTaskIds = metaTaskBindRepo.findAtomTaskIds(metaTaskToUserNew.getTaskId());
  151. List<MetaTaskToUserNew> completed = metaTaskToUserNewRepo.findAllByUserIdAndStatusAndDelAndAtomTaskIdIn(metaTaskToUserNew.getUserId(), MetaTaskStatus.COMPLETION, false, atomTaskIds);
  152. metaTaskToUserNew.setProcess(String.valueOf(completed.size()).concat("/").concat(String.valueOf(atomTaskIds.size())));
  153. String value = metaAtomTask.getTargetConfig();
  154. switch (metaAtomTask.getTargetType()) {
  155. case COLLECT_COLLECTION:
  156. if (StringUtils.isBlank(value)) {
  157. String errMsg = "任务进度显示异常,缺少藏品id配置";
  158. log.error(errMsg);
  159. metaTaskToUserNew.setAtomTaskProcess(errMsg);
  160. break;
  161. }
  162. String[] split = value.split(" ");
  163. List<MetaUserTaskProgressNew> collectCollection = metaUserTaskProgressNewRepo.findAllByMetaTaskToUserNewIdAndDel(metaTaskToUserNew.getId(), false);
  164. if (CollectionUtils.isEmpty(collectCollection)) {
  165. metaTaskToUserNew.setAtomTaskProcess(PREFIX.concat(String.valueOf(split.length)));
  166. break;
  167. }
  168. metaTaskToUserNew.setAtomTaskProcess(String.valueOf(collectCollection.size()).concat("/").concat(String.valueOf(split.length)));
  169. break;
  170. case ON_LINE_TIME_DAILY:
  171. if (StringUtils.isBlank(value)) {
  172. String errMsg = "任务进度显示异常,缺少在线时长配置";
  173. log.error(errMsg);
  174. metaTaskToUserNew.setAtomTaskProcess(errMsg);
  175. break;
  176. }
  177. MetaUserTaskProgressNew onLineTimeDaily = metaUserTaskProgressNewRepo.findByMetaTaskToUserNewIdAndDelAndCreatedAtAfter(metaTaskToUserNew.getId(), false, LocalDateTime.now().withHour(0).withMinute(0).withSecond(0));
  178. if (Objects.isNull(onLineTimeDaily)) {
  179. metaTaskToUserNew.setAtomTaskProcess("0");
  180. break;
  181. }
  182. metaTaskToUserNew.setAtomTaskProcess(onLineTimeDaily.getRemark().concat("/").concat(value));
  183. break;
  184. case ACCUMULATE:
  185. if (StringUtils.isBlank(value)) {
  186. String errMsg = "任务进度显示异常,缺少累计任务的数量配置";
  187. log.error(errMsg);
  188. metaTaskToUserNew.setAtomTaskProcess(errMsg);
  189. break;
  190. }
  191. List<MetaUserTaskProgressNew> accumulate = metaUserTaskProgressNewRepo.findAllByMetaTaskToUserNewIdAndDel(metaTaskToUserNew.getId(), false);
  192. if (CollectionUtils.isEmpty(accumulate)) {
  193. metaTaskToUserNew.setAtomTaskProcess(PREFIX.concat(value));
  194. break;
  195. }
  196. metaTaskToUserNew.setAtomTaskProcess(String.valueOf(accumulate.size()).concat("/").concat(value));
  197. break;
  198. default:
  199. String errMsg = "不存在的任务类型";
  200. log.error(errMsg);
  201. metaTaskToUserNew.setAtomTaskProcess(errMsg);
  202. break;
  203. }
  204. }
  205. /**
  206. * 校验基础任务
  207. *
  208. * @param metaAtomTask 基础任务
  209. * @return result
  210. */
  211. private MetaServiceResult checkMetaAtomTask(MetaAtomTask metaAtomTask) {
  212. if (Objects.isNull(metaAtomTask)) {
  213. return MetaServiceResult.returnError("基础任务不存在");
  214. }
  215. if (StringUtils.isBlank(metaAtomTask.getName())) {
  216. return MetaServiceResult.returnError(String.format("基础任务[%S]缺少任务名称", metaAtomTask.getId()));
  217. }
  218. if (Objects.isNull(metaAtomTask.getDetail())) {
  219. return MetaServiceResult.returnError(String.format("基础任务[%S]缺少任务详情", metaAtomTask.getId()));
  220. }
  221. if (Objects.isNull(metaAtomTask.getTargetType())) {
  222. return MetaServiceResult.returnError(String.format("基础任务[%S]缺少目标", metaAtomTask.getId()));
  223. }
  224. if (StringUtils.isBlank(metaAtomTask.getTargetConfig())) {
  225. return MetaServiceResult.returnError(String.format("基础任务[%S]缺少目标配置", metaAtomTask.getId()));
  226. }
  227. if (Objects.isNull(metaAtomTask.getAwardType())) {
  228. return MetaServiceResult.returnError(String.format("基础任务[%S]缺少奖励类型", metaAtomTask.getId()));
  229. }
  230. if (StringUtils.isBlank(metaAtomTask.getAwardConfig())) {
  231. return MetaServiceResult.returnError(String.format("基础任务[%S]缺少奖励配置", metaAtomTask.getId()));
  232. }
  233. return MetaServiceResult.returnSuccess();
  234. }
  235. /**
  236. * 校验任务
  237. *
  238. * @param metaTaskNew 任务信息
  239. * @return result
  240. */
  241. private MetaServiceResult checkMetaTaskNew(MetaTaskNew metaTaskNew) {
  242. if (Objects.isNull(metaTaskNew)) {
  243. return MetaServiceResult.returnError("任务不存在");
  244. }
  245. if (!metaTaskNew.isPublish()) {
  246. return MetaServiceResult.returnError("status error : task has not been published");
  247. }
  248. if (StringUtils.isBlank(metaTaskNew.getName())) {
  249. return MetaServiceResult.returnError(String.format("任务[%S]缺少任务名称", metaTaskNew.getId()));
  250. }
  251. if (Objects.isNull(metaTaskNew.getDetail())) {
  252. return MetaServiceResult.returnError(String.format("任务[%S]缺少任务详情", metaTaskNew.getId()));
  253. }
  254. if (Objects.isNull(metaTaskNew.getType())) {
  255. return MetaServiceResult.returnError(String.format("任务[%S]缺少任务类型", metaTaskNew.getId()));
  256. }
  257. return MetaServiceResult.returnSuccess();
  258. }
  259. }