MetaUserTaskProgressNewService.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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. private MetaTaskNewRepo metaTaskNewRepo;
  33. public Page<MetaUserTaskProgressNew> all(PageQuery pageQuery) {
  34. return metaUserTaskProgressNewRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaUserTaskProgressNew.class), JpaUtils.toPageRequest(pageQuery));
  35. }
  36. @Transactional
  37. public MetaRestResult<Boolean> metaSave(MetaUserTaskProgressNew metaUserTaskProgressNew) {
  38. // 校验进度模型参数
  39. MetaServiceResult result = checkParams(metaUserTaskProgressNew);
  40. if (!result.isSuccess()) {
  41. return MetaRestResult.returnError(result.getMessage());
  42. }
  43. // 校验任务领取记录
  44. MetaTaskToUserNew metaTaskToUserNew = metaTaskToUserNewRepo.findByIdAndDel(metaUserTaskProgressNew.getMetaTaskToUserNewId(), false);
  45. if (Objects.isNull(metaTaskToUserNew)) {
  46. return MetaRestResult.returnError("无用户领取任务记录");
  47. }
  48. if (!metaTaskToUserNew.getStatus().equals(MetaTaskStatus.PROGRESS)) {
  49. return MetaRestResult.returnError(String.format("状态错误:当前任务状态为[%S]", metaTaskToUserNew.getStatus().getDescription()));
  50. }
  51. // 校验任务
  52. MetaTaskNew metaTaskNew = metaTaskNewRepo.findByIdAndDel(metaTaskToUserNew.getTaskId(), false);
  53. MetaServiceResult checkMetaTaskNewResult = MetaTaskNew.checkMetaTaskNew(metaTaskNew);
  54. if (!checkMetaTaskNewResult.isSuccess()) {
  55. return MetaRestResult.returnError(checkMetaTaskNewResult.getMessage());
  56. }
  57. // 校验基础任务
  58. MetaAtomTask metaAtomTask = metaAtomTaskRepo.findByIdAndDel(metaTaskToUserNew.getAtomTaskId(), false);
  59. if (Objects.isNull(metaAtomTask)) {
  60. return MetaRestResult.returnError("基础任务信息为空");
  61. }
  62. // 收集藏品类型任务 remark为藏品id 不可为空
  63. if (metaAtomTask.getTargetType().equals(MetaTaskTarget.COLLECT_COLLECTION) || metaAtomTask.getTargetType().equals(MetaTaskTarget.ON_LINE_TIME_DAILY)) {
  64. if (StringUtils.isBlank(metaUserTaskProgressNew.getRemark())) {
  65. return MetaRestResult.returnError(String.format("类型[%S]的任务 remark不可为空", metaAtomTask.getTargetType().getDescription()));
  66. }
  67. }
  68. String value = metaAtomTask.getTargetConfig();
  69. // 收集藏品任务
  70. if (metaAtomTask.getTargetType().equals(MetaTaskTarget.COLLECT_COLLECTION)) {
  71. if (StringUtils.isBlank(value)) {
  72. return MetaRestResult.returnError("该任务未配置藏品id");
  73. }
  74. String[] split = value.split(" ");
  75. List<String> all = Arrays.asList(split);
  76. if (!all.contains(metaUserTaskProgressNew.getRemark())) {
  77. return MetaRestResult.returnError("不在任务规定藏品内");
  78. }
  79. }
  80. // 累计任务
  81. if (metaAtomTask.getTargetType().equals(MetaTaskTarget.ACCUMULATE)) {
  82. if (StringUtils.isBlank(value)) {
  83. return MetaRestResult.returnError("该任务未配置达标次数");
  84. }
  85. }
  86. metaUserTaskProgressNew.setProgressTime(LocalDateTime.now());
  87. // 在线时长任务 如记录存在则更新remark(每日在线时长) 如不存在则每日首次触发该任务
  88. if (metaAtomTask.getTargetType().equals(MetaTaskTarget.ON_LINE_TIME_DAILY)) {
  89. if (StringUtils.isBlank(value)) {
  90. return MetaRestResult.returnError("在线时长任务未配置达标时间");
  91. }
  92. MetaUserTaskProgressNew dbMetaUserTaskProgressNew = metaUserTaskProgressNewRepo.findByMetaTaskToUserNewIdAndDelAndCreatedAtAfter(metaUserTaskProgressNew.getMetaTaskToUserNewId(), false, LocalDateTime.now().withHour(0).withMinute(0).withSecond(0));
  93. if (Objects.isNull(dbMetaUserTaskProgressNew)) {
  94. metaUserTaskProgressNewRepo.save(metaUserTaskProgressNew);
  95. } else {
  96. int remark = Integer.parseInt(metaUserTaskProgressNew.getRemark()) + Integer.parseInt(dbMetaUserTaskProgressNew.getRemark());
  97. dbMetaUserTaskProgressNew.setRemark(String.valueOf(remark));
  98. dbMetaUserTaskProgressNew.setProgressTime(LocalDateTime.now());
  99. metaUserTaskProgressNewRepo.save(dbMetaUserTaskProgressNew);
  100. }
  101. } else {
  102. // 保存进度
  103. metaUserTaskProgressNewRepo.save(metaUserTaskProgressNew);
  104. }
  105. List<MetaUserTaskProgressNew> metaUserTaskProgressNews = metaUserTaskProgressNewRepo.findAllByMetaTaskToUserNewIdAndDel(metaUserTaskProgressNew.getMetaTaskToUserNewId(), false);
  106. // 是否完成任务
  107. switch (metaAtomTask.getTargetType()) {
  108. case COLLECT_COLLECTION:
  109. String[] split = value.split(" ");
  110. List<String> all = Arrays.asList(split);
  111. List<String> completed = metaUserTaskProgressNews.stream().map(MetaUserTaskProgressNew::getRemark).collect(Collectors.toList());
  112. if (new HashSet<>(completed).containsAll(all)) {
  113. completeTask(metaTaskToUserNew);
  114. return MetaRestResult.returnSuccess(true);
  115. }
  116. return MetaRestResult.returnSuccess(false);
  117. case ACCUMULATE:
  118. if (metaUserTaskProgressNews.size() >= Integer.parseInt(value)) {
  119. completeTask(metaTaskToUserNew);
  120. return MetaRestResult.returnSuccess(true);
  121. }
  122. return MetaRestResult.returnSuccess(false);
  123. case ON_LINE_TIME_DAILY:
  124. MetaUserTaskProgressNew dbMetaUserTaskProgressNew = metaUserTaskProgressNewRepo.findByMetaTaskToUserNewIdAndDelAndCreatedAtAfter(metaUserTaskProgressNew.getMetaTaskToUserNewId(), false, LocalDateTime.now().withHour(0).withMinute(0).withSecond(0));
  125. if (Integer.parseInt(dbMetaUserTaskProgressNew.getRemark()) >= Integer.parseInt(value)) {
  126. completeTask(metaTaskToUserNew);
  127. return MetaRestResult.returnSuccess(true);
  128. }
  129. return MetaRestResult.returnSuccess(false);
  130. default:
  131. throw new BusinessException(String.format("不存在的任务类型[%S]", metaAtomTask.getTargetType()));
  132. }
  133. }
  134. /**
  135. * 完成任务
  136. *
  137. * @param metaTaskToUserNew 任务领取记录
  138. */
  139. private void completeTask(MetaTaskToUserNew metaTaskToUserNew) {
  140. metaTaskToUserNew.setFinishTime(LocalDateTime.now());
  141. metaTaskToUserNew.setStatus(MetaTaskStatus.COMPLETION);
  142. metaTaskToUserNewRepo.save(metaTaskToUserNew);
  143. MetaTaskBind metaTaskBind = metaTaskBindRepo.findByTaskIdAndAtomTaskIdAndDel(metaTaskToUserNew.getTaskId(), metaTaskToUserNew.getAtomTaskId(), false);
  144. // 节点任务完成自动领取下一个节点任务
  145. if (MetaTaskType.NODE.equals(metaTaskBind.getType())) {
  146. // 下一个节点任务id
  147. Long nextAtomTaskId = metaTaskBindRepo.findNextAtomTaskId(metaTaskToUserNew.getTaskId(), metaTaskBind.getAtomTaskIndex());
  148. if (Objects.isNull(nextAtomTaskId)) {
  149. return;
  150. }
  151. MetaTaskToUserNew next = new MetaTaskToUserNew();
  152. next.setTaskId(metaTaskToUserNew.getTaskId());
  153. next.setAtomTaskId(nextAtomTaskId);
  154. next.setUserId(metaTaskToUserNew.getUserId());
  155. metaTaskToUserNewService.receiveTask(next, true);
  156. }
  157. }
  158. /**
  159. * 参数校验
  160. *
  161. * @param metaUserTaskProgressNew 待校验参数
  162. * @return 校验结果
  163. */
  164. private MetaServiceResult checkParams(MetaUserTaskProgressNew metaUserTaskProgressNew) {
  165. if (Objects.nonNull(metaUserTaskProgressNew.getId())) {
  166. return MetaServiceResult.returnError("Illegal parameter : id must be null");
  167. }
  168. if (Objects.isNull(metaUserTaskProgressNew.getMetaTaskToUserNewId())) {
  169. return MetaServiceResult.returnError("Illegal parameter : metaTaskToUserNewId can not be null");
  170. }
  171. if (Objects.isNull(metaUserTaskProgressNew.getUserId())) {
  172. return MetaServiceResult.returnError("Illegal parameter : userId can not be null");
  173. }
  174. MetaServiceResult result = MetaUtils.checkUserExcludeTourist(metaUserTaskProgressNew.getUserId());
  175. if (!result.isSuccess()) {
  176. return MetaServiceResult.returnError(result.getMessage());
  177. }
  178. // 指定备注唯一,校验是否重复
  179. if (metaUserTaskProgressNew.isRemarkOnly()) {
  180. if (StringUtils.isBlank(metaUserTaskProgressNew.getRemark())) {
  181. return MetaServiceResult.returnError("Illegal parameter : remark can not be null");
  182. }
  183. MetaUserTaskProgressNew dbMetaUserTaskProgressNew = metaUserTaskProgressNewRepo.findByMetaTaskToUserNewIdAndRemarkAndDel(metaUserTaskProgressNew.getMetaTaskToUserNewId(), metaUserTaskProgressNew.getRemark(), false);
  184. if (Objects.nonNull(dbMetaUserTaskProgressNew)) {
  185. return MetaServiceResult.returnError("重复触发");
  186. }
  187. }
  188. return MetaServiceResult.returnSuccess();
  189. }
  190. }