|
|
@@ -14,16 +14,15 @@ import com.github.binarywang.wxpay.service.WxPayService;
|
|
|
import com.izouma.nineth.config.AlipayProperties;
|
|
|
import com.izouma.nineth.config.WxPayProperties;
|
|
|
import com.izouma.nineth.domain.*;
|
|
|
+import com.izouma.nineth.domain.Collection;
|
|
|
import com.izouma.nineth.dto.NFTAccount;
|
|
|
import com.izouma.nineth.dto.PageQuery;
|
|
|
+import com.izouma.nineth.enums.CollectionType;
|
|
|
import com.izouma.nineth.enums.OrderStatus;
|
|
|
import com.izouma.nineth.enums.PayMethod;
|
|
|
import com.izouma.nineth.event.CreateAssetEvent;
|
|
|
import com.izouma.nineth.exception.BusinessException;
|
|
|
-import com.izouma.nineth.repo.CollectionRepo;
|
|
|
-import com.izouma.nineth.repo.OrderRepo;
|
|
|
-import com.izouma.nineth.repo.UserAddressRepo;
|
|
|
-import com.izouma.nineth.repo.UserRepo;
|
|
|
+import com.izouma.nineth.repo.*;
|
|
|
import com.izouma.nineth.utils.JpaUtils;
|
|
|
import com.izouma.nineth.utils.JsonUtils;
|
|
|
import com.izouma.nineth.utils.SecurityUtils;
|
|
|
@@ -33,6 +32,8 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.codec.EncoderException;
|
|
|
import org.apache.commons.codec.net.URLCodec;
|
|
|
import org.apache.commons.collections.MapUtils;
|
|
|
+import org.apache.commons.lang3.RandomUtils;
|
|
|
+import org.apache.commons.lang3.Range;
|
|
|
import org.apache.http.client.utils.URLEncodedUtils;
|
|
|
import org.springframework.context.event.EventListener;
|
|
|
import org.springframework.core.env.Environment;
|
|
|
@@ -43,10 +44,7 @@ import org.springframework.ui.Model;
|
|
|
import javax.transaction.Transactional;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.time.LocalDateTime;
|
|
|
-import java.util.Arrays;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Optional;
|
|
|
-import java.util.UUID;
|
|
|
+import java.util.*;
|
|
|
|
|
|
@Service
|
|
|
@AllArgsConstructor
|
|
|
@@ -64,6 +62,7 @@ public class OrderService {
|
|
|
private WxPayProperties wxPayProperties;
|
|
|
private AssetService assetService;
|
|
|
private SysConfigService sysConfigService;
|
|
|
+ private BlindBoxItemRepo blindBoxItemRepo;
|
|
|
|
|
|
public Page<Order> all(PageQuery pageQuery) {
|
|
|
return orderRepo.findAll(JpaUtils.toSpecification(pageQuery, Order.class), JpaUtils.toPageRequest(pageQuery));
|
|
|
@@ -217,12 +216,55 @@ public class OrderService {
|
|
|
public void notifyAlipay(Long orderId, Map<String, String> params) {
|
|
|
Order order = orderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
|
|
|
if (order.getStatus() == OrderStatus.NOT_PAID) {
|
|
|
- order.setStatus(OrderStatus.PROCESSING);
|
|
|
- order.setPayTime(LocalDateTime.now());
|
|
|
- order.setTransactionId(MapUtils.getString(params, "trade_no"));
|
|
|
- order.setPayMethod(PayMethod.ALIPAY);
|
|
|
- orderRepo.save(order);
|
|
|
- assetService.createAsset(order);
|
|
|
+ if (order.getType() == CollectionType.BLIND_BOX) {
|
|
|
+ List<BlindBoxItem> items = blindBoxItemRepo.findByBlindBoxId(order.getCollectionId());
|
|
|
+ Map<BlindBoxItem, Range<Integer>> randomRange = new HashMap<>();
|
|
|
+ int c = 0, sum = 0;
|
|
|
+ for (BlindBoxItem item : items) {
|
|
|
+ randomRange.put(item, Range.between(c, c + item.getStock()));
|
|
|
+ c += item.getStock();
|
|
|
+ sum += item.getStock();
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean win = false;
|
|
|
+ int retry = 0;
|
|
|
+ BlindBoxItem winItem = null;
|
|
|
+ while (winItem == null) {
|
|
|
+ int rand = RandomUtils.nextInt(0, sum + 1);
|
|
|
+ for (Map.Entry<BlindBoxItem, Range<Integer>> entry : randomRange.entrySet()) {
|
|
|
+ BlindBoxItem item = entry.getKey();
|
|
|
+ Range<Integer> range = entry.getValue();
|
|
|
+ if (rand >= range.getMinimum() && rand < range.getMaximum()) {
|
|
|
+ if (item.isRare()) {
|
|
|
+ int total = items.stream().filter(i -> !i.isRare())
|
|
|
+ .mapToInt(BlindBoxItem::getTotal).sum();
|
|
|
+ int stock = items.stream().filter(i -> !i.isRare())
|
|
|
+ .mapToInt(BlindBoxItem::getStock).sum();
|
|
|
+
|
|
|
+ double nRate = stock / (double) total;
|
|
|
+ double rRate = item.getStock() / (double) item.getTotal();
|
|
|
+
|
|
|
+ if (Math.abs(nRate - rRate) < 0.05 || retry > 1) {
|
|
|
+ winItem = item;
|
|
|
+ } else {
|
|
|
+ retry++;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ winItem = item;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ } else {
|
|
|
+ order.setStatus(OrderStatus.PROCESSING);
|
|
|
+ order.setPayTime(LocalDateTime.now());
|
|
|
+ order.setTransactionId(MapUtils.getString(params, "trade_no"));
|
|
|
+ order.setPayMethod(PayMethod.ALIPAY);
|
|
|
+ orderRepo.save(order);
|
|
|
+ assetService.createAsset(order);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|