package com.izouma.nineth.service; import com.izouma.nineth.domain.Asset; import com.izouma.nineth.domain.Collection; 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.event.CreateAssetEvent; import com.izouma.nineth.exception.BusinessException; import com.izouma.nineth.repo.AssetRepo; import com.izouma.nineth.repo.CollectionRepo; 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.context.ApplicationContext; import org.springframework.data.domain.Page; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @Service @AllArgsConstructor @Slf4j public class AssetService { private AssetRepo assetRepo; private UserRepo userRepo; private NFTService nftService; private ApplicationContext applicationContext; public Page all(PageQuery pageQuery) { return assetRepo.findAll(JpaUtils.toSpecification(pageQuery, Asset.class), JpaUtils.toPageRequest(pageQuery)); } @Async public void createAsset(Order order) { User user = userRepo.findById(order.getUserId()).orElseThrow(new BusinessException("用户不存在")); 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); } 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()) .name(order.getName()) .pic(order.getPic()) .properties(order.getProperties()) .tokenId(nft.getTokenId()) .blockNumber(nft.getBlockNumber()) .txHash(nft.getTxHash()) .gasUsed(nft.getGasUsed()) .price(order.getPrice()) .status(AssetStatus.NORMAL) .build(); assetRepo.save(asset); applicationContext.publishEvent(new CreateAssetEvent(this, true, order, asset)); return; } } catch (Exception e) { log.error("创建token失败", e); } applicationContext.publishEvent(new CreateAssetEvent(this, false, order, null)); } }