|
|
@ -169,15 +169,34 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe |
|
|
|
} |
|
|
|
|
|
|
|
// 5. 如果人数不足,从全体用户补充(同样过滤掉已中奖的)和别的等级下内定的也要过滤 |
|
|
|
if (winners.size() < requiredWinners) { |
|
|
|
int remaining = requiredWinners - winners.size(); |
|
|
|
// List<User> allAvailableUsers = getAllAvailableUsers(); |
|
|
|
// if (winners.size() < requiredWinners) { |
|
|
|
// int remaining = requiredWinners - winners.size(); |
|
|
|
//// List<User> allAvailableUsers = getAllAvailableUsers(); |
|
|
|
//// List<User> supplementWinners = randomSelectUsers(allAvailableUsers, Math.min(remaining, allAvailableUsers.size())); |
|
|
|
//// winners.addAll(convertToUserVoList(supplementWinners)); |
|
|
|
//// markUsersAsWinners(supplementWinners, startLotteryDto); // 标记为已中奖,并加入到中奖记录表里面 |
|
|
|
// |
|
|
|
// List<User> allAvailableUsers = getAllAvailableUsers(startLotteryDto.getGradeId()); //过滤别的等级下内定的用户和已中奖的用户 |
|
|
|
// List<User> supplementWinners = randomSelectUsers(allAvailableUsers, Math.min(remaining, allAvailableUsers.size())); |
|
|
|
// winners.addAll(convertToUserVoList(supplementWinners)); |
|
|
|
// markUsersAsWinners(supplementWinners, startLotteryDto); // 标记为已中奖,并加入到中奖记录表里面 |
|
|
|
// markUsersAsWinners(supplementWinners, startLotteryDto); |
|
|
|
// } |
|
|
|
if (winners.size() < requiredWinners) { |
|
|
|
int remaining = requiredWinners - winners.size(); |
|
|
|
List<User> allAvailableUsers = getAllAvailableUsers(startLotteryDto.getGradeId()); |
|
|
|
|
|
|
|
// 再次确保不包含任何内定用户 |
|
|
|
allAvailableUsers = allAvailableUsers.stream() |
|
|
|
.filter(user -> { |
|
|
|
UserDetail detail = userDetailMapper.selectById(user.getId()); |
|
|
|
return detail == null || detail.getIsFixed() != 1; |
|
|
|
}) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
|
|
List<User> allAvailableUsers = getAllAvailableUsers(startLotteryDto.getGradeId()); //过滤别的等级下内定的用户和已中奖的用户 |
|
|
|
List<User> supplementWinners = randomSelectUsers(allAvailableUsers, Math.min(remaining, allAvailableUsers.size())); |
|
|
|
List<User> supplementWinners = randomSelectUsers( |
|
|
|
allAvailableUsers, |
|
|
|
Math.min(remaining, allAvailableUsers.size()) |
|
|
|
); |
|
|
|
winners.addAll(convertToUserVoList(supplementWinners)); |
|
|
|
markUsersAsWinners(supplementWinners, startLotteryDto); |
|
|
|
} |
|
|
@ -229,21 +248,41 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe |
|
|
|
|
|
|
|
//获取全体可用用户(未中奖且非其他等奖内定用户) |
|
|
|
private List<User> getAllAvailableUsers(Long currentGradeId) { |
|
|
|
// 获取所有其他等奖的内定用户 |
|
|
|
List<User> otherFixedUsers = getOtherGradeFixedUsers(currentGradeId); |
|
|
|
Set<Long> otherFixedUserIds = otherFixedUsers.stream() |
|
|
|
.map(User::getId) |
|
|
|
// // 获取所有其他等奖的内定用户 |
|
|
|
// List<User> otherFixedUsers = getOtherGradeFixedUsers(currentGradeId); |
|
|
|
// Set<Long> otherFixedUserIds = otherFixedUsers.stream() |
|
|
|
// .map(User::getId) |
|
|
|
// .collect(Collectors.toSet()); |
|
|
|
// |
|
|
|
// // 查询所有未中奖用户 |
|
|
|
// LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); |
|
|
|
// wrapper.eq(User::getIsWin, 0) |
|
|
|
// .eq(User::getIsDel, 0); // 新增:只查询未删除的用户; |
|
|
|
// List<User> allUsers = userMapper.selectList(wrapper); |
|
|
|
// |
|
|
|
// // 过滤掉其他等奖的内定用户 |
|
|
|
// return allUsers.stream() |
|
|
|
// .filter(user -> !otherFixedUserIds.contains(user.getId())) |
|
|
|
// .collect(Collectors.toList()); |
|
|
|
|
|
|
|
// 1. 获取所有内定用户(所有等级) |
|
|
|
LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>(); |
|
|
|
wrapper.eq(UserDetail::getIsFixed, 1); |
|
|
|
List<UserDetail> allFixedUsers = userDetailMapper.selectList(wrapper); |
|
|
|
|
|
|
|
// 2. 获取所有内定用户的ID |
|
|
|
Set<Long> allFixedUserIds = allFixedUsers.stream() |
|
|
|
.map(UserDetail::getUserId) |
|
|
|
.collect(Collectors.toSet()); |
|
|
|
|
|
|
|
// 查询所有未中奖用户 |
|
|
|
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); |
|
|
|
wrapper.eq(User::getIsWin, 0) |
|
|
|
.eq(User::getIsDel, 0); // 新增:只查询未删除的用户; |
|
|
|
List<User> allUsers = userMapper.selectList(wrapper); |
|
|
|
// 3. 获取所有未中奖用户 |
|
|
|
LambdaQueryWrapper<User> userWrapper = new LambdaQueryWrapper<>(); |
|
|
|
userWrapper.eq(User::getIsWin, 0); |
|
|
|
List<User> allAvailableUsers = userMapper.selectList(userWrapper); |
|
|
|
|
|
|
|
// 过滤掉其他等奖的内定用户 |
|
|
|
return allUsers.stream() |
|
|
|
.filter(user -> !otherFixedUserIds.contains(user.getId())) |
|
|
|
// 4. 过滤掉所有内定用户(当前等级内定用户已在前面处理) |
|
|
|
return allAvailableUsers.stream() |
|
|
|
.filter(user -> !allFixedUserIds.contains(user.getId())) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
} |
|
|
|
|
|
|
@ -327,6 +366,8 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe |
|
|
|
.set(Grade::getUpdateTime, new Date()); |
|
|
|
gradeMapper.update(null, lambdaUpdateWrapper); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// // 随机选择指定数量的用户(内定名单中) |
|
|
|
// private List<UserDetail> randomSelectFixUser(List<UserDetail> users, int count) { |
|
|
|
// List<UserDetail> shuffled = new ArrayList<>(users); // 避免修改原集合 |
|
|
|