小杜 il y a 4 mois
Parent
commit
fa466ead10
23 fichiers modifiés avec 554 ajouts et 69 suppressions
  1. 3 0
      yt-advertise/advertise-feign/src/main/java/com/ytpm/feign/AdvertiseFeign.java
  2. 9 0
      yt-advertise/advertise-service/src/main/java/com/ytpm/controller/AdvertiseController.java
  3. 6 10
      yt-advertise/advertise-service/src/main/java/com/ytpm/service/TakuApiService.java
  4. 53 12
      yt-advertise/advertise-service/src/main/java/com/ytpm/service/impl/TakuApiServiceImpl.java
  5. 114 32
      yt-agent/agent-service/src/main/java/com/ytpm/controller/AgentIndexController.java
  6. 14 1
      yt-app/app-feign/src/main/java/com/ytpm/feign/AppFeign.java
  7. 55 7
      yt-app/app-service/src/main/java/com/ytpm/controller/UserController.java
  8. 12 0
      yt-app/app-service/src/main/java/com/ytpm/dao/AppUserMapper.java
  9. 3 0
      yt-app/app-service/src/main/java/com/ytpm/dao/LoginRecordMapper.java
  10. 22 0
      yt-app/app-service/src/main/resources/mapper/AppUserMapper.xml
  11. 16 0
      yt-app/app-service/src/main/resources/mapper/LoginRecordMapper.xml
  12. 10 0
      yt-common/src/main/java/com/ytpm/advertise/param/ConcurrentHourReportsParams.java
  13. 4 0
      yt-common/src/main/java/com/ytpm/advertise/param/HourReportParam.java
  14. 12 0
      yt-common/src/main/java/com/ytpm/advertise/view/HourReportRes.java
  15. 14 0
      yt-common/src/main/java/com/ytpm/app/param/AppUserQueryParam.java
  16. 4 0
      yt-common/src/main/java/com/ytpm/app/param/YtAppUserListParam.java
  17. 49 0
      yt-common/src/main/java/com/ytpm/util/DateUtil.java
  18. 8 0
      yt-risk/risk-feign/src/main/java/com/ytpm/feign/RiskFeign.java
  19. 115 7
      yt-risk/risk-manage/src/main/java/com/ytpm/controller/RiskManageController.java
  20. 3 0
      yt-risk/risk-manage/src/main/java/com/ytpm/dao/RiskManageMapper.java
  21. 6 0
      yt-risk/risk-manage/src/main/java/com/ytpm/service/RiskService.java
  22. 5 0
      yt-risk/risk-manage/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java
  23. 17 0
      yt-risk/risk-manage/src/main/resources/mapper/RiskManageMapper.xml

+ 3 - 0
yt-advertise/advertise-feign/src/main/java/com/ytpm/feign/AdvertiseFeign.java

@@ -34,6 +34,9 @@ public interface AdvertiseFeign {
     @PostMapping("/advertise/hourReport")
     ResultTable<HourReportView> hourReport(@RequestBody HourReportParam param);
 
+    @PostMapping("/advertise/concurrentHourReports")
+    Result<List<HourReportRes>> concurrentHourReports(@RequestBody ConcurrentHourReportsParams param);
+
     @GetMapping("/delAdSource")
     Result<?> delAdSource(@RequestParam("adSourceId") Integer adSourceId);
     @PostMapping("/saveAdSource")

+ 9 - 0
yt-advertise/advertise-service/src/main/java/com/ytpm/controller/AdvertiseController.java

@@ -134,4 +134,13 @@ public class AdvertiseController {
     public ResultTable<HourReportView>  hourReport(@RequestBody HourReportParam param){
         return takuApiService.hourReport(param);
     }
+
+    /**
+     *异步查询分小时报表
+     */
+    @ApiOperation("异步查询分小时报表")
+    @PostMapping("/concurrentHourReports")
+    public Result<List<HourReportRes>> concurrentHourReports(@RequestBody ConcurrentHourReportsParams param){
+        return takuApiService.concurrentHourReports(param.getParam());
+    }
 }

+ 6 - 10
yt-advertise/advertise-service/src/main/java/com/ytpm/service/TakuApiService.java

@@ -8,16 +8,7 @@ import com.ytpm.advertise.param.RelativeChannelParam;
 import com.ytpm.advertise.param.RoiReportParam;
 import com.ytpm.advertise.param.UnitsListParam;
 import com.ytpm.advertise.param.UnitsParam;
-import com.ytpm.advertise.view.AddAppResponse;
-import com.ytpm.advertise.view.AddPlacementResponse;
-import com.ytpm.advertise.view.AppV1View;
-import com.ytpm.advertise.view.ComprehensiveAppReport;
-import com.ytpm.advertise.view.ComprehensiveCommonView;
-import com.ytpm.advertise.view.ComprehensiveReportView;
-import com.ytpm.advertise.view.HourReportView;
-import com.ytpm.advertise.view.ReportRoiView;
-import com.ytpm.advertise.view.UnitsListView;
-import com.ytpm.advertise.view.UnitsView;
+import com.ytpm.advertise.view.*;
 import com.ytpm.agent.param.ChannelParam;
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
@@ -109,4 +100,9 @@ public interface TakuApiService {
      * 查询分小时报表
      */
     ResultTable<HourReportView> hourReport(HourReportParam param);
+
+    /**
+     * 异步查询分小时报表
+     */
+    Result<List<HourReportRes>> concurrentHourReports(List<HourReportParam> param);
 }

+ 53 - 12
yt-advertise/advertise-service/src/main/java/com/ytpm/service/impl/TakuApiServiceImpl.java

@@ -16,18 +16,7 @@ import com.ytpm.advertise.param.RelativeChannelParam;
 import com.ytpm.advertise.param.RoiReportParam;
 import com.ytpm.advertise.param.UnitsListParam;
 import com.ytpm.advertise.param.UnitsParam;
-import com.ytpm.advertise.view.AddAppResponse;
-import com.ytpm.advertise.view.AddPlacementResponse;
-import com.ytpm.advertise.view.AppV1View;
-import com.ytpm.advertise.view.ComprehensiveAppReport;
-import com.ytpm.advertise.view.ComprehensiveCommonView;
-import com.ytpm.advertise.view.ComprehensiveReportView;
-import com.ytpm.advertise.view.HourReportView;
-import com.ytpm.advertise.view.ReportRoiView;
-import com.ytpm.advertise.view.UnitsAddResponse;
-import com.ytpm.advertise.view.UnitsListView;
-import com.ytpm.advertise.view.UnitsUpdateResponse;
-import com.ytpm.advertise.view.UnitsView;
+import com.ytpm.advertise.view.*;
 import com.ytpm.agent.param.ChannelParam;
 import com.ytpm.advertise.enums.OpenReportEnum;
 import com.ytpm.general.RepMessage;
@@ -48,6 +37,11 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 @Slf4j(topic = "Taku API 服务")
 @Service
@@ -57,6 +51,8 @@ public class TakuApiServiceImpl implements TakuApiService {
     private final static String API_VERSION_V2 = "/v2";
     private final static String API_VERSION_V3 = "/v3";
 
+    // 创建固定大小的线程池(10个线程)
+    private static final ExecutorService executor = Executors.newFixedThreadPool(10);
     /**
      * 新增或修改应用
      */
@@ -305,4 +301,49 @@ public class TakuApiServiceImpl implements TakuApiService {
         return ResultTable.resultTableOk(new PageInfo<ReportRoiView>(new ArrayList<>()));
     }
 
+    public Result<List<HourReportRes>> concurrentHourReports(List<HourReportParam> paramList) {
+        ExecutorService executor = Executors.newCachedThreadPool();
+        List<CompletableFuture<HourReportRes>> futures = new ArrayList<>();
+
+        for (HourReportParam param : paramList) {
+            CompletableFuture<HourReportRes> future = CompletableFuture.supplyAsync(() -> {
+                try {
+                    ResultTable<HourReportView> resultTable = hourReport(param);
+                    List<HourReportView> data = resultTable.getData();
+                    HourReportRes hourReportRes = new HourReportRes();
+                    hourReportRes.setNetworkId(param.getNetwork_id_list().get(0)); // 确保 list 非空
+                    hourReportRes.setList(data);
+                    hourReportRes.setChannelName(param.getChannelName());
+                    return hourReportRes;
+                } catch (Exception e) {
+                    log.error("Error during hourReport call with param: {}", JSON.toJSONString(param), e);
+
+                    HourReportRes emptyRes = new HourReportRes();
+                    emptyRes.setNetworkId(param.getNetwork_id_list().get(0));
+                    emptyRes.setList(Collections.emptyList());
+                    return emptyRes;
+                }
+            }, executor);
+
+            futures.add(future);
+        }
+
+        // 收集所有 HourReportRes 对象
+        List<HourReportRes> resultList = futures.stream()
+                .map(CompletableFuture::join)
+                .collect(Collectors.toList());
+
+        executor.shutdown();
+        try {
+            if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
+                executor.shutdownNow();
+            }
+        } catch (InterruptedException e) {
+            executor.shutdownNow();
+            Thread.currentThread().interrupt();
+        }
+        return Result.resultObjOk(resultList);
+    }
+
+
 }

+ 114 - 32
yt-agent/agent-service/src/main/java/com/ytpm/controller/AgentIndexController.java

@@ -1,21 +1,27 @@
 package com.ytpm.controller;
 
+import cn.hutool.core.collection.CollUtil;
 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.param.IndexResParam;
 import com.ytpm.agent.view.AgentChannelView;
 import com.ytpm.agent.view.IndexHourReportView;
+import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AppUserQueryParam;
 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.general.ResultTable;
-import com.ytpm.service.impl.ChannelServiceImpl;
+import com.ytpm.util.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.apache.commons.lang3.StringUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -31,6 +37,7 @@ import java.util.stream.Collectors;
 
 @Api(tags = "首页数据统计模块")
 @RestController
+@Slf4j
 @RequestMapping("/index")
 public class AgentIndexController {
 
@@ -40,6 +47,12 @@ public class AgentIndexController {
     @Resource
     private ChannelMapper channelMapper;
 
+    @Resource
+    private AppFeign appFeign;
+
+    @Resource
+    private RiskFeign riskFeign;
+
     /**
      * 查询广告平台收益
      */
@@ -75,7 +88,10 @@ public class AgentIndexController {
         param.setGroup_by(Arrays.asList("date", "network_firm_id"));
 
         // 3. 获取报表数据
+        long currentTime = System.currentTimeMillis();
         List<ComprehensiveAppReport> appReport = advertiseFeign.getAppReport(param);
+        long endTime = System.currentTimeMillis();
+        log.info("调用api接口时间{}", endTime - currentTime);
 
         // 4. 按平台分类统计
         List<IndexResParam> result = Arrays.stream(AdPlatformTypeEnum.values())
@@ -146,6 +162,8 @@ public class AgentIndexController {
                     return resParam;
                 })
                 .collect(Collectors.toList());
+        long endResolve = System.currentTimeMillis();
+        log.debug("stream执行时间{}", endResolve - endTime);
 
         return Result.resultObjOk(result);
     }
@@ -157,7 +175,7 @@ public class AgentIndexController {
     @ApiOperation("查询分小时报表")
     @PostMapping("/hourReport")
     public Result<?> hourReport() {
-        HourReportParam param = new HourReportParam();
+
         // 1. 准备日期参数
         LocalDate today = LocalDate.now();
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
@@ -167,47 +185,111 @@ public class AgentIndexController {
         Integer todayInt = Integer.valueOf(todayStr);
         List<AgentChannelView> agentChannelViews = channelMapper.channelList();
         ArrayList<IndexHourReportView> indexHourReportViews = new ArrayList<>();
-
+        ArrayList<HourReportParam> hourReportParams = new ArrayList<>();
+        ConcurrentHourReportsParams concurrentHourReportsParams = new ConcurrentHourReportsParams();
         for (AgentChannelView agentChannelView : agentChannelViews) {
-            IndexHourReportView indexHourReportView = new IndexHourReportView();
-            indexHourReportView.setChannelName(agentChannelView.getChannelName());
-
-            List<BigDecimal> hourlyData = new ArrayList<>(24);
-            for (int i = 0; i < 24; i++) {
-                hourlyData.add(BigDecimal.ZERO);
-            }
-            List<BigDecimal> ecpmData = new ArrayList<>(24);
-            for (int i = 0; i < 24; i++) {
-                ecpmData.add(BigDecimal.ZERO);
-            }
+            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(100);
+            param.setLimit(1000);
             param.setStart(0);
             param.setTime_zone("UTC+8");
+            param.setChannelName(agentChannelView.getChannelName());
+            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);
+        }
+        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();
 
-            ResultTable<HourReportView> hourReportViewResultTable = advertiseFeign.hourReport(param);
-            List<HourReportView> data = hourReportViewResultTable.getData();
-            if (!data.isEmpty()) {
-                for (HourReportView hourReport : data) {
-                    int hour = hourReport.getHour();
-                    if (hour >= 0 && hour < 24) {
-                        BigDecimal revenue = hourReport.getEstimated_revenue();
-                        hourlyData.set(hour, revenue);
-                        ecpmData.set(hour, hourReport.getEstimated_revenue_ecpm());
-                    }
+                    hourlyData.set(hour, revenue != null ? revenue : BigDecimal.ZERO);
+                    ecpmData.set(hour, ecpm != null ? ecpm : BigDecimal.ZERO);
                 }
             }
-
-            indexHourReportView.setEstimatedRevenueList(hourlyData);
-            indexHourReportView.setEstimatedRevenueEcpmList(ecpmData);
-            indexHourReportViews.add(indexHourReportView);
         }
+        indexHourReportView.setEstimatedRevenueList(hourlyData);
+        indexHourReportView.setEstimatedRevenueEcpmList(ecpmData);
+        return indexHourReportView;
+    }
 
-        return Result.resultObjOk(indexHourReportViews);
+
+
+    @ApiOperation("查询用户行为数据统计")
+    @PostMapping("/userStatistic")
+    public Result<?> userStatistic() {
+        HashMap<String, Object> result = new HashMap<>();
+        AppUserQueryParam param = new AppUserQueryParam();
+        // 1. 查询今日数据
+        param.setStartTime(DateUtil.getTodayStart());
+        param.setEndTime(DateUtil.getTodayEnd());
+        List<YtDyzUser> todayUsers = appFeign.queryUserByTime(param);
+        //每个小时的用户数
+        int[] todayUser = appFeign.queryUserByTodayTime();
+        List<String> todayLogin = appFeign.queryLoginRecords(param);
+        Result<Map<String, Integer>> mapResult = riskFeign.queryBanned(param);
+        Map<String, int[]> data = riskFeign.queryBannedByHourToday().getData();
+        Map<String, Integer> todayMap = mapResult.getData();
+        //用户新增数
+        result.put("today", todayUsers.size());
+        result.put("todayLogin", todayLogin.size());
+        result.put("todayRisk", todayMap.get("risk"));
+        result.put("todayLock", todayMap.get("lock"));
+        result.put("todayRiskHour", data.get("riskHour"));
+        result.put("todayLockHour", data.get("lockHour"));
+        //每个小时的用户数
+        result.put("todayUser", todayUser);
+        // 2. 查询昨日数据
+        param.setStartTime(DateUtil.getYesterdayStart());
+        param.setEndTime(DateUtil.getYesterdayEnd());
+        List<YtDyzUser> yesterdayUsers = appFeign.queryUserByTime(param);
+        List<String> yesterdayLogin = appFeign.queryLoginRecords(param);
+        Map<String, Integer> yesterdayMap = riskFeign.queryBanned(param).getData();
+        result.put("yesterday", yesterdayUsers.size());
+        result.put("yesterdayLogin", yesterdayLogin.size());
+        //封禁数
+        result.put("yesterdayRisk", yesterdayMap.get("risk"));
+        //锁定数
+        result.put("yesterdayLock", yesterdayMap.get("lock"));
+        // 3. 查询本月数据
+        param.setStartTime(DateUtil.getMonthStart());
+        param.setEndTime(DateUtil.getMonthEnd());
+        List<String> monthLogin = appFeign.queryLoginRecords(param);
+        List<YtDyzUser> monthUsers = appFeign.queryUserByTime(param);
+        Map<String, Integer> monthMap = riskFeign.queryBanned(param).getData();
+
+        result.put("month", monthUsers.size());
+        result.put("monthLogin", monthLogin.size());
+        result.put("monthRisk", monthMap.get("risk"));
+        result.put("monthLock", monthMap.get("lock"));
+        return Result.resultObjOk(result);
     }
 
 

+ 14 - 1
yt-app/app-feign/src/main/java/com/ytpm/feign/AppFeign.java

@@ -3,6 +3,7 @@ package com.ytpm.feign;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzUser;
 import com.ytpm.app.param.YtAppUserListParam;
+import com.ytpm.app.param.AppUserQueryParam;
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -11,9 +12,11 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 @FeignClient(name = "app-service")
 public interface AppFeign {
-    @GetMapping("/user/queryAll")
+    @PostMapping("/user/queryAll")
     ResultTable<YtDyzUser> queryAll(@RequestBody YtAppUserListParam param);
     @GetMapping("/user/getUserInfo")
     Result<YtDyzUser> getUserInfo(@RequestParam("userId") String userId);
@@ -23,4 +26,14 @@ public interface AppFeign {
     Result<?> updateUserInfo(@RequestBody YtDyzUser dyzUser);
     @GetMapping("/user/adRecords")
     ResultTable<YtDyzAdRecord> adRecords(@RequestParam("userId") String userId);
+
+    @PostMapping("/user/queryUserByTime")
+    List<YtDyzUser> queryUserByTime(@RequestBody AppUserQueryParam appUserQueryParam);
+
+    @PostMapping("/user/queryUserByTodayTime")
+    int[] queryUserByTodayTime();
+
+    @PostMapping("/user/queryLoginRecords")
+     List<String> queryLoginRecords(@RequestBody AppUserQueryParam appUserQueryParam);
+
 }

+ 55 - 7
yt-app/app-service/src/main/java/com/ytpm/controller/UserController.java

@@ -3,6 +3,7 @@ package com.ytpm.controller;
 import com.github.pagehelper.PageInfo;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AppUserQueryParam;
 import com.ytpm.app.param.YtAppUserListParam;
 import com.ytpm.dao.AdRecordMapper;
 import com.ytpm.dao.AppUserMapper;
@@ -18,6 +19,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -36,7 +42,7 @@ public class UserController {
     /**
      * 查询app 所有玩家
      */
-    @GetMapping("/queryAll")
+    @PostMapping("/queryAll")
     public ResultTable<YtDyzUser> queryAll(@RequestBody YtAppUserListParam param){
         List<YtDyzUser> dyzUsers = appUserMapper.queryAll(param);
         if(dyzUsers.isEmpty()) return ResultTable.resultTableOk(new PageInfo<YtDyzUser>(dyzUsers));
@@ -46,8 +52,8 @@ public class UserController {
                 Collectors.groupingBy(YtDyzAdRecord::getUserId));
         for (YtDyzUser user : dyzUsers) {
             user.setLoginRecordList(loginRecordMapper.getLoginRecords(user.getUserId()));
-            user.setTodayVideo(userAdMap.containsKey(user.getUserId())?
-                    userAdMap.get(user.getUserId()).size():0);
+            user.setTodayVideo(userAdMap.containsKey(user.getUserId()) ?
+                    userAdMap.get(user.getUserId()).size() : 0);
         }
         return ResultTable.resultTableOk(new PageInfo<YtDyzUser>(dyzUsers));
     }
@@ -56,7 +62,7 @@ public class UserController {
      * 主键查询用户信息
      */
     @GetMapping("/getUserInfo")
-    public Result<YtDyzUser> getUserInfo(@RequestParam("userId") String userId){
+    public Result<YtDyzUser> getUserInfo(@RequestParam("userId") String userId) {
         YtDyzUser user = appUserMapper.selectPrimaryKey(userId);
         user.setLoginRecordList(loginRecordMapper.getLoginRecords(userId));
         return Result.resultObjOk(user);
@@ -66,18 +72,19 @@ public class UserController {
      * 查询用户信息
      */
     @GetMapping("/getUserList")
-    public ResultTable<YtDyzUser> getUserList(@RequestParam("userIds") String userIds){
+    public ResultTable<YtDyzUser> getUserList(@RequestParam("userIds") String userIds) {
         List<YtDyzUser> userList = appUserMapper.getUserList(userIds);
         for (YtDyzUser user : userList) {
             user.setLoginRecordList(loginRecordMapper.getLoginRecords(user.getUserId()));
         }
         return ResultTable.resultTableOk(new PageInfo<>(userList));
     }
+
     /**
      * 修改用户信息
      */
     @PostMapping("/updateUserInfo")
-    public Result<?> updateUserInfo(@RequestBody YtDyzUser dyzUser){
+    public Result<?> updateUserInfo(@RequestBody YtDyzUser dyzUser) {
         appUserMapper.updateUser(dyzUser);
         return Result.resultOk(RepMessage.MODIFY_SUCCESS);
     }
@@ -86,7 +93,48 @@ public class UserController {
      * 查询用户的广告记录
      */
     @GetMapping("/adRecords")
-    public ResultTable<YtDyzAdRecord> adRecords(@RequestParam("userId") String userId){
+    public ResultTable<YtDyzAdRecord> adRecords(@RequestParam("userId") String userId) {
         return ResultTable.resultTableOk(new PageInfo<YtDyzAdRecord>(adRecordMapper.getByUserId(userId)));
     }
+
+    @PostMapping("/queryUserByTime")
+    public List<YtDyzUser> queryUserByTime(@RequestBody AppUserQueryParam appUserQueryParam) {
+        List<YtDyzUser> ytDyzUsers = appUserMapper.queryAllByTime(appUserQueryParam.getStartTime(), appUserQueryParam.getEndTime());
+        return ytDyzUsers;
+    }
+
+    @PostMapping("/queryUserByTodayTime")
+    public int[] queryUserByTodayTime() {
+        // 获取当前日期
+        LocalDate localDate = LocalDate.now();
+
+        // 构建当天起始时间段
+        LocalDateTime startOfDay = localDate.atStartOfDay();
+        LocalDateTime endOfDay = startOfDay.plusDays(1).minusSeconds(1);
+
+        Date startTime = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
+        Date endTime = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
+
+        // 查询用户注册数据
+        List<YtDyzUser> ytDyzUsers = appUserMapper.queryAllByTime(startTime, endTime);
+        // 初始化每小时用户数量数组
+        int[] hourlyCounts = new int[24];
+        for (YtDyzUser user : ytDyzUsers) {
+            Date createTime = user.getRegistryTime();
+            if (createTime != null) {
+                Calendar calendar = Calendar.getInstance();
+                calendar.setTime(createTime);
+                int hour = calendar.get(Calendar.HOUR_OF_DAY);
+                if (hour >= 0 && hour < 24) {
+                    hourlyCounts[hour]++;
+                }
+            }
+        }
+        return hourlyCounts;
+    }
+
+    @PostMapping("/queryLoginRecords")
+    public List<String> queryLoginRecords(@RequestBody AppUserQueryParam appUserQueryParam) {
+        return loginRecordMapper.queryLoginCount(appUserQueryParam);
+    }
 }

+ 12 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/AppUserMapper.java

@@ -6,6 +6,7 @@ import com.ytpm.app.param.YtAppUserListParam;
 import org.apache.ibatis.annotations.Param;
 import org.mapstruct.Mapper;
 
+import java.util.Date;
 import java.util.List;
 
 @Mapper
@@ -49,6 +50,17 @@ public interface AppUserMapper {
      */
     List<YtDyzUser> queryAll(YtAppUserListParam param);
 
+    /**
+     * 查询所有玩家
+     * 按照注册时间范围查询
+     * @param startTime 开始时间(可选)
+     * @param endTime 结束时间(可选)
+     */
+    List<YtDyzUser> queryAllByTime(
+            @Param("startTime") Date startTime,
+            @Param("endTime") Date endTime
+    );
+
     /**
      * 查询用户信息
      */

+ 3 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/LoginRecordMapper.java

@@ -1,6 +1,7 @@
 package com.ytpm.dao;
 
 import com.ytpm.app.model.YtDyzLoginRecord;
+import com.ytpm.app.param.AppUserQueryParam;
 import org.apache.ibatis.annotations.Param;
 import org.mapstruct.Mapper;
 
@@ -17,4 +18,6 @@ public interface LoginRecordMapper {
      * 查询用户登录记录
      */
     List<YtDyzLoginRecord> getLoginRecords(@Param("userId")String userId);
+
+    List<String> queryLoginCount(AppUserQueryParam appUserQueryParam);
 }

+ 22 - 0
yt-app/app-service/src/main/resources/mapper/AppUserMapper.xml

@@ -185,4 +185,26 @@
             #{item}
         </foreach>
     </select>
+
+    <select id="queryAllByTime" resultType="com.ytpm.app.model.YtDyzUser">
+        SELECT
+        user_id, nick_name, head_img, power, registry_time,
+        last_login_time, last_login_ip, login_days, total_video,
+        total_income, red_packet_balance, red_packet_amount,
+        points_balance, points_total, withdraw_total, sign_days,
+        user_status, risk_reason, wx_open_id, platform_id
+        FROM yt_dyz_user
+        <where>
+            <if test="startTime != null">
+                AND registry_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND registry_time &lt;= #{endTime}
+            </if>
+        </where>
+        ORDER BY registry_time DESC
+    </select>
+
+
+
 </mapper>

+ 16 - 0
yt-app/app-service/src/main/resources/mapper/LoginRecordMapper.xml

@@ -32,4 +32,20 @@
         from yt_dyz_login_record
         where user_id = #{userId}
     </select>
+
+    <select id="queryLoginCount" resultType="String">
+        select user_id
+        from yt_dyz_login_record
+        <where>
+            <if test="startTime != null">
+                AND login_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND login_time &lt;= #{endTime}
+            </if>
+        </where>
+        group by user_id
+    </select>
+
+
 </mapper>

+ 10 - 0
yt-common/src/main/java/com/ytpm/advertise/param/ConcurrentHourReportsParams.java

@@ -0,0 +1,10 @@
+package com.ytpm.advertise.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ConcurrentHourReportsParams {
+    private List<HourReportParam> param;
+}

+ 4 - 0
yt-common/src/main/java/com/ytpm/advertise/param/HourReportParam.java

@@ -53,4 +53,8 @@ public class HourReportParam {
     private Integer start;
     /** 每次拉取数据的最大条数,默认是1000,最大1000,可选[1,1000] */
     private Integer limit;
+    /***
+     * 与api请求无关
+     */
+    private String channelName;
 }

+ 12 - 0
yt-common/src/main/java/com/ytpm/advertise/view/HourReportRes.java

@@ -0,0 +1,12 @@
+package com.ytpm.advertise.view;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class HourReportRes {
+    private Integer networkId;
+    private String channelName;
+    private List<HourReportView> list;
+}

+ 14 - 0
yt-common/src/main/java/com/ytpm/app/param/AppUserQueryParam.java

@@ -0,0 +1,14 @@
+package com.ytpm.app.param;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class AppUserQueryParam {
+    private Date startTime;
+
+    private Date endTime;
+
+    private Integer status;
+}

+ 4 - 0
yt-common/src/main/java/com/ytpm/app/param/YtAppUserListParam.java

@@ -30,4 +30,8 @@ public class YtAppUserListParam extends PageMeta {
     private String nickName ;
     @ApiModelProperty("用户状态")
     private Integer userStatus;
+    @ApiModelProperty("用户id")
+    private String userId;
+    @ApiModelProperty("渠道类型id")
+    private long ditchId;
 }

+ 49 - 0
yt-common/src/main/java/com/ytpm/util/DateUtil.java

@@ -1,7 +1,10 @@
 package com.ytpm.util;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.util.Date;
 
 public class DateUtil {
 
@@ -16,4 +19,50 @@ public class DateUtil {
         // 将字符串转换为整数
         return Integer.parseInt(formattedDate);
     }
+
+    private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    // 获取今日开始时间(00:00:00)
+    public static Date getTodayStart() {
+        LocalDateTime todayStart = LocalDate.now().atStartOfDay();
+        return localDateTimeToDate(todayStart);
+    }
+
+    // 获取今日结束时间(23:59:59)
+    public static Date getTodayEnd() {
+        LocalDateTime todayEnd = LocalDate.now().atTime(23, 59, 59);
+        return localDateTimeToDate(todayEnd);
+    }
+
+    // 获取昨日开始时间
+    public static Date getYesterdayStart() {
+        LocalDateTime yesterdayStart = LocalDate.now().minusDays(1).atStartOfDay();
+        return localDateTimeToDate(yesterdayStart);
+    }
+
+    // 获取昨日结束时间
+    public static Date getYesterdayEnd() {
+        LocalDateTime yesterdayEnd = LocalDate.now().minusDays(1).atTime(23, 59, 59);
+        return localDateTimeToDate(yesterdayEnd);
+    }
+
+    // 获取本月开始时间
+    public static Date getMonthStart() {
+        LocalDateTime monthStart = LocalDate.now().withDayOfMonth(1).atStartOfDay();
+        return localDateTimeToDate(monthStart);
+    }
+
+    // 获取本月结束时间
+    public static Date getMonthEnd() {
+        LocalDateTime monthEnd = LocalDate.now().withDayOfMonth(
+                LocalDate.now().lengthOfMonth()
+        ).atTime(23, 59, 59);
+        return localDateTimeToDate(monthEnd);
+    }
+
+    private static Date localDateTimeToDate(LocalDateTime localDateTime) {
+        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+
 }

+ 8 - 0
yt-risk/risk-feign/src/main/java/com/ytpm/feign/RiskFeign.java

@@ -2,6 +2,7 @@ package com.ytpm.feign;
 
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AppUserQueryParam;
 import com.ytpm.feign.fallback.RiskFeignFallBack;
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
@@ -24,6 +25,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 @FeignClient(name = "risk-manage", fallback = RiskFeignFallBack.class)
 public interface RiskFeign {
@@ -75,4 +77,10 @@ public interface RiskFeign {
 
     @GetMapping("/public/checkAdRisk")
     Result<?> checkAdRisk(@RequestParam("userId")String userId,@RequestParam("revenue")BigDecimal revenue);
+
+    @PostMapping("/riskManage/queryBanned")
+    Result<Map<String, Integer>> queryBanned(@RequestBody AppUserQueryParam appUserQueryParam);
+
+    @GetMapping("/riskManage/queryBannedByHourToday")
+    Result<Map<String, int[]>> queryBannedByHourToday();
 }

+ 115 - 7
yt-risk/risk-manage/src/main/java/com/ytpm/controller/RiskManageController.java

@@ -1,7 +1,12 @@
 package com.ytpm.controller;
 
+import cn.hutool.core.collection.CollUtil;
+import com.ytpm.agent.enums.UserStatusEnum;
+import com.ytpm.agent.model.YtPlatformBanned;
 import com.ytpm.agent.view.AgentUserInfo;
 import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AppUserQueryParam;
+import com.ytpm.feign.AppFeign;
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
 import com.ytpm.risk.param.RiskBannedListParam;
@@ -15,6 +20,7 @@ import com.ytpm.service.RiskService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.models.auth.In;
 import org.springframework.security.core.annotation.AuthenticationPrincipal;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -25,6 +31,12 @@ import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @Api(tags = "风控管理模块")
 @RestController
@@ -34,6 +46,9 @@ public class RiskManageController {
     @Resource
     private RiskService riskService;
 
+    @Resource
+    private AppFeign appFeign;
+
 
     /**
      * 用户禁登
@@ -41,8 +56,8 @@ public class RiskManageController {
     @ApiOperation("禁止用户登录")
     @ApiImplicitParam(name = "userId", value = "用户ID", required = true, paramType = "path")
     @GetMapping("/forbidLogin")
-    public Result<?> forbidLogin(@RequestParam("userId")String userId, @ApiIgnore  @AuthenticationPrincipal AgentUserInfo userInfo){
-        return riskService.lockUser(userId,userInfo);
+    public Result<?> forbidLogin(@RequestParam("userId") String userId, @ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo) {
+        return riskService.lockUser(userId, userInfo);
     }
 
     /**
@@ -50,7 +65,7 @@ public class RiskManageController {
      */
     @ApiOperation("封禁用户")
     @PostMapping("/banned")
-    public Result<?> banned(@RequestBody RiskBannedParam param, @ApiIgnore  @AuthenticationPrincipal AgentUserInfo userInfo){
+    public Result<?> banned(@RequestBody RiskBannedParam param, @ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo) {
         param.setOperator(userInfo.getUserId());
         param.setOperatorName(userInfo.getNickName());
         return riskService.banned(param);
@@ -61,7 +76,7 @@ public class RiskManageController {
      */
     @ApiOperation("查询风控用户记录")
     @PostMapping("/bannedList")
-    public ResultTable<RiskBannedListView> bannedList(@RequestBody RiskBannedListParam param, @ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo){
+    public ResultTable<RiskBannedListView> bannedList(@RequestBody RiskBannedListParam param, @ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo) {
         param.setChannelId(userInfo.getUserId());
         return riskService.bannedList(param);
     }
@@ -71,7 +86,7 @@ public class RiskManageController {
      */
     @ApiOperation("查询解封记录")
     @PostMapping("/deblockingList")
-    public ResultTable<RiskDeblockingListView> deblockingList(@RequestBody RiskDeblockingListParam param, @ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo){
+    public ResultTable<RiskDeblockingListView> deblockingList(@RequestBody RiskDeblockingListParam param, @ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo) {
         param.setChannelId(userInfo.getUserId());
         return riskService.deblockingList(param);
     }
@@ -81,7 +96,7 @@ public class RiskManageController {
      */
     @ApiOperation("修改用户状态")
     @PostMapping("/changeUserStatus")
-    public Result<?> changeUserStatus(@RequestBody RiskUserStatusParam param, @ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo){
+    public Result<?> changeUserStatus(@RequestBody RiskUserStatusParam param, @ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo) {
         param.setOperator(userInfo.getUserId());
         param.setOperatorName(userInfo.getNickName());
         return riskService.changeUserStatus(param);
@@ -92,9 +107,102 @@ public class RiskManageController {
      */
     @ApiOperation("风控配置关联应用")
     @PostMapping("/relativeApp")
-    public Result<?> relativeApp(@RequestBody RiskRelativeAppParam param, @ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo){
+    public Result<?> relativeApp(@RequestBody RiskRelativeAppParam param, @ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo) {
         param.setOperator(userInfo.getUserId());
         param.setOperatorName(userInfo.getNickName());
         return riskService.relativeApp(param);
     }
+
+    /**
+     * 查询封禁数和封号数
+     */
+    @ApiOperation("查询封禁数和封号数")
+    @PostMapping("/queryBanned")
+    public Result<Map<String, Integer>> queryBanned(@RequestBody AppUserQueryParam appUserQueryParam) {
+        Map<String, Integer> map = new HashMap<>();
+        List<YtPlatformBanned> ytPlatformBanneds =
+                riskService.queryBannedRecord(appUserQueryParam.getStartTime(), appUserQueryParam.getEndTime());
+        if (!ytPlatformBanneds.isEmpty()) {
+            String userIds = ytPlatformBanneds.stream()
+                    .map(YtPlatformBanned::getUserId)
+                    .collect(Collectors.joining(","));
+            ResultTable<YtDyzUser> userList = appFeign.getUserList(userIds);
+            List<YtDyzUser> data = userList.getData();
+            //锁定数
+            List<YtDyzUser> lockList = data.stream().filter((item) -> {
+                return item.getUserStatus() == UserStatusEnum.LOCK.getCode();
+            }).collect(Collectors.toList());
+            //封禁数
+            List<YtDyzUser> riskList = data.stream().filter((item) -> {
+                return item.getUserStatus() == UserStatusEnum.RISK.getCode();
+            }).collect(Collectors.toList());
+            map.put("lock", lockList.size());
+            map.put("risk", riskList.size());
+        }
+        else {
+            map.put("lock", 0);
+            map.put("risk", 0);
+        }
+        return Result.resultObjOk(map);
+    }
+
+    @ApiOperation("查询今日每小时的封禁数和封控数(按封禁记录时间)")
+    @GetMapping("/queryBannedByHourToday")
+    public Result<Map<String, int[]>> queryBannedByHourToday() {
+        Map<String, int[]> resultMap = new HashMap<>();
+        int[] lockCounts = new int[24];
+        int[] riskCounts = new int[24];
+
+        // 获取今天的开始和结束时间
+        LocalDateTime startOfDay = LocalDate.now().atStartOfDay();
+        LocalDateTime endOfDay = startOfDay.plusDays(1).minusSeconds(1);
+
+        Date startTime = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
+        Date endTime = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
+
+        // 查询今天封禁记录(根据封禁时间字段过滤)
+        List<YtPlatformBanned> bannedList = riskService.queryBannedRecord(startTime, endTime);
+
+        if (CollUtil.isNotEmpty(bannedList)) {
+            // 提取 userId
+            String userIds = bannedList.stream()
+                    .map(YtPlatformBanned::getUserId)
+                    .collect(Collectors.joining(","));
+
+            // 查询用户状态
+            ResultTable<YtDyzUser> userList = appFeign.getUserList(userIds);
+            List<YtDyzUser> users = userList.getData();
+
+            // 构建 userId -> user 映射,便于匹配
+            Map<String, YtDyzUser> userMap = users.stream()
+                    .collect(Collectors.toMap(YtDyzUser::getUserId, Function.identity(), (a, b) -> a));
+
+            for (YtPlatformBanned banned : bannedList) {
+                Date bannedTime = banned.getBannedTime(); // 替换为你实际的封禁时间字段
+                if (bannedTime != null) {
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(bannedTime);
+                    int hour = calendar.get(Calendar.HOUR_OF_DAY);
+
+                    if (hour >= 0 && hour < 24) {
+                        YtDyzUser user = userMap.get(banned.getUserId());
+                        if (user != null) {
+                            if (user.getUserStatus() == UserStatusEnum.LOCK.getCode()) {
+                                lockCounts[hour]++;
+                            } else if (user.getUserStatus() == UserStatusEnum.RISK.getCode()) {
+                                riskCounts[hour]++;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        resultMap.put("lockHour", lockCounts);
+        resultMap.put("riskHour", riskCounts);
+        return Result.resultObjOk(resultMap);
+    }
+
+
+
+
 }

+ 3 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/dao/RiskManageMapper.java

@@ -11,6 +11,7 @@ import com.ytpm.risk.view.RiskDeblockingListView;
 import org.apache.ibatis.annotations.Param;
 import org.mapstruct.Mapper;
 
+import java.util.Date;
 import java.util.List;
 
 @Mapper
@@ -43,4 +44,6 @@ public interface RiskManageMapper {
      * 清除旧配置关联数据
      */
     void deleteRelatives(@Param("templateId") String templateId);
+
+    List<YtPlatformBanned> queryBannedRecord(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
 }

+ 6 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/service/RiskService.java

@@ -1,5 +1,6 @@
 package com.ytpm.service;
 
+import com.ytpm.agent.model.YtPlatformBanned;
 import com.ytpm.agent.view.AgentUserInfo;
 import com.ytpm.app.model.YtDyzUser;
 import com.ytpm.general.Result;
@@ -15,8 +16,11 @@ import com.ytpm.risk.view.RiskConfigListView;
 import com.ytpm.risk.view.RiskConfigView;
 import com.ytpm.risk.view.RiskDeblockingListView;
 import com.ytpm.risk.view.RiskTemplateView;
+import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
 
 public interface RiskService {
     /**
@@ -91,4 +95,6 @@ public interface RiskService {
      * 校验广告的默认风控配置
      */
     Result<?> checkAdRisk(String userId, BigDecimal revenue);
+
+    List<YtPlatformBanned> queryBannedRecord(Date startTime,Date endTime);
 }

+ 5 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java

@@ -707,4 +707,9 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
         }
     }
 
+    @Override
+    public List<YtPlatformBanned> queryBannedRecord(Date startTime, Date endTime) {
+        List<YtPlatformBanned> ytPlatformBanneds = riskManageMapper.queryBannedRecord(startTime, endTime);
+        return ytPlatformBanneds;
+    }
 }

+ 17 - 0
yt-risk/risk-manage/src/main/resources/mapper/RiskManageMapper.xml

@@ -133,4 +133,21 @@
         order by banned_time desc
         limit 1
     </select>
+
+    <select id="queryBannedRecord" resultType="com.ytpm.agent.model.YtPlatformBanned">
+        select
+        banned_id, user_id, channel_id, banned_time, banned_reason, banned_type, banned_limit, operator, operator_name
+        from yt_platform_banned
+        <where>
+            <if test="startTime != null">
+                AND banned_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND banned_time &lt;= #{endTime}
+            </if>
+        </where>
+    </select>
+
+
+
 </mapper>