package com.izouma.nineth.service; import com.izouma.nineth.domain.DomainOrder; import com.izouma.nineth.domain.PhotoAsset; import com.izouma.nineth.domain.User; import com.izouma.nineth.dto.PageQuery; import com.izouma.nineth.enums.CollectionStatus; import com.izouma.nineth.enums.OrderStatus; import com.izouma.nineth.enums.PayMethod; import com.izouma.nineth.exception.BusinessException; import com.izouma.nineth.repo.DomainOrderRepo; import com.izouma.nineth.repo.UserRepo; import com.izouma.nineth.utils.JpaUtils; import lombok.AllArgsConstructor; import org.springframework.data.annotation.Transient; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import javax.print.DocFlavor; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Service @AllArgsConstructor public class DomainOrderService { private DomainOrderRepo domainOrderRepo; private ContentAuditService contentAuditService; private UserRepo userRepo; private AssetService assetService; public Page all(PageQuery pageQuery) { return domainOrderRepo .findAll(JpaUtils.toSpecification(pageQuery, DomainOrder.class), JpaUtils.toPageRequest(pageQuery)); } public DomainOrder create(Long userId, String domain, BigDecimal price) { if (domain.length() < 5) { throw new BusinessException("四位及以下域名只能官方创建。"); } Map checkResult = check(domain); if (!(Boolean) checkResult.get("result")) { throw new BusinessException(checkResult.get("reason").toString()); } if (price.compareTo(BigDecimal.valueOf(40L)) != 0) { throw new BusinessException("订单价格与配置不符,请重新下单."); } User user = userRepo.findById(userId).orElseThrow(new BusinessException("未找到用户")); if (domain.contains(".")) { int dotIndex = domain.indexOf("."); domain = domain.substring(0, dotIndex); } DomainOrder domainOrder = new DomainOrder(); domainOrder.setPicName(domain); domainOrder.setPrice(price); domainOrder.setDomainName(domain + ".uni"); domainOrder.setStatus(CollectionStatus.PENDING); domainOrder.setUserId(user.getId()); domainOrder.setUserAvatar(user.getAvatar()); domainOrder.setUserName(user.getNickname()); return domainOrderRepo.save(domainOrder); } public Map check(String domain) { Map result = new HashMap<>(); Integer count = domainOrderRepo.countAllByDomainNameEqualsAndStatus(domain, CollectionStatus.SUCCESS); if (domain.length() < 5 || domain.length() > 20) { result.put("result", false); result.put("reason", "域名长度不合规"); return result; } if (count > 0) { result.put("result", false); result.put("reason", "该域名已被注册"); return result; } if (!contentAuditService.auditText(domain)) { result.put("result", false); result.put("reason", "该域名内容不合规"); return result; } result.put("result", true); result.put("reason", "可以注册"); return result; } public List> search(String domain) { if (domain.contains(".")) { int dotIndex = domain.indexOf("."); domain = domain.substring(0, dotIndex); } List used = domainOrderRepo.searchUsedDomain(domain, CollectionStatus.SUCCESS); String n = domain.substring(domain.length() - 1); List> recommend = new ArrayList<>(); for (int i = 0; i < 100; i++) { domain = domain + n; Map checkResult = check(domain + ".uni"); if ((Boolean) checkResult.get("result")) { Map sold = new HashMap<>(); sold.put("domain", domain + ".uni"); sold.put("sold", false); recommend.add(sold); } if (recommend.size() > 2) { break; } } List> result = new ArrayList<>(recommend); used.forEach(domainOrder -> { Map sold = new HashMap<>(); sold.put("domain", domainOrder.getDomainName()); sold.put("sold", true); result.add(sold); }); return result; } @Transient public void notify(Long id, PayMethod payMethod, String transactionId) { DomainOrder domainOrder = domainOrderRepo.findById(id).orElseThrow(new BusinessException("未找到星图")); if (!domainOrder.getOrderStatus().equals(OrderStatus.NOT_PAID)) { throw new BusinessException("订单已经处理"); } domainOrder.setOrderStatus(OrderStatus.FINISH); domainOrder.setPayMethod(payMethod); domainOrder.setTransactionId(transactionId); domainOrder.setStatus(CollectionStatus.SUCCESS); createAsset(domainOrder); domainOrderRepo.save(domainOrder); } public void cancel(DomainOrder domainOrder) { domainOrder.setOrderStatus(OrderStatus.CANCELLED); domainOrder.setStatus(CollectionStatus.FAIL); domainOrderRepo.save(domainOrder); } public void createAsset(DomainOrder domainOrder) { Long createId = assetService.createAsset(domainOrder, userRepo.findById(domainOrder.getUserId()) .orElseThrow(new BusinessException("无用户记录")), null, BigDecimal.ZERO, "域名", null, false).getId(); } }