xiongzhu vor 4 Jahren
Ursprung
Commit
d16ef83583

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

@@ -212,7 +212,7 @@ public class Asset extends CollectionBaseEntity {
     private String hcTokenId;
     private String hcTokenId;
 
 
     @Column(columnDefinition = "bit(1) default 0")
     @Column(columnDefinition = "bit(1) default 0")
-    private boolean safeTransfer;
+    private boolean safeFlag;
 
 
 
 
     public static Asset create(Collection collection, User user) {
     public static Asset create(Collection collection, User user) {

+ 8 - 12
src/main/java/com/izouma/nineth/service/AirDropService.java

@@ -82,7 +82,7 @@ public class AirDropService {
                                 assetService.createAsset(winItem, user, 0L, collection.getPrice(), "出售",
                                 assetService.createAsset(winItem, user, 0L, collection.getPrice(), "出售",
                                         winItem.getTotal() > 1 ?
                                         winItem.getTotal() > 1 ?
                                                 collectionService.getNextNumber(winItem.getCollectionId()) : null,
                                                 collectionService.getNextNumber(winItem.getCollectionId()) : null,
-                                        collection.getHoldDays());
+                                        collection.getHoldDays(), false);
                             } else {
                             } else {
                                 //查看有无vip权限
                                 //查看有无vip权限
                                 CollectionPrivilege collectionPrivilege = collectionPrivilegeRepo
                                 CollectionPrivilege collectionPrivilege = collectionPrivilegeRepo
@@ -96,7 +96,7 @@ public class AirDropService {
                                 Asset asset = assetService.createAsset(winItem, user, null, null, "空投",
                                 Asset asset = assetService.createAsset(winItem, user, null, null, "空投",
                                         winItem.getTotal() > 1 ?
                                         winItem.getTotal() > 1 ?
                                                 collectionService.getNextNumber(winItem.getCollectionId()) : null,
                                                 collectionService.getNextNumber(winItem.getCollectionId()) : null,
-                                        collection.getHoldDays());
+                                        collection.getHoldDays(), false);
                                 //铸造空投的t+0
                                 //铸造空投的t+0
                                 if (record.isAuto()) {
                                 if (record.isAuto()) {
                                     assetRepo.updateHoldDays(asset.getId(), 0);
                                     assetRepo.updateHoldDays(asset.getId(), 0);
@@ -106,8 +106,7 @@ public class AirDropService {
                         } else {
                         } else {
                             if (record.isSimulateOrder()) {
                             if (record.isSimulateOrder()) {
                                 assetService.createAsset(collection, user, 0L, collection.getPrice(),
                                 assetService.createAsset(collection, user, 0L, collection.getPrice(),
-                                        "出售", collection.getTotal() > 1 ?
-                                                collectionService.getNextNumber(collection.getId()) : null);
+                                        "出售", collectionService.getNextNumber(collection), false);
                             } else {
                             } else {
                                 //查看有无vip权限
                                 //查看有无vip权限
                                 CollectionPrivilege collectionPrivilege = collectionPrivilegeRepo
                                 CollectionPrivilege collectionPrivilege = collectionPrivilegeRepo
@@ -119,8 +118,7 @@ public class AirDropService {
                                     }
                                     }
                                 }
                                 }
                                 Asset asset = assetService.createAsset(collection, user, null, null,
                                 Asset asset = assetService.createAsset(collection, user, null, null,
-                                        "空投", collection.getTotal() > 1 ?
-                                                collectionService.getNextNumber(collection.getId()) : null);
+                                        "空投", collectionService.getNextNumber(collection), false);
 
 
                                 //创建展厅
                                 //创建展厅
                                 if (collection.getType() == CollectionType.SHOWROOM) {
                                 if (collection.getType() == CollectionType.SHOWROOM) {
@@ -160,11 +158,10 @@ public class AirDropService {
                 if (collection.getType() == CollectionType.BLIND_BOX) {
                 if (collection.getType() == CollectionType.BLIND_BOX) {
                     BlindBoxItem winItem = collectionService.draw(collection.getId());
                     BlindBoxItem winItem = collectionService.draw(collection.getId());
                     asset = assetService.createAsset(winItem, user, 0L, collection.getPrice(), "出售",
                     asset = assetService.createAsset(winItem, user, 0L, collection.getPrice(), "出售",
-                            winItem.getTotal() > 1 ? collectionService.getNextNumber(winItem.getCollectionId()) : null,
-                            collection.getHoldDays());
+                            collectionService.getNextNumber(winItem), collection.getHoldDays(), true);
                 } else {
                 } else {
                     asset = assetService.createAsset(collection, user, 0L, collection.getPrice(), "出售",
                     asset = assetService.createAsset(collection, user, 0L, collection.getPrice(), "出售",
-                            collection.getTotal() > 1 ? collectionService.getNextNumber(collection.getId()) : null);
+                            collectionService.getNextNumber(collection), true);
                 }
                 }
                 assetRepo.flush();
                 assetRepo.flush();
                 tokenHistoryRepo.flush();
                 tokenHistoryRepo.flush();
@@ -192,11 +189,10 @@ public class AirDropService {
                 if (collection.getType() == CollectionType.BLIND_BOX) {
                 if (collection.getType() == CollectionType.BLIND_BOX) {
                     BlindBoxItem winItem = collectionService.draw(collection.getId());
                     BlindBoxItem winItem = collectionService.draw(collection.getId());
                     asset = assetService.createAsset(winItem, user, 0L, collection.getPrice(), "出售",
                     asset = assetService.createAsset(winItem, user, 0L, collection.getPrice(), "出售",
-                            winItem.getTotal() > 1 ? collectionService.getNextNumber(winItem.getCollectionId()) : null,
-                            collection.getHoldDays());
+                            collectionService.getNextNumber(winItem), collection.getHoldDays(), false);
                 } else {
                 } else {
                     asset = assetService.createAsset(collection, user, 0L, collection.getPrice(), "出售",
                     asset = assetService.createAsset(collection, user, 0L, collection.getPrice(), "出售",
-                            collection.getTotal() > 1 ? collectionService.getNextNumber(collection.getId()) : null);
+                            collectionService.getNextNumber(collection), false);
                 }
                 }
                 assetRepo.flush();
                 assetRepo.flush();
                 tokenHistoryRepo.flush();
                 tokenHistoryRepo.flush();

+ 39 - 20
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -77,7 +77,8 @@ public class AssetService {
         return all;
         return all;
     }
     }
 
 
-    public Asset createAsset(Collection collection, User user, Long orderId, BigDecimal price, String type, Integer number) {
+    public Asset createAsset(Collection collection, User user, Long orderId, BigDecimal price, String type,
+                             Integer number, boolean safeFlag) {
         Asset asset = Asset.create(collection, user);
         Asset asset = Asset.create(collection, user);
         asset.setTokenId(TokenUtils.genTokenId());
         asset.setTokenId(TokenUtils.genTokenId());
         asset.setNumber(number);
         asset.setNumber(number);
@@ -87,6 +88,13 @@ public class AssetService {
         if (collection.getTags() != null) {
         if (collection.getTags() != null) {
             asset.getTags().addAll(collection.getTags());
             asset.getTags().addAll(collection.getTags());
         }
         }
+        User fakeUser = null;
+        if (safeFlag) {
+            fakeUser = createFakeUser();
+            asset.setOwner(fakeUser.getNickname());
+            asset.setOwnerId(fakeUser.getId());
+            asset.setOwnerAvatar(fakeUser.getAvatar());
+        }
         assetRepo.saveAndFlush(asset);
         assetRepo.saveAndFlush(asset);
 
 
         tokenHistoryRepo.save(TokenHistory.builder()
         tokenHistoryRepo.save(TokenHistory.builder()
@@ -94,9 +102,9 @@ public class AssetService {
                 .fromUser(collection.getMinter())
                 .fromUser(collection.getMinter())
                 .fromUserId(collection.getMinterId())
                 .fromUserId(collection.getMinterId())
                 .fromAvatar(collection.getMinterAvatar())
                 .fromAvatar(collection.getMinterAvatar())
-                .toUser(user.getNickname())
-                .toUserId(user.getId())
-                .toAvatar(user.getAvatar())
+                .toUser((safeFlag ? fakeUser : user).getNickname())
+                .toUserId((safeFlag ? fakeUser : user).getId())
+                .toAvatar((safeFlag ? fakeUser : user).getAvatar())
                 .operation(type)
                 .operation(type)
                 .price(price)
                 .price(price)
                 .build());
                 .build());
@@ -105,7 +113,7 @@ public class AssetService {
     }
     }
 
 
     public Asset createAsset(BlindBoxItem winItem, User user, Long orderId, BigDecimal price, String type,
     public Asset createAsset(BlindBoxItem winItem, User user, Long orderId, BigDecimal price, String type,
-                             Integer number, Integer holdDays) {
+                             Integer number, Integer holdDays, boolean safeFlag) {
         Collection blindBox = collectionRepo.findDetailById(winItem.getBlindBoxId())
         Collection blindBox = collectionRepo.findDetailById(winItem.getBlindBoxId())
                 .orElseThrow(new BusinessException("盲盒不存在"));
                 .orElseThrow(new BusinessException("盲盒不存在"));
         Collection collection = collectionRepo.findDetailById(winItem.getCollectionId())
         Collection collection = collectionRepo.findDetailById(winItem.getCollectionId())
@@ -122,6 +130,13 @@ public class AssetService {
         if (collection.getTags() != null) {
         if (collection.getTags() != null) {
             asset.getTags().addAll(collection.getTags());
             asset.getTags().addAll(collection.getTags());
         }
         }
+        User fakeUser = null;
+        if (safeFlag) {
+            fakeUser = createFakeUser();
+            asset.setOwner(fakeUser.getNickname());
+            asset.setOwnerId(fakeUser.getId());
+            asset.setOwnerAvatar(fakeUser.getAvatar());
+        }
         assetRepo.saveAndFlush(asset);
         assetRepo.saveAndFlush(asset);
 
 
         tokenHistoryRepo.save(TokenHistory.builder()
         tokenHistoryRepo.save(TokenHistory.builder()
@@ -129,9 +144,9 @@ public class AssetService {
                 .fromUser(winItem.getMinter())
                 .fromUser(winItem.getMinter())
                 .fromUserId(winItem.getMinterId())
                 .fromUserId(winItem.getMinterId())
                 .fromAvatar(winItem.getMinterAvatar())
                 .fromAvatar(winItem.getMinterAvatar())
-                .toUser(user.getNickname())
-                .toUserId(user.getId())
-                .toAvatar(user.getAvatar())
+                .toUser((safeFlag ? fakeUser : user).getNickname())
+                .toUserId((safeFlag ? fakeUser : user).getId())
+                .toAvatar((safeFlag ? fakeUser : user).getAvatar())
                 .operation(type)
                 .operation(type)
                 .price(price)
                 .price(price)
                 .build());
                 .build());
@@ -151,7 +166,7 @@ public class AssetService {
         if (asset.getStatus() != AssetStatus.NORMAL) {
         if (asset.getStatus() != AssetStatus.NORMAL) {
             throw new BusinessException("当前状态不可展示");
             throw new BusinessException("当前状态不可展示");
         }
         }
-        User owner = asset.isSafeTransfer() ?
+        User owner = asset.isSafeFlag() ?
                 userRepo.findById(asset.getOwnerId()).orElseThrow(new BusinessException("用户不存在"))
                 userRepo.findById(asset.getOwnerId()).orElseThrow(new BusinessException("用户不存在"))
                 : userRepo.findById(asset.getUserId()).orElseThrow(new BusinessException("用户不存在"));
                 : userRepo.findById(asset.getUserId()).orElseThrow(new BusinessException("用户不存在"));
         Collection collection = Collection.builder()
         Collection collection = Collection.builder()
@@ -209,10 +224,10 @@ public class AssetService {
         if (ChronoUnit.DAYS.between(asset.getCreatedAt(), LocalDateTime.now()) < holdDays) {
         if (ChronoUnit.DAYS.between(asset.getCreatedAt(), LocalDateTime.now()) < holdDays) {
             throw new BusinessException("需持有满" + holdDays + "天才能寄售上架");
             throw new BusinessException("需持有满" + holdDays + "天才能寄售上架");
         }
         }
-        User owner = asset.isSafeTransfer() ?
+        User owner = asset.isSafeFlag() ?
                 userRepo.findById(asset.getOwnerId()).orElseThrow(new BusinessException("用户不存在"))
                 userRepo.findById(asset.getOwnerId()).orElseThrow(new BusinessException("用户不存在"))
                 : userRepo.findById(asset.getUserId()).orElseThrow(new BusinessException("用户不存在"));
                 : userRepo.findById(asset.getUserId()).orElseThrow(new BusinessException("用户不存在"));
-        if (!passwordEncoder.matches(tradeCode, owner.getTradeCode())) {
+        if (!passwordEncoder.matches(tradeCode, userRepo.findTradeCode(asset.getUserId()))) {
             throw new BusinessException("交易密码错误");
             throw new BusinessException("交易密码错误");
         }
         }
 //        if (StringUtils.isBlank(owner.getSettleAccountId())) {
 //        if (StringUtils.isBlank(owner.getSettleAccountId())) {
@@ -344,19 +359,23 @@ public class AssetService {
         transfer(asset, price, toUser, reason, orderId, false);
         transfer(asset, price, toUser, reason, orderId, false);
     }
     }
 
 
-    public void transfer(Asset asset, BigDecimal price, User toUser, TransferReason reason, Long orderId, boolean safeTransfer) {
+    private User createFakeUser() {
+        String name = "0x" + RandomStringUtils.randomAlphabetic(8);
+        return userRepo.save(User.builder()
+                .username(name)
+                .nickname(name)
+                .avatar(Constants.DEFAULT_AVATAR)
+                .build());
+    }
+
+    public void transfer(Asset asset, BigDecimal price, User toUser, TransferReason reason, Long orderId, boolean safeFlag) {
         Objects.requireNonNull(asset, "原藏品不能为空");
         Objects.requireNonNull(asset, "原藏品不能为空");
         Objects.requireNonNull(toUser, "转让人不能为空");
         Objects.requireNonNull(toUser, "转让人不能为空");
         Objects.requireNonNull(reason, "转让原因不能为空");
         Objects.requireNonNull(reason, "转让原因不能为空");
 
 
         User newOwner = toUser;
         User newOwner = toUser;
-        if (safeTransfer) {
-            String name = "0x" + RandomStringUtils.randomAlphabetic(8);
-            newOwner = userRepo.save(User.builder()
-                    .username(name)
-                    .nickname(name)
-                    .avatar(Constants.DEFAULT_AVATAR)
-                    .build());
+        if (safeFlag) {
+            newOwner = createFakeUser();
         }
         }
 
 
         Asset newAsset = new Asset();
         Asset newAsset = new Asset();
@@ -377,7 +396,7 @@ public class AssetService {
         newAsset.setType(CollectionType.DEFAULT);
         newAsset.setType(CollectionType.DEFAULT);
         newAsset.setSource(TransferReason.GIFT == reason ? AssetSource.GIFT : AssetSource.TRANSFER);
         newAsset.setSource(TransferReason.GIFT == reason ? AssetSource.GIFT : AssetSource.TRANSFER);
         newAsset.setTags(new HashSet<>(asset.getTags()));
         newAsset.setTags(new HashSet<>(asset.getTags()));
-        newAsset.setSafeTransfer(safeTransfer);
+        newAsset.setSafeFlag(safeFlag);
         newAsset.setHoldDays(asset.getOldHoldDays());
         newAsset.setHoldDays(asset.getOldHoldDays());
         assetRepo.save(newAsset);
         assetRepo.save(newAsset);
 
 

+ 8 - 0
src/main/java/com/izouma/nineth/service/CollectionService.java

@@ -429,6 +429,14 @@ public class CollectionService {
         return collectionRepo.getCurrentNumber(collectionId).orElse(0);
         return collectionRepo.getCurrentNumber(collectionId).orElse(0);
     }
     }
 
 
+    public synchronized Integer getNextNumber(Collection collection) {
+        return collection.getTotal() > 1 ? getNextNumber(collection.getId()) : null;
+    }
+
+    public synchronized Integer getNextNumber(BlindBoxItem collection) {
+        return collection.getTotal() > 1 ? getNextNumber(collection.getId()) : null;
+    }
+
     public void addStock(Long id, int number) {
     public void addStock(Long id, int number) {
         Collection collection = collectionRepo.findById(id).orElseThrow(new BusinessException("无记录"));
         Collection collection = collectionRepo.findById(id).orElseThrow(new BusinessException("无记录"));
         if (collection.getSource() != CollectionSource.OFFICIAL) {
         if (collection.getSource() != CollectionSource.OFFICIAL) {

+ 7 - 8
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -155,7 +155,7 @@ public class OrderService {
     }
     }
 
 
     public String mqCreate(Long userId, Long collectionId, int qty, Long addressId, Long userCouponId, Long invitor,
     public String mqCreate(Long userId, Long collectionId, int qty, Long addressId, Long userCouponId, Long invitor,
-                           String sign, boolean vip, int vipPurchase, int vipPoint, boolean safeTransfer) {
+                           String sign, boolean vip, int vipPurchase, int vipPoint, boolean safeFlag) {
         String qs = null;
         String qs = null;
         try {
         try {
             qs = AESEncryptUtil.decrypt(sign);
             qs = AESEncryptUtil.decrypt(sign);
@@ -188,7 +188,7 @@ public class OrderService {
         }
         }
 
 
         Long id = snowflakeIdWorker.nextId();
         Long id = snowflakeIdWorker.nextId();
-        redisTemplate.opsForValue().set("safeTransfer::" + id, safeTransfer, 10, TimeUnit.MINUTES);
+        redisTemplate.opsForValue().set("safeFlag::" + id, safeFlag, 10, TimeUnit.MINUTES);
         SendResult result = rocketMQTemplate.syncSend(generalProperties.getCreateOrderTopic(),
         SendResult result = rocketMQTemplate.syncSend(generalProperties.getCreateOrderTopic(),
                 new CreateOrderEvent(id, userId, collectionId, qty, addressId, userCouponId, invitor, vip),
                 new CreateOrderEvent(id, userId, collectionId, qty, addressId, userCouponId, invitor, vip),
                 100000);
                 100000);
@@ -691,15 +691,15 @@ public class OrderService {
 
 
                     assetService.createAsset(winItem, user, order.getId(), order.getPrice(), "出售",
                     assetService.createAsset(winItem, user, order.getId(), order.getPrice(), "出售",
                             winItem.getTotal() > 1 ? collectionService.getNextNumber(winItem.getCollectionId()) : null,
                             winItem.getTotal() > 1 ? collectionService.getNextNumber(winItem.getCollectionId()) : null,
-                            collection.getHoldDays());
+                            collection.getHoldDays(), false);
 
 
 
 
                 } else {
                 } else {
                     if (collection.getSource() == CollectionSource.TRANSFER) {
                     if (collection.getSource() == CollectionSource.TRANSFER) {
                         orderRepo.save(order);
                         orderRepo.save(order);
                         Asset asset = assetRepo.findById(collection.getAssetId()).orElse(null);
                         Asset asset = assetRepo.findById(collection.getAssetId()).orElse(null);
-                        boolean safeTransfer = Objects.equals(true, redisTemplate.opsForValue().get("safeTransfer::" + orderId));
-                        assetService.transfer(asset, order.getPrice(), user, TransferReason.TRANSFER, order.getId(), safeTransfer);
+                        boolean safeFlag = Objects.equals(true, redisTemplate.opsForValue().get("safeFlag::" + orderId));
+                        assetService.transfer(asset, order.getPrice(), user, TransferReason.TRANSFER, order.getId(), safeFlag);
                         order.setStatus(OrderStatus.FINISH);
                         order.setStatus(OrderStatus.FINISH);
                         orderRepo.save(order);
                         orderRepo.save(order);
                         collectionRepo.delete(collection);
                         collectionRepo.delete(collection);
@@ -722,9 +722,8 @@ public class OrderService {
                                 userRepo.updateVipPurchase(order.getUserId(), 1);
                                 userRepo.updateVipPurchase(order.getUserId(), 1);
                             }
                             }
                         }
                         }
-                        Asset asset = assetService.createAsset(collection, user, order.getId(), order.getPrice(), "出售",
-                                collection.getTotal() > 1 ? collectionService
-                                        .getNextNumber(order.getCollectionId()) : null);
+                        Asset asset = assetService.createAsset(collection, user, order.getId(), order.getPrice(),
+                                "出售", collectionService.getNextNumber(collection), false);
 
 
                         if (collection.getType() == CollectionType.SHOWROOM) {
                         if (collection.getType() == CollectionType.SHOWROOM) {
                             showroomService.save(asset);
                             showroomService.save(asset);

+ 2 - 2
src/main/java/com/izouma/nineth/web/OrderController.java

@@ -115,11 +115,11 @@ public class OrderController extends BaseController {
                                             @RequestParam(required = false) Long invitor,
                                             @RequestParam(required = false) Long invitor,
                                             @RequestParam String sign,
                                             @RequestParam String sign,
                                             @RequestParam(defaultValue = "false") boolean vip,
                                             @RequestParam(defaultValue = "false") boolean vip,
-                                            @RequestParam(defaultValue = "false") boolean safeTransfer) {
+                                            @RequestParam(defaultValue = "false") boolean safeFlag) {
         final User user = SecurityUtils.getAuthenticatedUser();
         final User user = SecurityUtils.getAuthenticatedUser();
         return new HashMap<>() {{
         return new HashMap<>() {{
             put("id", orderService.mqCreate(user.getId(), collectionId, qty, addressId, couponId, invitor, sign,
             put("id", orderService.mqCreate(user.getId(), collectionId, qty, addressId, couponId, invitor, sign,
-                    vip, user.getVipPurchase(), user.getVipPoint(), safeTransfer));
+                    vip, user.getVipPurchase(), user.getVipPoint(), safeFlag));
         }};
         }};
     }
     }
 
 

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

@@ -85,7 +85,7 @@ class AssetServiceTest extends ApplicationTests {
         Collection collection = collectionRepo.findById(order.getCollectionId()).get();
         Collection collection = collectionRepo.findById(order.getCollectionId()).get();
         BlindBoxItem blindBoxItem = blindBoxItemRepo.findById(4250L).get();
         BlindBoxItem blindBoxItem = blindBoxItemRepo.findById(4250L).get();
         User user = userRepo.findById(order.getUserId()).get();
         User user = userRepo.findById(order.getUserId()).get();
-        assetService.createAsset(blindBoxItem, user, order.getId(), order.getPrice(), "出售", 1, collection.getHoldDays());
+        assetService.createAsset(blindBoxItem, user, order.getId(), order.getPrice(), "出售", 1, collection.getHoldDays(), false);
     }
     }
 
 
     @Test
     @Test