DomainAskService.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package com.izouma.nineth.service.nftdomain;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.izouma.nineth.domain.Asset;
  4. import com.izouma.nineth.domain.DomainOrder;
  5. import com.izouma.nineth.domain.User;
  6. import com.izouma.nineth.domain.nftdomain.DomainAsk;
  7. import com.izouma.nineth.dto.PageQuery;
  8. import com.izouma.nineth.dto.nftdomain.DomainAskGroup;
  9. import com.izouma.nineth.dto.nftdomain.DomainResult;
  10. import com.izouma.nineth.enums.*;
  11. import com.izouma.nineth.exception.BusinessException;
  12. import com.izouma.nineth.repo.AssetRepo;
  13. import com.izouma.nineth.repo.DomainOrderRepo;
  14. import com.izouma.nineth.repo.UserRepo;
  15. import com.izouma.nineth.repo.nftdomain.DomainAskRepo;
  16. import com.izouma.nineth.service.AssetService;
  17. import com.izouma.nineth.service.UserBalanceService;
  18. import com.izouma.nineth.utils.JpaUtils;
  19. import com.izouma.nineth.utils.SecurityUtils;
  20. import lombok.AllArgsConstructor;
  21. import org.springframework.data.domain.Page;
  22. import org.springframework.stereotype.Service;
  23. import java.math.BigDecimal;
  24. import java.math.RoundingMode;
  25. import java.util.HashSet;
  26. import java.util.List;
  27. import java.util.Map;
  28. import java.util.Set;
  29. @Service
  30. @AllArgsConstructor
  31. public class DomainAskService {
  32. private final DomainAskRepo domainAskRepo;
  33. private final DomainOrderRepo domainOrderRepo;
  34. private final AssetRepo assetRepo;
  35. private final UserRepo userRepo;
  36. private final AssetService assetService;
  37. private final UserBalanceService userBalanceService;
  38. public Page<DomainAsk> all(PageQuery pageQuery) {
  39. return domainAskRepo
  40. .findAll(JpaUtils.toSpecification(pageQuery, DomainAsk.class), JpaUtils.toPageRequest(pageQuery));
  41. }
  42. public BigDecimal getMaxPrice(Long domainOrderId) {
  43. return domainAskRepo.findMaxPrice(domainOrderId);
  44. }
  45. public DomainAsk create(Long domainOrderId, Long userId, BigDecimal price) {
  46. User user = userRepo.findById(userId).orElseThrow(new BusinessException("未找到用户"));
  47. DomainOrder
  48. domainOrder = domainOrderRepo.findById(domainOrderId).orElseThrow(new BusinessException("暂无该藏品"));
  49. Asset asset = assetRepo.findFirstByNameAndStatus("RID元宇宙域名 " + domainOrder.getDomainName(), AssetStatus.NORMAL);
  50. if (asset == null) {
  51. throw new BusinessException("未找到对应藏品。");
  52. }
  53. if (asset.isConsignment()) {
  54. throw new BusinessException("藏品已经寄售,无法出价");
  55. }
  56. if (userId.equals(asset.getUserId())) {
  57. throw new BusinessException("无法叫价自己的藏品");
  58. }
  59. Set<DomainAskStatus> domainAskStatuses = new HashSet<>();
  60. domainAskStatuses.add(DomainAskStatus.ASKING);
  61. if (domainAskRepo
  62. .countByAssetIdAndUserIdAndStatusInAndDelFalse(asset.getId(), userId, domainAskStatuses) > 0) {
  63. throw new BusinessException("已有报价,请勿重复报价!");
  64. }
  65. DomainAsk domainAsk = DomainAsk.builder()
  66. .domainOrderId(domainOrderId)
  67. .assetId(asset.getId())
  68. .name(domainOrder.getDomainName())
  69. .ownerAvatar(asset.getOwnerAvatar())
  70. .ownerId(asset.getOwnerId())
  71. .nickname(user.getNickname())
  72. .avatar(user.getAvatar())
  73. .price(price)
  74. .userId(userId)
  75. .status(DomainAskStatus.NOT_PAID)
  76. .ownerName(asset.getOwner())
  77. .pic(domainOrder.getPic())
  78. .picUrl(domainOrder.getPic().get(0).getUrl())
  79. .serviceCharge(assetService.getDomainServiceCharge(asset.getUserId()))
  80. .royalties(asset.getRoyalties())
  81. .endTime(domainOrder.getEndTime())
  82. .build();
  83. return domainAskRepo.save(domainAsk);
  84. }
  85. public void notifyOrder(Long id, PayMethod payMethod, String transactionId) {
  86. DomainAsk domainAsk = domainAskRepo.findById(id).orElseThrow(new BusinessException("未找到账户"));
  87. domainAsk.setStatus(DomainAskStatus.ASKING);
  88. domainAsk.setPayMethod(payMethod);
  89. domainAsk.setTransactionId(transactionId);
  90. domainAskRepo.save(domainAsk);
  91. }
  92. public List<Map<String, Object>> getGroups() {
  93. Long userId = SecurityUtils.getAuthenticatedUser().getId();
  94. return domainAskRepo.askGroup(userId);
  95. }
  96. public void cancel(DomainAsk domainAsk) {
  97. // DomainAsk domainAsk = domainAskRepo.findById(id).orElseThrow(new BusinessException("未找到账户"));
  98. if (domainAsk.getStatus() == DomainAskStatus.NOT_PAID) {
  99. domainAsk.setStatus(DomainAskStatus.CANCELLED);
  100. }
  101. if (domainAsk.getStatus() == DomainAskStatus.ASKING) {
  102. if (!SecurityUtils.getAuthenticatedUser().getId().equals(domainAsk.getUserId())) {
  103. throw new BusinessException("该叫价用户id不匹配,不能取消");
  104. }
  105. domainAsk.setStatus(DomainAskStatus.REFUNDED);
  106. refund(domainAsk);
  107. }
  108. domainAskRepo.save(domainAsk);
  109. }
  110. public void refund(DomainAsk domainAsk) {
  111. userBalanceService
  112. .addBalance(domainAsk.getUserId(), domainAsk.getPrice(), domainAsk.getId(), BalanceType.REFUND);
  113. }
  114. public void accept(Long id) {
  115. DomainAsk domainAsk = domainAskRepo.findById(id).orElseThrow(new BusinessException("未查询到该叫价订单"));
  116. Asset asset = assetRepo.findById(domainAsk.getAssetId()).orElseThrow(new BusinessException("未找到该藏品"));
  117. if (!SecurityUtils.getAuthenticatedUser().getId().equals(domainAsk.getOwnerId())) {
  118. throw new BusinessException("非本人收到的报价,不可确认");
  119. }
  120. if (!domainAsk.getStatus().equals(DomainAskStatus.ASKING)) {
  121. throw new BusinessException("该报价未在正在报价状态");
  122. }
  123. Set<DomainAskStatus> domainAskStatuses = new HashSet<>();
  124. domainAskStatuses.add(DomainAskStatus.FINISH);
  125. if (domainAskRepo
  126. .countByAssetIdAndOwnerIdAndStatusInAndDelFalse(asset.getId(), domainAsk
  127. .getOwnerId(), domainAskStatuses) > 0) {
  128. throw new BusinessException("已有通过报价,请勿重复通过!");
  129. }
  130. BigDecimal amount = domainAsk.getPrice()
  131. // .subtract(BigDecimal.valueOf(1))
  132. .multiply(BigDecimal
  133. .valueOf(100 - domainAsk.getRoyalties() - domainAsk.getServiceCharge()))
  134. .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
  135. assetService.transfer(asset, amount,
  136. userRepo.findById(domainAsk.getUserId())
  137. .orElseThrow(new BusinessException("未找到用户")), TransferReason.ASK, domainAsk
  138. .getId());
  139. userBalanceService.realtimeSettleOrder(domainAsk);
  140. domainAsk.setStatus(DomainAskStatus.FINISH);
  141. domainAskRepo.save(domainAsk);
  142. List<DomainAsk> otherAsks = domainAskRepo
  143. .findByAssetIdAndStatusAndDelFalse(asset.getId(), DomainAskStatus.ASKING);
  144. otherAsks.forEach(this::cancel);
  145. }
  146. }