|
|
@ -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); |
|
|
|