Jelajahi Sumber

重写Agent广告平台分组数据统计
增加libs目录存放第三方jar包

marxjaw 3 bulan lalu
induk
melakukan
52b35c5672

+ 1 - 0
libs/desc.txt

@@ -0,0 +1 @@
+本文件夹用于存放第三方依赖SDK jar包

+ 9 - 333
yt-agent/agent-service/src/main/java/com/ytpm/controller/AgentIndexController.java

@@ -1,39 +1,21 @@
 package com.ytpm.controller;
 
 import cn.hutool.core.collection.CollUtil;
-import com.alibaba.fastjson.JSON;
-import com.ytpm.advertise.enums.AdPlatformTypeEnum;
-import com.ytpm.advertise.param.ComprehensiveReportParam;
-import com.ytpm.advertise.param.ConcurrentHourReportsParams;
-import com.ytpm.advertise.param.HourReportParam;
-import com.ytpm.advertise.view.ComprehensiveAppReport;
-import com.ytpm.advertise.view.HourReportRes;
-import com.ytpm.advertise.view.HourReportView;
 import com.ytpm.agent.model.YtApp;
-import com.ytpm.agent.param.AppListParam;
-import com.ytpm.agent.param.DateRangeParams;
-import com.ytpm.agent.param.IndexResParam;
-import com.ytpm.agent.view.AgentAppView;
-import com.ytpm.agent.view.AgentChannelView;
+import com.ytpm.agent.view.AgentAdGroupStaticsVO;
 import com.ytpm.agent.view.AgentTopCountView;
 import com.ytpm.agent.view.AgentUserInfo;
-import com.ytpm.agent.view.IndexHourReportView;
 import com.ytpm.app.param.AppQueryUserTodayTimeParam;
 import com.ytpm.app.param.AppUserQueryParam;
 import com.ytpm.dao.AppMapper;
-import com.ytpm.dao.ChannelMapper;
-import com.ytpm.feign.AdvertiseFeign;
 import com.ytpm.feign.AppFeign;
 import com.ytpm.feign.RiskFeign;
 import com.ytpm.general.Result;
 import com.ytpm.service.AgentAppService;
 import com.ytpm.util.DateUtil;
-import com.ytpm.util.RedisService;
-import com.ytpm.utils.GetTakuInfoUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.annotation.AuthenticationPrincipal;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -42,20 +24,10 @@ import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.time.temporal.TemporalAdjusters;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Api(tags = "首页数据统计模块")
@@ -64,26 +36,15 @@ import java.util.stream.Collectors;
 @RequestMapping("/index")
 public class AgentIndexController {
 
-    @Resource
-    private AdvertiseFeign advertiseFeign;
-
-    @Resource
-    private ChannelMapper channelMapper;
-
     @Resource
     private AppFeign appFeign;
 
     @Resource
     private RiskFeign riskFeign;
 
-    @Autowired
-    private RedisService redisService;
-
     @Resource
     private AgentAppService agentAppService;
 
-    @Resource
-    private GetTakuInfoUtil getTakuInfoUtil;
     @Resource
     private AppMapper appMapper;
 
@@ -110,302 +71,17 @@ public class AgentIndexController {
      */
     @ApiOperation("查询广告平台收益")
     @PostMapping("/profit")
-    public Result<?> profit(@ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo) {
-        // 1. 准备日期参数
-        DateRangeParams dateParams = prepareDateParams();
-
-        // 2. 构建查询参数
-        ComprehensiveReportParam reportParam = buildReportParam(dateParams, userInfo);
-
-        // 3. 获取报表数据
-        List<ComprehensiveAppReport> appReport = fetchReportData(reportParam);
-
-        // 4. 按平台分类统计
-        List<IndexResParam> result = processPlatformReports(appReport, dateParams);
-
-        return Result.resultObjOk(result);
-    }
-
-    /**
-     * 准备日期参数
-     */
-    private DateRangeParams prepareDateParams() {
-        LocalDate today = LocalDate.now();
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
-
-        return new DateRangeParams(
-                today.format(formatter),
-                today.minusDays(1).format(formatter),
-                today.with(TemporalAdjusters.firstDayOfMonth()).format(formatter),
-                today.with(TemporalAdjusters.lastDayOfMonth()).format(formatter)
-        );
-    }
-
-    /**
-     * 构建报表查询参数
-     */
-    private ComprehensiveReportParam buildReportParam(DateRangeParams dateParams, AgentUserInfo userInfo) {
-        ComprehensiveReportParam param = new ComprehensiveReportParam();
-
-        // 设置日期范围
-        param.setStartdate(Integer.parseInt(dateParams.getMonthStart()));
-        param.setEnddate(Integer.parseInt(dateParams.getMonthEnd()));
-
-        // 添加所有平台ID
-        param.setNetwork_firm_id_list(Arrays.stream(AdPlatformTypeEnum.values())
-                .map(AdPlatformTypeEnum::getCode)
-                .collect(Collectors.toList()));
-        AppListParam appListParam = new AppListParam();
-        appListParam.setUserId(userInfo.getUserId());
-        //设置takuPublicKey
-        String takuPublicKey = getTakuInfoUtil.getTakuPublicKey(userInfo.getUserId());
-        param.setTakuPublicKey(takuPublicKey);
-        //增加appId查询
-        List<AgentAppView> agentAppViews = agentAppService.searchAppIdList(appListParam);
-        ArrayList<String> list = new ArrayList<>();
-        if (CollUtil.isNotEmpty(agentAppViews)) {
-            //获取的是superiorId
-          param.setApp_id_list(agentAppViews.stream().map(AgentAppView::getSuperiorId).collect(Collectors.toList()));
-        }
-        else {
-            param.setApp_id_list(list);
-        }
-        // 设置分组
-        param.setGroup_by(Arrays.asList("date", "network_firm_id","app"));
-
-        return param;
-    }
-
-    /**
-     * 获取报表数据
-     */
-    private List<ComprehensiveAppReport> fetchReportData(ComprehensiveReportParam param) {
-        long startTime = System.currentTimeMillis();
-        List<ComprehensiveAppReport> appReport = new ArrayList<>();
-        if (CollUtil.isNotEmpty(param.getApp_id_list())){
-            appReport=advertiseFeign.getAppReport(param);
-            log.info("调用API接口耗时: {}ms", System.currentTimeMillis() - startTime);
-        }
-        //appIdList为空 返回空数据
-        return appReport;
-    }
-
-    /**
-     * 处理平台报告
-     */
-    private List<IndexResParam> processPlatformReports(List<ComprehensiveAppReport> appReport,
-                                                       DateRangeParams dateParams) {
-        long startTime = System.currentTimeMillis();
-
-        List<IndexResParam> result = Arrays.stream(AdPlatformTypeEnum.values())
-                .map(platform -> buildPlatformReport(platform, appReport, dateParams))
-                .collect(Collectors.toList());
-
-        log.debug("报告处理耗时: {}ms", System.currentTimeMillis() - startTime);
-        return result;
-    }
-
-    /**
-     * 构建单个平台报告
-     */
-    private IndexResParam buildPlatformReport(AdPlatformTypeEnum platform,
-                                              List<ComprehensiveAppReport> allReports,
-                                              DateRangeParams dateParams) {
-        IndexResParam resParam = new IndexResParam();
-        resParam.setPlatform(platform.getDesc());
-
-        // 过滤当前平台的数据
-        List<ComprehensiveAppReport> platformReports = filterByPlatform(allReports, platform);
-
-        // 设置各项指标
-        setRevenueMetrics(resParam, platformReports, dateParams);
-        setEcpmMetrics(resParam, platformReports, dateParams);
-
-        return resParam;
-    }
-
-    /**
-     * 按平台过滤报告
-     */
-    private List<ComprehensiveAppReport> filterByPlatform(List<ComprehensiveAppReport> reports,
-                                                          AdPlatformTypeEnum platform) {
-        return reports.stream()
-                .filter(item -> String.valueOf(platform.getCode()).equals(item.getNetwork_firm_id()))
-                .collect(Collectors.toList());
-    }
-
-    /**
-     * 设置收入指标
-     */
-    private void setRevenueMetrics(IndexResParam resParam,
-                                   List<ComprehensiveAppReport> reports,
-                                   DateRangeParams dateParams) {
-        // 今日收入
-        BigDecimal todayRevenue = sumByDate(reports, dateParams.getToday(), ComprehensiveAppReport::getRevenue);
-        resParam.setToday(formatAmount(todayRevenue));
-
-        // 昨日收入
-        BigDecimal yesterdayRevenue = sumByDate(reports, dateParams.getYesterday(), ComprehensiveAppReport::getRevenue);
-        resParam.setYesterday(formatAmount(yesterdayRevenue));
-
-        // 本月收入
-        BigDecimal monthRevenue = sumByDateRange(reports, dateParams.getMonthStart(), dateParams.getMonthEnd(), ComprehensiveAppReport::getRevenue);
-        resParam.setMonth(formatAmount(monthRevenue));
-    }
-
-    /**
-     * 设置eCPM指标
-     */
-    private void setEcpmMetrics(IndexResParam resParam,
-                                List<ComprehensiveAppReport> reports,
-                                DateRangeParams dateParams) {
-        // 今日eCPM
-        BigDecimal todayEcpm = sumByDate(reports, dateParams.getToday(), ComprehensiveAppReport::getEcpm);
-        resParam.setEcpmToday(formatAmount(todayEcpm));
-
-        // 昨日eCPM
-        BigDecimal yesterdayEcpm = sumByDate(reports, dateParams.getYesterday(), ComprehensiveAppReport::getEcpm);
-        resParam.setEcpmYesterday(formatAmount(yesterdayEcpm));
-
-        // 本月eCPM
-        BigDecimal monthEcpm = sumByDateRange(reports, dateParams.getMonthStart(), dateParams.getMonthEnd(), ComprehensiveAppReport::getEcpm);
-        resParam.setEcpmMonth(formatAmount(monthEcpm));
-    }
-
-    /**
-     * 按日期求和
-     */
-    private BigDecimal sumByDate(List<ComprehensiveAppReport> reports,
-                                 String date,
-                                 Function<ComprehensiveAppReport, BigDecimal> extractor) {
-        return reports.stream()
-                .filter(item -> date.equals(item.getDate()))
-                .map(extractor)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-    }
-
-    /**
-     * 按日期范围求和
-     */
-    private BigDecimal sumByDateRange(List<ComprehensiveAppReport> reports,
-                                      String startDate,
-                                      String endDate,
-                                      Function<ComprehensiveAppReport, BigDecimal> extractor) {
-        return reports.stream()
-                .filter(item -> {
-                    String date = item.getDate();
-                    return date != null && date.compareTo(startDate) >= 0 && date.compareTo(endDate) <= 0;
-                })
-                .map(extractor)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-    }
-
-    /**
-     * 格式化金额(保留2位小数,四舍五入)
-     */
-    private String formatAmount(BigDecimal amount) {
-        return amount.setScale(2, RoundingMode.HALF_UP).toString();
-    }
-
-
-    /**
-     * 查询分小时报表 折线图数据
-     * 预估收益以及ecpm
-     */
-    @ApiOperation("查询分小时报表")
-    @PostMapping("/hourReport")
-    public Result<?> hourReport(@ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo) {
-        if (redisService.hasKey("hourReport"+userInfo.getUserId())) {
-            List<IndexHourReportView> hourReportResList = JSON.parseArray(redisService.getStr("hourReport"+userInfo.getUserId()), IndexHourReportView.class);
-            return Result.resultObjOk(hourReportResList);
-        } else {
-            // 1. 准备日期参数
-            LocalDate today = LocalDate.now();
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
-
-            // 今日和昨日日期
-            String todayStr = today.format(formatter);
-            Integer todayInt = Integer.valueOf(todayStr);
-            List<AgentChannelView> agentChannelViews = channelMapper.channelList();
-            ArrayList<IndexHourReportView> indexHourReportViews = new ArrayList<>();
-            ArrayList<HourReportParam> hourReportParams = new ArrayList<>();
-            ConcurrentHourReportsParams concurrentHourReportsParams = new ConcurrentHourReportsParams();
-            AppListParam appListParam = new AppListParam();
-            appListParam.setUserId(userInfo.getUserId());
-            List<AgentAppView> agentAppViews = agentAppService.searchAppIdList(appListParam);
-            List<String> appIdList;
-            if (CollUtil.isNotEmpty(agentAppViews)){
-                appIdList = agentAppViews.stream().map(AgentAppView::getSuperiorId).collect(Collectors.toList());
-            }
-            else {
-                return Result.resultObjOk(indexHourReportViews);
-            }
-            //查询takuPublicKey
-            String takuPublicKey = getTakuInfoUtil.getTakuPublicKey(userInfo.getUserId());
-            for (AgentChannelView agentChannelView : agentChannelViews) {
-                HourReportParam param = new HourReportParam();
-                Integer networkId = agentChannelView.getNetworkId();
-                param.setNetwork_id_list(Collections.singletonList(networkId));
-                param.setStart_date(todayInt);
-                param.setEnd_date(todayInt);
-                param.setCurrency("CNY");
-                param.setLimit(1000);
-                param.setStart(0);
-                param.setTime_zone("UTC+8");
-                param.setChannelName(agentChannelView.getChannelName());
-                param.setApp_id_list(appIdList);
-                //增加taku公钥
-                param.setTakuPublicKey(takuPublicKey);
-                hourReportParams.add(param);
-            }
-            concurrentHourReportsParams.setParam(hourReportParams);
-            //进行远程调用获取数据
-            Result<List<HourReportRes>> listResult = advertiseFeign.concurrentHourReports(concurrentHourReportsParams);
-            List<HourReportRes> hourReportResList = listResult.getData();
-            for (HourReportRes hourReportRes : hourReportResList) {
-                //处理数据
-                IndexHourReportView indexHourReportView = buildIndexHourReportView(hourReportRes);
-                //加入数组中
-                indexHourReportViews.add(indexHourReportView);
-            }
-            //50分钟过期
-            redisService.setTimeOutStr("hourReport"+userInfo.getUserId(), JSON.toJSONString(indexHourReportViews), 50 * 60 * 1000);
-            return Result.resultObjOk(indexHourReportViews);
-        }
-
-    }
-
-    /**
-     * 对返回的小时报表数据进行处理
-     *
-     * @param hourReportRes 小时数据
-     * @return
-     */
-    private IndexHourReportView buildIndexHourReportView(HourReportRes hourReportRes) {
-        IndexHourReportView indexHourReportView = new IndexHourReportView();
-        indexHourReportView.setChannelName(hourReportRes.getChannelName());
-        List<BigDecimal> hourlyData = new ArrayList<>(Collections.nCopies(24, BigDecimal.ZERO));
-        List<BigDecimal> ecpmData = new ArrayList<>(Collections.nCopies(24, BigDecimal.ZERO));
-        if (CollUtil.isNotEmpty(hourReportRes.getList())) {
-            for (HourReportView hourReport : hourReportRes.getList()) {
-                int hour = hourReport.getHour();
-                if (hour >= 0 && hour < 24) {
-                    BigDecimal revenue = hourReport.getEstimated_revenue();
-                    BigDecimal ecpm = hourReport.getEstimated_revenue_ecpm();
-
-                    hourlyData.set(hour, revenue != null ? revenue : BigDecimal.ZERO);
-                    ecpmData.set(hour, ecpm != null ? ecpm : BigDecimal.ZERO);
-                }
-            }
+    public Result<List<AgentAdGroupStaticsVO>> profit(@ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo) {
+        //查询代理商拥有的app
+        List<YtApp> ytApps = appMapper.queryAll(userInfo.getUserId());
+        if(CollUtil.isEmpty(ytApps)){
+            return Result.resultErr("未找到您的应用,请在应用管理新增");
         }
-        indexHourReportView.setEstimatedRevenueList(hourlyData);
-        indexHourReportView.setEstimatedRevenueEcpmList(ecpmData);
-        return indexHourReportView;
+        String appIds = ytApps.stream().map(YtApp::getAppId).collect(Collectors.joining(","));
+        //分广告平台,分别统计用户当天、昨日、本月的数据封装并返回
+        return Result.resultObjOk(appFeign.getAgentProfit(appIds));
     }
 
-
     @ApiOperation("查询用户行为数据统计")
     @PostMapping("/userStatistic")
     public Result<Map<String, Object>> getDashboardData(@ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo) throws InterruptedException {

+ 4 - 0
yt-app/app-feign/src/main/java/com/ytpm/feign/AppFeign.java

@@ -1,5 +1,6 @@
 package com.ytpm.feign;
 
+import com.ytpm.agent.view.AgentAdGroupStaticsVO;
 import com.ytpm.agent.view.AgentTopCountView;
 import com.ytpm.app.model.YtAppDefaultConfig;
 import com.ytpm.app.model.YtDyzAdRecord;
@@ -77,4 +78,7 @@ public interface AppFeign {
 
     @GetMapping("/ad/userStatics")
     DashboardRiskVO userStatics(@RequestParam(name = "appId") String appId);
+
+    @GetMapping("/ad/getAgentProfit")
+    List<AgentAdGroupStaticsVO> getAgentProfit(@RequestParam(name = "appIds")String appIds);
 }

+ 8 - 0
yt-app/app-service/src/main/java/com/ytpm/controller/dyz/AdController.java

@@ -1,5 +1,6 @@
 package com.ytpm.controller.dyz;
 
+import com.ytpm.agent.view.AgentAdGroupStaticsVO;
 import com.ytpm.agent.view.AgentTopCountView;
 import com.ytpm.app.param.DyzAdRecordParam;
 import com.ytpm.general.Result;
@@ -20,6 +21,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.Map;
 
 
@@ -83,4 +85,10 @@ public class AdController {
     public DashboardRiskVO userStatics(@RequestParam(name = "appId")String appId){
         return adService.userStatics(appId);
     }
+
+    @ApiOperation("查询代理商首页统计广告数据")
+    @GetMapping("/getAgentProfit")
+    public List<AgentAdGroupStaticsVO> getAgentProfit(@RequestParam(name = "appIds")String appIds){
+        return adService.getAgentProfit(appIds);
+    }
 }

+ 11 - 3
yt-app/app-service/src/main/java/com/ytpm/dao/dyz/AdRecordMapper.java

@@ -1,8 +1,8 @@
 package com.ytpm.dao.dyz;
 
+import com.ytpm.agent.view.AgentAdGroupStaticsVO;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.middle.view.AppRevenueHourVO;
-import com.ytpm.middle.view.DashboardAppRevenueVO;
 import org.apache.ibatis.annotations.Param;
 import org.mapstruct.Mapper;
 
@@ -27,8 +27,6 @@ public interface AdRecordMapper {
 
     /**
      * 查询应用分小时收益数据
-     * @param appId
-     * @return
      */
     List<AppRevenueHourVO> getHourRevenue(@Param("appId") String appId,@Param("type")int type);
 
@@ -41,4 +39,14 @@ public interface AdRecordMapper {
      * 根据应用查询收益
      */
     BigDecimal getRevenueByType(@Param("appIds") String appIds,@Param("type") int type);
+
+    /**
+     * 根据应用查询ecpm
+     */
+    BigDecimal getEcpmByType(@Param("appIds")String appIds, @Param("type")int type);
+
+    /**
+     * 查询广告平台分组统计
+     */
+    List<AgentAdGroupStaticsVO> getAdGroupStatics(@Param("appIds")String appIds);
 }

+ 7 - 0
yt-app/app-service/src/main/java/com/ytpm/service/dyz/AdService.java

@@ -1,5 +1,6 @@
 package com.ytpm.service.dyz;
 
+import com.ytpm.agent.view.AgentAdGroupStaticsVO;
 import com.ytpm.agent.view.AgentTopCountView;
 import com.ytpm.app.param.DyzAdRecordParam;
 import com.ytpm.general.Result;
@@ -8,6 +9,7 @@ import com.ytpm.middle.view.DashboardRevenueVO;
 import com.ytpm.middle.view.DashboardRiskVO;
 
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.Map;
 
 public interface AdService {
@@ -39,4 +41,9 @@ public interface AdService {
      * 查询用户风控分时数据统计
      */
     DashboardRiskVO userStatics(String appIds);
+
+    /**
+     * 查询代理商首页广告数据统计
+     */
+    List<AgentAdGroupStaticsVO> getAgentProfit(String appIds);
 }

+ 34 - 0
yt-app/app-service/src/main/java/com/ytpm/service/dyz/impl/AdServiceImpl.java

@@ -1,10 +1,14 @@
 package com.ytpm.service.dyz.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.RandomUtil;
 import com.ytpm.advertise.enums.AdPlatformTypeEnum;
 import com.ytpm.advertise.enums.AdSourceTypeEnum;
 import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.agent.view.AgentAdGroupStaticsVO;
+import com.ytpm.agent.view.AgentNetworkEcpmGroupVO;
+import com.ytpm.agent.view.AgentNetworkRevenueGroupVO;
 import com.ytpm.agent.view.AgentTopCountView;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzUser;
@@ -37,6 +41,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -196,6 +201,35 @@ public class AdServiceImpl implements AdService {
         return vo;
     }
 
+    /**
+     * 查询代理商首页广告数据统计
+     */
+    @Override
+    public List<AgentAdGroupStaticsVO> getAgentProfit(String appIds) {
+        List<AgentAdGroupStaticsVO> vos = adRecordMapper.getAdGroupStatics(appIds);
+        for (AgentAdGroupStaticsVO vo : vos) {
+            List<AgentNetworkRevenueGroupVO> networkRevenueGroups = vo.getNetworkRevenueGroups();
+            if(CollUtil.isNotEmpty(networkRevenueGroups)){
+                Map<String, BigDecimal> revenueMap = networkRevenueGroups.stream().collect(
+                        Collectors.toMap(AgentNetworkRevenueGroupVO::getHour, AgentNetworkRevenueGroupVO::getRevenue));
+                vo.setTodayHourRevenueMap(revenueMap);
+                vo.setTodayRevenue(revenueMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add));
+            }
+            vo.setYesterdayRevenue(adRecordMapper.getRevenueByType(appIds,2));
+            vo.setMonthRevenue(adRecordMapper.getRevenueByType(appIds,3));
+            List<AgentNetworkEcpmGroupVO> networkEcpmGroups = vo.getNetworkEcpmGroups();
+            if(CollUtil.isNotEmpty(networkEcpmGroups)){
+                Map<String, BigDecimal> ecpmMap = networkEcpmGroups.stream().collect(
+                        Collectors.toMap(AgentNetworkEcpmGroupVO::getHour, AgentNetworkEcpmGroupVO::getEcpm));
+                vo.setTodayHourEcpmMap(ecpmMap);
+                vo.setTodayEcpm(ecpmMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add));
+            }
+            vo.setYesterdayEcpm(adRecordMapper.getEcpmByType(appIds,2));
+            vo.setMonthEcpm(adRecordMapper.getEcpmByType(appIds,3));
+        }
+        return vos;
+    }
+
     /**
      * 保存记录
      *  始终创建新的事务以保障子方法的独立事务

+ 49 - 0
yt-app/app-service/src/main/resources/mapper/dyz/AdRecordMapper.xml

@@ -112,4 +112,53 @@
                 and DATE_FORMAT(finish_time, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m')
             </if>
     </select>
+    <select id="getEcpmByType" resultType="java.math.BigDecimal">
+        SELECT
+            sum( ecpm )
+        FROM
+            yt_dyz_ad_record
+        WHERE
+            app_id in
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+        <if test="type != null and type ==1">
+            and DATE(finish_time) = DATE(now())
+        </if>
+        <if test="type != null and type ==2">
+            and DATE(finish_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
+        </if>
+        <if test="type != null and type ==3">
+            and DATE_FORMAT(finish_time, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m')
+        </if>
+    </select>
+    <resultMap id="AdGroupStaticsMap" type="com.ytpm.agent.view.AgentAdGroupStaticsVO">
+        <id column="network_form_id" property="netowrkId" />
+        <result column="network_name" property="netowrkName" />
+        <collection property="networkEcpmGroups" ofType="com.ytpm.agent.view.AgentNetworkEcpmGroupVO">
+            <result column="hour" property="hour" />
+            <result column="ecpm" property="ecpm" />
+        </collection>
+        <collection property="networkRevenueGroups" ofType="com.ytpm.agent.view.AgentNetworkRevenueGroupVO">
+            <result column="hour" property="hour" />
+            <result column="revenue" property="revenue" />
+        </collection>
+    </resultMap>
+    <select id="getAdGroupStatics" resultMap="AdGroupStaticsMap">
+        SELECT
+            network_form_id,
+            network_name,
+            DATE_FORMAT(finish_time,'%Y-%m-%d %H:00:00') as `hour`,
+            sum( revenue ) revenue,
+            sum( ecpm ) ecpm
+        FROM
+            yt_dyz_ad_record
+        WHERE
+            app_id in
+        <foreach collection="appIds.split(',')" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+          AND DATE( finish_time ) = DATE(now())
+        group by network_form_id,`hour`
+    </select>
 </mapper>

+ 0 - 17
yt-common/src/main/java/com/ytpm/agent/param/IndexResParam.java

@@ -1,17 +0,0 @@
-package com.ytpm.agent.param;
-
-import lombok.Data;
-
-/**
- * 首页收入统计返回实体
- */
-@Data
-public class IndexResParam {
-    private String platform;
-    private String today;
-    private String yesterday;
-    private String month;
-    private String ecpmToday;
-    private String ecpmYesterday;
-    private String ecpmMonth;
-}

+ 47 - 0
yt-common/src/main/java/com/ytpm/agent/view/AgentAdGroupStaticsVO.java

@@ -0,0 +1,47 @@
+package com.ytpm.agent.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 代理商广告分组统计类
+ * @author Marx
+ * @date 2025/8/1 14:05
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("代理商广告分组统计类")
+public class AgentAdGroupStaticsVO {
+    @ApiModelProperty("广告平台ID")
+    private String netowrkId;
+    @ApiModelProperty("广告平台名称")
+    private String netowrkName;
+    @ApiModelProperty("今日ECPM")
+    private BigDecimal todayEcpm;
+    @ApiModelProperty("昨日ECPM")
+    private BigDecimal yesterdayEcpm;
+    @ApiModelProperty("本月ECPM")
+    private BigDecimal monthEcpm;
+    @ApiModelProperty("今日总收益")
+    private BigDecimal todayRevenue;
+    @ApiModelProperty("昨日总收益")
+    private BigDecimal yesterdayRevenue;
+    @ApiModelProperty("本月总收益")
+    private BigDecimal monthRevenue;
+    @ApiModelProperty("分小时ecpm列表")
+    private List<AgentNetworkEcpmGroupVO> networkEcpmGroups;
+    @ApiModelProperty("分小时收益列表")
+    private List<AgentNetworkRevenueGroupVO> networkRevenueGroups;
+    @ApiModelProperty("今日分小时ecpm统计数据")
+    private Map<String, BigDecimal> todayHourEcpmMap;
+    @ApiModelProperty("今日分小时收益统计数据")
+    private Map<String, BigDecimal> todayHourRevenueMap;
+}

+ 25 - 0
yt-common/src/main/java/com/ytpm/agent/view/AgentNetworkEcpmGroupVO.java

@@ -0,0 +1,25 @@
+package com.ytpm.agent.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * 代理商广告ecpm分组统计类
+ * @author Marx
+ * @date 2025/8/1 14:20
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("代理商广告ecpm分组统计类")
+public class AgentNetworkEcpmGroupVO {
+    @ApiModelProperty("分小时")
+    private String hour;
+    @ApiModelProperty("ecpm")
+    private BigDecimal ecpm;
+}

+ 25 - 0
yt-common/src/main/java/com/ytpm/agent/view/AgentNetworkRevenueGroupVO.java

@@ -0,0 +1,25 @@
+package com.ytpm.agent.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * 代理商广告收益分组统计类
+ * @author Marx
+ * @date 2025/8/1 14:38
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("代理商广告收益分组统计类")
+public class AgentNetworkRevenueGroupVO {
+    @ApiModelProperty("分小时")
+    private String hour;
+    @ApiModelProperty("revenue")
+    private BigDecimal revenue;
+}

+ 0 - 13
yt-common/src/main/java/com/ytpm/agent/view/IndexHourReportView.java

@@ -1,13 +0,0 @@
-package com.ytpm.agent.view;
-
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-@Data
-public class IndexHourReportView {
-    private String channelName;
-    private List<BigDecimal> estimatedRevenueList;
-    private List<BigDecimal> estimatedRevenueEcpmList;
-}

+ 7 - 12
yt-risk/risk-manage/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java

@@ -472,19 +472,14 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
                 Collectors.toMap(RiskConfigView::getFieldName, RiskConfigView::getConfigVal));
         //判断同应用 UID生成数如果不小于配置数则触发规则校验
         int uidCount = Integer.parseInt(configMap.get("uidCount"));
-        if(dyzUsers.size()<uidCount)return;
-        //获取配置天数以判断 同应用多渠道账号注册时间间隔不得低于配置时间
         int days = Integer.parseInt(configMap.get("days"));
-        List<Date> regDateList = dyzUsers.stream().map(YtDyzUser::getRegistryTime).collect(Collectors.toList());
-        Date first = regDateList.get(0);
-        long interval;
-        for (int i = 1; i < regDateList.size(); i++) {
-            interval  = DateUtil.between(first, regDateList.get(i), DateUnit.DAY);
-            if(days > interval){
-                riskLockUser(dyzUser,"322","系统判定重复刷单用户限制",getTipsMsg());
-            }
-            first = regDateList.get(i);
-        }
+        //过滤该用户注册时间在三天内的渠道数
+        long ditchCount = dyzUsers.stream().filter(
+                s->(days>DateUtil.between(new Date(), s.getRegistryTime(),DateUnit.DAY))
+        ).count();
+        //三天内注册的渠道数小于预设的渠道数通过校验,否则风控锁定用户
+        if(ditchCount<uidCount)return;
+        riskLockUser(dyzUser,"322","系统判定重复刷单用户限制",getTipsMsg());
     }
 
     /**