xiongzhu 4 éve
szülő
commit
4dd514d0c1

+ 5 - 0
pom.xml

@@ -80,6 +80,11 @@
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-activemq</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>com.github.ben-manes.caffeine</groupId>
             <artifactId>caffeine</artifactId>

+ 3 - 0
src/main/java/com/izouma/nineth/domain/Order.java

@@ -94,6 +94,9 @@ public class Order extends BaseEntity {
     @ApiModelProperty("支付时间")
     private LocalDateTime payTime;
 
+    @ApiModelProperty("取消时间")
+    private LocalDateTime cancelTime;
+
     @ApiModelProperty("交易hash")
     private String txHash;
 

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

@@ -1,12 +1,15 @@
 package com.izouma.nineth.repo;
 
 import com.izouma.nineth.domain.Order;
+import com.izouma.nineth.enums.OrderStatus;
 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.transaction.Transactional;
+import java.time.LocalDateTime;
+import java.util.List;
 import java.util.Optional;
 
 public interface OrderRepo extends JpaRepository<Order, Long>, JpaSpecificationExecutor<Order> {
@@ -16,4 +19,6 @@ public interface OrderRepo extends JpaRepository<Order, Long>, JpaSpecificationE
     void softDelete(Long id);
 
     Optional<Order> findByIdAndDelFalse(Long id);
+
+    List<Order> findByStatusAndCreatedAtBeforeAndDelFalse(OrderStatus status, LocalDateTime time);
 }

+ 39 - 0
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -38,6 +38,7 @@ import org.apache.http.client.utils.URLEncodedUtils;
 import org.springframework.context.event.EventListener;
 import org.springframework.core.env.Environment;
 import org.springframework.data.domain.Page;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.ui.Model;
 
@@ -120,6 +121,7 @@ public class OrderService {
     public void payOrderAlipay(Long id, Model model) {
         try {
             Order order = orderRepo.findByIdAndDelFalse(id).orElseThrow(new BusinessException("订单不存在"));
+
             if (order.getStatus() != OrderStatus.NOT_PAID) {
                 throw new BusinessException("订单状态错误");
             }
@@ -284,6 +286,8 @@ public class OrderService {
                 orderRepo.save(order);
                 assetService.createAsset(order);
             }
+        } else if (order.getStatus() == OrderStatus.CANCELLED) {
+
         }
     }
 
@@ -302,4 +306,39 @@ public class OrderService {
             log.error("创建asset失败");
         }
     }
+
+    public void cancel(Long id) {
+        Order order = orderRepo.findById(id).orElseThrow(new BusinessException("订单不存在"));
+        cancel(order);
+    }
+
+    public void cancel(Order order) {
+        if (order.getStatus() != OrderStatus.NOT_PAID) {
+            throw new BusinessException("已支付订单无法取消");
+        }
+        Collection collection = collectionRepo.findById(order.getCollectionId())
+                .orElseThrow(new BusinessException("藏品不存在"));
+        User minter = userRepo.findById(collection.getMinterId()).orElseThrow(new BusinessException("铸造者不存在"));
+
+        collection.setSale(collection.getSale() - 1);
+        collection.setStock(collection.getStock() + 1);
+        collectionRepo.save(collection);
+
+        minter.setSales(minter.getSales() - 1);
+        userRepo.save(minter);
+
+        order.setStatus(OrderStatus.CANCELLED);
+        order.setCancelTime(LocalDateTime.now());
+        orderRepo.save(order);
+    }
+
+    @Scheduled(fixedRate = 60000)
+    public void batchCancel() {
+        List<Order> orders = orderRepo.findByStatusAndCreatedAtBeforeAndDelFalse(OrderStatus.NOT_PAID,
+                LocalDateTime.now().minusMinutes(5));
+        orders.stream().parallel().forEach(this::cancel);
+    }
+
+    public void refundCancelled(Order order) {
+    }
 }