diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java index 8350faf..351d9ad 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java @@ -381,45 +381,38 @@ public class AdminUserDetailServiceImpl extends ServiceImpl 2000) { return Result.failure("单次导入最多支持2000条数据"); } - // 3. 提取所有精网号并去重 - List jwcodes = userDtos.stream() - .map(UserImportDto::getJwcode) - .distinct() - .collect(Collectors.toList()); - int filteredCount = 0; - List filteredUserDtos = new ArrayList<>(); + // 3. 收集不以9开头的无效精网号 + List invalidPrefixJwCodes = new ArrayList<>(); + List 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 jwcodes = validUserDtos.stream() .map(UserImportDto::getJwcode) - .filter(jwcode -> jwcode != null && jwcode.startsWith("9")) // 添加过滤条件 .distinct() .collect(Collectors.toList()); - - - // 4. 批量检查member表中存在的精网号(优化为单次查询) + // 5. 检查member表中存在的精网号 Set existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes) .stream() .collect(Collectors.toSet()); - // 5. 处理导入逻辑 + // 6. 处理导入逻辑 int successCount = 0; int skipCount = 0; Set processedCodes = new HashSet<>(); - List invalidJwCodes = new ArrayList<>(); + List 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 0 ? Result.success(message) : Result.failure("没有有效数据可导入"); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java index 49123d0..ea4cb71 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java @@ -340,6 +340,121 @@ public class AdminUserServiceImpl extends ServiceImpl imp // } @Override +// public Result importUsers(MultipartFile file) { +// try { +// // 1. 解析Excel +// List userDtos = EasyExcel.read(file.getInputStream()) +// .head(UserImportDto.class) +// .sheet() +// .doReadSync(); +// +// +// +// // 2. 检查数据量是否超过限制 +// if (userDtos.size() > 2000) { +// return Result.failure("单次导入最多支持2000条数据"); +// } +// +// // 3. 获取所有精网号 +// List 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 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 existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes) +// .stream() +// .collect(Collectors.toSet()); +// +// // 5. 获取已存在的精网号及其删除状态 +// Map existingUserMap = adminUserMapper.selectAllUserCodesWithDelStatus() +// .stream() +// .collect(Collectors.toMap( +// User::getJwcode, +// User::getIsDel, +// (existing, replacement) -> existing +// )); +// +// +// List usersToAdd = new ArrayList<>(); +// List usersToUpdate = new ArrayList<>(); +// Set 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 imp .sheet() .doReadSync(); - - // 2. 检查数据量是否超过限制 if (userDtos.size() > 2000) { return Result.failure("单次导入最多支持2000条数据"); } - // 3. 获取所有精网号 - List 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 invalidPrefixJwCodes = new ArrayList<>(); + List validUserDtos = new ArrayList<>(); - int filteredCount = 0; - List 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 jwcodes = validUserDtos.stream() + .map(UserImportDto::getJwcode) + .distinct() + .collect(Collectors.toList()); + + // 5. 检查member表中存在的精网号 Set existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes) .stream() .collect(Collectors.toSet()); - // 5. 获取已存在的精网号及其删除状态 + // 6. 获取已存在的精网号及其删除状态 Map existingUserMap = adminUserMapper.selectAllUserCodesWithDelStatus() .stream() .collect(Collectors.toMap( @@ -392,50 +500,64 @@ public class AdminUserServiceImpl extends ServiceImpl imp (existing, replacement) -> existing )); - List usersToAdd = new ArrayList<>(); List usersToUpdate = new ArrayList<>(); Set processedCodes = new HashSet<>(); - int skipCount = 0; - for (int i = 0; i < userDtos.size(); i++) { - UserImportDto dto = userDtos.get(i); + // 收集所有失败的精网号(包括跳过和无效的) + List allFailedJwCodes = new ArrayList<>(invalidPrefixJwCodes); + Map 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 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 imp .set(User::getIsDel, 1); // 逻辑删除 return this.update(userWrapper); + + } catch (Exception e) { // 事务会自动回滚 throw new RuntimeException("批量删除用户失败", e);