Ver Fonte

Merge remote-tracking branch 'origin/master'

marxjaw há 3 meses atrás
pai
commit
4117d2a442

+ 82 - 59
yt-agent/agent-service/src/main/java/com/ytpm/controller/AgentIndexController.java

@@ -39,10 +39,17 @@ import java.time.temporal.TemporalAdjusters;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -339,66 +346,82 @@ public class AgentIndexController {
 
     @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());
-        long startTodayUsers = System.currentTimeMillis() ;
-        List<YtDyzUser> todayUsers = appFeign.queryUserByTime(param);
-        long endTodayUsers = System.currentTimeMillis();
-        log.info("查询用户的时间{}",endTodayUsers-startTodayUsers);
-        //每个小时的用户数
-        int[] todayUser = appFeign.queryUserByTodayTime();
-        long endTodayUser = System.currentTimeMillis() ;
-        log.info("每个小时的用户数{}",endTodayUser-endTodayUsers);
-        //今日登入
-        List<String> todayLogin = appFeign.queryLoginRecords(param);
-        long timeMillis = System.currentTimeMillis() ;
-        log.info("今日登入{}",timeMillis-endTodayUser);
-        Result<Map<String, Integer>> mapResult = riskFeign.queryBanned(param);
-        long timeMillis1 = System.currentTimeMillis() ;
-        log.info("今日封禁数据{}",timeMillis1-timeMillis);
-        Map<String, int[]> data = riskFeign.queryBannedByHourToday().getData();
-        long timeMillis2 = System.currentTimeMillis() ;
-        log.info("今日封禁小时数据{}",timeMillis2-timeMillis1);
-        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);
-        long currentTimeMillis = System.currentTimeMillis();
-        Map<String, Integer> monthMap = riskFeign.queryBanned(param).getData();
-        long currentTimeMillis1 = System.currentTimeMillis();
-        log.info("当月数据{}",currentTimeMillis1-currentTimeMillis);
-        result.put("month", monthUsers.size());
-        result.put("monthLogin", monthLogin.size());
-        result.put("monthRisk", monthMap.get("risk"));
-        result.put("monthLock", monthMap.get("lock"));
+    public Result<Map<String, Object>> getDashboardData() throws InterruptedException {
+        Map<String, Object> result = new ConcurrentHashMap<>();
+
+        processPeriodData(result, "today",
+                DateUtil.getTodayStart(),
+                DateUtil.getTodayEnd(),
+                true);
+
+        processPeriodData(result, "yesterday",
+                DateUtil.getYesterdayStart(),
+                DateUtil.getYesterdayEnd(),
+                false);
+
+        processPeriodData(result, "month",
+                DateUtil.getMonthStart(),
+                DateUtil.getMonthEnd(),
+                false);
+
         return Result.resultObjOk(result);
+
+    }
+
+    // 统一处理时间段数据的公共方法
+    private void processPeriodData(Map<String, Object> result,
+                                   String prefix,
+                                   Date startTime,
+                                   Date endTime,
+                                   boolean isToday) {
+        AppUserQueryParam param = new AppUserQueryParam();
+        param.setStartTime(startTime);
+        param.setEndTime(endTime);
+
+        // 获取基础数据
+        int userCount = appFeign.queryUserByTime(param).size();
+        int loginCount = appFeign.queryLoginRecords(param).size();
+
+        try {
+            log.info("调用风险查询接口,参数: {}", param);
+
+            // 拆解调用步骤
+            Result<Map<String, Integer>> response = riskFeign.queryBanned(param);
+
+            if(response == null) {
+                log.error("Feign调用返回null!");
+                return;
+            }
+
+            log.info("服务返回状态码: {}", response.getCode()); // 假设有getCode()
+            log.info("服务返回消息: {}", response.getMessage());
+            Map<String, Integer> riskMap = response.getData();
+
+            if(riskMap == null) {
+                log.warn("服务返回data字段为null");
+            } else {
+                log.info("获取风险数据: {}", riskMap);
+            }
+            result.put(prefix + "Risk", riskMap.get("risk"));
+            result.put(prefix + "Lock", riskMap.get("lock"));
+        } catch(Exception e) {
+            log.error("Feign调用异常", e); // 捕获Feign异常
+        }
+
+        // 存储通用指标(线程安全操作)
+        result.put(prefix, userCount);
+        result.put(prefix + "Login", loginCount);
+
+
+        // 今日特有逻辑
+        if (isToday) {
+            int[] todayUser = appFeign.queryUserByTodayTime();
+            Map<String, int[]> data = riskFeign.queryBannedByHourToday().getData();
+
+            result.put("todayUser", todayUser);
+            result.put("todayRiskHour", data.get("riskHour"));
+            result.put("todayLockHour", data.get("lockHour"));
+        }
     }
 
 

+ 5 - 11
yt-app/app-service/src/main/java/com/ytpm/controller/UserController.java

@@ -9,6 +9,7 @@ import com.ytpm.app.model.YtDyzUser;
 import com.ytpm.app.param.AppUserParam;
 import com.ytpm.app.param.AppUserQueryParam;
 import com.ytpm.app.param.YtAppUserListParam;
+import com.ytpm.app.view.HourCountView;
 import com.ytpm.app.view.YtAppUserListView;
 import com.ytpm.dao.AdRecordMapper;
 import com.ytpm.dao.AppUserMapper;
@@ -228,20 +229,13 @@ public class UserController {
 
         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);
+        List<HourCountView> hourCountViews = appUserMapper.countUsersByHour(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]++;
-                }
+        for (HourCountView hc : hourCountViews) {
+            if (hc.getHour() >= 0 && hc.getHour() < 24) {
+                hourlyCounts[hc.getHour()] = hc.getCount();
             }
         }
         return hourlyCounts;

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

@@ -3,6 +3,7 @@ package com.ytpm.dao;
 import com.ytpm.app.model.YtDyzPowerRecord;
 import com.ytpm.app.model.YtDyzUser;
 import com.ytpm.app.param.YtAppUserListParam;
+import com.ytpm.app.view.HourCountView;
 import com.ytpm.app.view.WxDefaultConfig;
 import com.ytpm.app.view.YtAppUserListView;
 import org.apache.ibatis.annotations.Param;
@@ -63,6 +64,9 @@ public interface AppUserMapper {
             @Param("endTime") Date endTime
     );
 
+    List<HourCountView> countUsersByHour(@Param("startTime") Date startTime,
+                                         @Param("endTime") Date endTime);
+
     /**
      * 查询用户信息
      */

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

@@ -240,6 +240,13 @@
         </where>
         ORDER BY registry_time DESC
     </select>
+    <select id="countUsersByHour" resultType="com.ytpm.app.view.HourCountView">
+        SELECT HOUR(registry_time) AS hour, COUNT(*) AS count
+        FROM yt_dyz_user
+        WHERE registry_time BETWEEN #{startTime} AND #{endTime}
+        GROUP BY HOUR(registry_time)
+    </select>
+
     <select id="getDefaultConfig" resultType="com.ytpm.app.view.WxDefaultConfig">
         select
             config_id, config_name, open_id appId, secret, app_id platformAppId, app_key platformAppSecret, app_type

+ 9 - 0
yt-common/src/main/java/com/ytpm/app/view/HourCountView.java

@@ -0,0 +1,9 @@
+package com.ytpm.app.view;
+
+import lombok.Data;
+
+@Data
+public class HourCountView {
+    private int hour;
+    private int count;
+}

+ 1 - 24
yt-risk/risk-manage/src/main/java/com/ytpm/controller/RiskManageController.java

@@ -175,22 +175,6 @@ public class RiskManageController {
         List<YtPlatformBanned> bannedList = riskService.queryBannedRecord(startTime, endTime);
 
         if (CollUtil.isNotEmpty(bannedList)) {
-            // 提取 userId
-            String userIds = bannedList.stream()
-                    .map(YtPlatformBanned::getUserId)
-                    .collect(Collectors.joining(","));
-
-
-            AppUserParam appUserParam = new AppUserParam();
-            appUserParam.setUserIds(userIds);
-            // 查询用户状态
-            ResultTable<YtDyzUser> userList = appFeign.getUserAll(appUserParam);
-            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) {
@@ -199,15 +183,8 @@ public class RiskManageController {
                     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]++;
-                            }
+                          lockCounts[hour]++;
                         }
-                    }
                 }
             }
         }

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

@@ -158,7 +158,7 @@
 
     <select id="queryBannedRecordGroupByUserId" resultType="com.ytpm.agent.model.YtPlatformBanned">
         select
-        banned_id, user_id, channel_id,agent_id, banned_time, banned_reason, banned_type, banned_limit, operator, operator_name
+        user_id
         from yt_platform_banned
         <where>
             <if test="startTime != null">