فهرست منبع

第三类分润优化

skyfffire 1 ماه پیش
والد
کامیت
04542cd683
1فایلهای تغییر یافته به همراه23 افزوده شده و 4 حذف شده
  1. 23 4
      src/main/java/modules/user/UserTeamShareTask.java

+ 23 - 4
src/main/java/modules/user/UserTeamShareTask.java

@@ -166,9 +166,28 @@ public class UserTeamShareTask implements Runnable {
                 .map(String::valueOf)
                 .collect(Collectors.joining(","));
 
-        AppConfig.LOGGER.info("开始查询用户");
-        List<User> userList = User.dao.find("SELECT id, balance FROM t_user WHERE id IN (" + inSql + ")");
-        AppConfig.LOGGER.info("用户查询完毕");
+        AppConfig.LOGGER.info("开始查询用户,符合条件的用户ID数量: {}", eligibleUserIds.size());
+        // ******** 关键改进:分批查询 User 对象 ********
+        final int BATCH_QUERY_SIZE = 1000; // 每批次查询 1000 个用户
+        List<User> userList = new ArrayList<>(eligibleUserIds.size()); // 预估大小,减少扩容开销
+
+        // 将 Set 转换为 List,方便进行 subList 分批操作
+        List<Long> eligibleUserIdsList = new ArrayList<>(eligibleUserIds);
+
+        for (int i = 0; i < eligibleUserIdsList.size(); i += BATCH_QUERY_SIZE) {
+            // 获取当前批次的 user_id 子列表
+            List<Long> subList = eligibleUserIdsList.subList(i, Math.min(i + BATCH_QUERY_SIZE, eligibleUserIdsList.size()));
+
+            String subInSql = subList.stream()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(","));
+
+            // 执行 IN 查询,添加到总的 userList 中
+            userList.addAll(User.dao.find("SELECT id, balance FROM t_user WHERE id IN (" + subInSql + ")"));
+            AppConfig.LOGGER.debug("已查询用户批次 {} 到 {},总已查询用户数: {}", i, Math.min(i + BATCH_QUERY_SIZE, eligibleUserIdsList.size()) -1 , userList.size());
+        }
+        // ******** 分批查询 User 对象结束 ********
+        AppConfig.LOGGER.info("用户查询完毕,共查询到 {} 个符合用户。", userList.size());
 
         // 为了方便处理,将 list 转换为 map,userOrderCounts 也转换为 map
         Map<Long, User> userMap = userList.stream()
@@ -241,7 +260,7 @@ public class UserTeamShareTask implements Runnable {
             log2.set("create_time", System.currentTimeMillis());
             log2.set("is_deleted", 0);
             log2.set("description", "NFT持有者共享总数的10%," + validOrderCount + " / " + nftt.getMaxQuantity()); // 加入订单数量信息
-            log2.set("amount", shareAmount1);
+            log2.set("amount", shareAmount2);
             log2.set("user_id", userId);
             depositLogsToSave.add(log2);
         }