DomainOrderService.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package com.izouma.nineth.service;
  2. import com.alibaba.excel.util.StringUtils;
  3. import com.izouma.nineth.domain.DomainOrder;
  4. import com.izouma.nineth.domain.FileObject;
  5. import com.izouma.nineth.domain.PhotoAsset;
  6. import com.izouma.nineth.domain.User;
  7. import com.izouma.nineth.dto.PageQuery;
  8. import com.izouma.nineth.enums.CollectionStatus;
  9. import com.izouma.nineth.enums.OrderStatus;
  10. import com.izouma.nineth.enums.PayMethod;
  11. import com.izouma.nineth.exception.BusinessException;
  12. import com.izouma.nineth.repo.DomainOrderRepo;
  13. import com.izouma.nineth.repo.UserRepo;
  14. import com.izouma.nineth.utils.JpaUtils;
  15. import com.izouma.nineth.utils.SecurityUtils;
  16. import lombok.AllArgsConstructor;
  17. import org.springframework.data.annotation.Transient;
  18. import org.springframework.data.domain.Page;
  19. import org.springframework.stereotype.Service;
  20. import javax.print.DocFlavor;
  21. import java.math.BigDecimal;
  22. import java.util.*;
  23. import java.util.regex.Matcher;
  24. import java.util.regex.Pattern;
  25. @Service
  26. @AllArgsConstructor
  27. public class DomainOrderService {
  28. private DomainOrderRepo domainOrderRepo;
  29. private ContentAuditService contentAuditService;
  30. private UserRepo userRepo;
  31. private AssetService assetService;
  32. private SysConfigService sysConfigService;
  33. public Page<DomainOrder> all(PageQuery pageQuery) {
  34. return domainOrderRepo
  35. .findAll(JpaUtils.toSpecification(pageQuery, DomainOrder.class), JpaUtils.toPageRequest(pageQuery));
  36. }
  37. public boolean isContainChinese(String str) {
  38. if (StringUtils.isEmpty(str)) {
  39. throw new BusinessException("sms context is empty!");
  40. }
  41. Pattern p = Pattern.compile("[\u4E00-\u9FA5|\\!|\\,|\\。|\\(|\\)|\\《|\\》|\\“|\\”|\\?|\\:|\\;|\\【|\\】]");
  42. Matcher m = p.matcher(str);
  43. if (m.find()) {
  44. return true;
  45. }
  46. return false;
  47. }
  48. public DomainOrder create(Long userId, String domain, BigDecimal price) {
  49. List<DomainOrder> notPaidOrders = domainOrderRepo.findAllByUserIdAndOrderStatus(userId, OrderStatus.NOT_PAID);
  50. Long superUserId = Long.valueOf(sysConfigService.getString("domain_superUserId"));
  51. if (!superUserId.equals(SecurityUtils.getAuthenticatedUser().getId())) {
  52. if (isContainChinese(domain)) {
  53. throw new BusinessException("禁止注册中文域名");
  54. }
  55. if (notPaidOrders.size() > 0) {
  56. throw new BusinessException("已存在未支付订单,不可继续下单");
  57. }
  58. if (domain.length() < 9) {
  59. throw new BusinessException("四位及以下域名只能官方创建。");
  60. }
  61. }
  62. Map<String, Object> checkResult = check(domain);
  63. if (!(Boolean) checkResult.get("result")) {
  64. throw new BusinessException(checkResult.get("reason").toString());
  65. }
  66. if (price.compareTo(BigDecimal.valueOf(40L)) != 0) {
  67. throw new BusinessException("订单价格与配置不符,请重新下单.");
  68. }
  69. User user = userRepo.findById(userId).orElseThrow(new BusinessException("未找到用户"));
  70. if (domain.contains(".")) {
  71. int dotIndex = domain.indexOf(".");
  72. domain = domain.substring(0, dotIndex);
  73. }
  74. FileObject fileObject = new FileObject();
  75. fileObject.setName("默认图片");
  76. fileObject.setType("image/jpeg");
  77. fileObject.setUrl("https://raex-meta.oss-cn-shenzhen.aliyuncs.com/image/2021-12-17-19-03-38BNAlEhlJ.png");
  78. DomainOrder domainOrder = new DomainOrder();
  79. domainOrder.setPic(Collections.singletonList(fileObject));
  80. domainOrder.setPicName(domain);
  81. domainOrder.setPrice(price);
  82. domainOrder.setDomainName(domain + ".nft");
  83. domainOrder.setStatus(CollectionStatus.PENDING);
  84. domainOrder.setOrderStatus(OrderStatus.NOT_PAID);
  85. domainOrder.setUserId(user.getId());
  86. domainOrder.setUserAvatar(user.getAvatar());
  87. domainOrder.setUserName(user.getNickname());
  88. return domainOrderRepo.save(domainOrder);
  89. }
  90. public Map<String, Object> check(String domain) {
  91. Long superUserId = Long.valueOf(sysConfigService.getString("domain_superUserId"));
  92. String visibleDomain = domain + ".nft";
  93. List<String> keywords = Arrays.asList(sysConfigService.getString("domain_keyword").split(","));
  94. Map<String, Object> result = new HashMap<>();
  95. if (!superUserId.equals(SecurityUtils.getAuthenticatedUser().getId())) {
  96. if (keywords.stream().anyMatch(keyword -> org.apache.commons.lang.StringUtils.equals(keyword, domain))) {
  97. result.put("result", false);
  98. result.put("reason", "包含敏感关键字");
  99. return result;
  100. }
  101. if (visibleDomain.length() < 9 || visibleDomain.length() > 20) {
  102. result.put("result", false);
  103. result.put("reason", "域名长度不合规");
  104. return result;
  105. }
  106. if (!contentAuditService.auditText(domain)) {
  107. result.put("result", false);
  108. result.put("reason", "该域名内容不合规");
  109. return result;
  110. }
  111. }
  112. Integer count = domainOrderRepo
  113. .countAllByDomainNameEqualsAndOrderStatusNot(visibleDomain, OrderStatus.CANCELLED);
  114. if (count > 0) {
  115. result.put("result", false);
  116. result.put("reason", "该域名已被注册");
  117. return result;
  118. }
  119. result.put("result", true);
  120. result.put("reason", "可以注册");
  121. return result;
  122. }
  123. public List<Map<String, Object>> search(String domain) {
  124. if (domain.contains(".")) {
  125. int dotIndex = domain.indexOf(".");
  126. domain = domain.substring(0, dotIndex);
  127. }
  128. List<DomainOrder> used = domainOrderRepo.searchUsedDomain("%" + domain + "%", OrderStatus.CANCELLED);
  129. String n = domain.substring(domain.length() - 1);
  130. List<Map<String, Object>> recommend = new ArrayList<>();
  131. for (int i = 0; i < 100; i++) {
  132. if (i != 0) {
  133. domain = domain + n;
  134. }
  135. Map<String, Object> checkResult = check(domain);
  136. if ((Boolean) checkResult.get("result")) {
  137. Map<String, Object> sold = new HashMap<>();
  138. sold.put("domain", domain + ".nft");
  139. sold.put("sold", false);
  140. recommend.add(sold);
  141. }
  142. if (recommend.size() > 2) {
  143. break;
  144. }
  145. }
  146. List<Map<String, Object>> result = new ArrayList<>(recommend);
  147. used.forEach(domainOrder -> {
  148. Map<String, Object> sold = new HashMap<>();
  149. sold.put("domain", domainOrder.getDomainName());
  150. sold.put("sold", true);
  151. result.add(sold);
  152. });
  153. return result;
  154. }
  155. @Transient
  156. public void notify(Long id, PayMethod payMethod, String transactionId) {
  157. DomainOrder domainOrder = domainOrderRepo.findById(id).orElseThrow(new BusinessException("未找到星图"));
  158. if (!domainOrder.getOrderStatus().equals(OrderStatus.NOT_PAID)) {
  159. throw new BusinessException("订单已经处理");
  160. }
  161. domainOrder.setOrderStatus(OrderStatus.FINISH);
  162. domainOrder.setPayMethod(payMethod);
  163. domainOrder.setTransactionId(transactionId);
  164. domainOrder.setStatus(CollectionStatus.SUCCESS);
  165. domainOrder.setCreateAssetId(createAsset(domainOrder));
  166. domainOrderRepo.save(domainOrder);
  167. }
  168. public void cancel(DomainOrder domainOrder) {
  169. domainOrder.setOrderStatus(OrderStatus.CANCELLED);
  170. domainOrder.setStatus(CollectionStatus.FAIL);
  171. domainOrderRepo.save(domainOrder);
  172. }
  173. public Long createAsset(DomainOrder domainOrder) {
  174. return assetService.createAsset(domainOrder, userRepo.findById(domainOrder.getUserId())
  175. .orElseThrow(new BusinessException("无用户记录")), null, BigDecimal.ZERO, "域名", null, false).getId();
  176. }
  177. }