MetaTaskToUserService.java 11 KB

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