MetaTaskToUserService.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package com.izouma.nineth.service;
  2. import com.alibaba.excel.util.CollectionUtils;
  3. import com.izouma.nineth.domain.MetaProp;
  4. import com.izouma.nineth.domain.MetaTask;
  5. import com.izouma.nineth.domain.MetaTaskToUser;
  6. import com.izouma.nineth.domain.MetaUserTaskProgress;
  7. import com.izouma.nineth.dto.MetaRestResult;
  8. import com.izouma.nineth.dto.PageQuery;
  9. import com.izouma.nineth.enums.MetaTaskStatus;
  10. import com.izouma.nineth.repo.MetaPropRepo;
  11. import com.izouma.nineth.repo.MetaTaskRepo;
  12. import com.izouma.nineth.repo.MetaTaskToUserRepo;
  13. import com.izouma.nineth.repo.MetaUserTaskProgressRepo;
  14. import com.izouma.nineth.utils.JpaUtils;
  15. import lombok.AllArgsConstructor;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.apache.commons.lang3.StringUtils;
  18. import org.springframework.data.domain.Page;
  19. import org.springframework.stereotype.Service;
  20. import java.time.LocalDate;
  21. import java.time.LocalDateTime;
  22. import java.time.format.DateTimeFormatter;
  23. import java.util.List;
  24. import java.util.Objects;
  25. @Service
  26. @AllArgsConstructor
  27. @Slf4j
  28. public class MetaTaskToUserService {
  29. private MetaTaskToUserRepo metaTaskToUserRepo;
  30. private MetaTaskRepo metaTaskRepo;
  31. private MetaUserTaskProgressRepo metaUserTaskProgressRepo;
  32. private MetaPropRepo metaPropRepo;
  33. public Page<MetaTaskToUser> all(PageQuery pageQuery) {
  34. return metaTaskToUserRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaTaskToUser.class), JpaUtils.toPageRequest(pageQuery));
  35. }
  36. public MetaRestResult<MetaTaskToUser> receiveTask(MetaTaskToUser metaTaskToUser) {
  37. if (Objects.nonNull(metaTaskToUser.getId())) {
  38. return MetaRestResult.returnError("Illegal parameter : id must be null");
  39. }
  40. if (Objects.isNull(metaTaskToUser.getTaskId())) {
  41. return MetaRestResult.returnError("Illegal parameter : taskId can not be null");
  42. }
  43. if (Objects.isNull(metaTaskToUser.getUserId())) {
  44. return MetaRestResult.returnError("Illegal parameter : userId can not be null");
  45. }
  46. MetaTask metaTask = metaTaskRepo.findByIdAndDel(metaTaskToUser.getTaskId(), false);
  47. if (Objects.isNull(metaTask)) {
  48. return MetaRestResult.returnError(String.format("根据任务id[%S]查询不到任务详情", metaTaskToUser.getTaskId()));
  49. }
  50. if (!metaTask.isPublish()) {
  51. return MetaRestResult.returnError("status error : task has not been published");
  52. }
  53. if (metaTask.isFinish()) {
  54. return MetaRestResult.returnError("status error : task has been finished");
  55. }
  56. if (StringUtils.isBlank(metaTask.getName())) {
  57. return MetaRestResult.returnError(String.format("任务[%S]缺少任务名称", metaTaskToUser.getTaskId()));
  58. }
  59. if (Objects.isNull(metaTask.getType())) {
  60. return MetaRestResult.returnError(String.format("任务[%S]缺少任务类型", metaTaskToUser.getTaskId()));
  61. }
  62. if (Objects.isNull(metaTask.getAwardType())) {
  63. return MetaRestResult.returnError(String.format("任务[%S]缺少任务奖励类型", metaTaskToUser.getTaskId()));
  64. }
  65. if (Objects.isNull(metaTask.getDetail())) {
  66. return MetaRestResult.returnError(String.format("任务[%S]缺少任务详情", metaTaskToUser.getTaskId()));
  67. }
  68. // 判断当前玩家是否领取过任务
  69. MetaTaskToUser dbMetaTaskToUser = metaTaskToUserRepo.findByUserIdAndTaskIdAndDel(metaTaskToUser.getUserId(), metaTaskToUser.getTaskId(), false);
  70. if (Objects.nonNull(dbMetaTaskToUser)) {
  71. return MetaRestResult.returnError(String.format("当前用户已在[%S]领取过该任务[%S]", dbMetaTaskToUser.getGetTime(), metaTask.getName()));
  72. }
  73. if (Objects.nonNull(metaTask.getAwardPic())) {
  74. metaTaskToUser.setAwardPic(metaTask.getAwardPic());
  75. }
  76. if (metaTask.getGoldNum() > 0) {
  77. metaTaskToUser.setGoldNum(metaTask.getGoldNum());
  78. }
  79. if (Objects.nonNull(metaTask.getMetaPropId())) {
  80. metaTaskToUser.setMetaPropId(metaTask.getMetaPropId());
  81. }
  82. metaTaskToUser.setTaskName(metaTask.getName());
  83. metaTaskToUser.setTaskType(metaTask.getType());
  84. metaTaskToUser.setDetail(metaTask.getDetail());
  85. metaTaskToUser.setGetTime(LocalDateTime.now());
  86. metaTaskToUser.setAwardType(metaTask.getAwardType());
  87. metaTaskToUser.setStatus(MetaTaskStatus.PROGRESS);
  88. metaTaskToUser.setChannelId(metaTask.getChannelId());
  89. MetaTaskToUser save = metaTaskToUserRepo.save(metaTaskToUser);
  90. setProgress(save);
  91. return MetaRestResult.returnSuccess(save);
  92. }
  93. public MetaRestResult<List<MetaTaskToUser>> findByStatus(Long userId, Long channelId, MetaTaskStatus status) {
  94. List<MetaTaskToUser> metaTaskToUsers = metaTaskToUserRepo.findAllByUserIdAndChannelIdAndStatusAndDel(userId, channelId, status, false);
  95. metaTaskToUsers.forEach(this::setProgress);
  96. return MetaRestResult.returnSuccess(metaTaskToUsers);
  97. }
  98. public MetaRestResult<MetaTaskToUser> findProgress(Long id) {
  99. MetaTaskToUser metaTaskToUser = metaTaskToUserRepo.findByIdAndDel(id, false);
  100. if (Objects.isNull(metaTaskToUser)) {
  101. return MetaRestResult.returnError(String.format("根据id[%S]查询不到用户领取记录", id));
  102. }
  103. setProgress(metaTaskToUser);
  104. return MetaRestResult.returnSuccess(metaTaskToUser);
  105. }
  106. /**
  107. * 设置任务进度
  108. *
  109. * @param metaTaskToUser 参数
  110. */
  111. private void setProgress(MetaTaskToUser metaTaskToUser) {
  112. if (Objects.nonNull(metaTaskToUser.getMetaPropId())) {
  113. MetaProp metaProp = metaPropRepo.findByIdAndDel(metaTaskToUser.getMetaPropId(), false);
  114. if (Objects.nonNull(metaProp)) {
  115. metaTaskToUser.setMetaProp(metaProp);
  116. }
  117. }
  118. MetaTask metaTask = metaTaskRepo.findByIdAndDel(metaTaskToUser.getTaskId(), false);
  119. if (Objects.isNull(metaTask)) {
  120. log.error("任务信息为空");
  121. }
  122. String value = metaTask.getValue();
  123. String PREFIX = "0/";
  124. switch (metaTaskToUser.getTaskType()) {
  125. case COLLECT_COLLECTION:
  126. if (StringUtils.isBlank(value)) {
  127. String errMsg = "任务进度显示异常,缺少藏品id配置";
  128. log.error(errMsg);
  129. metaTaskToUser.setProcess(errMsg);
  130. break;
  131. }
  132. String[] split = value.split(" ");
  133. List<MetaUserTaskProgress> collectCollection = metaUserTaskProgressRepo.findAllByMetaTaskToUserIdAndDel(metaTaskToUser.getId(), false);
  134. if (CollectionUtils.isEmpty(collectCollection)) {
  135. metaTaskToUser.setProcess(PREFIX.concat(String.valueOf(split.length)));
  136. break;
  137. }
  138. metaTaskToUser.setProcess(String.valueOf(collectCollection.size()).concat("/").concat(String.valueOf(split.length)));
  139. break;
  140. case ON_LINE_TIME_DAILY:
  141. if (StringUtils.isBlank(value)) {
  142. String errMsg = "任务进度显示异常,缺少在线时长配置";
  143. log.error(errMsg);
  144. metaTaskToUser.setProcess(errMsg);
  145. break;
  146. }
  147. MetaUserTaskProgress onLineTimeDaily = metaUserTaskProgressRepo.findByMetaTaskToUserIdAndDelAndCreatedAtAfter(metaTaskToUser.getId(), false, LocalDateTime.now().withHour(0).withMinute(0).withSecond(0));
  148. if (Objects.isNull(onLineTimeDaily)) {
  149. metaTaskToUser.setProcess(PREFIX.concat(value));
  150. break;
  151. }
  152. metaTaskToUser.setProcess(onLineTimeDaily.getRemark().concat("/").concat(value));
  153. break;
  154. case ACCUMULATE:
  155. if (StringUtils.isBlank(value)) {
  156. String errMsg = "任务进度显示异常,缺少累计任务的数量配置";
  157. log.error(errMsg);
  158. metaTaskToUser.setProcess(errMsg);
  159. break;
  160. }
  161. List<MetaUserTaskProgress> accumulate = metaUserTaskProgressRepo.findAllByMetaTaskToUserIdAndDel(metaTaskToUser.getId(), false);
  162. if (CollectionUtils.isEmpty(accumulate)) {
  163. metaTaskToUser.setProcess(PREFIX.concat(value));
  164. break;
  165. }
  166. metaTaskToUser.setProcess(String.valueOf(accumulate.size()).concat("/").concat(value));
  167. break;
  168. default:
  169. break;
  170. }
  171. }
  172. /**
  173. * 计算累计签到天数
  174. *
  175. * @param value 开始日期配置
  176. * @param metaTaskToUserId 用户领取任务记录id
  177. * @return 累计签到天数
  178. */
  179. private int countSignIn(String value, Long metaTaskToUserId) {
  180. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  181. LocalDateTime startTime = LocalDate.parse(value, formatter).atStartOfDay();
  182. LocalDateTime endTime = LocalDateTime.now();
  183. List<MetaUserTaskProgress> metaUserTaskProgresses = metaUserTaskProgressRepo.findAllByMetaTaskToUserIdAndDelAndCreatedAtBetweenOrderByCreatedAtDesc(metaTaskToUserId, false, startTime, endTime);
  184. int num = 0;
  185. if (CollectionUtils.isEmpty(metaUserTaskProgresses)) {
  186. return num;
  187. }
  188. int i = 0;
  189. for (MetaUserTaskProgress metaUserTaskProgress : metaUserTaskProgresses) {
  190. if (metaUserTaskProgress.getCreatedAt().isAfter(endTime.withHour(0).withMinute(0).withSecond(0))) {
  191. num = num + 1;
  192. continue;
  193. }
  194. i = i + 1;
  195. if (metaUserTaskProgress.getCreatedAt().isAfter(endTime.withHour(0).withMinute(0).withSecond(0).plusDays(-i))
  196. && metaUserTaskProgress.getCreatedAt().isBefore(endTime.withHour(0).withMinute(0).plusDays(-(i - 1)))) {
  197. num = num + 1;
  198. continue;
  199. }
  200. break;
  201. }
  202. if (num > 7) {
  203. num = num % 7;
  204. }
  205. return num;
  206. }
  207. }