xiongzhu před 4 roky
rodič
revize
91870695af

+ 23 - 0
src/main/java/com/izouma/nineth/event/TransferAssetEvent.java

@@ -0,0 +1,23 @@
+package com.izouma.nineth.event;
+
+import com.izouma.nineth.domain.Asset;
+import org.springframework.context.ApplicationEvent;
+
+public class TransferAssetEvent extends ApplicationEvent {
+    private final boolean success;
+    private final Asset   asset;
+
+    public TransferAssetEvent(Object source, boolean success, Asset asset) {
+        super(source);
+        this.success = success;
+        this.asset = asset;
+    }
+
+    public Asset getAsset() {
+        return asset;
+    }
+
+    public boolean isSuccess() {
+        return success;
+    }
+}

+ 24 - 10
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -16,6 +16,7 @@ import com.izouma.nineth.config.WxPayProperties;
 import com.izouma.nineth.domain.*;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.*;
+import com.izouma.nineth.event.TransferAssetEvent;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.lock.RedisLockable;
 import com.izouma.nineth.repo.*;
@@ -357,18 +358,11 @@ public class AssetService {
         giftOrder.setPayTime(LocalDateTime.now());
         giftOrder.setPayMethod(PayMethod.ALIPAY);
 
-        transfer(asset, newOwner);
-
-        tokenHistoryRepo.save(TokenHistory.builder()
-                .fromUser(asset.getOwner())
-                .fromUserId(asset.getOwnerId())
-                .toUser(newOwner.getNickname())
-                .toUserId(newOwner.getId())
-                .operation("转赠")
-                .build());
+        transfer(asset, asset.getPrice(), newOwner, "转赠", null);
     }
 
-    public void transfer(Asset asset, User toUser) {
+    @Async
+    public void transfer(Asset asset, BigDecimal price, User toUser, String reason, Long orderId) {
         Asset newAsset = new Asset();
         BeanUtils.copyProperties(asset, newAsset);
         newAsset.setId(null);
@@ -377,17 +371,37 @@ public class AssetService {
         newAsset.setOwnerId(toUser.getId());
         newAsset.setOwnerAvatar(toUser.getAvatar());
         newAsset.setPublicShow(false);
+        newAsset.setConsignment(false);
         newAsset.setPublicCollectionId(null);
         newAsset.setStatus(AssetStatus.NORMAL);
+        newAsset.setPrice(price);
+        newAsset.setSellPrice(null);
+        newAsset.setOrderId(orderId);
         assetRepo.save(newAsset);
 
+
         asset.setPublicShow(false);
+        asset.setConsignment(false);
         asset.setPublicCollectionId(null);
         asset.setStatus(AssetStatus.GIFTED);
         asset.setOwner(toUser.getNickname());
         asset.setOwnerId(toUser.getId());
         asset.setOwnerAvatar(toUser.getAvatar());
         assetRepo.save(asset);
+
+        tokenHistoryRepo.save(TokenHistory.builder()
+                .tokenId(asset.getTokenId())
+                .fromUser(asset.getOwner())
+                .fromUserId(asset.getOwnerId())
+                .toUser(toUser.getNickname())
+                .toUserId(toUser.getId())
+                .operation(reason)
+                .build());
+
+        if (orderId != null) {
+            applicationContext.publishEvent(new TransferAssetEvent(this, true, newAsset));
+        }
+
     }
 
     public List<TokenHistory> tokenHistory(String tokenId, Long assetId) {

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

@@ -17,6 +17,7 @@ import com.izouma.nineth.domain.*;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.event.CreateAssetEvent;
+import com.izouma.nineth.event.TransferAssetEvent;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.utils.JpaUtils;
@@ -299,7 +300,7 @@ public class OrderService {
             } else {
                 if (collection.getSource() == CollectionSource.TRANSFER) {
                     Asset asset = assetRepo.findById(collection.getAssetId()).orElse(null);
-                    assetService.transfer(asset, user);
+                    assetService.transfer(asset, order.getPrice(), user, "转让", order.getId());
                     collectionRepo.delete(collection);
                 } else {
                     order.setStatus(OrderStatus.PROCESSING);
@@ -321,25 +322,20 @@ public class OrderService {
                 .orElseThrow(new BusinessException("藏品不存在"));
         User user = userRepo.findById(order.getUserId()).orElseThrow(new BusinessException("用户不存在"));
         if (order.getStatus() == OrderStatus.NOT_PAID) {
+            order.setStatus(OrderStatus.PROCESSING);
+            order.setPayTime(LocalDateTime.now());
+            order.setTransactionId(transactionId);
+            order.setPayMethod(payMethod);
             if (order.getType() == CollectionType.BLIND_BOX) {
                 BlindBoxItem winItem = collectionService.draw(collection.getId());
-
-                order.setStatus(OrderStatus.PROCESSING);
-                order.setPayTime(LocalDateTime.now());
-                order.setTransactionId(transactionId);
-                order.setPayMethod(payMethod);
                 orderRepo.save(order);
                 assetService.createAsset(winItem, user, order.getId(), order.getPrice(), "出售");
             } else {
                 if (collection.getSource() == CollectionSource.TRANSFER) {
                     Asset asset = assetRepo.findById(collection.getAssetId()).orElse(null);
-                    assetService.transfer(asset, user);
+                    assetService.transfer(asset, order.getPrice(), user, "转让", order.getId());
                     collectionRepo.delete(collection);
                 } else {
-                    order.setStatus(OrderStatus.PROCESSING);
-                    order.setPayTime(LocalDateTime.now());
-                    order.setTransactionId(transactionId);
-                    order.setPayMethod(payMethod);
                     orderRepo.save(order);
                     assetService.createAsset(collection, user, order.getId(), order.getPrice(), "出售");
                 }
@@ -363,6 +359,21 @@ public class OrderService {
         }
     }
 
+    @EventListener
+    public void onTransferAsset(TransferAssetEvent event) {
+        Asset asset = event.getAsset();
+        Order order = orderRepo.findById(asset.getOrderId()).orElseThrow(new BusinessException("订单不存在"));
+        if (event.isSuccess()) {
+            order.setTxHash(asset.getTxHash());
+            order.setGasUsed(asset.getGasUsed());
+            order.setBlockNumber(asset.getBlockNumber());
+            order.setStatus(OrderStatus.FINISH);
+            orderRepo.save(order);
+        } else {
+            log.error("创建asset失败");
+        }
+    }
+
     public void cancel(Long id) {
         Order order = orderRepo.findById(id).orElseThrow(new BusinessException("订单不存在"));
         cancel(order);