diff --git a/server/src/app/api/v1/endpoints/employees.py b/server/src/app/api/v1/endpoints/employees.py index 1f83fd5..ff207d0 100644 --- a/server/src/app/api/v1/endpoints/employees.py +++ b/server/src/app/api/v1/endpoints/employees.py @@ -125,3 +125,22 @@ def disable_employee(employee_id: str, db: DbSession) -> EmployeeRead: return EmployeeService(db).disable_employee(employee_id) except LookupError as exc: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(exc)) from exc + + +@router.post( + "/{employee_id}/enable", + response_model=EmployeeRead, + summary="启用员工", + description="将停用员工恢复为在职状态,使其可以重新登录系统。", + responses={ + status.HTTP_404_NOT_FOUND: { + "model": ErrorResponse, + "description": "员工不存在。", + } + }, +) +def enable_employee(employee_id: str, db: DbSession) -> EmployeeRead: + try: + return EmployeeService(db).enable_employee(employee_id) + except LookupError as exc: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(exc)) from exc diff --git a/server/src/app/services/employee.py b/server/src/app/services/employee.py index 921fc96..79545c7 100644 --- a/server/src/app/services/employee.py +++ b/server/src/app/services/employee.py @@ -333,6 +333,27 @@ class EmployeeService: logger.info("Disabled employee id=%s no=%s", employee.id, employee.employee_no) return self._serialize_employee(hydrated or saved) + def enable_employee(self, employee_id: str) -> EmployeeRead: + self.ensure_directory_ready() + + employee = self.repository.get(employee_id) + if employee is None: + raise LookupError("Employee not found") + + if employee.employment_status != "停用": + return self._serialize_employee(employee) + + now = datetime.now() + employee.employment_status = "在职" + employee.sync_state = "已同步" + employee.last_sync_at = now + self._append_change_log(employee, action="启用员工账号", occurred_at=now) + + saved = self.repository.save(employee) + hydrated = self.repository.get(saved.id) + logger.info("Enabled employee id=%s no=%s", employee.id, employee.employee_no) + return self._serialize_employee(hydrated or saved) + def _seed_roles(self) -> None: existing_by_code = {role.role_code: role for role in self.repository.list_roles()}