xiongzhu 4 年 前
コミット
baad042993

+ 7 - 0
src/main/java/com/izouma/nineth/service/AirDropService.java

@@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.data.domain.Page;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
@@ -112,6 +113,11 @@ public class AirDropService {
         return airDropRepo.save(record);
     }
 
+    @Async
+    public void asyncDrop(Long collectionId, Long userId, int num, LocalDateTime time) {
+        drop(collectionId, userId, num, time);
+    }
+
     public void drop(Long collectionId, Long userId, int num, LocalDateTime time) {
         Collection collection = collectionRepo.findById(collectionId)
                 .orElseThrow(new BusinessException("藏品不存在"));
@@ -138,6 +144,7 @@ public class AirDropService {
                     tokenHistory.setCreatedAt(asset.getCreatedAt());
                     tokenHistoryRepo.save(tokenHistory);
                 }
+                log.info("空投成功{}/{} collectionId={}, userId={}", i + 1, num, collectionId, userId);
             }
         } catch (Exception e) {
             log.error("空投出错", e);

+ 67 - 6
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -33,10 +33,7 @@ import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.security.Authority;
 import com.izouma.nineth.service.sms.SmsService;
-import com.izouma.nineth.utils.AESEncryptUtil;
-import com.izouma.nineth.utils.JpaUtils;
-import com.izouma.nineth.utils.SecurityUtils;
-import com.izouma.nineth.utils.SnowflakeIdWorker;
+import com.izouma.nineth.utils.*;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -44,6 +41,8 @@ import org.apache.commons.codec.EncoderException;
 import org.apache.commons.codec.net.URLCodec;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.RandomUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.client.producer.SendResult;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
@@ -61,6 +60,7 @@ import org.springframework.ui.Model;
 import java.io.File;
 import java.io.OutputStream;
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.math.RoundingMode;
 import java.time.Duration;
 import java.time.LocalDate;
@@ -299,8 +299,8 @@ public class OrderService {
                     .contactName(Optional.ofNullable(userAddress).map(UserAddress::getName).orElse(null))
                     .contactPhone(Optional.ofNullable(userAddress).map(UserAddress::getPhone).orElse(null))
                     .address(Optional.ofNullable(userAddress).map(u ->
-                            u.getProvinceName() + " " + u.getCityName() + " " + u.getDistrictName() + " " + u
-                                    .getAddress())
+                                    u.getProvinceName() + " " + u.getCityName() + " " + u.getDistrictName() + " " + u
+                                            .getAddress())
                             .orElse(null))
                     .status(OrderStatus.NOT_PAID)
                     .assetId(collection.getAssetId())
@@ -980,4 +980,65 @@ public class OrderService {
 
     }
 
+    public List<Order> addOrder(Long collectionId, List<Long> userIds, LocalDateTime time, boolean notify) {
+        Collection collection = collectionRepo.findById(collectionId).orElseThrow(new BusinessException("藏品不存在"));
+        User minter = userRepo.findById(collection.getMinterId()).orElseThrow(new BusinessException("用户不存在"));
+        int i = 0;
+        List<Order> list = new ArrayList<>();
+        for (Long userId : userIds) {
+            time = time.plusSeconds(i++);
+            BigDecimal gasFee = new BigDecimal("1");
+            Order order = Order.builder()
+                    .id(snowflakeIdWorker.nextId())
+                    .userId(userId)
+                    .collectionId(collectionId)
+                    .name(collection.getName())
+                    .pic(collection.getPic())
+                    .detail(collection.getDetail())
+                    .properties(collection.getProperties())
+                    .category(collection.getCategory())
+                    .canResale(collection.isCanResale())
+                    .royalties(collection.getRoyalties())
+                    .serviceCharge(collection.getServiceCharge())
+                    .type(collection.getType())
+                    .source(collection.getSource())
+                    .minterId(collection.getMinterId())
+                    .minter(minter.getNickname())
+                    .minterAvatar(minter.getAvatar())
+                    .qty(1)
+                    .price(collection.getPrice())
+                    .gasPrice(gasFee)
+                    .totalPrice(collection.getPrice().multiply(BigDecimal.valueOf(1)).add(gasFee))
+                    .status(notify ? OrderStatus.NOT_PAID : OrderStatus.FINISH)
+                    .assetId(collection.getAssetId())
+                    .countId(collection.getCountId())
+                    .build();
+            orderRepo.saveAndFlush(order);
+
+            String txHash = RandomStringUtils.randomAlphanumeric(64).toLowerCase(Locale.ROOT);
+            String transactionId = DateTimeUtils.format(LocalDateTime.now(), "yyyyMMdd") +
+                    RandomStringUtils.randomNumeric(24);
+            BigInteger gas = new BigInteger("157377");
+
+            if (notify) {
+                rocketMQTemplate.syncSend(generalProperties.getOrderNotifyTopic(),
+                        new OrderNotifyEvent(order.getId(), PayMethod.ALIPAY, order.getTransactionId()
+                                , System.currentTimeMillis()));
+            } else {
+                order.setCreatedAt(ObjectUtils.clone(time));
+                order.setPayTime(time.plusSeconds(RandomUtils.nextInt(5, 50)));
+                order.setTransactionId(transactionId);
+                order.setTxHash(txHash);
+                order.setGasUsed(gas);
+                order.setPayMethod(PayMethod.ALIPAY);
+                order.setStatus(OrderStatus.FINISH);
+                order.setModifiedAt(order.getPayTime());
+                order.setModifiedBy("system");
+                order.setCreatedBy("system");
+                orderRepo.save(order);
+            }
+            list.add(order);
+        }
+        return list;
+    }
 }

+ 7 - 1
src/main/java/com/izouma/nineth/web/AirDropController.java

@@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.time.LocalDateTime;
 import java.util.List;
 
 @RestController
@@ -20,7 +21,7 @@ import java.util.List;
 @AllArgsConstructor
 public class AirDropController extends BaseController {
     private AirDropService airDropService;
-    private AirDropRepo airDropRepo;
+    private AirDropRepo    airDropRepo;
 
     @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -51,5 +52,10 @@ public class AirDropController extends BaseController {
         List<AirDrop> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
+
+    @PostMapping("/asyncDrop")
+    public void asyncDrop(Long collectionId, Long userId, int num, LocalDateTime time) {
+        airDropService.asyncDrop(collectionId, userId, num, time);
+    }
 }
 

+ 8 - 0
src/main/java/com/izouma/nineth/web/OrderController.java

@@ -187,5 +187,13 @@ public class OrderController extends BaseController {
             e.printStackTrace();
         }
     }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/addOrder")
+    public List<Order> addOrder(@RequestParam Long collectionId, @RequestParam List<Long> userIds,
+                                @RequestParam LocalDateTime time,
+                                @RequestParam(defaultValue = "false") boolean notify) {
+        return orderService.addOrder(collectionId, userIds, time, notify);
+    }
 }
 

+ 3 - 3
src/test/java/com/izouma/nineth/service/AirDropServiceTest.java

@@ -18,11 +18,11 @@ public class AirDropServiceTest extends ApplicationTests {
     @Test
     public void drop() {
         airDropService.drop(4235490L, 4273750L, 498,
-                LocalDateTime.of(2022, 3, 25, 17, 30));
+                LocalDateTime.of(2022, 4, 13, 23, 01));
     }
 
     @Test
-    public void excel(){
+    public void excel() {
         File file = new File("/Users/qiufangchao/Desktop/RaexDrop.xlsx");
         UploadDataListener<AirDropExcelDTO> listener = new UploadDataListener<>();
         List<AirDropExcelDTO> dtos = EasyExcel.read(file, AirDropExcelDTO.class, listener)
@@ -30,7 +30,7 @@ public class AirDropServiceTest extends ApplicationTests {
                 .doReadSync();
 //        System.out.println(dtos);
 
-        dtos.forEach(dto->{
+        dtos.forEach(dto -> {
 
         });
     }

+ 7 - 6
src/test/java/com/izouma/nineth/service/OrderServiceTest.java

@@ -12,13 +12,18 @@ import com.izouma.nineth.enums.AssetStatus;
 import com.izouma.nineth.enums.AuthStatus;
 import com.izouma.nineth.enums.OrderStatus;
 import com.izouma.nineth.repo.*;
+import com.izouma.nineth.utils.DateTimeUtils;
 import com.izouma.nineth.utils.FileUtils;
+import com.izouma.nineth.utils.SnowflakeIdWorker;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -47,6 +52,8 @@ public class OrderServiceTest extends ApplicationTests {
     private CollectionService collectionService;
     @Autowired
     private BlindBoxItemRepo  blindBoxItemRepo;
+    @Autowired
+    private SnowflakeIdWorker snowflakeIdWorker;
 
     @Test
     public void create() {
@@ -241,12 +248,6 @@ public class OrderServiceTest extends ApplicationTests {
                 });
     }
 
-    @Test
-    public void test() {
-        orderService.create(9972L, 83346L, 1, null, null, null,
-                112342311L, false);
-    }
-
     @Test
     public void test1() {
         orderService.queryCreateOrder("945378720611303424");