瀏覽代碼

交易历史bug

xiongzhu 4 年之前
父節點
當前提交
5f0a954150

+ 2 - 0
src/main/java/com/izouma/nineth/domain/Asset.java

@@ -139,6 +139,8 @@ public class Asset extends BaseEntity {
 
     private int likes;
 
+    private Long fromAssetId;
+
     public static Asset create(Collection collection, User user) {
         return Asset.builder()
                 .userId(user.getId())

+ 8 - 0
src/main/java/com/izouma/nineth/repo/AssetRepo.java

@@ -10,6 +10,7 @@ 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 AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationExecutor<Asset> {
     @Query("update Asset t set t.del = true where t.id = ?1")
@@ -28,4 +29,11 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
     List<Asset> findByConsignmentTrue();
 
     List<Asset> findByTokenIdIn(Iterable<String> tokenId);
+
+    List<Asset> findByTokenIdOrderByCreatedAt(String tokenId);
+
+    List<Asset> findByOrderId(Long orderId);
+
+    @Query("select a from Asset a join Order o on o.assetId = a.id join Asset aa on aa.orderId = o.id where a.id = ?1")
+    Optional<Asset> findChild(Long id);
 }

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

@@ -27,4 +27,6 @@ public interface OrderRepo extends JpaRepository<Order, Long>, JpaSpecificationE
     List<Order> findByCollectionIdIn(Iterable<Long> collectionId);
 
     int countByCollectionIdAndStatusIn(Long collectionId, Iterable<OrderStatus> orderStatuses);
+
+    List<Order> findByStatus(OrderStatus orderStatus);
 }

+ 9 - 0
src/main/java/com/izouma/nineth/repo/TokenHistoryRepo.java

@@ -5,8 +5,10 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 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.util.List;
 
 public interface TokenHistoryRepo extends JpaRepository<TokenHistory, Long>, JpaSpecificationExecutor<TokenHistory> {
@@ -14,4 +16,11 @@ public interface TokenHistoryRepo extends JpaRepository<TokenHistory, Long>, Jpa
 
     @Query("select t from TokenHistory t where t.toUserId = ?1 or t.fromUserId = ?1 order by t.createdAt desc")
     Page<TokenHistory> userHistory(Long userId, Pageable pageable);
+
+    @Transactional
+    @Modifying
+    int deleteByTokenId(String tokenId);
+
+    @Query("select t from TokenHistory t where t.fromUserId = t.toUserId")
+    List<TokenHistory> findError();
 }

+ 5 - 2
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -255,6 +255,7 @@ public class AssetService {
         newAsset.setPrice(price);
         newAsset.setSellPrice(null);
         newAsset.setOrderId(orderId);
+        newAsset.setFromAssetId(asset.getId());
         assetRepo.save(newAsset);
 
         tokenHistoryRepo.save(TokenHistory.builder()
@@ -334,13 +335,15 @@ public class AssetService {
             userHistory.setPic(asset.map(Asset::getPic).orElse(new ArrayList<>()));
             switch (tokenHistory.getOperation()) {
                 case "出售":
+                case "转让":
                     userHistory.setDescription(tokenHistory.getToUserId().equals(userId) ? "作品交易——买入" : "作品交易——售出");
+                    break;
                 case "空投":
                     userHistory.setDescription("空投");
+                    break;
                 case "转赠":
                     userHistory.setDescription(tokenHistory.getToUserId().equals(userId) ? "他人赠送" : "作品赠送");
-                case "转让":
-                    userHistory.setDescription(tokenHistory.getToUserId().equals(userId) ? "作品交易——买入" : "作品交易——售出");
+                    break;
             }
             return userHistory;
         });

+ 11 - 4
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -503,14 +503,21 @@ public class OrderService {
             if (collection.getSource() != CollectionSource.OFFICIAL) continue;
             collection.setCurrentNumber(0);
             collectionRepo.save(collection);
-            for (Asset asset : assetRepo.findByCollectionIdAndStatusIn(collection.getId(),
-                    Arrays.asList(AssetStatus.NORMAL, AssetStatus.GIFTING, AssetStatus.TRADING))) {
-                asset.setNumber(collectionService.getNextNumber(collection.getId()));
-                assetRepo.save(asset);
+            for (Asset asset : assetRepo.findByCollectionId(collection.getId())) {
+                if (asset.getStatus() == AssetStatus.GIFTED || asset.getStatus() == AssetStatus.TRANSFERRED) {
+
+                } else {
+                    asset.setNumber(collectionService.getNextNumber(collection.getId()));
+                    assetRepo.save(asset);
+                }
             }
         }
     }
 
+    public void setNumberRecursive(Asset asset) {
+    }
+
+
     public void setSales() {
         List<Collection> collections = collectionRepo.findAll();
         List<User> minters = userRepo.findAllById(collections.stream().map(Collection::getMinterId)

+ 82 - 3
src/test/java/com/izouma/nineth/service/OrderServiceTest.java

@@ -1,19 +1,42 @@
 package com.izouma.nineth.service;
 
 import com.github.binarywang.wxpay.exception.WxPayException;
+import com.huifu.adapay.core.exception.BaseAdaPayException;
+import com.huifu.adapay.model.Payment;
 import com.izouma.nineth.ApplicationTests;
+import com.izouma.nineth.TokenHistory;
+import com.izouma.nineth.domain.Asset;
+import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.Order;
+import com.izouma.nineth.enums.AssetStatus;
 import com.izouma.nineth.enums.OrderStatus;
-import com.izouma.nineth.repo.OrderRepo;
+import com.izouma.nineth.repo.*;
 import org.apache.commons.codec.EncoderException;
+import org.apache.commons.collections.MapUtils;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 public class OrderServiceTest extends ApplicationTests {
     @Autowired
-    private OrderService orderService;
+    private OrderService     orderService;
+    @Autowired
+    private OrderRepo        orderRepo;
+    @Autowired
+    private AssetRepo        assetRepo;
+    @Autowired
+    private TokenHistoryRepo tokenHistoryRepo;
     @Autowired
-    private OrderRepo    orderRepo;
+    private AssetService     assetService;
+    @Autowired
+    private CollectionRepo   collectionRepo;
+    @Autowired
+    private UserRepo         userRepo;
 
     @Test
     public void create() throws EncoderException, WxPayException {
@@ -45,4 +68,60 @@ public class OrderServiceTest extends ApplicationTests {
     public void cancel() {
         orderService.cancel(9892L);
     }
+
+    @Test
+    public void fixNotPaid() throws BaseAdaPayException {
+        List<Order> errOrders = new ArrayList<>();
+        orderRepo.findByStatus(OrderStatus.FINISH).stream().parallel().forEach(order -> {
+            if (order.getCreatedAt().isAfter(LocalDateTime.of(2021, 11, 30, 1, 1))) {
+                try {
+                    Map<String, Object> res = Payment.query(order.getTransactionId());
+                    String status = MapUtils.getString(res, "status");
+                    String errMsg = MapUtils.getString(res, "error_msg");
+                    if (!"succeeded".equals(status) && !"对应支付记录不存在".equals(errMsg)) {
+                        System.out.println(order.getId());
+                        errOrders.add(order);
+                    }
+                } catch (Exception e) {
+                }
+            }
+        });
+
+        System.out.println(errOrders.stream().map(o -> o.getId().toString()).collect(Collectors.joining(",")));
+
+
+        for (Order errOrder : errOrders) {
+            Collection collection = collectionRepo.findById(errOrder.getCollectionId()).orElse(null);
+            if (collection == null) continue;
+            List<Asset> assets = assetRepo.findByOrderId(errOrder.getId());
+            for (Asset asset : assets) {
+                if (asset.getStatus() == AssetStatus.NORMAL) {
+                    if (asset.isPublicShow()) {
+                        assetService.cancelPublic(asset);
+                    }
+                    tokenHistoryRepo.deleteByTokenId(asset.getTokenId());
+                    assetRepo.delete(asset);
+                }
+            }
+            orderRepo.delete(errOrder);
+            collection.setStock(collection.getStock() + 1);
+            collection.setSale(collection.getSale() - 1);
+            collectionRepo.save(collection);
+        }
+    }
+
+    @Test
+    public void fixTokenHistory() {
+        for (TokenHistory tokenHistory : tokenHistoryRepo.findError()) {
+            List<Asset> assets = assetRepo.findByTokenIdOrderByCreatedAt(tokenHistory.getTokenId());
+            if (assets.size() == 2) {
+                userRepo.findById(assets.get(0).getUserId()).ifPresent(fromUser -> {
+                    tokenHistory.setFromUserId(assets.get(0).getUserId());
+                    tokenHistory.setFromUser(fromUser.getNickname());
+                    tokenHistory.setFromAvatar(fromUser.getAvatar());
+                    tokenHistoryRepo.save(tokenHistory);
+                });
+            }
+        }
+    }
 }