Browse Source

导入用户的一些问题

master
willy 1 week ago
parent
commit
000d154f3d
  1. 52
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java
  2. 230
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java

52
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java

@ -381,45 +381,38 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
if (userDtos.size() > 2000) {
return Result.failure("单次导入最多支持2000条数据");
}
// 3. 提取所有精网号并去重
List<String> jwcodes = userDtos.stream()
.map(UserImportDto::getJwcode)
.distinct()
.collect(Collectors.toList());
int filteredCount = 0;
List<UserImportDto> filteredUserDtos = new ArrayList<>();
// 3. 收集不以9开头的无效精网号
List<String> invalidPrefixJwCodes = new ArrayList<>();
List<UserImportDto> validUserDtos = new ArrayList<>();
for (UserImportDto dto : userDtos) {
if (dto.getJwcode() != null && dto.getJwcode().startsWith("9")) {
filteredUserDtos.add(dto);
} else {
filteredCount++;
LOGGER.warn("剔除以9开头的精网号: {}", dto.getJwcode());
validUserDtos.add(dto);
} else if (dto.getJwcode() != null) {
invalidPrefixJwCodes.add(dto.getJwcode());
}
}
// 3. 提取所有精网号并去重且只保留以9开头的数字
jwcodes = userDtos.stream()
// 4. 获取所有有效精网号
List<String> jwcodes = validUserDtos.stream()
.map(UserImportDto::getJwcode)
.filter(jwcode -> jwcode != null && jwcode.startsWith("9")) // 添加过滤条件
.distinct()
.collect(Collectors.toList());
// 4. 批量检查member表中存在的精网号优化为单次查询
// 5. 检查member表中存在的精网号
Set<String> existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes)
.stream()
.collect(Collectors.toSet());
// 5. 处理导入逻辑
// 6. 处理导入逻辑
int successCount = 0;
int skipCount = 0;
Set<String> processedCodes = new HashSet<>();
List<String> invalidJwCodes = new ArrayList<>();
List<String> invalidJwCodes = new ArrayList<>(invalidPrefixJwCodes); // 包含不以9开头的
for (int i = 0; i < userDtos.size(); i++) {
UserImportDto dto = userDtos.get(i);
for (int i = 0; i < validUserDtos.size(); i++) {
UserImportDto dto = validUserDtos.get(i);
try {
// 基础校验
validateUser(dto, i + 2, processedCodes);
@ -458,12 +451,19 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
}
}
// 6. 构建结果信息
String message = String.format("导入完成: 成功%d条,跳过%d条,失败%d条", successCount, skipCount, filteredCount);
// 7. 构建结果信息只包含无效精网号
String message;
if (!invalidJwCodes.isEmpty()) {
message += String.format(",其中%d个精网号无效(示例: %s)",
invalidJwCodes.size(),
invalidJwCodes.stream().limit(5).collect(Collectors.joining(",")));
// 只显示无效精网号包括不以9开头和member表中不存在的
String invalidCodesStr = invalidJwCodes.stream()
.distinct() // 去重
.collect(Collectors.joining(","));
message = String.format("导入完成: 成功%d条,无效精网号: %s",
successCount,
invalidCodesStr);
} else {
message = String.format("导入完成: 成功%d条,无无效精网号", successCount);
}
return successCount > 0 ? Result.success(message) : Result.failure("没有有效数据可导入");

230
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java

@ -340,6 +340,121 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
// }
@Override
// public Result importUsers(MultipartFile file) {
// try {
// // 1. 解析Excel
// List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
// .head(UserImportDto.class)
// .sheet()
// .doReadSync();
//
//
//
// // 2. 检查数据量是否超过限制
// if (userDtos.size() > 2000) {
// return Result.failure("单次导入最多支持2000条数据");
// }
//
// // 3. 获取所有精网号
// List<String> jwcodes = userDtos.stream()
// .map(UserImportDto::getJwcode)
// .distinct()
// .collect(Collectors.toList());
// // 3. 提取所有精网号并去重且只保留以9开头的数字
// jwcodes = userDtos.stream()
// .map(UserImportDto::getJwcode)
// .filter(jwcode -> jwcode != null && jwcode.startsWith("9")) // 添加过滤条件
// .distinct()
// .collect(Collectors.toList());
//
// int filteredCount = 0;
// List<UserImportDto> filteredUserDtos = new ArrayList<>();
// for (UserImportDto dto : userDtos) {
// if (dto.getJwcode() != null && dto.getJwcode().startsWith("9")) {
// filteredUserDtos.add(dto);
// } else {
// filteredCount++;
// LOGGER.warn("剔除以9开头的精网号: {}", dto.getJwcode());
// }
// }
//
// // 4. 检查member表中存在的精网号
// Set<String> existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes)
// .stream()
// .collect(Collectors.toSet());
//
// // 5. 获取已存在的精网号及其删除状态
// Map<String, Integer> existingUserMap = adminUserMapper.selectAllUserCodesWithDelStatus()
// .stream()
// .collect(Collectors.toMap(
// User::getJwcode,
// User::getIsDel,
// (existing, replacement) -> existing
// ));
//
//
// List<User> usersToAdd = new ArrayList<>();
// List<User> usersToUpdate = new ArrayList<>();
// Set<String> processedCodes = new HashSet<>();
// int skipCount = 0;
//
// for (int i = 0; i < userDtos.size(); i++) {
// UserImportDto dto = userDtos.get(i);
// try {
// validateUser(dto, i + 2);
//
// // 检查member表中是否存在
// if (!existingMemberCodes.contains(dto.getJwcode())) {
// throw new IllegalArgumentException(String.format("第%d行: 精网号%s不存在于member表中", i + 2, dto.getJwcode()));
// }
//
// // 文件内去重
// if (processedCodes.contains(dto.getJwcode())) {
// throw new IllegalArgumentException(String.format("第%d行: 精网号%s在当前文件中重复", i + 2, dto.getJwcode()));
// }
// processedCodes.add(dto.getJwcode());
//
// // 处理数据库中的重复情况
// if (existingUserMap.containsKey(dto.getJwcode())) {
// Integer isDel = existingUserMap.get(dto.getJwcode());
// if (isDel == 1) {
// User existingUser = adminUserMapper.selectByJwCode(dto.getJwcode());
// User userToUpdate = convertToEntity(dto);
// userToUpdate.setId(existingUser.getId());
// userToUpdate.setIsDel(0);
// usersToUpdate.add(userToUpdate);
// } else {
// throw new IllegalArgumentException(String.format("第%d行: 精网号%s已存在", i + 2, dto.getJwcode()));
// }
// } else {
// usersToAdd.add(convertToEntity(dto));
// }
// } catch (IllegalArgumentException e) {
// LOGGER.warn("导入数据校验失败: {}", e.getMessage());
// skipCount++;
// }
// }
//
// // 6. 执行数据库操作
// int successCount = 0;
// if (!usersToAdd.isEmpty()) {
// boolean addSuccess = this.saveBatch(usersToAdd);
// successCount += addSuccess ? usersToAdd.size() : 0;
// }
// if (!usersToUpdate.isEmpty()) {
// boolean updateSuccess = this.updateBatchById(usersToUpdate);
// successCount += updateSuccess ? usersToUpdate.size() : 0;
// }
//
// return successCount > 0 ?
// Result.success(String.format("导入成功%d条(新增%d条,更新%d条),跳过%d条,失败%d条",
// successCount, usersToAdd.size(), usersToUpdate.size(), skipCount,filteredCount)) :
// Result.failure("没有有效数据可导入");
// } catch (Exception e) {
// LOGGER.error("导入用户失败", e);
// return Result.failure("导入失败: " + e.getMessage());
// }
// }
public Result importUsers(MultipartFile file) {
try {
// 1. 解析Excel
@ -348,42 +463,35 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
.sheet()
.doReadSync();
// 2. 检查数据量是否超过限制
if (userDtos.size() > 2000) {
return Result.failure("单次导入最多支持2000条数据");
}
// 3. 获取所有精网号
List<String> jwcodes = userDtos.stream()
.map(UserImportDto::getJwcode)
.distinct()
.collect(Collectors.toList());
// 3. 提取所有精网号并去重且只保留以9开头的数字
jwcodes = userDtos.stream()
.map(UserImportDto::getJwcode)
.filter(jwcode -> jwcode != null && jwcode.startsWith("9")) // 添加过滤条件
.distinct()
.collect(Collectors.toList());
// 3. 收集不以9开头的精网号
List<String> invalidPrefixJwCodes = new ArrayList<>();
List<UserImportDto> validUserDtos = new ArrayList<>();
int filteredCount = 0;
List<UserImportDto> filteredUserDtos = new ArrayList<>();
for (UserImportDto dto : userDtos) {
if (dto.getJwcode() != null && dto.getJwcode().startsWith("9")) {
filteredUserDtos.add(dto);
} else {
filteredCount++;
LOGGER.warn("剔除以9开头的精网号: {}", dto.getJwcode());
validUserDtos.add(dto);
} else if (dto.getJwcode() != null) {
invalidPrefixJwCodes.add(dto.getJwcode());
}
}
// 4. 检查member表中存在的精网号
// 4. 获取所有有效精网号
List<String> jwcodes = validUserDtos.stream()
.map(UserImportDto::getJwcode)
.distinct()
.collect(Collectors.toList());
// 5. 检查member表中存在的精网号
Set<String> existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes)
.stream()
.collect(Collectors.toSet());
// 5. 获取已存在的精网号及其删除状态
// 6. 获取已存在的精网号及其删除状态
Map<String, Integer> existingUserMap = adminUserMapper.selectAllUserCodesWithDelStatus()
.stream()
.collect(Collectors.toMap(
@ -392,50 +500,64 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
(existing, replacement) -> existing
));
List<User> usersToAdd = new ArrayList<>();
List<User> usersToUpdate = new ArrayList<>();
Set<String> processedCodes = new HashSet<>();
int skipCount = 0;
for (int i = 0; i < userDtos.size(); i++) {
UserImportDto dto = userDtos.get(i);
// 收集所有失败的精网号包括跳过和无效的
List<String> allFailedJwCodes = new ArrayList<>(invalidPrefixJwCodes);
Map<String, String> failureReasons = new LinkedHashMap<>();
// 先处理无效前缀的
invalidPrefixJwCodes.forEach(code ->
failureReasons.put(code, "不以9开头"));
for (int i = 0; i < validUserDtos.size(); i++) {
UserImportDto dto = validUserDtos.get(i);
String jwcode = dto.getJwcode();
int rowNum = i + 2; // Excel行号(从第2行开始)
try {
validateUser(dto, i + 2);
validateUser(dto, rowNum);
// 检查member表中是否存在
if (!existingMemberCodes.contains(dto.getJwcode())) {
throw new IllegalArgumentException(String.format("第%d行: 精网号%s不存在于member表中", i + 2, dto.getJwcode()));
if (!existingMemberCodes.contains(jwcode)) {
allFailedJwCodes.add(jwcode);
failureReasons.put(jwcode, "不存在于member表中");
continue;
}
// 文件内去重
if (processedCodes.contains(dto.getJwcode())) {
throw new IllegalArgumentException(String.format("第%d行: 精网号%s在当前文件中重复", i + 2, dto.getJwcode()));
if (processedCodes.contains(jwcode)) {
allFailedJwCodes.add(jwcode);
failureReasons.put(jwcode, "文件中重复");
continue;
}
processedCodes.add(dto.getJwcode());
processedCodes.add(jwcode);
// 处理数据库中的重复情况
if (existingUserMap.containsKey(dto.getJwcode())) {
Integer isDel = existingUserMap.get(dto.getJwcode());
if (existingUserMap.containsKey(jwcode)) {
Integer isDel = existingUserMap.get(jwcode);
if (isDel == 1) {
User existingUser = adminUserMapper.selectByJwCode(dto.getJwcode());
User existingUser = adminUserMapper.selectByJwCode(jwcode);
User userToUpdate = convertToEntity(dto);
userToUpdate.setId(existingUser.getId());
userToUpdate.setIsDel(0);
usersToUpdate.add(userToUpdate);
} else {
throw new IllegalArgumentException(String.format("第%d行: 精网号%s已存在", i + 2, dto.getJwcode()));
allFailedJwCodes.add(jwcode);
failureReasons.put(jwcode, "已存在未删除");
}
} else {
usersToAdd.add(convertToEntity(dto));
}
} catch (IllegalArgumentException e) {
LOGGER.warn("导入数据校验失败: {}", e.getMessage());
skipCount++;
allFailedJwCodes.add(jwcode);
failureReasons.put(jwcode, e.getMessage());
}
}
// 6. 执行数据库操作
// 7. 执行数据库操作
int successCount = 0;
if (!usersToAdd.isEmpty()) {
boolean addSuccess = this.saveBatch(usersToAdd);
@ -446,10 +568,32 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
successCount += updateSuccess ? usersToUpdate.size() : 0;
}
return successCount > 0 ?
Result.success(String.format("导入成功%d条(新增%d条,更新%d条),跳过%d条,失败%d条",
successCount, usersToAdd.size(), usersToUpdate.size(), skipCount,filteredCount)) :
Result.failure("没有有效数据可导入");
// 构建结果信息
String message;
if (!allFailedJwCodes.isEmpty()) {
// 构建失败精网号及原因列表
String failedDetails = allFailedJwCodes.stream()
.map(code -> code + "(" + failureReasons.getOrDefault(code, "未知原因") + ")")
.collect(Collectors.joining(", "));
message = String.format(
"导入成功%d条(新增%d条,更新%d条),失败%d条。失败记录: %s",
successCount,
usersToAdd.size(),
usersToUpdate.size(),
allFailedJwCodes.size(),
failedDetails
);
} else {
message = String.format(
"导入成功%d条(新增%d条,更新%d条),无失败记录",
successCount,
usersToAdd.size(),
usersToUpdate.size()
);
}
return Result.success(message);
} catch (Exception e) {
LOGGER.error("导入用户失败", e);
return Result.failure("导入失败: " + e.getMessage());
@ -500,6 +644,8 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
.set(User::getIsDel, 1); // 逻辑删除
return this.update(userWrapper);
} catch (Exception e) {
// 事务会自动回滚
throw new RuntimeException("批量删除用户失败", e);

Loading…
Cancel
Save