SubscribeTask.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package com.izouma.nineth.service.scheduledTask;
  2. import cn.hutool.core.util.RandomUtil;
  3. import com.izouma.nineth.domain.Collection;
  4. import com.izouma.nineth.domain.Subscribe;
  5. import com.izouma.nineth.enums.SubscribeStatus;
  6. import com.izouma.nineth.repo.CollectionRepo;
  7. import com.izouma.nineth.repo.SubscribeRepo;
  8. import io.jsonwebtoken.lang.Collections;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.scheduling.annotation.Scheduled;
  12. import org.springframework.stereotype.Component;
  13. import java.time.LocalDateTime;
  14. import java.util.ArrayList;
  15. import java.util.HashMap;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.stream.Collectors;
  19. @Component
  20. @Slf4j
  21. public class SubscribeTask {
  22. @Autowired
  23. private CollectionRepo collectionRepo;
  24. @Autowired
  25. private SubscribeRepo subscribeRepo;
  26. private Map<Long, LocalDateTime> collectionMap = new HashMap<>();
  27. // @Scheduled(cron = "0/5 * * * * ?")
  28. public void subscriberTask() {
  29. LocalDateTime startTime = LocalDateTime.now();
  30. LocalDateTime endTime = startTime.plusSeconds(6);
  31. List<Collection> ongoingList = collectionRepo
  32. .findAllByStartTimeGreaterThanAndStartTimeLessThanEqual(startTime, endTime);
  33. if (!Collections.isEmpty(ongoingList)) {
  34. for (Collection collection : ongoingList) {
  35. if (collection.getStartTime().isAfter(startTime) && !collection.getSubscribeStatus().equals(SubscribeStatus.ONGOING)) {
  36. collectionRepo.updateSubscribeStatus(collection.getId(), SubscribeStatus.ONGOING);
  37. }
  38. }
  39. }
  40. List<Collection> subscribeEndingList = collectionRepo
  41. .findAllByEndTimeGreaterThanAndEndTimeLessThanEqual(startTime, endTime);
  42. if (!Collections.isEmpty(subscribeEndingList)) {
  43. for (Collection collection : subscribeEndingList) {
  44. if (collection.getEndTime().isAfter(startTime) && !collection.getSubscribeStatus().equals(SubscribeStatus.SUBSCRIBE_ENDING)) {
  45. collectionRepo.updateSubscribeStatus(collection.getId(), SubscribeStatus.SUBSCRIBE_ENDING);
  46. }
  47. }
  48. }
  49. List<Collection> collectionList = collectionRepo
  50. .findAllByEndTimeLessThanEqualAndPublishTimeGreaterThan(startTime, endTime);
  51. if (!Collections.isEmpty(collectionList)) {
  52. for (Collection collection : collectionList) {
  53. if (collectionMap.containsKey(collection.getId())) {
  54. if (startTime.isAfter(collectionMap.get(collection.getId()))) {
  55. collectionMap.remove(collection.getId());
  56. }
  57. continue;
  58. }
  59. collectionMap.put(collection.getId(), collection.getPublishTime());
  60. List<Subscribe> subscribeList = subscribeRepo.findAllByCollectionId(collection.getId());
  61. if (subscribeList.size() <= collection.getStock()) {
  62. for (Subscribe subscribe : subscribeList) {
  63. subscribeRepo.setPurchaseQualifications(subscribe.getId(), true);
  64. }
  65. } else {
  66. ArrayList<Subscribe> subscribes = new ArrayList<>();
  67. for (int i = 0; i < collection.getStock(); i++) {
  68. subscribes.add(RandomUtil.randomEle(subscribeList));
  69. }
  70. List<Long> list = subscribes.stream().map(Subscribe::getId).collect(Collectors.toList());
  71. for (Long id : list) {
  72. subscribeRepo.setPurchaseQualifications(id, true);
  73. }
  74. }
  75. }
  76. }
  77. List<Collection> announcingList = collectionRepo
  78. .findAllByPublishTimeGreaterThanAndPublishTimeLessThanEqual(startTime, endTime);
  79. if (!Collections.isEmpty(announcingList)) {
  80. for (Collection collection : announcingList) {
  81. if (collection.getPublishTime().isAfter(startTime) && !collection.getSubscribeStatus().equals(SubscribeStatus.ANNOUNCING)) {
  82. collectionRepo.updateSubscribeStatus(collection.getId(), SubscribeStatus.ANNOUNCING);
  83. }
  84. }
  85. }
  86. List<Collection> onSaleList = collectionRepo
  87. .findAllByPurchaseTimeGreaterThanAndPurchaseTimeLessThanEqual(startTime, endTime);
  88. if (!Collections.isEmpty(onSaleList)) {
  89. for (Collection collection : onSaleList) {
  90. if (collection.getPurchaseTime().isAfter(startTime) && !collection.getSubscribeStatus().equals(SubscribeStatus.ON_SALE)) {
  91. collectionRepo.updateSubscribeStatus(collection.getId(), SubscribeStatus.ON_SALE);
  92. }
  93. }
  94. }
  95. }
  96. }