Ver Fonte

feat: ams 统计模块

cjwen há 1 ano atrás
pai
commit
67cac4f3b8

+ 1 - 1
src/main/java/com/ichaoj/ams/controller/AddressController.java

@@ -77,7 +77,7 @@ public class AddressController {
     @GetMapping("/group-list")
     @AuthResource
     public PublicResult<List<String>> queryGroupList() {
-        List<String> result = addressService.queryGroupList();
+        List<String> result = addressService.queryGroupList(1);
         return PublicResult.success(result);
     }
 

+ 64 - 0
src/main/java/com/ichaoj/ams/controller/StatisticsController.java

@@ -0,0 +1,64 @@
+package com.ichaoj.ams.controller;
+
+import com.ichaoj.ams.service.IAmsAddressAccountService;
+import com.ichaoj.ams.service.IAmsTradeRecordService;
+import com.ichaoj.common.annotation.AuthResource;
+import com.ichaoj.common.model.PublicResult;
+import com.ichaoj.common.model.PublicUserInfo;
+import com.ichaoj.web.context.SuperWhaleContext;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author : cjwen
+ * @date : 2023/05/23 18:37
+ */
+
+@RestController
+@RequestMapping("/statistics")
+@Tag(name = "统计模块")
+public class StatisticsController {
+
+    @Resource
+    private IAmsTradeRecordService tradeService;
+
+    @Resource
+    private IAmsAddressAccountService accountService;
+
+    @GetMapping("daily-cost")
+    @Operation(summary = "每日消耗gas和本金")
+    @AuthResource
+    public PublicResult<Map<String, Object>> dailyCostStatistics() {
+        Map<String, Object> map = new HashMap<>(5);
+        String userId = SuperWhaleContext.getContext(PublicUserInfo.class).getUserId();
+        List<String> batchAddresses = accountService.queryGroupList(1);
+
+        // 从链上获取当日gas费用
+        BigDecimal dailyGasCost = getDailyGasCost(userId);
+        // 从链上获取当日本金消耗量
+//        BigDecimal dailyPrincipalCost = getDailyPrincipalCost(userId);
+        // 总消耗 = gas费用 + 本金消耗
+//        BigDecimal totalCost = dailyGasCost.add(dailyPrincipalCost);
+        return PublicResult.success(map);
+    }
+
+    private void getGroupAndWalletNum(Map<String, Object> map) {
+        List<String> list = accountService.queryGroupList(0);
+        map.put("premiumCount", list.size());
+
+    }
+
+    private BigDecimal getDailyGasCost(String userId) {
+        return BigDecimal.ZERO;
+    }
+
+}

+ 10 - 0
src/main/java/com/ichaoj/ams/mapper/AmsTradeRecordMapper.java

@@ -1,7 +1,10 @@
 package com.ichaoj.ams.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ichaoj.ams.entity.AmsTradeRecord;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ichaoj.ams.request.record.PageTradeRecordRequest;
+import com.ichaoj.ams.response.record.TradeRecordResponse;
 
 /**
  * <p>
@@ -13,4 +16,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface AmsTradeRecordMapper extends BaseMapper<AmsTradeRecord> {
 
+    /**
+     * 分页查询交易记录
+     * @param buildPageObj 分页对象
+     * @param request 请求参数
+     * @return 分页结果
+     */
+    Page<TradeRecordResponse> pageTradeRecord(Page<AmsTradeRecord> buildPageObj, PageTradeRecordRequest request);
 }

+ 11 - 0
src/main/java/com/ichaoj/ams/response/record/TradeRecordResponse.java

@@ -2,6 +2,7 @@ package com.ichaoj.ams.response.record;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import com.ichaoj.ams.constant.AmsConstant;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -58,6 +59,16 @@ public class TradeRecordResponse {
      */
     private String address;
 
+    /**
+     * 任务类型
+     */
+    private AmsConstant.TaskType taskType;
+
+    /**
+     * 任务名称
+     */
+    private String taskName;
+
     /**
      * 创建时间
      */

+ 8 - 1
src/main/java/com/ichaoj/ams/service/IAmsAddressAccountService.java

@@ -62,7 +62,14 @@ public interface IAmsAddressAccountService extends IService<AmsAddressAccount> {
     /**
      * 查询地址组列表
      * @return 地址组列表
+     * @param addressType
      */
-    List<String> queryGroupList();
+    List<String> queryGroupList(int addressType);
 
+    /**
+     * 根据地址查找
+     * @param address 地址
+     * @return 地址账户
+     */
+    AmsAddressAccount getByAddress(String address);
 }

+ 9 - 4
src/main/java/com/ichaoj/ams/service/impl/AmsAddressAccountServiceImpl.java

@@ -10,7 +10,6 @@ import com.ichaoj.ams.common.bean.Wallet;
 import com.ichaoj.ams.common.util.WalletUtil;
 import com.ichaoj.ams.common.util.ZipUtil;
 import com.ichaoj.ams.entity.AmsAddressAccount;
-import com.ichaoj.ams.entity.AmsTradeRecord;
 import com.ichaoj.ams.mapper.AmsAddressAccountMapper;
 import com.ichaoj.ams.request.address.BatchAddressRequest;
 import com.ichaoj.ams.request.address.PageAddressRequest;
@@ -30,7 +29,6 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
-import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -109,14 +107,21 @@ public class AmsAddressAccountServiceImpl extends SuperWhaleServiceImpl<AmsAddre
     }
 
     @Override
-    public List<String> queryGroupList() {
+    public List<String> queryGroupList(int addressType) {
         LambdaQueryWrapper<AmsAddressAccount> wrapper = Wrappers.lambdaQuery();
         wrapper.eq(AmsAddressAccount::getUserId, SuperWhaleContext.getContext(PublicUserInfo.class).getUserId())
-                .eq(AmsAddressAccount::getAddressType, 1)
+                .eq(addressType >= 0, AmsAddressAccount::getAddressType, addressType)
                 .groupBy(AmsAddressAccount::getGroupName);
         return this.list(wrapper).stream().map(AmsAddressAccount::getGroupName).distinct().collect(Collectors.toList());
     }
 
+    @Override
+    public AmsAddressAccount getByAddress(String address) {
+        LambdaQueryWrapper<AmsAddressAccount> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(AmsAddressAccount::getAddress, address);
+        return this.getOne(wrapper);
+    }
+
     /**
      * 添加精品号
      */

+ 1 - 1
src/main/java/com/ichaoj/ams/service/impl/AmsExecuteRecordServiceImpl.java

@@ -58,7 +58,7 @@ public class AmsExecuteRecordServiceImpl extends SuperWhaleServiceImpl<AmsExecut
         wrapper
                 .eq(StrUtil.isNotBlank(executeRequest.getQueryValue()), AmsExecuteRecord::getExecuteId, executeRequest.getQueryValue())
                 .or(w->w.like(StrUtil.isNotBlank(executeRequest.getQueryValue()), AmsExecuteRecord::getGroupName, executeRequest.getQueryValue())
-                        .like(StrUtil.isNotBlank(executeRequest.getQueryValue()), AmsExecuteRecord::getTaskId, executeRequest.getQueryValue()))
+                        .or().like(StrUtil.isNotBlank(executeRequest.getQueryValue()), AmsExecuteRecord::getTaskId, executeRequest.getQueryValue()))
                 .orderByDesc(AmsExecuteRecord::getCreateTime);
         Page<AmsExecuteRecord> result = this.page(this.buildPageObj(executeRequest), wrapper);
         return this.convertPublicPage(result, s -> BeanUtil.copyProperties(s, ExecuteResponse.class));

+ 34 - 21
src/main/java/com/ichaoj/ams/service/impl/AmsTradeRecordServiceImpl.java

@@ -13,12 +13,18 @@ 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.*;
@@ -39,15 +45,13 @@ public class AmsTradeRecordServiceImpl extends SuperWhaleServiceImpl<AmsTradeRec
 
     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(w -> w.eq(StrUtil.isNotBlank(pageRequest.getQueryValue()), AmsTradeRecord::getTxId, pageRequest.getQueryValue())
-                        .eq(StrUtil.isNotBlank(pageRequest.getQueryValue()), AmsTradeRecord::getAddress, 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,24 +66,31 @@ 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, gas, currenAmount);
+
+                    // 修改地址操作时间
+                    AmsAddressAccount account = accountService.getByAddress(address);
+                    account.setLastOperTime(LocalDateTime.now());
+                    accountService.updateById(account);
                     // todo 调用链上交易
                 } else {
-                    int sleepSeconds = RandomUtil.randomInt(intervalMin, intervalMax);
-                    long sleep = sleepSeconds * 60L + RandomUtil.randomInt(1, 30);
-                    log.info("执行器{} ,总共有{} 条交易需要执行,当前是{},第{} 笔交易,需要等待{} 分钟",
-                            executeId,
-                            addresses.size(),
-                            address, i + 1,
-                            sleep);
+
                     AmsTradeRecord record = this.getOne(
                             new LambdaQueryWrapper<AmsTradeRecord>()
                                     .eq(AmsTradeRecord::getExecuteId, executeId)
@@ -87,15 +98,17 @@ public class AmsTradeRecordServiceImpl extends SuperWhaleServiceImpl<AmsTradeRec
                     );
 
                     if (record == null) {
-                        AMS_SCHEDULER.schedule(new TimerTask() {
-                            @Override
-                            public void run() {
-                                saveTrade(executeId, address, gas, currenAmount);
-                                // todo 调用链上交易
-                            }
+                        AMS_SCHEDULER.schedule(() -> {
+                            saveTrade(executeId, address, gas, currenAmount);
+                            // 修改地址操作时间
+                            AmsAddressAccount account = accountService.getByAddress(address);
+                            account.setLastOperTime(LocalDateTime.now());
+                            accountService.updateById(account);
+                            // todo 调用链上交易
                         }, sleep, TimeUnit.SECONDS);
                     }
                 }
+
                 addressMap.put(address, true);
                 set.add(address);
             }

+ 27 - 1
src/main/resources/mapper/AmsTradeRecordMapper.xml

@@ -1,5 +1,31 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ichaoj.ams.mapper.AmsTradeRecordMapper">
-
+    <select id="pageTradeRecord" resultType="com.ichaoj.ams.response.record.TradeRecordResponse">
+        SELECT tr.trade_record_id,
+        tr.tx_id,
+        tr.execute_id,
+        tr.gas,
+        tr.amount,
+        tr.current_balance,
+        tr.chain_id,
+        tr.`status`,
+        tr.address,
+        tr.create_time,
+        tr.update_time,
+        t.task_type,
+        t.task_name
+        FROM ams_trade_record tr
+        inner join ams_execute_record er
+        on tr.execute_id = er.execute_id and er.flag = 0
+        inner join ams_airdrop_task t
+        on t.ams_task_id = er.task_id and t.flag = 0
+        WHERE tr.flag = 0
+        <if test="request.queryValue != null and request.queryValue != ''">
+            and tr.execute_id = #{request.queryValue}
+            or tr.tx_id = #{request.queryValue}
+            or tr.address = #{request.queryValue}
+        </if>
+        ORDER BY tr.create_time DESC
+    </select>
 </mapper>