wangqifan 3 år sedan
förälder
incheckning
38ad877cd4

+ 14 - 0
src/main/java/com/izouma/nineth/repo/SubscribeTimeRepo.java

@@ -1,16 +1,30 @@
 package com.izouma.nineth.repo;
 
+import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.SubscribeTime;
+import com.izouma.nineth.service.LikeService;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
+import javax.annotation.Nonnull;
 import javax.transaction.Transactional;
+import java.time.LocalDateTime;
+import java.util.List;
 
 public interface SubscribeTimeRepo extends JpaRepository<SubscribeTime, Long>, JpaSpecificationExecutor<SubscribeTime> {
     @Query("update SubscribeTime t set t.del = true where t.id = ?1")
     @Modifying
     @Transactional
     void softDelete(Long id);
+
+    @Nonnull
+    @CacheEvict(value = "subscribeTimeList")
+    SubscribeTime save(@Nonnull SubscribeTime subscribeTime);
+
+    @Cacheable(value = "subscribeTimeList")
+    List<SubscribeTime> findAllByStartAfterOrderBySort(LocalDateTime localDateTime);
 }

+ 10 - 0
src/main/java/com/izouma/nineth/service/CacheService.java

@@ -4,6 +4,8 @@ import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+
 @Service
 public class CacheService {
     @CacheEvict(value = "collection", allEntries = true)
@@ -80,4 +82,12 @@ public class CacheService {
     public void clearTop(int month) {
     }
 
+    @CacheEvict(value = "subscribeTimeList")
+    public void clearSubscribeTime() {
+    }
+
+    @CacheEvict(value = "subscribeCollectionList", key = "#now")
+    public void clearSubscribeCollectionList(LocalDateTime now) {
+    }
+
 }

+ 52 - 20
src/main/java/com/izouma/nineth/service/CollectionService.java

@@ -41,6 +41,7 @@ import javax.annotation.PostConstruct;
 import javax.persistence.criteria.Predicate;
 import javax.transaction.Transactional;
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
@@ -71,6 +72,7 @@ public class CollectionService {
     private PointRecordRepo               pointRecordRepo;
     private SubscribeRepo                 subscribeRepo;
     private FollowRepo                    followRepo;
+    private SubscribeTimeRepo             subscribeTimeRepo;
 
     private final Map<Long, ScheduledFuture<?>> tasks = new HashMap<>();
 
@@ -148,6 +150,9 @@ public class CollectionService {
 //        onShelfTask(record);
         redisTemplate.opsForValue().set(RedisKeys.COLLECTION_STOCK + record.getId(), record.getStock());
         redisTemplate.opsForValue().set(RedisKeys.COLLECTION_SALE + record.getId(), record.getSale());
+        if (record.getSource().equals(CollectionSource.OFFICIAL) & record.isOnShelf()) {
+            cacheService.clearSubscribeCollectionList(LocalDate.now().atStartOfDay());
+        }
         return record;
     }
 
@@ -166,6 +171,9 @@ public class CollectionService {
 
         record = collectionRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
 //        onShelfTask(record);
+        if (record.getSource().equals(CollectionSource.OFFICIAL) & record.isOnShelf()) {
+            cacheService.clearSubscribeCollectionList(LocalDate.now().atStartOfDay());
+        }
         return record;
     }
 
@@ -602,27 +610,51 @@ public class CollectionService {
         return dtos;
     }
 
-    @Cacheable(value = "subscribeCollectionList", key = "#pageQuery.hashCode()")
-    public PageWrapper<Collection> subscribeAll(PageQuery pageQuery) {
-        pageQuery.getQuery().put("del", false);
-        Specification<Collection> specification = JpaUtils.toSpecification(pageQuery, Collection.class);
-        PageRequest pageRequest = JpaUtils.toPageRequest(pageQuery);
-        if (pageRequest.getSort().stream().noneMatch(order -> order.getProperty().equals("purchaseTime"))) {
-            pageRequest = PageRequest.of(pageRequest.getPageNumber(), pageQuery.getSize(),
-                    pageRequest.getSort().and(Sort.by("purchaseTime").ascending()));
-        }
+    @Cacheable(value = "subscribeCollectionList", key = "#now")
+    public List<SubscribeListDTO> subscribeAll(LocalDateTime now) {
+        List<SubscribeListDTO> subscribeListDTOS = new ArrayList<>();
+//        Map<String, Object> resultMap = new HashMap<>();
+//
+//        resultMap.put("subList", subscribeListDTOS);
+//        resultMap.put("notSubscribedIds", dtoPage.getContent().stream().filter(dto -> !dto.isSubscribed())
+//                .map(CollectionDTO::getId).collect(Collectors
+//                        .toList()));
+        List<SubscribeTime> subscribeTimes = subscribeTimeRepo
+                .findAllByStartAfterOrderBySort(LocalDate.now().atStartOfDay());
+        subscribeTimes.forEach(subscribeTime -> {
+            PageQuery pageQuery = new PageQuery();
+            pageQuery.setPage(0);
+            pageQuery.setSize(10000);
+            pageQuery.getQuery().put("del", false);
+            Specification<Collection> specification = JpaUtils.toSpecification(pageQuery, Collection.class);
+            PageRequest pageRequest = JpaUtils.toPageRequest(pageQuery);
+            if (pageRequest.getSort().stream().noneMatch(order -> order.getProperty().equals("startTime"))) {
+                pageRequest = PageRequest.of(pageRequest.getPageNumber(), pageQuery.getSize(),
+                        pageRequest.getSort().and(Sort.by("startTime").ascending()));
+            }
 
-        specification = specification.and((Specification<Collection>) (root, criteriaQuery, criteriaBuilder) -> {
-            List<Predicate> and = new ArrayList<>();
-            List<SubscribeStatus> statuses = new ArrayList<>();
-            statuses.add(SubscribeStatus.NOT_STARTED);
-            statuses.add(SubscribeStatus.ONGOING);
-            and.add(root.get("subscribeStatus").in(statuses));
-            and.add(criteriaBuilder.equal(root.get("source"), CollectionSource.OFFICIAL));
-            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+            specification = specification.and((Specification<Collection>) (root, criteriaQuery, criteriaBuilder) -> {
+                List<Predicate> and = new ArrayList<>();
+                List<SubscribeStatus> statuses = new ArrayList<>();
+                statuses.add(SubscribeStatus.NOT_STARTED);
+                statuses.add(SubscribeStatus.ONGOING);
+                and.add(root.get("subscribeStatus").in(statuses));
+                and.add(criteriaBuilder.equal(root.get("onShelf"), true));
+                and.add(criteriaBuilder.equal(root.get("source"), CollectionSource.OFFICIAL));
+                and.add(criteriaBuilder
+                        .between(root.get("startTime"), subscribeTime.getStart(), subscribeTime.getEnd()));
+                return criteriaBuilder.and(and.toArray(new Predicate[0]));
+            });
+            Page<Collection> page = collectionRepo.findAll(specification, pageRequest);
+            PageWrapper<Collection> dtoPage = new PageWrapper<>(page.getContent(), page.getPageable().getPageNumber(),
+                    page.getPageable().getPageSize(), page.getTotalElements());
+            Page<CollectionDTO> pageNew = toDTO(dtoPage.toPage());
+            subscribeListDTOS
+                    .add(SubscribeListDTO.builder().dateTime(subscribeTime.getStart())
+                            .collectionDTOS(pageNew.getContent())
+                            .build());
         });
-        Page<Collection> page = collectionRepo.findAll(specification, pageRequest);
-        return new PageWrapper<>(page.getContent(), page.getPageable().getPageNumber(),
-                page.getPageable().getPageSize(), page.getTotalElements());
+//        resultMap.put("notSubscribedIds", );
+        return subscribeListDTOS;
     }
 }

+ 9 - 15
src/main/java/com/izouma/nineth/web/CollectionController.java

@@ -2,10 +2,12 @@ package com.izouma.nineth.web;
 
 import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.FileObject;
+import com.izouma.nineth.domain.SubscribeTime;
 import com.izouma.nineth.dto.*;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.CollectionRepo;
 import com.izouma.nineth.repo.NewsRepo;
+import com.izouma.nineth.repo.SubscribeTimeRepo;
 import com.izouma.nineth.service.CacheService;
 import com.izouma.nineth.service.CollectionService;
 import com.izouma.nineth.service.LikeService;
@@ -23,6 +25,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -36,6 +39,7 @@ public class CollectionController extends BaseController {
     private LikeService       likeService;
     private NewsRepo          newsRepo;
     private CacheService      cacheService;
+    private SubscribeTimeRepo subscribeTimeRepo;
 
     @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -173,23 +177,13 @@ public class CollectionController extends BaseController {
 
     @GetMapping("/subscribeList")
     public Map<String, Object> subscribeList() {
-        PageQuery pageQuery = new PageQuery();
-        pageQuery.setSize(10000);
-        pageQuery.setPage(0);
-        Page<CollectionDTO> dtoPage = collectionService.toDTO(collectionService.subscribeAll(pageQuery).toPage());
+        List<SubscribeListDTO> dtoPage = collectionService.subscribeAll(LocalDate.now().atStartOfDay());
         List<SubscribeListDTO> subscribeListDTOS = new ArrayList<>();
         Map<String, Object> resultMap = new HashMap<>();
-        subscribeListDTOS
-                .add(SubscribeListDTO.builder().dateTime(LocalDateTime.now()).collectionDTOS(dtoPage.getContent())
-                        .build());
-        subscribeListDTOS
-                .add(SubscribeListDTO.builder().dateTime(LocalDateTime.now().plusMinutes(10))
-                        .collectionDTOS(dtoPage.getContent())
-                        .build());
-        resultMap.put("subList", subscribeListDTOS);
-        resultMap.put("notSubscribedIds", dtoPage.getContent().stream().filter(dto -> !dto.isSubscribed())
-                .map(CollectionDTO::getId).collect(Collectors
-                        .toList()));
+        resultMap.put("subList", dtoPage);
+//        resultMap.put("notSubscribedIds", dtoPage.getContent().stream().filter(dto -> !dto.isSubscribed())
+//                .map(CollectionDTO::getId).collect(Collectors
+//                        .toList()));
         return resultMap;
     }
 }