MintOrderService.java 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package com.izouma.nineth.service;
  2. import com.izouma.nineth.domain.Asset;
  3. import com.izouma.nineth.domain.MintMaterial;
  4. import com.izouma.nineth.domain.MintOrder;
  5. import com.izouma.nineth.domain.User;
  6. import com.izouma.nineth.dto.PageQuery;
  7. import com.izouma.nineth.enums.AssetStatus;
  8. import com.izouma.nineth.enums.MintOrderStatus;
  9. import com.izouma.nineth.exception.BusinessException;
  10. import com.izouma.nineth.repo.AssetRepo;
  11. import com.izouma.nineth.repo.MintOrderRepo;
  12. import com.izouma.nineth.repo.UserRepo;
  13. import com.izouma.nineth.utils.JpaUtils;
  14. import lombok.AllArgsConstructor;
  15. import org.springframework.data.domain.Page;
  16. import org.springframework.stereotype.Service;
  17. import javax.transaction.Transactional;
  18. import java.util.List;
  19. import java.util.Optional;
  20. import java.util.stream.Collectors;
  21. @Service
  22. @AllArgsConstructor
  23. public class MintOrderService {
  24. private MintOrderRepo mintOrderRepo;
  25. private UserRepo userRepo;
  26. private AssetService assetService;
  27. private AssetRepo assetRepo;
  28. public Page<MintOrder> all(PageQuery pageQuery) {
  29. return mintOrderRepo.findAll(JpaUtils.toSpecification(pageQuery, MintOrder.class), JpaUtils.toPageRequest(pageQuery));
  30. }
  31. @Transactional
  32. public void create(Long userId, List<Long> assetIds) {
  33. User user = userRepo.findByIdAndDelFalse(userId).orElseThrow(new BusinessException("用户不存在"));
  34. User blackHole = userRepo.findByIdAndDelFalse(1435297L).orElseThrow(new BusinessException("无法铸造"));
  35. if (assetIds.size() != 3) {
  36. throw new BusinessException("数量不正确,请重新选择");
  37. }
  38. List<Asset> assets = assetRepo.findAllByIdInAndUserId(assetIds, userId);
  39. assets = assets.stream()
  40. .filter(asset -> asset.getName().contains("尼尔斯") && AssetStatus.NORMAL.equals(asset.getStatus()))
  41. .collect(Collectors.toList());
  42. if (assets.size() != 3) {
  43. throw new BusinessException("有藏品不符合,请重新选择");
  44. }
  45. // 铸造资产
  46. List<MintMaterial> materials = assets.stream().map(asset -> {
  47. MintMaterial material = new MintMaterial();
  48. material.setAssetId(asset.getId());
  49. material.setCollectionId(asset.getCollectionId());
  50. material.setName(asset.getName());
  51. return material;
  52. }).collect(Collectors.toList());
  53. // 铸造订单
  54. mintOrderRepo.save(MintOrder.builder()
  55. .userId(userId)
  56. .phone(user.getPhone())
  57. .material(materials)
  58. .consume(true)
  59. .status(MintOrderStatus.AIR_DROP)
  60. .build());
  61. // 改为转赠
  62. assets.forEach(asset -> assetService.transfer(asset, asset.getPrice(), blackHole, "转赠", null));
  63. }
  64. public void finish(Long id) {
  65. MintOrder mintOrder = mintOrderRepo.findById(id).orElseThrow(new BusinessException("铸造订单不存在"));
  66. mintOrder.setStatus(MintOrderStatus.FINISH);
  67. mintOrderRepo.save(mintOrder);
  68. }
  69. }