package com.izouma.nineth.service; import com.izouma.nineth.domain.Asset; import com.izouma.nineth.domain.MintMaterial; import com.izouma.nineth.domain.MintOrder; import com.izouma.nineth.domain.User; import com.izouma.nineth.dto.PageQuery; import com.izouma.nineth.enums.AssetStatus; import com.izouma.nineth.enums.MintOrderStatus; import com.izouma.nineth.exception.BusinessException; import com.izouma.nineth.repo.AssetRepo; import com.izouma.nineth.repo.MintOrderRepo; import com.izouma.nineth.repo.UserRepo; import com.izouma.nineth.utils.JpaUtils; import lombok.AllArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @Service @AllArgsConstructor public class MintOrderService { private MintOrderRepo mintOrderRepo; private UserRepo userRepo; private AssetService assetService; private AssetRepo assetRepo; public Page all(PageQuery pageQuery) { return mintOrderRepo.findAll(JpaUtils.toSpecification(pageQuery, MintOrder.class), JpaUtils.toPageRequest(pageQuery)); } @Transactional public void create(Long userId, List assetIds) { User user = userRepo.findByIdAndDelFalse(userId).orElseThrow(new BusinessException("用户不存在")); User blackHole = userRepo.findByIdAndDelFalse(1435297L).orElseThrow(new BusinessException("无法铸造")); if (assetIds.size() != 3) { throw new BusinessException("数量不正确,请重新选择"); } List assets = assetRepo.findAllByIdInAndUserId(assetIds, userId); assets = assets.stream() .filter(asset -> asset.getName().contains("尼尔斯") && AssetStatus.NORMAL.equals(asset.getStatus())) .collect(Collectors.toList()); if (assets.size() != 3) { throw new BusinessException("有藏品不符合,请重新选择"); } // 铸造资产 List materials = assets.stream().map(asset -> { MintMaterial material = new MintMaterial(); material.setAssetId(asset.getId()); material.setCollectionId(asset.getCollectionId()); material.setName(asset.getName()); return material; }).collect(Collectors.toList()); // 铸造订单 mintOrderRepo.save(MintOrder.builder() .userId(userId) .phone(user.getPhone()) .material(materials) .consume(true) .status(MintOrderStatus.AIR_DROP) .build()); // 改为转赠 assets.forEach(asset -> assetService.transfer(asset, asset.getPrice(), blackHole, "转赠", null)); } public void finish(Long id) { MintOrder mintOrder = mintOrderRepo.findById(id).orElseThrow(new BusinessException("铸造订单不存在")); mintOrder.setStatus(MintOrderStatus.FINISH); mintOrderRepo.save(mintOrder); } }