| | |
| | | import com.rongyichuang.employee.dto.response.EmployeeResponse; |
| | | import com.rongyichuang.employee.entity.Employee; |
| | | import com.rongyichuang.employee.repository.EmployeeRepository; |
| | | import com.rongyichuang.user.service.UserService; |
| | | import com.rongyichuang.user.entity.User; |
| | | import com.rongyichuang.common.exception.BusinessException; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | |
| | | @Autowired |
| | | private EmployeeRepository employeeRepository; |
| | | |
| | | @Autowired |
| | | private UserService userService; |
| | | |
| | | private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); |
| | | |
| | | // 密码验证正则:至少6个字符,必须包含字母和数字 |
| | | private static final Pattern PASSWORD_PATTERN = Pattern.compile("^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d@$!%*?&]{6,}$"); |
| | | |
| | | /** |
| | | * 辅助方法:将Employee转换为EmployeeResponse |
| | | */ |
| | | private EmployeeResponse convertToResponse(Employee employee) { |
| | | Optional<User> userOpt = userService.findById(employee.getUserId()); |
| | | if (userOpt.isPresent()) { |
| | | User user = userOpt.get(); |
| | | return new EmployeeResponse(employee, user); |
| | | } else { |
| | | throw new BusinessException("USER_NOT_FOUND", "员工对应的用户不存在,员工ID: " + employee.getId()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取所有员工列表 |
| | |
| | | public List<EmployeeResponse> findAllEmployees() { |
| | | List<Employee> employees = employeeRepository.findAll(); |
| | | return employees.stream() |
| | | .map(EmployeeResponse::new) |
| | | .map(this::convertToResponse) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | |
| | | public Page<EmployeeResponse> findEmployees(String name, int page, int size) { |
| | | Pageable pageable = PageRequest.of(page, size); |
| | | Page<Employee> employeePage = employeeRepository.findByNameContainingOrderByCreateTimeDesc(name, pageable); |
| | | return employeePage.map(EmployeeResponse::new); |
| | | return employeePage.map(this::convertToResponse); |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | List<Employee> employees = employeeRepository.findByNameContaining(name.trim()); |
| | | return employees.stream() |
| | | .map(EmployeeResponse::new) |
| | | .map(this::convertToResponse) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | |
| | | public EmployeeResponse findById(Long id) { |
| | | Optional<Employee> employee = employeeRepository.findById(id); |
| | | if (employee.isPresent()) { |
| | | return new EmployeeResponse(employee.get()); |
| | | Employee emp = employee.get(); |
| | | Optional<User> userOpt = userService.findById(emp.getUserId()); |
| | | if (userOpt.isPresent()) { |
| | | User user = userOpt.get(); |
| | | return new EmployeeResponse(emp, user); |
| | | } else { |
| | | throw new BusinessException("USER_NOT_FOUND", "员工对应的用户不存在,员工ID: " + id); |
| | | } |
| | | } |
| | | throw new BusinessException("EMPLOYEE_NOT_FOUND", "员工不存在"); |
| | | } |
| | | |
| | | /** |
| | | * 根据用户ID获取员工信息 |
| | | */ |
| | | public Employee findByUserId(Long userId) { |
| | | Optional<Employee> employee = employeeRepository.findByUserId(userId); |
| | | return employee.orElse(null); |
| | | } |
| | | |
| | | /** |
| | |
| | | // 验证输入 |
| | | validateEmployeeInput(input); |
| | | |
| | | // 处理User表逻辑 |
| | | User user; |
| | | if (input.getPassword() != null && !input.getPassword().trim().isEmpty()) { |
| | | // 有密码时,创建或更新用户(包含密码) |
| | | user = userService.findOrCreateUserByPhone(input.getPhone(), input.getName(), input.getPassword()); |
| | | } else { |
| | | // 无密码时,只更新用户基本信息(不更新密码) |
| | | user = userService.findOrCreateUserByPhone(input.getPhone(), input.getName(), null); |
| | | } |
| | | |
| | | Employee employee; |
| | | if (input.getId() != null) { |
| | | // 更新员工 |
| | | employee = employeeRepository.findById(input.getId()) |
| | | .orElseThrow(() -> new BusinessException("EMPLOYEE_NOT_FOUND", "员工不存在")); |
| | | |
| | | // 检查手机号是否被其他员工使用 |
| | | if (employeeRepository.existsByPhoneAndIdNot(input.getPhone(), input.getId())) { |
| | | throw new BusinessException("PHONE_ALREADY_EXISTS", "手机号已被其他员工使用"); |
| | | // 检查用户ID是否被其他员工使用(排除当前员工) |
| | | Optional<Employee> existingEmployee = employeeRepository.findByUserId(user.getId()); |
| | | if (existingEmployee.isPresent() && !existingEmployee.get().getId().equals(input.getId())) { |
| | | throw new BusinessException("PHONE_ALREADY_EXISTS", "该手机号已被其他员工使用"); |
| | | } |
| | | } else { |
| | | // 新增员工 |
| | | if (employeeRepository.existsByPhone(input.getPhone())) { |
| | | throw new BusinessException("PHONE_ALREADY_EXISTS", "手机号已存在"); |
| | | // 新增员工 - 检查该用户是否已经是员工 |
| | | Optional<Employee> existingEmployee = employeeRepository.findByUserId(user.getId()); |
| | | if (existingEmployee.isPresent()) { |
| | | throw new BusinessException("PHONE_ALREADY_EXISTS", "该手机号已被其他员工使用"); |
| | | } |
| | | employee = new Employee(); |
| | | employee.setUserId(1L); // 临时设置,实际应该从当前登录用户获取 |
| | | } |
| | | |
| | | // 设置基本信息 |
| | | employee.setName(input.getName()); |
| | | employee.setPhone(input.getPhone()); |
| | | // 不再设置phone字段,保持为null |
| | | employee.setPhone(null); |
| | | employee.setRoleId(input.getRoleId()); |
| | | employee.setDescription(input.getDescription()); |
| | | |
| | | // 处理密码 |
| | | if (input.getPassword() != null && !input.getPassword().trim().isEmpty()) { |
| | | employee.setPassword(passwordEncoder.encode(input.getPassword())); |
| | | } |
| | | employee.setUserId(user.getId()); // 设置关联的用户ID |
| | | |
| | | Employee savedEmployee = employeeRepository.save(employee); |
| | | logger.info("员工保存成功: {}", savedEmployee.getName()); |
| | | |
| | | return new EmployeeResponse(savedEmployee); |
| | | return new EmployeeResponse(savedEmployee, user); |
| | | } |
| | | |
| | | /** |
| | |
| | | throw new BusinessException("ROLE_REQUIRED", "角色不能为空"); |
| | | } |
| | | |
| | | // 新增员工时密码必填 |
| | | // 密码验证:新增时必填,编辑时可选 |
| | | if (input.getId() == null) { |
| | | // 新增员工时密码必填 |
| | | if (input.getPassword() == null || input.getPassword().trim().isEmpty()) { |
| | | throw new BusinessException("PASSWORD_REQUIRED", "密码不能为空"); |
| | | } |
| | | } |
| | | |
| | | |
| | | // 如果提供了密码,验证密码格式 |
| | | if (input.getPassword() != null && !input.getPassword().trim().isEmpty()) { |
| | | if (!PASSWORD_PATTERN.matcher(input.getPassword()).matches()) { |