Codex Assistant
2 天以前 58d9f460b2f8c34430285115e2557d18333c5cab
backend/src/main/java/com/rongyichuang/employee/service/EmployeeService.java
@@ -4,6 +4,8 @@
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;
@@ -32,10 +34,26 @@
    @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());
        }
    }
    /**
     * 获取所有员工列表
@@ -43,7 +61,7 @@
    public List<EmployeeResponse> findAllEmployees() {
        List<Employee> employees = employeeRepository.findAll();
        return employees.stream()
                .map(EmployeeResponse::new)
                .map(this::convertToResponse)
                .collect(Collectors.toList());
    }
@@ -53,7 +71,7 @@
    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);
    }
    /**
@@ -65,7 +83,7 @@
        }
        List<Employee> employees = employeeRepository.findByNameContaining(name.trim());
        return employees.stream()
                .map(EmployeeResponse::new)
                .map(this::convertToResponse)
                .collect(Collectors.toList());
    }
@@ -75,9 +93,24 @@
    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);
    }
    /**
@@ -87,40 +120,48 @@
        // 验证输入
        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);
    }
    /**
@@ -154,13 +195,14 @@
            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()) {