refactor: 重构validateEmployeeData方法复用逻辑

- 修改validateEmployeeData方法,增加existingIds参数支持导入场景
- 删除validateEmployeeDataForImport方法,统一使用validateEmployeeData
- 单条新增场景(existingIds=null)执行原有验证逻辑
- 导入场景(existingIds!=null)跳过柜员号唯一性检查(已在调用前批量查询)
- 保持性能优化:批量查询一次existingIds,而非每条记录单独查询

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
wkc
2026-02-06 09:37:54 +08:00
parent 8bdce0adbf
commit d5af1602f9

View File

@@ -203,7 +203,7 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
BeanUtils.copyProperties(excel, addDTO); BeanUtils.copyProperties(excel, addDTO);
// 验证数据 // 验证数据
validateEmployeeData(addDTO, isUpdateSupport); validateEmployeeData(addDTO, isUpdateSupport, null);
CcdiEmployee employee = new CcdiEmployee(); CcdiEmployee employee = new CcdiEmployee();
BeanUtils.copyProperties(addDTO, employee); BeanUtils.copyProperties(addDTO, employee);
@@ -351,8 +351,12 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
/** /**
* 验证员工数据 * 验证员工数据
*
* @param addDTO 新增DTO
* @param isUpdateSupport 是否支持更新
* @param existingIds 已存在的员工ID集合(导入场景使用,传null表示单条新增)
*/ */
private void validateEmployeeData(CcdiEmployeeAddDTO addDTO, Boolean isUpdateSupport) { private void validateEmployeeData(CcdiEmployeeAddDTO addDTO, Boolean isUpdateSupport, Set<Long> existingIds) {
// 验证必填字段 // 验证必填字段
if (StringUtils.isEmpty(addDTO.getName())) { if (StringUtils.isEmpty(addDTO.getName())) {
throw new RuntimeException("姓名不能为空"); throw new RuntimeException("姓名不能为空");
@@ -379,16 +383,29 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
throw new RuntimeException(idCardError); throw new RuntimeException(idCardError);
} }
// 检查柜员号(employeeId)唯一性 // 单条新增场景:检查柜员号和身份证号唯一性
if (employeeMapper.selectById(addDTO.getEmployeeId()) != null) { if (existingIds == null) {
throw new RuntimeException("该柜员号已存在"); // 检查柜员号(employeeId)唯一性
} if (employeeMapper.selectById(addDTO.getEmployeeId()) != null) {
throw new RuntimeException("该柜员号已存在");
}
// 检查身份证号唯一性 // 检查身份证号唯一性
LambdaQueryWrapper<CcdiEmployee> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<CcdiEmployee> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CcdiEmployee::getIdCard, addDTO.getIdCard()); wrapper.eq(CcdiEmployee::getIdCard, addDTO.getIdCard());
if (employeeMapper.selectCount(wrapper) > 0) { if (employeeMapper.selectCount(wrapper) > 0) {
throw new RuntimeException("该身份证号已存在"); throw new RuntimeException("该身份证号已存在");
}
} else {
// 导入场景:如果柜员号不存在,才检查身份证号唯一性
if (!existingIds.contains(addDTO.getEmployeeId())) {
// 检查身份证号唯一性
LambdaQueryWrapper<CcdiEmployee> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CcdiEmployee::getIdCard, addDTO.getIdCard());
if (employeeMapper.selectCount(wrapper) > 0) {
throw new RuntimeException("该身份证号已存在");
}
}
} }
// 验证状态 // 验证状态
@@ -432,7 +449,7 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
BeanUtils.copyProperties(excel, addDTO); BeanUtils.copyProperties(excel, addDTO);
// 验证数据(支持更新模式) // 验证数据(支持更新模式)
validateEmployeeDataForImport(addDTO, isUpdateSupport, existingIds); validateEmployeeData(addDTO, isUpdateSupport, existingIds);
CcdiEmployee employee = convertToEntity(excel); CcdiEmployee employee = convertToEntity(excel);
@@ -552,52 +569,6 @@ public class CcdiEmployeeServiceImpl implements ICcdiEmployeeService {
redisTemplate.opsForHash().putAll(key, statusData); redisTemplate.opsForHash().putAll(key, statusData);
} }
/**
* 验证员工数据(导入模式,支持更新)
*/
private void validateEmployeeDataForImport(CcdiEmployeeAddDTO addDTO, Boolean isUpdateSupport, Set<Long> existingIds) {
// 验证必填字段
if (StringUtils.isEmpty(addDTO.getName())) {
throw new RuntimeException("姓名不能为空");
}
if (addDTO.getEmployeeId() == null) {
throw new RuntimeException("柜员号不能为空");
}
if (addDTO.getDeptId() == null) {
throw new RuntimeException("所属部门不能为空");
}
if (StringUtils.isEmpty(addDTO.getIdCard())) {
throw new RuntimeException("身份证号不能为空");
}
if (StringUtils.isEmpty(addDTO.getPhone())) {
throw new RuntimeException("电话不能为空");
}
if (StringUtils.isEmpty(addDTO.getStatus())) {
throw new RuntimeException("状态不能为空");
}
// 验证身份证号格式
String idCardError = IdCardUtil.getErrorMessage(addDTO.getIdCard());
if (idCardError != null) {
throw new RuntimeException(idCardError);
}
// 如果柜员号不存在,检查身份证号唯一性
if (!existingIds.contains(addDTO.getEmployeeId())) {
// 检查身份证号唯一性
LambdaQueryWrapper<CcdiEmployee> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CcdiEmployee::getIdCard, addDTO.getIdCard());
if (employeeMapper.selectCount(wrapper) > 0) {
throw new RuntimeException("该身份证号已存在");
}
}
// 验证状态
if (!"0".equals(addDTO.getStatus()) && !"1".equals(addDTO.getStatus())) {
throw new RuntimeException("状态只能填写'在职'或'离职'");
}
}
/** /**
* 导入结果内部类 * 导入结果内部类
*/ */