Добавлен класс ReportData и улучшен процесс создания заявок

В код добавлен новый класс `ReportData` для хранения информации о заявках, а также перечисляемый тип `ReportStep` для определения этапов создания заявки. Введена структура данных `Dictionary<long, ReportData> reportCreation` для отслеживания процесса создания заявок по идентификатору чата.

Изменен процесс обработки обновлений: теперь при выборе "report" пользователю предлагается выбрать приоритет через клавиатуру. Упрощена логика обработки выбора приоритета и удалены лишние проверки для админ-панели и просмотра заявок.

Обновлены сообщения для пользователей, улучшено взаимодействие и управление состоянием ожидания заявки. Также обновлены кнопки навигации для более интуитивного пользовательского интерфейса.
This commit is contained in:
Mef 2025-03-19 19:00:55 +07:00
parent 4c42e61de3
commit 76c2a1492a

View File

@ -86,7 +86,22 @@ class Program
// Ожидаем отмены через token
cts.Token.WaitHandle.WaitOne();
}
private class ReportData
{
public ReportStep Step { get; set; }
public string Priority { get; set; } = string.Empty;
public string Room { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public string FullName { get; set; } = string.Empty;
}
private enum ReportStep
{
Priority,
Room,
Description,
FullName,
Completed
}
private static async Task DeletePreviousMessage(ITelegramBotClient botClient, long chatId, int messageId)
{
try
@ -99,7 +114,7 @@ class Program
Log.Error($"Ошибка при удалении сообщения {messageId} в чате {chatId}: {ex.Message}");
}
}
private static Dictionary<long, ReportData> reportCreation = new Dictionary<long, ReportData>();
private static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
@ -126,150 +141,192 @@ class Program
if (data == "report")
{
usersWaitingForReport[chatId] = true;
await botClient.SendMessage(chatId, "Пожалуйста, отправьте описание проблемы.");
Log.Information($"Пользователь {chatId} начал создание заявки");
// Начинаем процесс создания заявки с запроса приоритета
reportCreation[chatId] = new ReportData { Step = ReportStep.Priority };
var priorityKeyboard = new InlineKeyboardMarkup(new[]
{
new[] {
InlineKeyboardButton.WithCallbackData("Низкий", "priority_low")
},
new[] {
InlineKeyboardButton.WithCallbackData("Средний", "priority_medium")
},
new[] {
InlineKeyboardButton.WithCallbackData("Высокий", "priority_high")
},
new[] {
InlineKeyboardButton.WithCallbackData("Отмена", "cancel_report")
}
});
await botClient.SendMessage(chatId, "Выберите приоритет заявки:", replyMarkup: priorityKeyboard);
Log.Information($"Пользователь {chatId} начал создание заявки - выбор приоритета");
}
else if (data == "admin_panel")
else if (data != null && data.StartsWith("priority_"))
{
if (admins.Contains(chatId))
// Обрабатываем выбор приоритета
if (reportCreation.TryGetValue(chatId, out var reportData))
{
await SendAdminPanel(botClient, chatId);
}
else
{
var keyboard = new InlineKeyboardMarkup(new[]
string priority = data.Substring(9) switch
{
"low" => "Низкий",
"medium" => "Средний",
"high" => "Высокий",
_ => "Не указан"
};
reportData.Priority = priority;
reportData.Step = ReportStep.Room;
var cancelKeyboard = new InlineKeyboardMarkup(new[]
{
new[] { InlineKeyboardButton.WithCallbackData("Отмена", "cancel_report") }
});
await botClient.SendMessage(chatId, "Введите номер кабинета:", replyMarkup: cancelKeyboard);
Log.Information($"Пользователь {chatId} выбрал приоритет {priority}");
}
else if (data == "admin_panel")
{
if (admins.Contains(chatId))
{
await SendAdminPanel(botClient, chatId);
}
else
{
var keyboard = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
}
});
await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard);
Log.Information($"Неавторизованный доступ к админ-панели от {chatId}");
await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard);
Log.Information($"Неавторизованный доступ к админ-панели от {chatId}");
}
}
}
else if (data == "view_reports")
{
if (admins.Contains(chatId))
else if (data == "view_reports")
{
if (admins.Contains(chatId))
{
await ViewReports(botClient, chatId);
}
else
{
var keyboard = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
}
});
await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard);
Log.Information($"Неавторизованный доступ к заявкам от {chatId}");
}
}
else if (data == "view_archived_reports")
{
if (admins.Contains(chatId))
{
await ViewArchivedReports(botClient, chatId);
}
else
{
var keyboard = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
}
});
await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard);
Log.Information($"Неавторизованный доступ к архиву заявок от {chatId}");
}
}
else if (data != null && data.StartsWith("report_"))
{
long reportId = long.Parse(data.Substring(7));
if (callbackQuery?.Message?.MessageId != null)
{
int messageId = callbackQuery.Message.MessageId;
await ShowReportDetails(botClient, chatId, reportId, messageId);
}
}
else if (data != null && data.StartsWith("status_"))
{
string[] parts = data.Split('_');
long reportId = long.Parse(parts[1]);
string newStatus = parts[2];
if (callbackQuery?.Message?.MessageId != null)
{
int messageId = callbackQuery.Message.MessageId;
await UpdateReportStatus(reportId, newStatus);
await ShowReportDetails(botClient, chatId, reportId, messageId);
}
}
else if (data != null && data.StartsWith("delete_"))
{
long reportId = long.Parse(data.Substring(7));
await DeleteReport(botClient, chatId, reportId);
}
else if (data == "back_to_list")
{
await ViewReports(botClient, chatId);
}
else
else if (data == "main_menu")
{
var keyboard = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
}
});
await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard);
Log.Information($"Неавторизованный доступ к заявкам от {chatId}");
await SendMainMenu(botClient, chatId);
}
}
else if (data == "view_archived_reports")
{
if (admins.Contains(chatId))
{
await ViewArchivedReports(botClient, chatId);
}
else
{
var keyboard = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
}
});
await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard);
Log.Information($"Неавторизованный доступ к архиву заявок от {chatId}");
}
}
else if (data != null && data.StartsWith("report_"))
{
long reportId = long.Parse(data.Substring(7));
if (callbackQuery?.Message?.MessageId != null)
{
int messageId = callbackQuery.Message.MessageId;
await ShowReportDetails(botClient, chatId, reportId, messageId);
}
}
else if (data != null && data.StartsWith("status_"))
{
string[] parts = data.Split('_');
long reportId = long.Parse(parts[1]);
string newStatus = parts[2];
if (callbackQuery?.Message?.MessageId != null)
{
int messageId = callbackQuery.Message.MessageId;
await UpdateReportStatus(reportId, newStatus);
await ShowReportDetails(botClient, chatId, reportId, messageId);
}
}
else if (data != null && data.StartsWith("delete_"))
{
long reportId = long.Parse(data.Substring(7));
await DeleteReport(botClient, chatId, reportId);
}
else if (data == "back_to_list")
{
await ViewReports(botClient, chatId);
}
else if (data == "main_menu")
{
await SendMainMenu(botClient, chatId);
}
}
}
// Обработка текстовых сообщений
if (update.Type == UpdateType.Message && update.Message?.Text != null)
{
var message = update.Message;
Log.Information($"Получено сообщение от {message.Chat.Id}: {message.Text}");
// Обработка команды /admin для авторизации
if (message.Text.StartsWith("/admin"))
// Обработка текстовых сообщений
if (update.Type == UpdateType.Message && update.Message?.Text != null)
{
string[] parts = message.Text.Split(' ');
if (parts.Length == 2 && parts[1] == adminPassword)
var message = update.Message;
Log.Information($"Получено сообщение от {message.Chat.Id}: {message.Text}");
// Обработка команды /admin для авторизации
if (message.Text.StartsWith("/admin"))
{
admins.Add(message.Chat.Id);
var keyboard = new InlineKeyboardMarkup(new[]
string[] parts = message.Text.Split(' ');
if (parts.Length == 2 && parts[1] == adminPassword)
{
admins.Add(message.Chat.Id);
var keyboard = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
}
});
await botClient.SendMessage(message.Chat.Id, "✅ Вы авторизованы как администратор!", replyMarkup: keyboard);
Log.Information($"Новый администратор: {message.Chat.Id}");
}
else
{
var keyboard = new InlineKeyboardMarkup(new[]
await botClient.SendMessage(message.Chat.Id, "✅ Вы авторизованы как администратор!", replyMarkup: keyboard);
Log.Information($"Новый администратор: {message.Chat.Id}");
}
else
{
var keyboard = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
}
});
await botClient.SendMessage(message.Chat.Id, "❌ Неверный пароль!", replyMarkup: keyboard);
await botClient.SendMessage(message.Chat.Id, "❌ Неверный пароль!", replyMarkup: keyboard);
}
return;
}
return;
}
if (message.Text == "/start")
{
var keyboard = new InlineKeyboardMarkup(new[]
if (message.Text == "/start")
{
var keyboard = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData("Подать заявку", "report"),
@ -277,38 +334,39 @@ class Program
}
});
await botClient.SendMessage(
chatId: message.Chat.Id,
text: "Привет! Я бот для сбора заявок на ремонт оборудования.",
replyMarkup: keyboard
);
Log.Information($"Ответ на команду /start с кнопками отправлен.");
}
else if (usersWaitingForReport.TryGetValue(message.Chat.Id, out bool isWaiting) && isWaiting)
{
string problemDescription = message.Text;
await SaveReportToDatabase(message.Chat.Id, problemDescription);
// Создаем клавиатуру с кнопкой возврата
var keyboard = new InlineKeyboardMarkup(new[]
await botClient.SendMessage(
chatId: message.Chat.Id,
text: "Привет! Я бот для сбора заявок на ремонт оборудования.",
replyMarkup: keyboard
);
Log.Information($"Ответ на команду /start с кнопками отправлен.");
}
else if (usersWaitingForReport.TryGetValue(message.Chat.Id, out bool isWaiting) && isWaiting)
{
string problemDescription = message.Text;
await SaveReportToDatabase(message.Chat.Id, problemDescription);
// Создаем клавиатуру с кнопкой возврата
var keyboard = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
}
});
await botClient.SendMessage(
chatId: message.Chat.Id,
text: "✅ Спасибо за заявку! Мы обработаем её в ближайшее время.",
replyMarkup: keyboard);
await botClient.SendMessage(
chatId: message.Chat.Id,
text: "✅ Спасибо за заявку! Мы обработаем её в ближайшее время.",
replyMarkup: keyboard);
usersWaitingForReport[message.Chat.Id] = false;
Log.Information($"Заявка пользователя {message.Chat.Id} сохранена в базе данных.");
}
else
{
await botClient.SendMessage(chatId: message.Chat.Id, text: " Используйте команду /start для начала работы с ботом.");
usersWaitingForReport[message.Chat.Id] = false;
Log.Information($"Заявка пользователя {message.Chat.Id} сохранена в базе данных.");
}
else
{
await botClient.SendMessage(chatId: message.Chat.Id, text: " Используйте команду /start для начала работы с ботом.");
}
}
}
}
@ -352,11 +410,6 @@ class Program
}
}
private static async Task SendMainMenu(ITelegramBotClient botClient, long chatId)
{
var keyboard = new InlineKeyboardMarkup(new[]
@ -421,19 +474,18 @@ class Program
buttons.Add(new[]
{
InlineKeyboardButton.WithCallbackData(
$"#{id} - {status} - {description}...",
$"report_{id}")
});
InlineKeyboardButton.WithCallbackData(
$"#{id} - {status} - {description}...",
$"report_{id}")
});
}
}
// Добавляем кнопки навигации
buttons.Add(new[]
{
InlineKeyboardButton.WithCallbackData("Назад", "admin_panel"),
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
});
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
});
await botClient.SendMessage(
chatId: chatId,
@ -520,25 +572,25 @@ class Program
var statusButtons = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData("🟡 Ожидает", $"status_{reportId}_ожидает"),
InlineKeyboardButton.WithCallbackData("🔵 В работе", $"status_{reportId}_в работе")
},
new[]
{
InlineKeyboardButton.WithCallbackData("🟢 Закрыта", $"status_{reportId}_закрыта")
},
new[]
{
InlineKeyboardButton.WithCallbackData("❌ Удалить заявку", $"delete_{reportId}")
},
new[]
{
InlineKeyboardButton.WithCallbackData("Назад", "back_to_list"),
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
}
});
new[]
{
InlineKeyboardButton.WithCallbackData("🟡 Ожидает", $"status_{reportId}_ожидает"),
InlineKeyboardButton.WithCallbackData("🔵 В работе", $"status_{reportId}_в работе")
},
new[]
{
InlineKeyboardButton.WithCallbackData("🟢 Закрыта", $"status_{reportId}_закрыта")
},
new[]
{
InlineKeyboardButton.WithCallbackData("❌ Удалить заявку", $"delete_{reportId}")
},
new[]
{
InlineKeyboardButton.WithCallbackData("Назад", "back_to_list"),
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
}
});
string newText = $"Заявка #{reportId}\n\nОписание: {description}\nСтатус: {status}";