MetaUserTaskProgressNewService.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package com.izouma.nineth.service;
  2. import com.izouma.nineth.domain.*;
  3. import com.izouma.nineth.dto.MetaRestResult;
  4. import com.izouma.nineth.dto.MetaServiceResult;
  5. import com.izouma.nineth.dto.PageQuery;
  6. import com.izouma.nineth.enums.MetaTaskStatus;
  7. import com.izouma.nineth.enums.MetaTaskTarget;
  8. import com.izouma.nineth.enums.MetaTaskType;
  9. import com.izouma.nineth.exception.BusinessException;
  10. import com.izouma.nineth.repo.*;
  11. import com.izouma.nineth.utils.JpaUtils;
  12. import com.izouma.nineth.utils.MetaUtils;
  13. import lombok.AllArgsConstructor;
  14. import org.apache.commons.lang3.StringUtils;
  15. import org.springframework.data.domain.Page;
  16. import org.springframework.stereotype.Service;
  17. import javax.transaction.Transactional;
  18. import java.time.LocalDateTime;
  19. import java.util.Arrays;
  20. import java.util.HashSet;
  21. import java.util.List;
  22. import java.util.Objects;
  23. import java.util.stream.Collectors;
  24. @Service
  25. @AllArgsConstructor
  26. public class MetaUserTaskProgressNewService {
  27. private MetaUserTaskProgressNewRepo metaUserTaskProgressNewRepo;
  28. private MetaTaskToUserNewRepo metaTaskToUserNewRepo;
  29. private MetaAtomTaskRepo metaAtomTaskRepo;
  30. private MetaTaskToUserNewService metaTaskToUserNewService;
  31. private MetaTaskBindRepo metaTaskBindRepo;
  32. public Page<MetaUserTaskProgressNew> all(PageQuery pageQuery) {
  33. return metaUserTaskProgressNewRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaUserTaskProgressNew.class), JpaUtils.toPageRequest(pageQuery));
  34. }
  35. @Transactional
  36. public MetaRestResult<Boolean> metaSave(MetaUserTaskProgressNew metaUserTaskProgressNew) {
  37. // 校验参数
  38. MetaServiceResult result = checkParams(metaUserTaskProgressNew);
  39. if (!result.isSuccess()) {
  40. return MetaRestResult.returnError(result.getMessage());
  41. }
  42. // 任务领取记录
  43. MetaTaskToUserNew metaTaskToUserNew = metaTaskToUserNewRepo.findByIdAndDel(metaUserTaskProgressNew.getMetaTaskToUserNewId(), false);
  44. if (Objects.isNull(metaTaskToUserNew)) {
  45. return MetaRestResult.returnError("无用户领取任务记录");
  46. }
  47. if (!metaTaskToUserNew.getStatus().equals(MetaTaskStatus.PROGRESS)) {
  48. return MetaRestResult.returnError(String.format("状态错误:当前任务状态为[%S]", metaTaskToUserNew.getStatus().getDescription()));
  49. }
  50. // 基础任务
  51. MetaAtomTask metaAtomTask = metaAtomTaskRepo.findByIdAndDel(metaTaskToUserNew.getAtomTaskId(), false);
  52. if (Objects.isNull(metaAtomTask)) {
  53. return MetaRestResult.returnError("基础任务信息为空");
  54. }
  55. // 收集藏品类型任务 remark为藏品id 不可为空
  56. if (metaAtomTask.getTargetType().equals(MetaTaskTarget.COLLECT_COLLECTION)) {
  57. if (StringUtils.isBlank(metaUserTaskProgressNew.getRemark())) {
  58. return MetaRestResult.returnError(String.format("类型[%S]的任务 remark不可为空", metaAtomTask.getTargetType().getDescription()));
  59. }
  60. }
  61. String value = metaAtomTask.getTargetConfig();
  62. // 收集藏品任务
  63. if (metaAtomTask.getTargetType().equals(MetaTaskTarget.COLLECT_COLLECTION)) {
  64. if (StringUtils.isBlank(value)) {
  65. return MetaRestResult.returnError("该任务未配置藏品id");
  66. }
  67. String[] split = value.split(" ");
  68. List<String> all = Arrays.asList(split);
  69. if (!all.contains(metaUserTaskProgressNew.getRemark())) {
  70. return MetaRestResult.returnError("不在任务规定藏品内");
  71. }
  72. }
  73. // 累计任务
  74. if (metaAtomTask.getTargetType().equals(MetaTaskTarget.ACCUMULATE)) {
  75. if (StringUtils.isBlank(value)) {
  76. return MetaRestResult.returnError("该任务未配置达标次数");
  77. }
  78. }
  79. metaUserTaskProgressNew.setProgressTime(LocalDateTime.now());
  80. // 在线时长任务 如记录存在则更新remark(每日在线时长) 如不存在则每日首次触发该任务
  81. if (metaAtomTask.getTargetType().equals(MetaTaskTarget.ON_LINE_TIME_DAILY)) {
  82. MetaUserTaskProgressNew dbMetaUserTaskProgressNew = metaUserTaskProgressNewRepo.findByMetaTaskToUserNewIdAndDelAndCreatedAtAfter(metaUserTaskProgressNew.getMetaTaskToUserNewId(), false, LocalDateTime.now().withHour(0).withMinute(0).withSecond(0));
  83. if (Objects.isNull(dbMetaUserTaskProgressNew)) {
  84. metaUserTaskProgressNewRepo.save(metaUserTaskProgressNew);
  85. // 该类型任务不存在完成
  86. return MetaRestResult.returnSuccess(false);
  87. }
  88. int remark = Integer.parseInt(metaUserTaskProgressNew.getRemark()) + Integer.parseInt(dbMetaUserTaskProgressNew.getRemark());
  89. dbMetaUserTaskProgressNew.setRemark(String.valueOf(remark));
  90. dbMetaUserTaskProgressNew.setProgressTime(LocalDateTime.now());
  91. metaUserTaskProgressNewRepo.save(dbMetaUserTaskProgressNew);
  92. return MetaRestResult.returnSuccess(false);
  93. }
  94. // 保存进度
  95. metaUserTaskProgressNewRepo.save(metaUserTaskProgressNew);
  96. List<MetaUserTaskProgressNew> metaUserTaskProgressNews = metaUserTaskProgressNewRepo.findAllByMetaTaskToUserNewIdAndDel(metaUserTaskProgressNew.getMetaTaskToUserNewId(), false);
  97. // 是否完成任务
  98. switch (metaAtomTask.getTargetType()) {
  99. case COLLECT_COLLECTION:
  100. String[] split = value.split(" ");
  101. List<String> all = Arrays.asList(split);
  102. List<String> completed = metaUserTaskProgressNews.stream().map(MetaUserTaskProgressNew::getRemark).collect(Collectors.toList());
  103. if (new HashSet<>(completed).containsAll(all)) {
  104. completeTask(metaTaskToUserNew);
  105. return MetaRestResult.returnSuccess(true);
  106. }
  107. return MetaRestResult.returnSuccess(false);
  108. case ACCUMULATE:
  109. if (metaUserTaskProgressNews.size() >= Integer.parseInt(value)) {
  110. completeTask(metaTaskToUserNew);
  111. return MetaRestResult.returnSuccess(true);
  112. }
  113. return MetaRestResult.returnSuccess(false);
  114. default:
  115. throw new BusinessException(String.format("不存在的任务类型[%S]", metaAtomTask.getTargetType()));
  116. }
  117. }
  118. /**
  119. * 完成任务
  120. *
  121. * @param metaTaskToUserNew 任务领取记录
  122. */
  123. private void completeTask(MetaTaskToUserNew metaTaskToUserNew) {
  124. metaTaskToUserNew.setFinishTime(LocalDateTime.now());
  125. metaTaskToUserNew.setStatus(MetaTaskStatus.COMPLETION);
  126. metaTaskToUserNewRepo.save(metaTaskToUserNew);
  127. MetaTaskBind metaTaskBind = metaTaskBindRepo.findByTaskIdAndAtomTaskIdAndDel(metaTaskToUserNew.getTaskId(), metaTaskToUserNew.getAtomTaskId(), false);
  128. // 节点任务完成自动领取下一个节点任务
  129. if (MetaTaskType.NODE.equals(metaTaskBind.getType())) {
  130. // 下一个节点任务id
  131. Long nextAtomTaskId = metaTaskBindRepo.findNextAtomTaskId(metaTaskToUserNew.getTaskId(), metaTaskBind.getAtomTaskIndex());
  132. if (Objects.isNull(nextAtomTaskId)) {
  133. return;
  134. }
  135. MetaTaskToUserNew next = new MetaTaskToUserNew();
  136. next.setTaskId(metaTaskToUserNew.getTaskId());
  137. next.setAtomTaskId(nextAtomTaskId);
  138. next.setUserId(metaTaskToUserNew.getUserId());
  139. metaTaskToUserNewService.receiveTask(next, true);
  140. }
  141. }
  142. /**
  143. * 参数校验
  144. *
  145. * @param metaUserTaskProgressNew 待校验参数
  146. * @return 校验结果
  147. */
  148. private MetaServiceResult checkParams(MetaUserTaskProgressNew metaUserTaskProgressNew) {
  149. if (Objects.nonNull(metaUserTaskProgressNew.getId())) {
  150. return MetaServiceResult.returnError("Illegal parameter : id must be null");
  151. }
  152. if (Objects.isNull(metaUserTaskProgressNew.getMetaTaskToUserNewId())) {
  153. return MetaServiceResult.returnError("Illegal parameter : metaTaskToUserNewId can not be null");
  154. }
  155. if (Objects.isNull(metaUserTaskProgressNew.getUserId())) {
  156. return MetaServiceResult.returnError("Illegal parameter : userId can not be null");
  157. }
  158. MetaServiceResult result = MetaUtils.checkUserExcludeTourist(metaUserTaskProgressNew.getUserId());
  159. if (!result.isSuccess()) {
  160. return MetaServiceResult.returnError(result.getMessage());
  161. }
  162. // 指定备注唯一,校验是否重复
  163. if (metaUserTaskProgressNew.isRemarkOnly()) {
  164. if (StringUtils.isBlank(metaUserTaskProgressNew.getRemark())) {
  165. return MetaServiceResult.returnError("Illegal parameter : remark can not be null");
  166. }
  167. MetaUserTaskProgressNew dbMetaUserTaskProgressNew = metaUserTaskProgressNewRepo.findByMetaTaskToUserNewIdAndRemarkAndDel(metaUserTaskProgressNew.getMetaTaskToUserNewId(), metaUserTaskProgressNew.getRemark(), false);
  168. if (Objects.nonNull(dbMetaUserTaskProgressNew)) {
  169. return MetaServiceResult.returnError("重复触发");
  170. }
  171. }
  172. return MetaServiceResult.returnSuccess();
  173. }
  174. }