Просмотр исходного кода

:perf:代码优化 将循环查询用户名,改为批量

zhangxianyu 1 год назад
Родитель
Сommit
108a3b962e

+ 53 - 6
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java

@@ -237,9 +237,25 @@ public class RoleManageServiceImpl implements IRoleManageService {
         sql.setCallback(Sqls.callback.maps());
         sql.setPager(pager);
         dao.execute(sql);
-        List<Map> list = sql.getList(Map.class).stream().map(map -> {
-            getNameById(map);
-
+        //查询结果
+        List<Map> list = sql.getList(Map.class);
+        //用户id列表
+        List<Long> userIds = new ArrayList<>();
+        for (Map map : list) {
+//            getNameById(map);
+            //把投手id和运营id和GSID和客服人员ID 转成List
+            if(map.get("put_user_id") != null){
+                userIds.add(Long.valueOf(map.get("put_user_id").toString()));
+            }
+            if(map.get("oper_user_id") != null){
+                userIds.add(Long.valueOf(map.get("oper_user_id").toString()));
+            }
+            if(map.get("gs_id") != null){
+                userIds.add(Long.valueOf(map.get("gs_id").toString()));
+            }
+            if(map.get("customer_service_id") != null){
+                userIds.add(Long.valueOf(map.get("customer_service_id").toString()));
+            }
             String str = (String) map.get("role_amount");
             if(str!=null&&str.contains("[") && str.contains("]")){
                 //去掉字符串中的‘[]’
@@ -262,13 +278,44 @@ public class RoleManageServiceImpl implements IRoleManageService {
             if ("null".equals(map.get("country"))) {
                 map.put("country", null);
             }
-            return map;
-        }).collect(Collectors.toList());
-
+        }
+        //去重userIds
+        userIds = userIds.stream().distinct().collect(Collectors.toList());
+        //发送RPC接口查询所有用户
+        ResultVO<Map<Long, String>> userMap = sysUserRpc.getUserNameByIds(userIds);
+
+        for (Map map : list) {
+            //投手名
+            updateUserName(map, "put_user_id", "put_user_name", userMap);
+            //运营人员名
+            updateUserName(map, "oper_user_id", "oper_user_name", userMap);
+            //GS人员名
+            updateUserName(map, "gs_id", "gs_name", userMap);
+            //客服人员名
+            updateUserName(map, "customer_service_id", "customer_service_name", userMap);
+        }
         //返回结果
         return new Page<>(list, pager);
     }
 
+    // 更新用户名称
+    private void updateUserName(Map<String, Object> map, String userIdKey, String userNameKey, ResultVO<Map<Long, String>> userMap) {
+        Object userIdObj = map.get(userIdKey);
+        if (userIdObj != null) {
+            try {
+                long userId = Long.parseLong(userIdObj.toString());
+                String userName = userMap.getData().get(userId);
+                if (userName != null) {
+                    map.put(userNameKey, userName);
+                }
+            } catch (NumberFormatException e) {
+                // 处理长整型转换异常
+                log.error("Error parsing user ID for key " + userIdKey + ": " + e.getMessage());
+            }
+        }
+    }
+
+
     private Criteria spliceRechargeTotalAmountWithin24h(RoleRechargeRankingDTO dto, Criteria criA) {
         switch (dto.getRechargeTotalAmountWithin24hUnit()) {
             case ">" -> criA.where().andGT("role_total_amount", dto.getRechargeTotalAmountWithin24h());