Răsfoiți Sursa

资产创建

xiongzhu 4 ani în urmă
părinte
comite
5c653bcbc2

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

@@ -12,6 +12,7 @@ import lombok.NoArgsConstructor;
 
 import javax.persistence.*;
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.List;
 
 
@@ -41,7 +42,7 @@ public class Asset extends BaseEntity {
     private Long minterId;
 
     @ApiModelProperty("铸造者头像")
-    private Long minterAvatar;
+    private String minterAvatar;
 
     @ApiModelProperty("图片")
     @Convert(converter = StringArrayConverter.class)
@@ -54,8 +55,11 @@ public class Asset extends BaseEntity {
     @ApiModelProperty("购买hash")
     private String txHash;
 
+    @ApiModelProperty("消耗gas")
+    private BigInteger gasUsed;
+
     @ApiModelProperty("区块高度")
-    private String blockHeight;
+    private BigInteger blockNumber;
 
     @ApiModelProperty("购买hash")
     private String ipfsUrl;

+ 6 - 2
src/main/java/com/izouma/nineth/domain/Order.java

@@ -13,6 +13,7 @@ import lombok.NoArgsConstructor;
 
 import javax.persistence.*;
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -83,11 +84,14 @@ public class Order extends BaseEntity {
     @ApiModelProperty("支付时间")
     private LocalDateTime payTime;
 
-    @ApiModelProperty("链上hash")
+    @ApiModelProperty("交易hash")
     private String txHash;
 
     @ApiModelProperty("消耗gas")
-    private int gas;
+    private BigInteger gasUsed;
+
+    @ApiModelProperty("区块高度")
+    private BigInteger blockNumber;
 
     @ApiModelProperty("收货人")
     private String contactName;

+ 34 - 0
src/main/java/com/izouma/nineth/dto/Minter.java

@@ -0,0 +1,34 @@
+package com.izouma.nineth.dto;
+
+import com.alibaba.fastjson.JSON;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+
+@AllArgsConstructor
+@Builder
+public class Minter {
+    private Long   id;
+    private String name;
+    private String avatar;
+    private String account;
+
+    public class MinterConverter implements AttributeConverter<Minter, String> {
+
+        @Override
+        public String convertToDatabaseColumn(Minter minter) {
+            if (minter == null) return null;
+            return JSON.toJSONString(minter);
+        }
+
+        @Override
+        public Minter convertToEntityAttribute(String s) {
+            if (StringUtils.isEmpty(s)) {
+                return null;
+            }
+            return JSON.parseObject(s, Minter.class);
+        }
+    }
+}

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

@@ -3,13 +3,16 @@ package com.izouma.nineth.service;
 import com.izouma.nineth.domain.Asset;
 import com.izouma.nineth.domain.Order;
 import com.izouma.nineth.domain.User;
+import com.izouma.nineth.dto.NFT;
 import com.izouma.nineth.dto.NFTAccount;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.AssetStatus;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.AssetRepo;
 import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.scheduling.annotation.Async;
@@ -17,6 +20,7 @@ import org.springframework.stereotype.Service;
 
 @Service
 @AllArgsConstructor
+@Slf4j
 public class AssetService {
 
     private AssetRepo  assetRepo;
@@ -28,7 +32,7 @@ public class AssetService {
     }
 
     @Async
-    public void createAsset(Order order) {
+    public Asset createAsset(Order order) {
         User user = userRepo.findById(order.getUserId()).orElseThrow(new BusinessException("用户不存在"));
         if (StringUtils.isEmpty(user.getPublicKey())) {
             NFTAccount account = nftService.createAccount(user.getUsername());
@@ -38,5 +42,30 @@ public class AssetService {
             userRepo.save(user);
         }
 
+        try {
+            NFT nft = nftService.createToken(user.getNftAccount());
+            if (nft != null) {
+                Asset asset = Asset.builder()
+                        .userId(user.getId())
+                        .orderId(order.getId())
+                        .minter(order.getMinter())
+                        .minterId(order.getMinterId())
+                        .minterAvatar(order.getMinterAvatar())
+                        .pic(order.getPic())
+                        .tokenId(nft.getTokenId())
+                        .blockNumber(nft.getBlockNumber())
+                        .txHash(nft.getTxHash())
+                        .gasUsed(nft.getGasUsed())
+                        .price(order.getPrice())
+                        .status(AssetStatus.NORMAL)
+                        .build();
+                assetRepo.save(asset);
+                return asset;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("创建nft失败");
+        }
+        return null;
     }
 }

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

@@ -96,6 +96,6 @@ public class NFTService {
             // 异步交易未成功需要根据状态码判断交易状态
             log.error("EVM合约执行未成功: " + resp.getCode());
         }
-        return null;
+        throw new BusinessException("创建nft失败");
     }
 }

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

@@ -6,10 +6,7 @@ import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
 import com.alipay.api.request.AlipayTradeWapPayRequest;
 import com.izouma.nineth.config.AlipayProperties;
-import com.izouma.nineth.domain.Collection;
-import com.izouma.nineth.domain.Order;
-import com.izouma.nineth.domain.User;
-import com.izouma.nineth.domain.UserAddress;
+import com.izouma.nineth.domain.*;
 import com.izouma.nineth.dto.NFTAccount;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.OrderStatus;
@@ -153,7 +150,14 @@ public class OrderService {
             order.setTransactionId(MapUtils.getString(params, "trade_no"));
             order.setPayMethod(PayMethod.ALIPAY);
             orderRepo.save(order);
-            assetService.createAsset(order);
+            Asset asset = assetService.createAsset(order);
+            if (asset != null) {
+                order.setTxHash(asset.getTxHash());
+                order.setGasUsed(asset.getGasUsed());
+                order.setBlockNumber(asset.getBlockNumber());
+                order.setStatus(OrderStatus.FINISH);
+                orderRepo.save(order);
+            }
         }
     }
 }