Przeglądaj źródła

fix: 统计任务和地址数据

cjwen 1 rok temu
rodzic
commit
67ca101eb8

+ 3 - 14
src/main/java/com/ichaoj/ams/controller/StatisticsController.java

@@ -3,18 +3,12 @@ package com.ichaoj.ams.controller;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.poi.excel.ExcelBase;
-import cn.hutool.poi.excel.ExcelUtil;
-import cn.hutool.poi.excel.ExcelWriter;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.ichaoj.ams.common.util.FileUtils;
 import com.ichaoj.ams.common.util.PoiUtils;
 import com.ichaoj.ams.entity.AmsAirdropProject;
 import com.ichaoj.ams.entity.AmsAirdropTask;
 import com.ichaoj.ams.entity.AmsExecuteRecord;
 import com.ichaoj.ams.entity.AmsTradeRecord;
-import com.ichaoj.ams.request.statistics.DailyCostRequest;
 import com.ichaoj.ams.response.address.CountAddressResponse;
 import com.ichaoj.ams.response.statistics.*;
 import com.ichaoj.ams.response.task.TaskProgressResponse;
@@ -26,18 +20,12 @@ 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.apache.poi.hssf.usermodel.HSSFSheet;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
 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 javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
-import java.io.File;
-import java.io.IOException;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.*;
@@ -86,7 +74,8 @@ public class StatisticsController {
     @Operation(summary = "每日消耗gas和本金")
     @AuthResource
     public PublicResult<List<DailyCostResponse>> dailyCostStatistics() {
-        List<DailyCostResponse> list = tradeService.dailyCostStatistics();
+        String userId = SuperWhaleContext.getContext(PublicUserInfo.class).getUserId();
+        List<DailyCostResponse> list = tradeService.dailyCostStatistics(null, null, userId);
         return PublicResult.success(list);
     }
 
@@ -146,7 +135,7 @@ public class StatisticsController {
     public void createExcelFile(HttpServletResponse res) {
         try {
             // 支出趋势
-            List<DailyCostResponse> trendList = tradeService.dailyCostStatistics();
+            List<DailyCostResponse> trendList = tradeService.dailyCostStatistics(null, null, SuperWhaleContext.getContext(PublicUserInfo.class).getUserId());
             CostResponse trendCost = new CostResponse();
             trendCost.setActualCost(BigDecimal.valueOf(trendList.stream().mapToDouble(t -> t.getGas().doubleValue()).sum()));
 

+ 9 - 2
src/main/java/com/ichaoj/ams/mapper/AmsTradeRecordMapper.java

@@ -9,6 +9,7 @@ import com.ichaoj.ams.response.record.TradeRecordResponse;
 import com.ichaoj.ams.response.statistics.ExportResponse;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -26,19 +27,24 @@ public interface AmsTradeRecordMapper extends BaseMapper<AmsTradeRecord> {
      *
      * @param buildPageObj 分页对象
      * @param request      请求参数
+     * @param userId
      * @return 分页结果
      */
-    Page<TradeRecordResponse> pageTradeRecord(Page<AmsTradeRecord> buildPageObj, PageTradeRecordRequest request);
+    Page<TradeRecordResponse> pageTradeRecord(Page<AmsTradeRecord> buildPageObj, @Param("request") PageTradeRecordRequest request, @Param("userId") String userId);
 
     /**
      * 统计每日消耗gas和本金
      *
+     * @param startTime
+     * @param endTime
+     * @param userId
      * @return 统计数据
      */
-    List<DailyCostResponse> dailyCostStatistics();
+    List<DailyCostResponse> dailyCostStatistics(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("userId") String userId);
 
     /**
      * 查询报表数据
+     *
      * @param userId 用户id
      * @return 报表数据
      */
@@ -46,6 +52,7 @@ public interface AmsTradeRecordMapper extends BaseMapper<AmsTradeRecord> {
 
     /**
      * 根据用户id查询用户投入列表
+     *
      * @param userId 用户
      * @return 列表
      */

+ 30 - 0
src/main/java/com/ichaoj/ams/response/statistics/NotifyTaskResponse.java

@@ -0,0 +1,30 @@
+package com.ichaoj.ams.response.statistics;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+/**
+ * @author gavin
+ * @date 2023/6/1
+ */
+@Data
+public class NotifyTaskResponse {
+
+    private BigDecimal recentGas;
+    private BigDecimal totalGas;
+
+    private BigDecimal recentAmount;
+    private BigDecimal totalAmount;
+
+    private BigDecimal predictCost;
+    private BigDecimal actualCost;
+
+    private Long recentBatchCount;
+    private Long recentPremiumCount;
+    private Long totalBatchCount;
+    private Long totalPremiumCount;
+
+
+}

+ 7 - 1
src/main/java/com/ichaoj/ams/service/IAmsTradeRecordService.java

@@ -9,6 +9,7 @@ import com.ichaoj.ams.response.record.TradeRecordResponse;
 import com.ichaoj.ams.response.statistics.ExportResponse;
 import com.ichaoj.common.model.PublicPage;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -49,9 +50,13 @@ public interface IAmsTradeRecordService extends IService<AmsTradeRecord> {
 
     /**
      * 统计每日消耗gas和本金
+     *
+     * @param startTime
+     * @param endTime
+     * @param userId    用户id
      * @return 统计数据
      */
-    List<DailyCostResponse> dailyCostStatistics();
+    List<DailyCostResponse> dailyCostStatistics(LocalDateTime startTime, LocalDateTime endTime, String userId);
 
     /**
      * 获取导出数据
@@ -65,4 +70,5 @@ public interface IAmsTradeRecordService extends IService<AmsTradeRecord> {
      * @return 列表
      */
     List<TradeRecordResponse> listByUserId(String userId);
+
 }

+ 3 - 6
src/main/java/com/ichaoj/ams/service/impl/AmsTradeRecordServiceImpl.java

@@ -1,17 +1,14 @@
 package com.ichaoj.ams.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.RandomUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ichaoj.ams.entity.AmsAddressAccount;
-import com.ichaoj.ams.entity.AmsExecuteRecord;
 import com.ichaoj.ams.entity.AmsTradeRecord;
 import com.ichaoj.ams.mapper.AmsTradeRecordMapper;
 import com.ichaoj.ams.request.record.CreateTradeRecordRequest;
@@ -58,7 +55,7 @@ public class AmsTradeRecordServiceImpl extends SuperWhaleServiceImpl<AmsTradeRec
 
     @Override
     public PublicPage<TradeRecordResponse> pageTradeRecord(PageTradeRecordRequest pageRequest) {
-        Page<TradeRecordResponse> result = this.baseMapper.pageTradeRecord(this.buildPageObj(pageRequest), pageRequest);
+        Page<TradeRecordResponse> result = this.baseMapper.pageTradeRecord(this.buildPageObj(pageRequest), pageRequest, SuperWhaleContext.getContext(PublicUserInfo.class).getUserId());
         return this.convertPublicPage(result, s -> BeanUtil.copyProperties(s, TradeRecordResponse.class));
     }
 
@@ -153,8 +150,8 @@ public class AmsTradeRecordServiceImpl extends SuperWhaleServiceImpl<AmsTradeRec
     }
 
     @Override
-    public List<DailyCostResponse> dailyCostStatistics() {
-        return this.baseMapper.dailyCostStatistics();
+    public List<DailyCostResponse> dailyCostStatistics(LocalDateTime startTime, LocalDateTime endTime, String userId) {
+        return this.baseMapper.dailyCostStatistics(startTime, endTime, userId);
     }
 
     @Override

+ 120 - 0
src/main/java/com/ichaoj/ams/task/NotifyTask.java

@@ -0,0 +1,120 @@
+package com.ichaoj.ams.task;
+
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ichaoj.ams.entity.AmsAddressAccount;
+import com.ichaoj.ams.response.statistics.DailyCostResponse;
+import com.ichaoj.ams.response.statistics.NotifyTaskResponse;
+import com.ichaoj.ams.service.*;
+import com.ichaoj.web.util.ParamTemplate;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author gavin
+ * @date 2023/6/1
+ */
+@Component
+@RequiredArgsConstructor
+@Slf4j
+public class NotifyTask {
+
+    private final IAmsTradeRecordService tradeService;
+
+    private final IAmsAirdropProjectService projectService;
+
+    private final IAmsAddressAccountService accountService;
+
+    private final IAmsAirdropTaskService taskService;
+
+    private final IAmsExecuteRecordService executeRecordService;
+    private final ParamTemplate paramTemplate;
+
+    @XxlJob("ams_weekly_report")
+    public void statisticsWeeklyReport() {
+        NotifyTaskResponse response = new NotifyTaskResponse();
+
+        LocalDateTime startTime = LocalDateTimeUtil.of(DateUtil.lastWeek());
+        LocalDateTime endTime = LocalDateTime.now();
+
+        // 统计最近的gas和amount日常支出
+        getDailyCost(response, startTime, endTime);
+
+        // 统计总gas和amount支出
+        getDailyCost(response, null, null);
+
+        // 统计最近添加地址数量和精品号数量
+        countAddress(response, startTime, endTime, 0);
+        countAddress(response, null, null, 0);
+        countAddress(response, startTime, endTime, 1);
+        countAddress(response, null, null, 1);
+
+        //  统计项目数量
+//        countProject();
+
+
+        String emailStr = paramTemplate.getParamValue("str_ams_data_notify_email");
+        String[] emails = emailStr.split(StrUtil.COMMA);
+        Set<String> emailSet = new HashSet<>();
+        if (emails.length == 1) {
+            emailSet.add(emailStr);
+        } else {
+            emailSet.addAll(ListUtil.of(emails));
+        }
+        for (String email : emailSet) {
+            sendEmail(response, email);
+        }
+    }
+
+    private void sendEmail(NotifyTaskResponse response, String email) {
+
+    }
+
+    private void countAddress(NotifyTaskResponse response, LocalDateTime startTime, LocalDateTime endTime, int addressType) {
+        long count = accountService.count(new LambdaQueryWrapper<AmsAddressAccount>()
+                .eq(AmsAddressAccount::getAddressType, addressType)
+                .ge(startTime != null, AmsAddressAccount::getCreateTime, startTime)
+                .le(endTime != null, AmsAddressAccount::getCreateTime, endTime)
+        );
+        if (startTime == null) {
+            if (addressType == 0) {
+                response.setTotalPremiumCount(count);
+            } else {
+                response.setTotalBatchCount(count);
+            }
+        } else {
+            if (addressType == 0) {
+                response.setRecentPremiumCount(count);
+            } else {
+                response.setRecentBatchCount(count);
+            }
+        }
+
+    }
+
+    private void getDailyCost(NotifyTaskResponse response, LocalDateTime startTime, LocalDateTime endTime) {
+        List<DailyCostResponse> list = tradeService.dailyCostStatistics(startTime, endTime, null);
+        BigDecimal gasCost = BigDecimal.valueOf(list.stream().mapToDouble(d -> d.getGas().doubleValue()).sum());
+        BigDecimal amountCost = BigDecimal.valueOf(list.stream().mapToDouble(d -> d.getPrincipal().doubleValue()).sum());
+        if (startTime == null) {
+            response.setTotalGas(gasCost);
+            response.setTotalGas(amountCost);
+        } else {
+            response.setRecentGas(gasCost);
+            response.setRecentGas(amountCost);
+        }
+    }
+
+
+}

+ 11 - 5
src/main/resources/mapper/AmsTradeRecordMapper.xml

@@ -21,6 +21,7 @@
         inner join ams_airdrop_task t
         on t.ams_task_id = er.task_id and t.flag = 0
         WHERE tr.flag = 0
+        and er.user_id = #{userId}
         <if test="request.queryValue != null and request.queryValue != ''">
             and tr.execute_id = #{request.queryValue}
             or tr.tx_id = #{request.queryValue}
@@ -31,11 +32,16 @@
     </select>
 
     <select id="dailyCostStatistics" resultType="com.ichaoj.ams.response.statistics.DailyCostResponse">
-        SELECT DATE_FORMAT(create_time, '%m-%d') `date`,
-               SUM(gas)    AS                    gas,
-               SUM(amount) AS                    principal
-        FROM ams_trade_record
-        WHERE flag = 0
+        SELECT DATE_FORMAT(tr.create_time, '%y-%m-%d') `date`,
+        SUM(tr.gas) AS gas,
+        SUM(tr.amount) AS principal
+        FROM ams_trade_record tr
+        inner join ams_execute_record er
+        on er.execute_id = tr.execute_id and er.flag = 0 and er.user_id = #{userId}
+        WHERE tr.flag = 0
+        <if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
+            and tr.create_time between #{startTime} and #{endTime}
+        </if>
         GROUP BY `date`;
     </select>