|
@@ -1,8 +1,8 @@
|
|
|
package com.izouma.nineth.service;
|
|
package com.izouma.nineth.service;
|
|
|
|
|
|
|
|
import cn.hutool.core.convert.Convert;
|
|
import cn.hutool.core.convert.Convert;
|
|
|
-import com.fasterxml.jackson.annotation.JsonView;
|
|
|
|
|
import com.izouma.nineth.TokenHistory;
|
|
import com.izouma.nineth.TokenHistory;
|
|
|
|
|
+import com.izouma.nineth.config.Constants;
|
|
|
import com.izouma.nineth.config.GeneralProperties;
|
|
import com.izouma.nineth.config.GeneralProperties;
|
|
|
import com.izouma.nineth.domain.Collection;
|
|
import com.izouma.nineth.domain.Collection;
|
|
|
import com.izouma.nineth.domain.*;
|
|
import com.izouma.nineth.domain.*;
|
|
@@ -10,7 +10,6 @@ import com.izouma.nineth.dto.PageQuery;
|
|
|
import com.izouma.nineth.dto.PageWrapper;
|
|
import com.izouma.nineth.dto.PageWrapper;
|
|
|
import com.izouma.nineth.dto.UserHistory;
|
|
import com.izouma.nineth.dto.UserHistory;
|
|
|
import com.izouma.nineth.enums.*;
|
|
import com.izouma.nineth.enums.*;
|
|
|
-import com.izouma.nineth.event.TransferAssetEvent;
|
|
|
|
|
import com.izouma.nineth.exception.BusinessException;
|
|
import com.izouma.nineth.exception.BusinessException;
|
|
|
import com.izouma.nineth.repo.*;
|
|
import com.izouma.nineth.repo.*;
|
|
|
import com.izouma.nineth.utils.JpaUtils;
|
|
import com.izouma.nineth.utils.JpaUtils;
|
|
@@ -18,9 +17,8 @@ import com.izouma.nineth.utils.SecurityUtils;
|
|
|
import com.izouma.nineth.utils.TokenUtils;
|
|
import com.izouma.nineth.utils.TokenUtils;
|
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
-import org.apache.commons.collections.CollectionUtils;
|
|
|
|
|
import org.apache.commons.lang3.ObjectUtils;
|
|
import org.apache.commons.lang3.ObjectUtils;
|
|
|
-import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
|
|
+import org.apache.commons.lang3.RandomStringUtils;
|
|
|
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
|
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.cache.annotation.Cacheable;
|
|
import org.springframework.cache.annotation.Cacheable;
|
|
@@ -29,15 +27,11 @@ import org.springframework.data.domain.Page;
|
|
|
import org.springframework.data.domain.PageImpl;
|
|
import org.springframework.data.domain.PageImpl;
|
|
|
import org.springframework.data.domain.Pageable;
|
|
import org.springframework.data.domain.Pageable;
|
|
|
import org.springframework.data.jpa.domain.Specification;
|
|
import org.springframework.data.jpa.domain.Specification;
|
|
|
-import org.springframework.scheduling.annotation.Async;
|
|
|
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
-import javax.persistence.criteria.CriteriaBuilder;
|
|
|
|
|
-import javax.persistence.criteria.CriteriaQuery;
|
|
|
|
|
import javax.persistence.criteria.Predicate;
|
|
import javax.persistence.criteria.Predicate;
|
|
|
-import javax.persistence.criteria.Root;
|
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
import java.time.LocalDateTime;
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
import java.time.temporal.ChronoUnit;
|
|
@@ -339,17 +333,31 @@ public class AssetService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public void transfer(Asset asset, BigDecimal price, User toUser, TransferReason reason, Long orderId) {
|
|
public void transfer(Asset asset, BigDecimal price, User toUser, TransferReason reason, Long orderId) {
|
|
|
|
|
+ transfer(asset, price, toUser, reason, orderId, false);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public void transfer(Asset asset, BigDecimal price, User toUser, TransferReason reason, Long orderId, boolean safeTransfer) {
|
|
|
Objects.requireNonNull(asset, "原藏品不能为空");
|
|
Objects.requireNonNull(asset, "原藏品不能为空");
|
|
|
Objects.requireNonNull(toUser, "转让人不能为空");
|
|
Objects.requireNonNull(toUser, "转让人不能为空");
|
|
|
Objects.requireNonNull(reason, "转让原因不能为空");
|
|
Objects.requireNonNull(reason, "转让原因不能为空");
|
|
|
|
|
|
|
|
|
|
+ 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());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
Asset newAsset = new Asset();
|
|
Asset newAsset = new Asset();
|
|
|
BeanUtils.copyProperties(asset, newAsset);
|
|
BeanUtils.copyProperties(asset, newAsset);
|
|
|
newAsset.setId(null);
|
|
newAsset.setId(null);
|
|
|
newAsset.setUserId(toUser.getId());
|
|
newAsset.setUserId(toUser.getId());
|
|
|
- newAsset.setOwner(toUser.getNickname());
|
|
|
|
|
- newAsset.setOwnerId(toUser.getId());
|
|
|
|
|
- newAsset.setOwnerAvatar(toUser.getAvatar());
|
|
|
|
|
|
|
+ newAsset.setOwner(newOwner.getNickname());
|
|
|
|
|
+ newAsset.setOwnerId(newOwner.getId());
|
|
|
|
|
+ newAsset.setOwnerAvatar(newOwner.getAvatar());
|
|
|
newAsset.setPublicShow(false);
|
|
newAsset.setPublicShow(false);
|
|
|
newAsset.setConsignment(false);
|
|
newAsset.setConsignment(false);
|
|
|
newAsset.setPublicCollectionId(null);
|
|
newAsset.setPublicCollectionId(null);
|
|
@@ -361,10 +369,11 @@ 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.setHoldDays(asset.getOldHoldDays());
|
|
newAsset.setHoldDays(asset.getOldHoldDays());
|
|
|
assetRepo.save(newAsset);
|
|
assetRepo.save(newAsset);
|
|
|
|
|
|
|
|
- tokenHistoryRepo.save(TokenHistory.builder()
|
|
|
|
|
|
|
+ TokenHistory tokenHistory = TokenHistory.builder()
|
|
|
.tokenId(asset.getTokenId())
|
|
.tokenId(asset.getTokenId())
|
|
|
.fromUser(asset.getOwner())
|
|
.fromUser(asset.getOwner())
|
|
|
.fromUserId(asset.getOwnerId())
|
|
.fromUserId(asset.getOwnerId())
|
|
@@ -374,15 +383,16 @@ public class AssetService {
|
|
|
.toAvatar(toUser.getAvatar())
|
|
.toAvatar(toUser.getAvatar())
|
|
|
.operation(reason.getDescription())
|
|
.operation(reason.getDescription())
|
|
|
.price(TransferReason.GIFT == reason ? null : price)
|
|
.price(TransferReason.GIFT == reason ? null : price)
|
|
|
- .build());
|
|
|
|
|
|
|
+ .build();
|
|
|
|
|
+ tokenHistoryRepo.save(tokenHistory);
|
|
|
|
|
|
|
|
asset.setPublicShow(false);
|
|
asset.setPublicShow(false);
|
|
|
asset.setConsignment(false);
|
|
asset.setConsignment(false);
|
|
|
asset.setPublicCollectionId(null);
|
|
asset.setPublicCollectionId(null);
|
|
|
asset.setStatus(TransferReason.GIFT == reason ? AssetStatus.GIFTED : AssetStatus.TRANSFERRED);
|
|
asset.setStatus(TransferReason.GIFT == reason ? AssetStatus.GIFTED : AssetStatus.TRANSFERRED);
|
|
|
- asset.setOwner(toUser.getNickname());
|
|
|
|
|
- asset.setOwnerId(toUser.getId());
|
|
|
|
|
- asset.setOwnerAvatar(toUser.getAvatar());
|
|
|
|
|
|
|
+ asset.setOwner(newOwner.getNickname());
|
|
|
|
|
+ asset.setOwnerId(newOwner.getId());
|
|
|
|
|
+ asset.setOwnerAvatar(newOwner.getAvatar());
|
|
|
assetRepo.save(asset);
|
|
assetRepo.save(asset);
|
|
|
|
|
|
|
|
//vip权限转让
|
|
//vip权限转让
|