xiongzhu 4 лет назад
Родитель
Сommit
9490fad7d6

+ 5 - 0
src/main/java/com/izouma/nineth/repo/GiftOrderRepo.java

@@ -1,8 +1,13 @@
 package com.izouma.nineth.repo;
 
 import com.izouma.nineth.domain.GiftOrder;
+import com.izouma.nineth.enums.OrderStatus;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
+import java.time.LocalDateTime;
+import java.util.List;
+
 public interface GiftOrderRepo extends JpaRepository<GiftOrder, Long>, JpaSpecificationExecutor<GiftOrder> {
+    List<GiftOrder> findByStatusAndCreatedAtBeforeAndDelFalse(OrderStatus status, LocalDateTime time);
 }

+ 27 - 0
src/main/java/com/izouma/nineth/service/GiftOrderService.java

@@ -26,6 +26,7 @@ import org.apache.commons.codec.EncoderException;
 import org.apache.commons.codec.net.URLCodec;
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.env.Environment;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.ui.Model;
 
@@ -33,6 +34,7 @@ import javax.transaction.Transactional;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.Arrays;
+import java.util.List;
 
 @Service
 @AllArgsConstructor
@@ -170,4 +172,29 @@ public class GiftOrderService {
         }
         throw new BusinessException("不支持此付款方式");
     }
+
+    @Scheduled(fixedRate = 60000)
+    public void batchCancel() {
+        List<GiftOrder> orders = giftOrderRepo.findByStatusAndCreatedAtBeforeAndDelFalse(OrderStatus.NOT_PAID,
+                LocalDateTime.now().minusMinutes(5));
+        orders.forEach(o -> {
+            try {
+                cancel(o);
+            } catch (Exception ignored) {
+            }
+        });
+    }
+
+    public void cancel(GiftOrder order) {
+        if (order.getStatus() != OrderStatus.NOT_PAID) {
+            throw new BusinessException("已支付订单无法取消");
+        }
+        Asset asset = assetRepo.findById(order.getAssetId()).orElseThrow(new BusinessException("藏品不存在"));
+        asset.setStatus(AssetStatus.NORMAL);
+        assetRepo.save(asset);
+
+        order.setStatus(OrderStatus.CANCELLED);
+        order.setCancelTime(LocalDateTime.now());
+        giftOrderRepo.save(order);
+    }
 }

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

@@ -344,7 +344,12 @@ public class OrderService {
     public void batchCancel() {
         List<Order> orders = orderRepo.findByStatusAndCreatedAtBeforeAndDelFalse(OrderStatus.NOT_PAID,
                 LocalDateTime.now().minusMinutes(5));
-        orders.forEach(this::cancel);
+        orders.forEach(o -> {
+            try {
+                cancel(o);
+            } catch (Exception ignored) {
+            }
+        });
     }
 
     public void refundCancelled(Order order) {