wangqifan 3 лет назад
Родитель
Сommit
72f0602713

+ 6 - 2
src/main/java/com/izouma/nineth/repo/DomainOrderRepo.java

@@ -2,6 +2,7 @@ package com.izouma.nineth.repo;
 
 import com.izouma.nineth.domain.DomainOrder;
 import com.izouma.nineth.enums.CollectionStatus;
+import com.izouma.nineth.enums.OrderStatus;
 import com.izouma.nineth.service.LikeService;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -9,6 +10,7 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
+import java.time.LocalDateTime;
 import java.util.List;
 
 public interface DomainOrderRepo extends JpaRepository<DomainOrder, Long>, JpaSpecificationExecutor<DomainOrder> {
@@ -19,6 +21,8 @@ public interface DomainOrderRepo extends JpaRepository<DomainOrder, Long>, JpaSp
 
     Integer countAllByDomainNameEqualsAndStatus(String name, CollectionStatus status);
 
-    @Query(value = "select c from DomainOrder c where c.picName like ?1 and c.status = ?2")
-    List<DomainOrder> searchUsedDomain(String name, CollectionStatus status);
+    @Query(value = "select c from DomainOrder c where c.picName like ?1 and c.orderStatus <> ?2")
+    List<DomainOrder> searchUsedDomain(String name, OrderStatus status);
+
+    List<DomainOrder> findByOrderStatusAndCreatedAtBeforeAndDelFalse(OrderStatus orderStatus, LocalDateTime createdAt);
 }

+ 1 - 1
src/main/java/com/izouma/nineth/service/DomainOrderService.java

@@ -92,7 +92,7 @@ public class DomainOrderService {
             int dotIndex = domain.indexOf(".");
             domain = domain.substring(0, dotIndex);
         }
-        List<DomainOrder> used = domainOrderRepo.searchUsedDomain(domain, CollectionStatus.SUCCESS);
+        List<DomainOrder> used = domainOrderRepo.searchUsedDomain(domain, OrderStatus.CANCELLED);
 
         String n = domain.substring(domain.length() - 1);
         List<Map<String, Object>> recommend = new ArrayList<>();

+ 18 - 0
src/main/java/com/izouma/nineth/service/OrderCancelService.java

@@ -42,6 +42,8 @@ public class OrderCancelService {
     private final AuctionOrderService           auctionOrderService;
     private final PhotoAssetService             photoAssetService;
     private final PhotoAssetRepo                photoAssetRepo;
+    private final DomainOrderService            domainOrderService;
+    private final DomainOrderRepo               domainOrderRepo;
 
     private static int orderCancelInterval = 210;
 
@@ -121,6 +123,22 @@ public class OrderCancelService {
         });
     }
 
+    @Scheduled(fixedRate = 30000, initialDelay = 30000)
+    @RedisLock(value = "domain_order_batch_cancel", expire = 3, unit = TimeUnit.MINUTES)
+    public void batchCancelDomainOrder() {
+        List<DomainOrder> orders = domainOrderRepo.findByOrderStatusAndCreatedAtBeforeAndDelFalse(OrderStatus.NOT_PAID,
+                LocalDateTime.now().minusSeconds(orderCancelInterval));
+        orders.forEach(o -> {
+            try {
+                DomainOrder order = domainOrderRepo.findById(o.getId()).orElseThrow(new BusinessException("订单不存在"));
+                if (order.getOrderStatus() == OrderStatus.NOT_PAID && canCancel(order.getId().toString())) {
+                    domainOrderService.cancel(order);
+                }
+            } catch (Exception ignored) {
+            }
+        });
+    }
+
     private boolean canCancel(String id) {
         String channel = null;
         Object payTmp = redisTemplate.opsForValue().get(RedisKeys.PAY_TMP + id);