|
|
@@ -3,13 +3,15 @@ package modules.user;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.jfinal.kit.StrKit;
|
|
|
import com.jfinal.plugin.activerecord.Db;
|
|
|
+import com.jfinal.plugin.activerecord.Record;
|
|
|
import common.jfinal.AppConfig;
|
|
|
import common.model.User;
|
|
|
import common.utils.bsn.BsnSDK;
|
|
|
import common.utils.http.MyRet;
|
|
|
import common.utils.hyg.HygSDK;
|
|
|
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
public class UserService {
|
|
|
public String hello() {
|
|
|
@@ -94,11 +96,11 @@ public class UserService {
|
|
|
return Db.queryStr(sql, token);
|
|
|
}
|
|
|
|
|
|
- public String findWorkidByToken(String token) {
|
|
|
- String sql = "select workid from t_user where token = ?";
|
|
|
-
|
|
|
- return Db.queryStr(sql, token);
|
|
|
- }
|
|
|
+// public String findWorkidByToken(String token) {
|
|
|
+// String sql = "select workid from t_user where token = ?";
|
|
|
+//
|
|
|
+// return Db.queryStr(sql, token);
|
|
|
+// }
|
|
|
|
|
|
public User findUserById(String id) {
|
|
|
String sql = "select * from t_user where id = ?";
|
|
|
@@ -188,4 +190,112 @@ public class UserService {
|
|
|
return User.dao.find(fullSql, searchKeyWord, searchKeyWord, searchKeyWord, offset, pageSize);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ public MyRet teamInfoByAdmin() {
|
|
|
+ // 1. 查询所有推荐人ID及其有效下级用户数量
|
|
|
+ String queryReferrerStatsSql = "SELECT referrer_id, COUNT(id) AS valid_user_count " +
|
|
|
+ "FROM t_user " +
|
|
|
+ "WHERE is_effective = 1 AND referrer_id IS NOT NULL " +
|
|
|
+ "GROUP BY referrer_id HAVING COUNT(id) > 0";
|
|
|
+ AppConfig.LOGGER.info("执行 SQL 查询推荐人统计: {}", queryReferrerStatsSql);
|
|
|
+ List<Record> referrerStatsRecords = Db.find(queryReferrerStatsSql);
|
|
|
+
|
|
|
+ if (referrerStatsRecords.isEmpty()) {
|
|
|
+ AppConfig.LOGGER.info("没有符合条件的推荐人。");
|
|
|
+ return MyRet.fail("还没人推荐过任何人是有效用户。");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提取所有唯一的 referrer_id,并转换为 List 方便分批
|
|
|
+ List<Long> eligibleReferrerIdsList = referrerStatsRecords.stream()
|
|
|
+ .map(record -> record.getLong("referrer_id"))
|
|
|
+ .distinct() // 确保唯一,虽然 Set 已经保证了
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ AppConfig.LOGGER.info("符合条件的推荐人ID数量: {}", eligibleReferrerIdsList.size());
|
|
|
+
|
|
|
+ // 转换为 Map,方便通过 referrer_id 查找 valid_user_count (这个 Map 仍然需要)
|
|
|
+ Map<Long, Integer> referrerValidUserCountMap = referrerStatsRecords.stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ record -> record.getLong("referrer_id"),
|
|
|
+ record -> record.getLong("valid_user_count").intValue()
|
|
|
+ ));
|
|
|
+
|
|
|
+ // ******** 2. 分批查询所有推荐人 User 对象,并直接整合 valid_user_count 到 User 对象中 ********
|
|
|
+ final int BATCH_QUERY_SIZE = 1000;
|
|
|
+ List<User> finalReferrerList = new ArrayList<>(eligibleReferrerIdsList.size()); // 最终的推荐人 User 对象列表
|
|
|
+
|
|
|
+ AppConfig.LOGGER.info("开始分批查询推荐人 User 对象并整合 valid_referred_count...");
|
|
|
+ for (int i = 0; i < eligibleReferrerIdsList.size(); i += BATCH_QUERY_SIZE) {
|
|
|
+ List<Long> subListReferrerIds = eligibleReferrerIdsList.subList(i, Math.min(i + BATCH_QUERY_SIZE, eligibleReferrerIdsList.size()));
|
|
|
+ String subInSql = subListReferrerIds.stream().map(String::valueOf).collect(Collectors.joining(","));
|
|
|
+
|
|
|
+ List<User> currentBatchUsers = User.dao.find("SELECT id, mobile_number, balance FROM t_user WHERE id IN (" + subInSql + ")");
|
|
|
+
|
|
|
+ for (User referrer : currentBatchUsers) {
|
|
|
+ // 直接在这里将 valid_user_count 整合进去
|
|
|
+ Integer validUserCount = referrerValidUserCountMap.get(referrer.getId());
|
|
|
+ if (validUserCount != null) {
|
|
|
+ referrer.put("valid_referred_count", validUserCount);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finalReferrerList.addAll(currentBatchUsers);
|
|
|
+ AppConfig.LOGGER.debug("已查询推荐人批次 {} 总已查询用户数: {}", i, finalReferrerList.size());
|
|
|
+ }
|
|
|
+ AppConfig.LOGGER.info("推荐人 User 对象查询并整合完毕,共查询到 {} 个推荐人。", finalReferrerList.size());
|
|
|
+
|
|
|
+ // ******** 3. 分批查询所有被推荐用户(下级用户),并按推荐人 ID 分组 ********
|
|
|
+ AppConfig.LOGGER.info("开始分批查询所有被推荐用户(下级用户)并分组...");
|
|
|
+ // 存储所有被推荐用户的数据,Key为referrer_id,Value为该referrer_id推荐的User的Map列表
|
|
|
+ Map<Long, List<Map<String, Object>>> allReferredUsersByReferrerId = new HashMap<>();
|
|
|
+
|
|
|
+ for (int i = 0; i < eligibleReferrerIdsList.size(); i += BATCH_QUERY_SIZE) {
|
|
|
+ List<Long> subListReferrerIds = eligibleReferrerIdsList.subList(i, Math.min(i + BATCH_QUERY_SIZE, eligibleReferrerIdsList.size()));
|
|
|
+ String subInReferrerSql = subListReferrerIds.stream().map(String::valueOf).collect(Collectors.joining(","));
|
|
|
+
|
|
|
+ String queryReferredUsersSql = "SELECT id, mobile_number, effective_time, referrer_id " +
|
|
|
+ "FROM t_user " +
|
|
|
+ "WHERE is_effective = 1 " + // 确保是有效用户
|
|
|
+ "AND referrer_id IN (" + subInReferrerSql + ")" +
|
|
|
+ "ORDER BY effective_time ASC";
|
|
|
+
|
|
|
+ List<Record> referredUserRecords = Db.find(queryReferredUsersSql);
|
|
|
+
|
|
|
+ // 将 Record 转换为 Map<String, Object> 并按 referrer_id 分组
|
|
|
+ for (Record record : referredUserRecords) {
|
|
|
+ Long currentReferrerId = record.getLong("referrer_id");
|
|
|
+ Map<String, Object> referredUser = new HashMap<>();
|
|
|
+ referredUser.put("id", record.getLong("id"));
|
|
|
+ referredUser.put("mobile_number", record.getStr("mobile_number"));
|
|
|
+ referredUser.put("effective_time", record.getLong("effective_time"));
|
|
|
+
|
|
|
+ allReferredUsersByReferrerId.computeIfAbsent(currentReferrerId, k -> new ArrayList<>()).add(referredUser);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ AppConfig.LOGGER.info("所有被推荐用户查询并分组完毕。共找到被推荐用户 {} 条。",
|
|
|
+ allReferredUsersByReferrerId.values().stream().mapToInt(List::size).sum());
|
|
|
+
|
|
|
+ // ******** 4. 将被推荐用户列表整合到推荐人 User 对象中 ********
|
|
|
+ AppConfig.LOGGER.info("开始将下级用户列表整合到推荐人 User 对象...");
|
|
|
+ for (User referrer : finalReferrerList) { // 遍历已经整合了 valid_referred_count 的推荐人列表
|
|
|
+ Long referrerId = referrer.getId();
|
|
|
+ List<Map<String, Object>> referredUsers = allReferredUsersByReferrerId.getOrDefault(referrerId, Collections.emptyList()); // 使用 getOrDefault 避免 NPE
|
|
|
+
|
|
|
+ referrer.put("referred_users", referredUsers); // put 进去一个 List<Map<String, Object>>
|
|
|
+ AppConfig.LOGGER.info("推荐人: {}", referrer.toJson());
|
|
|
+ AppConfig.LOGGER.debug("推荐人 {} 已关联 {} 个被推荐用户。", referrerId, referredUsers.size());
|
|
|
+
|
|
|
+ for (Map<String, Object> ru : referredUsers) {
|
|
|
+ AppConfig.LOGGER.info(" - ID:{}, 手机号:{}, 有效时间:{}", ru.get("id"), ru.get("mobile_number"), ru.get("effective_time"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ AppConfig.LOGGER.info("直推网络查询与构建完成。");
|
|
|
+ // ******** 分批查询 User 对象结束 ********
|
|
|
+
|
|
|
+ // 筛选出直推人数大于10人的组,每个用户按第10位被推荐人(下级)的有效时间进行从小到大排序
|
|
|
+
|
|
|
+ // 筛选出直推人数大于5人的组,每个用户按第5位被推荐人(下级)的有效时间进行从小到大排序
|
|
|
+ // 筛选出直推人数大于2人的组,每个用户按第2位被推荐人(下级)的有效时间进行从小到大排序
|
|
|
+
|
|
|
+ return MyRet.ok("查询成功");
|
|
|
+ }
|
|
|
}
|