|
@@ -1,7 +1,6 @@
|
|
|
package com.ichaoj.ams.service.impl;
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
-import cn.hutool.core.thread.ThreadUtil;
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
import cn.hutool.core.util.RandomUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
@@ -14,18 +13,22 @@ import com.ichaoj.ams.mapper.AmsTradeRecordMapper;
|
|
|
import com.ichaoj.ams.request.record.CreateTradeRecordRequest;
|
|
|
import com.ichaoj.ams.request.record.PageTradeRecordRequest;
|
|
|
import com.ichaoj.ams.response.record.TradeRecordResponse;
|
|
|
+import com.ichaoj.ams.service.IAmsAddressAccountService;
|
|
|
+import com.ichaoj.ams.service.IAmsAirdropTaskService;
|
|
|
import com.ichaoj.ams.service.IAmsTradeRecordService;
|
|
|
import com.ichaoj.common.model.PublicPage;
|
|
|
+import com.ichaoj.common.model.PublicUserInfo;
|
|
|
import com.ichaoj.mybatis.service.SuperWhaleServiceImpl;
|
|
|
+import com.ichaoj.web.context.SuperWhaleContext;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
-import java.util.concurrent.CompletableFuture;
|
|
|
-import java.util.concurrent.TimeUnit;
|
|
|
-import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
+import java.util.concurrent.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -40,14 +43,15 @@ import java.util.stream.Collectors;
|
|
|
@Slf4j
|
|
|
public class AmsTradeRecordServiceImpl extends SuperWhaleServiceImpl<AmsTradeRecordMapper, AmsTradeRecord> implements IAmsTradeRecordService {
|
|
|
|
|
|
+ private final static ScheduledExecutorService AMS_SCHEDULER = Executors.newScheduledThreadPool(5);
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ @Lazy
|
|
|
+ private IAmsAddressAccountService accountService;
|
|
|
+
|
|
|
@Override
|
|
|
public PublicPage<TradeRecordResponse> pageTradeRecord(PageTradeRecordRequest pageRequest) {
|
|
|
- LambdaQueryWrapper<AmsTradeRecord> wrapper = Wrappers.lambdaQuery();
|
|
|
- wrapper
|
|
|
- .eq(StrUtil.isNotBlank(pageRequest.getQueryValue()), AmsTradeRecord::getExecuteId, pageRequest.getQueryValue())
|
|
|
- .or().eq(StrUtil.isNotBlank(pageRequest.getQueryValue()), AmsTradeRecord::getTxId, pageRequest.getQueryValue())
|
|
|
- .orderByDesc(AmsTradeRecord::getCreateTime);
|
|
|
- Page<AmsTradeRecord> result = this.page(this.buildPageObj(pageRequest), wrapper);
|
|
|
+ Page<TradeRecordResponse> result = this.baseMapper.pageTradeRecord(this.buildPageObj(pageRequest), pageRequest);
|
|
|
return this.convertPublicPage(result, s -> BeanUtil.copyProperties(s, TradeRecordResponse.class));
|
|
|
}
|
|
|
|
|
@@ -62,34 +66,49 @@ public class AmsTradeRecordServiceImpl extends SuperWhaleServiceImpl<AmsTradeRec
|
|
|
addressMap.put(address, false);
|
|
|
}
|
|
|
|
|
|
- while (set.size() != addresses.size()) {
|
|
|
+ while (set.size() <= addresses.size()) {
|
|
|
for (int i = 0; i < addresses.size(); i++) {
|
|
|
BigDecimal gas = getCurrentGasPrice(maxGas);
|
|
|
log.info("当前gas: {}", gas);
|
|
|
BigDecimal currenAmount = getCurrenAmount(amount);
|
|
|
log.info("amount: {}", currenAmount);
|
|
|
String address = getUnusedAddress(addressMap, addresses);
|
|
|
+ int sleepSeconds = RandomUtil.randomInt(intervalMin, intervalMax);
|
|
|
+ long sleep = sleepSeconds * 60L + RandomUtil.randomInt(1, 30);
|
|
|
+ log.info("执行器{} ,当前总共有{} 条交易需要执行,当前是第{} 笔交易,第{}笔交易需要等待{} 分钟",
|
|
|
+ executeId,
|
|
|
+ addresses.size(),
|
|
|
+ i + 1,
|
|
|
+ i + 2,
|
|
|
+ sleep / 60);
|
|
|
if (i == 0) {
|
|
|
- saveTrade(executeId, address);
|
|
|
+ saveTrade(executeId, address, gas, currenAmount);
|
|
|
+
|
|
|
+ // 修改地址操作时间
|
|
|
+ AmsAddressAccount account = accountService.getByAddress(address);
|
|
|
+ account.setLastOperTime(LocalDateTime.now());
|
|
|
+ accountService.updateById(account);
|
|
|
// todo 调用链上交易
|
|
|
} else {
|
|
|
- int sleepSeconds = RandomUtil.randomInt(intervalMin, intervalMax);
|
|
|
- log.info("当前是第{} 笔交易,需要等待{} 分钟", i + 1, sleepSeconds);
|
|
|
- try {
|
|
|
- AmsTradeRecord record = this.getOne(
|
|
|
- new LambdaQueryWrapper<AmsTradeRecord>()
|
|
|
- .eq(AmsTradeRecord::getExecuteId, executeId)
|
|
|
- .eq(AmsTradeRecord::getAddress, address)
|
|
|
- );
|
|
|
- if (record == null) {
|
|
|
- TimeUnit.MILLISECONDS.sleep(sleepSeconds * 1000L + RandomUtil.randomInt(100, 999));
|
|
|
- saveTrade(executeId, address);
|
|
|
+
|
|
|
+ AmsTradeRecord record = this.getOne(
|
|
|
+ new LambdaQueryWrapper<AmsTradeRecord>()
|
|
|
+ .eq(AmsTradeRecord::getExecuteId, executeId)
|
|
|
+ .eq(AmsTradeRecord::getAddress, address)
|
|
|
+ );
|
|
|
+
|
|
|
+ if (record == null) {
|
|
|
+ AMS_SCHEDULER.schedule(() -> {
|
|
|
+ saveTrade(executeId, address, gas, currenAmount);
|
|
|
+ // 修改地址操作时间
|
|
|
+ AmsAddressAccount account = accountService.getByAddress(address);
|
|
|
+ account.setLastOperTime(LocalDateTime.now());
|
|
|
+ accountService.updateById(account);
|
|
|
// todo 调用链上交易
|
|
|
- }
|
|
|
- } catch (InterruptedException e) {
|
|
|
- e.printStackTrace();
|
|
|
+ }, sleep, TimeUnit.SECONDS);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
addressMap.put(address, true);
|
|
|
set.add(address);
|
|
|
}
|
|
@@ -104,13 +123,15 @@ public class AmsTradeRecordServiceImpl extends SuperWhaleServiceImpl<AmsTradeRec
|
|
|
return RandomUtil.randomBigDecimal(BigDecimal.ZERO, new BigDecimal(maxGas));
|
|
|
}
|
|
|
|
|
|
- private void saveTrade(String executeId, String address) {
|
|
|
+ private void saveTrade(String executeId, String address, BigDecimal gas, BigDecimal amount) {
|
|
|
CreateTradeRecordRequest trade = CreateTradeRecordRequest.builder()
|
|
|
.address(address)
|
|
|
.executeId(executeId)
|
|
|
.createTime(LocalDateTime.now())
|
|
|
.status(0)
|
|
|
.txId(IdUtil.simpleUUID())
|
|
|
+ .gas(gas.toPlainString())
|
|
|
+ .amount(amount.toPlainString())
|
|
|
.build();
|
|
|
this.save(BeanUtil.copyProperties(trade, AmsTradeRecord.class));
|
|
|
}
|