xiongzhu 4 年之前
父节点
当前提交
71252e8108

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

@@ -3,6 +3,7 @@ package com.izouma.nineth.domain;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.izouma.nineth.annotations.Searchable;
 import com.izouma.nineth.converter.FileObjectListConverter;
 import com.izouma.nineth.converter.PrivilegeListConverter;
@@ -187,4 +188,8 @@ public class Order {
 
     private boolean opened;
 
+    @JsonProperty("createdAt")
+    public LocalDateTime getCreatedAt() {
+        return createdAt;
+    }
 }

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

@@ -39,4 +39,11 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
 
     @Query("select a from Asset a join User u on a.userId = u.id where a.consignment = true and u.settleAccountId is null")
     List<Asset> findNoAccount();
+
+    List<Asset> findByTxHash(String hash);
+
+    List<Asset> findByIdIn(Iterable<Long> ids);
+
+    @Query("select a from Asset a left join TokenHistory t on a.tokenId = t.tokenId where t.id is null")
+    List<Asset> findByNoHistory();
 }

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

@@ -33,4 +33,5 @@ public interface OrderRepo extends JpaRepository<Order, Long>, JpaSpecificationE
     @Query("select count(o) from Order o join Collection c on o.collectionId = c.id " +
             "where c.minterId = ?1 and c.source = 'OFFICIAL' and o.status <> 'NOT_PAID' and o.status <> 'CANCELLED'")
     long countSales(Long userId);
+
 }

+ 0 - 13
src/main/java/com/izouma/nineth/service/AssetMintService.java

@@ -38,19 +38,6 @@ public class AssetMintService {
     private Environment        env;
 
     public void mint(Asset asset, Long historyId) {
-        if (Arrays.stream(env.getActiveProfiles()).anyMatch(s -> s.equals("dev"))) {
-            asset.setTokenId(new SnowflakeIdWorker(0, 1).nextId() + "");
-            asset.setBlockNumber(new BigInteger("1"));
-            asset.setTxHash("1");
-            asset.setGasUsed(new BigInteger("1"));
-            if (asset.getIpfsUrl() == null) {
-                asset.setIpfsUrl(ipfsUpload(asset.getPic().get(0).getUrl()));
-            }
-            assetRepo.save(asset);
-            applicationContext.publishEvent(new CreateAssetEvent(this, true, asset));
-            return;
-        }
-
         User user = userRepo.findById(asset.getUserId()).orElseThrow(new BusinessException("用户不存在"));
         if (StringUtils.isEmpty(user.getPublicKey())) {
             NFTAccount account = nftService.createAccount(user.getUsername() + "_");

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

@@ -96,7 +96,11 @@ public class OrderService {
                 throw new BusinessException("该兑换券不可用");
             }
         }
-
+        if (collection.isScheduleSale()) {
+            if (collection.getStartTime().isAfter(LocalDateTime.now())) {
+                throw new BusinessException("当前还未开售");
+            }
+        }
         if (!collection.isOnShelf()) {
             throw new BusinessException("藏品已下架");
         }

+ 2 - 1
src/main/resources/application.yaml

@@ -12,7 +12,7 @@ spring:
   profiles:
     active: dev
   datasource:
-    url: jdbc:mysql://rm-wz9sc79f5255780opqo.mysql.rds.aliyuncs.com/raex_test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8
+    url: jdbc:mysql://rm-wz9sc79f5255780opqo.mysql.rds.aliyuncs.com/raex?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8
     username: raex
     password: K@SdS7e6NTw4CK
     hikari:
@@ -41,6 +41,7 @@ spring:
         max_active: 8
         max_idle: 8
         min_idle: 0
+    database: 1
   servlet:
     multipart:
       max_file_size: 100MB

+ 103 - 0
src/test/java/com/izouma/nineth/service/AssetServiceTest.java

@@ -1,11 +1,18 @@
 package com.izouma.nineth.service;
 
 import com.izouma.nineth.ApplicationTests;
+import com.izouma.nineth.TokenHistory;
 import com.izouma.nineth.domain.*;
+import com.izouma.nineth.dto.NFT;
+import com.izouma.nineth.dto.NFTAccount;
 import com.izouma.nineth.repo.*;
+import org.apache.commons.lang3.StringUtils;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.Arrays;
+import java.util.List;
+
 class AssetServiceTest extends ApplicationTests {
     @Autowired
     private OrderRepo         orderRepo;
@@ -23,6 +30,10 @@ class AssetServiceTest extends ApplicationTests {
     private AssetMintService  assetMintService;
     @Autowired
     private AssetRepo         assetRepo;
+    @Autowired
+    private NFTService        nftService;
+    @Autowired
+    private TokenHistoryRepo  tokenHistoryRepo;
 
     @Test
     void createAsset() {
@@ -75,4 +86,96 @@ class AssetServiceTest extends ApplicationTests {
         }
     }
 
+    @Test
+    public void fixHash() throws Exception {
+        for (Asset asset : assetRepo.findByTxHash("1")) {
+            User user = userRepo.findById(asset.getUserId()).get();
+            if (StringUtils.isEmpty(user.getPublicKey())) {
+                NFTAccount account = nftService.createAccount(user.getUsername() + "_");
+                user.setNftAccount(account.getAccountId());
+                user.setKmsId(account.getAccountKmsId());
+                user.setPublicKey(account.getPublicKey());
+                userRepo.save(user);
+            }
+            NFT nft = nftService.createToken(user.getNftAccount());
+            if (nft != null) {
+                asset.setTokenId(nft.getTokenId());
+                asset.setBlockNumber(nft.getBlockNumber());
+                asset.setTxHash(nft.getTxHash());
+                asset.setGasUsed(nft.getGasUsed());
+                assetRepo.save(asset);
+
+                List<TokenHistory> list = tokenHistoryRepo.findByTokenIdOrderByCreatedAtDesc(asset.getTokenId());
+                for (TokenHistory tokenHistory : list) {
+                    tokenHistory.setTokenId(asset.getTokenId());
+                }
+                tokenHistoryRepo.saveAll(list);
+            }
+        }
+    }
+
+    @Test
+    public void fixHash1() throws Exception {
+        List<Long> ids = Arrays.asList(27206L, 27216L, 27242L, 27271L, 27276L, 27280L, 27292L, 27294L, 43485L);
+        for (Asset asset : assetRepo.findByIdIn(ids)) {
+            User user = userRepo.findById(asset.getUserId()).get();
+            if (StringUtils.isEmpty(user.getPublicKey())) {
+                NFTAccount account = nftService.createAccount(user.getUsername() + "_");
+                user.setNftAccount(account.getAccountId());
+                user.setKmsId(account.getAccountKmsId());
+                user.setPublicKey(account.getPublicKey());
+                userRepo.save(user);
+            }
+            NFT nft = nftService.createToken(user.getNftAccount());
+            if (nft != null) {
+                asset.setTokenId(nft.getTokenId());
+                asset.setBlockNumber(nft.getBlockNumber());
+                asset.setTxHash(nft.getTxHash());
+                asset.setGasUsed(nft.getGasUsed());
+                assetRepo.save(asset);
+
+                TokenHistory tokenHistory = tokenHistoryRepo.save(TokenHistory.builder()
+                        .tokenId(asset.getTokenId())
+                        .fromUser(asset.getMinter())
+                        .fromUserId(asset.getMinterId())
+                        .fromAvatar(asset.getMinterAvatar())
+                        .toUser(user.getNickname())
+                        .toUserId(user.getId())
+                        .toAvatar(user.getAvatar())
+                        .operation("出售")
+                        .price(asset.getPrice())
+                        .tokenId(asset.getTokenId())
+                        .build());
+                tokenHistory.setCreatedAt(asset.getCreatedAt());
+                tokenHistoryRepo.save(tokenHistory);
+            }
+        }
+    }
+
+    @Test
+    public void fixNoHistory() {
+        List<Asset> assets = assetRepo.findByNoHistory();
+
+        for (Asset asset : assets) {
+            if (StringUtils.isNotBlank(asset.getTokenId())){
+                User user = userRepo.findById(asset.getUserId()).get();
+                TokenHistory tokenHistory = tokenHistoryRepo.save(TokenHistory.builder()
+                        .tokenId(asset.getTokenId())
+                        .fromUser(asset.getMinter())
+                        .fromUserId(asset.getMinterId())
+                        .fromAvatar(asset.getMinterAvatar())
+                        .toUser(user.getNickname())
+                        .toUserId(user.getId())
+                        .toAvatar(user.getAvatar())
+                        .operation("出售")
+                        .price(asset.getPrice())
+                        .tokenId(asset.getTokenId())
+                        .build());
+                tokenHistory.setCreatedAt(asset.getCreatedAt());
+                tokenHistoryRepo.save(tokenHistory);
+            }
+
+        }
+        System.out.println(assets);
+    }
 }

+ 88 - 13
src/test/java/com/izouma/nineth/service/OrderServiceTest.java

@@ -6,10 +6,12 @@ import com.huifu.adapay.model.Payment;
 import com.izouma.nineth.ApplicationTests;
 import com.izouma.nineth.TokenHistory;
 import com.izouma.nineth.domain.*;
+import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.dto.UserBankCard;
 import com.izouma.nineth.enums.AssetStatus;
 import com.izouma.nineth.enums.AuthStatus;
 import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.utils.FileUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -20,32 +22,32 @@ import org.springframework.beans.factory.annotation.Autowired;
 
 import java.io.IOException;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
+import java.util.concurrent.Future;
 import java.util.stream.Collectors;
 
 @Slf4j
 public class OrderServiceTest extends ApplicationTests {
     @Autowired
-    private OrderService     orderService;
+    private OrderService      orderService;
     @Autowired
-    private OrderRepo        orderRepo;
+    private OrderRepo         orderRepo;
     @Autowired
-    private AssetRepo        assetRepo;
+    private AssetRepo         assetRepo;
     @Autowired
-    private TokenHistoryRepo tokenHistoryRepo;
+    private TokenHistoryRepo  tokenHistoryRepo;
     @Autowired
-    private AssetService     assetService;
+    private AssetService      assetService;
     @Autowired
-    private CollectionRepo   collectionRepo;
+    private CollectionRepo    collectionRepo;
     @Autowired
-    private UserRepo         userRepo;
+    private UserRepo          userRepo;
     @Autowired
-    private IdentityAuthRepo identityAuthRepo;
+    private IdentityAuthRepo  identityAuthRepo;
     @Autowired
-    private UserBankCardRepo userBankCardRepo;
+    private UserBankCardRepo  userBankCardRepo;
+    @Autowired
+    private CollectionService collectionService;
 
     @Test
     public void create() throws EncoderException, WxPayException {
@@ -174,4 +176,77 @@ public class OrderServiceTest extends ApplicationTests {
             }
         }
     }
+
+    @Test
+    public void mint() {
+        for (Order order : orderRepo.findByStatus(OrderStatus.PROCESSING)) {
+            if (order.getPayTime().isBefore(LocalDateTime.of(2021, 12, 18, 15, 8))) {
+                try {
+                    Collection collection = collectionRepo.findById(order.getCollectionId())
+                            .orElseThrow(new BusinessException("无记录"));
+                    User user = userRepo.findById(order.getUserId()).orElseThrow(new BusinessException("无记录"));
+                    Future<Asset> f = assetService.createAsset(collection, user, order.getId(), order.getPrice(), "出售",
+                            collectionService.getNextNumber(order.getCollectionId()));
+                    while (true) {
+                        if (f.isDone()) {
+                            break;
+                        }
+                        Thread.sleep(300);
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+
+        }
+    }
+
+    @Test
+    public void removeDuplicate() {
+        List<Long> ids = new ArrayList<>();
+        orderRepo.findByCollectionId(8012L).stream()
+                .filter(o -> o.getStatus() == OrderStatus.FINISH || o.getStatus() == OrderStatus.PROCESSING)
+                .parallel().forEach(order -> {
+                    List<Asset> assets = assetRepo.findByOrderId(order.getId());
+                    if (assets.size() > 1) {
+                        assets.sort(Comparator.comparing(BaseEntity::getCreatedAt));
+                        for (int i = 1; i < assets.size(); i++) {
+                            assetRepo.delete(assets.get(i));
+                            tokenHistoryRepo.deleteByTokenId(assets.get(i).getTokenId());
+                            if (assets.get(i).getPublicCollectionId() != null) {
+                                collectionRepo.findById(assets.get(i).getPublicCollectionId()).ifPresent(c -> {
+                                    collectionRepo.delete(c);
+                                });
+                            }
+                        }
+                        ids.add(order.getId());
+                    }
+                });
+        System.out.println(ids);
+    }
+
+    @Test
+    public void setNumber1() {
+        final int[] number = {1};
+        orderRepo.findByCollectionId(8012L).stream()
+                .filter(o -> o.getStatus() == OrderStatus.FINISH || o.getStatus() == OrderStatus.PROCESSING)
+                .sorted(Comparator.comparing(Order::getCreatedAt))
+                .forEach(order -> {
+                    Asset asset = assetRepo.findByOrderId(order.getId()).get(0);
+                    asset.setNumber(number[0]);
+                    assetRepo.save(asset);
+                    if (asset.getPublicCollectionId() != null) {
+                        collectionRepo.findById(asset.getPublicCollectionId()).ifPresent(c -> {
+                            c.setNumber(asset.getNumber());
+                            collectionRepo.save(c);
+                        });
+                    }
+                    number[0]++;
+                });
+
+        assetRepo.findByCollectionId(8012L).stream().parallel().forEach(asset -> {
+
+        });
+
+    }
 }