where(function ($q) use ($params) { $q->where('username', 'like', '%' . $params['keyword'] . '%') ->orWhere('real_name', 'like', '%' . $params['keyword'] . '%') ->orWhere('phone', 'like', '%' . $params['keyword'] . '%') ->orWhere('email', 'like', '%' . $params['keyword'] . '%'); }); } if (!empty($params['department_id'])) { $query->where('department_id', $params['department_id']); } if (isset($params['status']) && $params['status'] !== '') { $query->where('status', $params['status']); } if (!empty($params['role_id'])) { $query->whereHas('roles', function ($q) use ($params) { $q->where('role_id', $params['role_id']); }); } // 排序 $orderBy = $params['order_by'] ?? 'id'; $orderDirection = $params['order_direction'] ?? 'desc'; $query->orderBy($orderBy, $orderDirection); // 分页 $page = $params['page'] ?? 1; $pageSize = $params['page_size'] ?? 20; $list = $query->paginate($pageSize, ['*'], 'page', $page); return [ 'list' => $list->items(), 'total' => $list->total(), 'page' => $page, 'page_size' => $pageSize, ]; } /** * 获取用户详情 */ public function getById(int $id): array { $user = User::with(['department', 'roles'])->find($id); if (!$user) { throw ValidationException::withMessages([ 'id' => ['用户不存在'], ]); } return $this->formatUserInfo($user); } /** * 创建用户 */ public function create(array $data): User { // 检查用户名是否已存在 if (User::where('username', $data['username'])->exists()) { throw ValidationException::withMessages([ 'username' => ['用户名已存在'], ]); } // 检查手机号是否已存在 if (!empty($data['phone']) && User::where('phone', $data['phone'])->exists()) { throw ValidationException::withMessages([ 'phone' => ['手机号已被使用'], ]); } // 检查邮箱是否已存在 if (!empty($data['email']) && User::where('email', $data['email'])->exists()) { throw ValidationException::withMessages([ 'email' => ['邮箱已被使用'], ]); } DB::beginTransaction(); try { $user = User::create([ 'username' => $data['username'], 'password' => Hash::make($data['password']), 'real_name' => $data['real_name'], 'email' => $data['email'] ?? null, 'phone' => $data['phone'] ?? null, 'department_id' => $data['department_id'] ?? null, 'avatar' => $data['avatar'] ?? null, 'status' => $data['status'] ?? 1, ]); // 关联角色 if (!empty($data['role_ids'])) { $user->roles()->attach($data['role_ids']); } DB::commit(); return $user; } catch (\Exception $e) { DB::rollBack(); throw $e; } } /** * 更新用户 */ public function update(int $id, array $data): User { $user = User::find($id); if (!$user) { throw ValidationException::withMessages([ 'id' => ['用户不存在'], ]); } // 检查用户名是否已被其他用户使用 if (isset($data['username']) && $data['username'] !== $user->username) { if (User::where('username', $data['username'])->exists()) { throw ValidationException::withMessages([ 'username' => ['用户名已存在'], ]); } } // 检查手机号是否已被其他用户使用 if (isset($data['phone']) && $data['phone'] !== $user->phone) { if (User::where('phone', $data['phone'])->exists()) { throw ValidationException::withMessages([ 'phone' => ['手机号已被使用'], ]); } } // 检查邮箱是否已被其他用户使用 if (isset($data['email']) && $data['email'] !== $user->email) { if (User::where('email', $data['email'])->exists()) { throw ValidationException::withMessages([ 'email' => ['邮箱已被使用'], ]); } } DB::beginTransaction(); try { $updateData = [ 'real_name' => $data['real_name'] ?? $user->real_name, 'email' => $data['email'] ?? $user->email, 'phone' => $data['phone'] ?? $user->phone, 'department_id' => $data['department_id'] ?? $user->department_id, 'avatar' => $data['avatar'] ?? $user->avatar, 'status' => $data['status'] ?? $user->status, ]; if (isset($data['username'])) { $updateData['username'] = $data['username']; } if (isset($data['password'])) { $updateData['password'] = Hash::make($data['password']); } $user->update($updateData); // 更新角色关联 if (isset($data['role_ids'])) { $user->roles()->sync($data['role_ids']); } DB::commit(); return $user; } catch (\Exception $e) { DB::rollBack(); throw $e; } } /** * 删除用户 */ public function delete(int $id): void { $user = User::find($id); if (!$user) { throw ValidationException::withMessages([ 'id' => ['用户不存在'], ]); } $user->delete(); } /** * 批量删除用户 */ public function batchDelete(array $ids): int { return User::whereIn('id', $ids)->delete(); } /** * 批量更新用户状态 */ public function batchUpdateStatus(array $ids, int $status): int { return User::whereIn('id', $ids)->update(['status' => $status]); } /** * 批量分配部门 */ public function batchAssignDepartment(array $ids, int $departmentId): int { return User::whereIn('id', $ids)->update(['department_id' => $departmentId]); } /** * 批量分配角色 */ public function batchAssignRoles(array $ids, array $roleIds): void { foreach ($ids as $userId) { $user = User::find($userId); if ($user) { $user->roles()->sync($roleIds); } } } /** * 导出用户数据 */ public function export(array $params): string { // 异步导出 $job = new UserExportJob($params); dispatch($job); return '导出任务已提交,请稍后在导出列表中查看'; } /** * 导入用户数据 */ public function import(\Illuminate\Http\UploadedFile $file): array { $path = $file->store('imports'); // 异步导入 $job = new UserImportJob($path); dispatch($job); return [ 'message' => '导入任务已提交,请稍后在导入列表中查看', 'file_path' => $path, ]; } /** * 格式化用户信息 */ private function formatUserInfo(User $user): array { return [ 'id' => $user->id, 'username' => $user->username, 'real_name' => $user->real_name, 'email' => $user->email, 'phone' => $user->phone, 'avatar' => $user->avatar, 'department' => $user->department ? [ 'id' => $user->department->id, 'name' => $user->department->name, ] : null, 'roles' => $user->roles->map(function ($role) { return [ 'id' => $role->id, 'name' => $role->name, 'code' => $role->code, ]; })->toArray(), 'status' => $user->status, 'last_login_at' => $user->last_login_at ? $user->last_login_at->toDateTimeString() : null, 'last_login_ip' => $user->last_login_ip, 'created_at' => $user->created_at->toDateTimeString(), 'updated_at' => $user->updated_at->toDateTimeString(), ]; } }