Веб-приложение для регистрации обращений сотрудников в отдел системного администрирования. Проект имитирует внутренний портал Service Desk: сотрудник может задать общий вопрос или описать проблему, система распознает намерение, отвечает в чате либо предлагает создать заявку через структурированную форму.
Главная идея проекта: пользователь не решает техническую проблему самостоятельно, а корректно оформляет обращение. Дальше заявка попадает в журнал, где ее можно назначить исполнителю, изменить статус, приоритет и срок выполнения.
- Регистрация обращения через диалоговый интерфейс.
- Распознавание намерения пользователя: общий вопрос, инцидент или неясный запрос.
- Ответы на общие вопросы без создания заявки.
- Определение категории проблемы по ключевым словам.
- Создание заявки через кнопку и структурированную форму.
- SLA-опрос внутри формы перед созданием заявки.
- Автоматическое присвоение номера заявки.
- Расчет ETA по выбранному приоритету.
- Карточка текущей заявки.
- Журнал всех заявок.
- Разделение заявок на открытые, закрытые и все.
- Поиск по номеру, описанию, исполнителю, статусу и категории.
- Сортировка по дате создания, SLA, ETA и статусу.
- Редактирование статуса, приоритета, исполнителя и ETA.
- Закрытие заявки кнопкой
Готово. - Возврат закрытой заявки обратно в работу.
- Сохранение истории заявок в
localStorage. - Переключение светлой и темной темы.
- React
- TypeScript
- Vite
- Mantine UI
- Lucide React
- LocalStorage для хранения истории заявок
Backend и база данных не используются. Для демонстрационного Service Desk это удобно: проект запускается локально и не требует сервера.
Требуется Node.js 18 или новее.
На Windows, если PowerShell блокирует npm, используйте npm.cmd:
npm.cmd install
npm.cmd run devОбычный вариант:
npm install
npm run devПосле запуска Vite откроет локальный адрес, обычно:
http://127.0.0.1:5173
npm.cmd run buildНа Windows также можно:
npm run buildСобранные файлы появятся в папке dist.
- Сотрудник открывает вкладку
Регистрация. - Вводит общий вопрос или описание проблемы.
- Система анализирует намерение пользователя.
- Если это общий вопрос, сервис отвечает в чате и не создает заявку.
- Если это инцидент, сервис определяет категорию и показывает кнопку
Открыть форму заявки. - Сотрудник заполняет структурированную форму: ФИО, кабинет, инвентарный номер, категорию, SLA и описание.
- После отправки формы создается заявка с номером, категорией, SLA, ETA и ответственной группой.
- Заявка появляется в карточке текущего обращения и в журнале.
Чат не считает любое сообщение заявкой. Он различает несколько типов сообщений:
| Тип сообщения | Пример | Действие системы |
|---|---|---|
| Общий вопрос | Как проверить статус заявки? |
Отвечает в чате без создания заявки |
| Вопрос про SLA | Что значит критический приоритет? |
Объясняет правила SLA |
| Инцидент | Не работает монитор в кабинете 204 |
Распознает категорию и предлагает форму заявки |
| Неясный запрос | Помогите |
Просит уточнить проблему |
Для распознавания используются ключевые слова и простая intent recognition логика в src/data/intents.ts. Словари включают разные формулировки одной проблемы: бытовые фразы, технические термины, сокращения, названия программ, варианты вроде не работает, не запускается, нет доступа, а также часть английских слов вроде printer, network, ticket status.
| Ответ сотрудника | Приоритет | ETA |
|---|---|---|
| Нет, работа полностью остановлена | Критический | 2 часа |
| Могу переключиться на другие задачи | Высокий | 8 часов |
| Могу работать, но неудобно | Средний | 24 часа |
SLA назначается не только по типу проблемы, а по влиянию на работу сотрудника. Это ближе к реальному Service Desk: один и тот же монитор может быть критичным, если сотрудник полностью не может работать, или средним, если есть запасное рабочее место.
Система распознает основные типовые обращения:
- не включается компьютер;
- не работает монитор;
- нет интернета или сети;
- не печатает принтер;
- забыли пароль или нет доступа;
- не открывается корпоративная программа;
- не работает мышь или клавиатура;
- нужна установка программного обеспечения;
- проблема с электронной почтой;
- нет доступа к общей папке.
Если категория не распознана, создается общее обращение в ИТ-поддержку.
Во вкладке Журнал заявок можно управлять всеми обращениями.
Доступные действия:
- фильтр
Открытые,Закрытые,Все; - поиск по тексту заявки;
- сортировка по новым заявкам, приоритету, ETA и статусу;
- изменение статуса;
- изменение SLA;
- назначение исполнителя;
- изменение ETA;
- закрытие заявки;
- повторное открытие закрытой заявки.
История заявок сохраняется в браузере через localStorage, поэтому после обновления страницы созданные обращения остаются в журнале.
СозданаОжидает специалистаВ работеЗакрыта
При нажатии Готово заявка получает статус Закрыта и дату закрытия. Закрытую заявку можно вернуть в статус Ожидает специалиста.
Попробуйте ввести:
Не работает монитор
Затем выберите:
Нет, работа полностью остановлена
Результат: будет создана критическая заявка по оборудованию рабочего места.
Другие примеры:
Нет интернета в кабинете 305
Забыл пароль от учетной записи
Не печатает принтер в бухгалтерии
Не открывается 1С
Нет доступа к общей папке отдела
src/
App.tsx
main.tsx
styles.css
types.ts
components/
Chat.tsx
QuickActions.tsx
RequestHistory.tsx
TicketPanel.tsx
data/
faq.ts
Основные файлы:
src/App.tsx— основная логика приложения, темы, вкладки, создание и обновление заявок.src/components/Chat.tsx— интерфейс регистрации обращения и выбора SLA.src/components/RequestHistory.tsx— журнал заявок, фильтры, сортировка и редактирование.src/components/TicketPanel.tsx— карточка текущей заявки.src/data/faq.ts— категории обращений, ключевые слова и группы исполнителей.src/data/intents.ts— распознавание намерений и ответы на общие вопросы.src/types.ts— TypeScript-типы заявок, сообщений, SLA и статусов.
Проект не использует backend. Все заявки сохраняются локально в браузере:
localStorage key: service-desk-tickets
Это значит:
- данные сохраняются после обновления страницы;
- данные доступны только в текущем браузере;
- при очистке данных сайта журнал будет удален.