Обновление обработки отчетов пользователей

Внесены изменения в класс `Program` для улучшения обработки отчетов.
Добавлен класс `Report` с необходимыми свойствами.
Метод `SaveReportToDatabase` теперь принимает объект `Report` и обновлен SQL-запрос.
Добавлена логика для пошагового ввода данных отчета от пользователя.
Упрощен код ожидания отчета и удалены ненужные строки.
Добавлен метод `CreateDatabaseIfNotExists` для создания таблицы `Reports` с новыми полями.
Введены словари `userReportSteps` и `userReports` для отслеживания состояния отчетов.
This commit is contained in:
Professional 2025-03-19 19:20:14 +07:00
parent 52dd321f1d
commit 94d23ff86e

View File

@ -127,7 +127,9 @@ class Program
if (data == "report") if (data == "report")
{ {
usersWaitingForReport[chatId] = true; usersWaitingForReport[chatId] = true;
await botClient.SendMessage(chatId, "Пожалуйста, отправьте описание проблемы."); userReportSteps[chatId] = 1;
userReports[chatId] = new Report();
await botClient.SendMessage(chatId, "Пожалуйста, укажите приоритет (низкий, средний, высокий).");
Log.Information($"Пользователь {chatId} начал создание заявки"); Log.Information($"Пользователь {chatId} начал создание заявки");
} }
else if (data == "admin_panel") else if (data == "admin_panel")
@ -286,29 +288,43 @@ class Program
} }
else if (usersWaitingForReport.TryGetValue(message.Chat.Id, out bool isWaiting) && isWaiting) else if (usersWaitingForReport.TryGetValue(message.Chat.Id, out bool isWaiting) && isWaiting)
{ {
string problemDescription = message.Text; if (userReportSteps.TryGetValue(message.Chat.Id, out int step))
await SaveReportToDatabase(message.Chat.Id, problemDescription);
// Создаем клавиатуру с кнопкой возврата
var keyboard = new InlineKeyboardMarkup(new[]
{ {
new[] switch (step)
{ {
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") case 1:
} userReports[message.Chat.Id].Priority = message.Text;
}); userReportSteps[message.Chat.Id] = 2;
await botClient.SendMessage(message.Chat.Id, "Пожалуйста, укажите кабинет.");
break;
case 2:
userReports[message.Chat.Id].Room = message.Text;
userReportSteps[message.Chat.Id] = 3;
await botClient.SendMessage(message.Chat.Id, "Пожалуйста, опишите проблему.");
break;
case 3:
userReports[message.Chat.Id].Description = message.Text;
userReportSteps[message.Chat.Id] = 4;
await botClient.SendMessage(message.Chat.Id, "Пожалуйста, укажите ваше ФИО.");
break;
case 4:
userReports[message.Chat.Id].ReporterName = message.Text;
await SaveReportToDatabase(message.Chat.Id, userReports[message.Chat.Id]);
await botClient.SendMessage( await botClient.SendMessage(
chatId: message.Chat.Id, message.Chat.Id,
text: "✅ Спасибо за заявку! Мы обработаем её в ближайшее время.", "✅ Спасибо за заявку! Мы обработаем её в ближайшее время."
replyMarkup: keyboard); );
usersWaitingForReport[message.Chat.Id] = false; usersWaitingForReport[message.Chat.Id] = false;
userReportSteps.Remove(message.Chat.Id);
userReports.Remove(message.Chat.Id);
Log.Information($"Заявка пользователя {message.Chat.Id} сохранена в базе данных."); Log.Information($"Заявка пользователя {message.Chat.Id} сохранена в базе данных.");
break;
}
}
} }
else else
{ {
await botClient.SendMessage(chatId: message.Chat.Id, text: " Используйте команду /start для начала работы с ботом."); await botClient.SendMessage(message.Chat.Id, " Используйте команду /start для начала работы с ботом.");
} }
} }
} }
@ -320,6 +336,7 @@ class Program
} }
private static async Task DeleteReport(ITelegramBotClient botClient, long chatId, long reportId) private static async Task DeleteReport(ITelegramBotClient botClient, long chatId, long reportId)
{ {
try try
@ -580,7 +597,7 @@ class Program
} }
} }
private static async Task SaveReportToDatabase(long chatId, string description) private static async Task SaveReportToDatabase(long chatId, Report report)
{ {
string connectionString = "Data Source=bot.db"; // Используем SQLite string connectionString = "Data Source=bot.db"; // Используем SQLite
@ -593,11 +610,14 @@ class Program
var insertCommand = connection.CreateCommand(); var insertCommand = connection.CreateCommand();
insertCommand.CommandText = insertCommand.CommandText =
@" @"
INSERT INTO Reports (ChatId, Description, Status) INSERT INTO Reports (ChatId, Priority, Room, Description, ReporterName, Status)
VALUES (@ChatId, @Description, 'ожидает'); VALUES (@ChatId, @Priority, @Room, @Description, @ReporterName, 'ожидает');
"; ";
insertCommand.Parameters.AddWithValue("@ChatId", chatId); insertCommand.Parameters.AddWithValue("@ChatId", chatId);
insertCommand.Parameters.AddWithValue("@Description", description); insertCommand.Parameters.AddWithValue("@Priority", report.Priority);
insertCommand.Parameters.AddWithValue("@Room", report.Room);
insertCommand.Parameters.AddWithValue("@Description", report.Description);
insertCommand.Parameters.AddWithValue("@ReporterName", report.ReporterName);
await insertCommand.ExecuteNonQueryAsync(); await insertCommand.ExecuteNonQueryAsync();
Log.Information($"Заявка от пользователя {chatId} успешно сохранена."); Log.Information($"Заявка от пользователя {chatId} успешно сохранена.");
@ -610,6 +630,7 @@ class Program
} }
private static async Task CreateDatabaseIfNotExists() private static async Task CreateDatabaseIfNotExists()
{ {
string connectionString = "Data Source=bot.db"; // Путь к вашей базе данных string connectionString = "Data Source=bot.db"; // Путь к вашей базе данных
@ -626,7 +647,10 @@ class Program
CREATE TABLE IF NOT EXISTS Reports ( CREATE TABLE IF NOT EXISTS Reports (
Id INTEGER PRIMARY KEY AUTOINCREMENT, Id INTEGER PRIMARY KEY AUTOINCREMENT,
ChatId INTEGER NOT NULL, ChatId INTEGER NOT NULL,
Priority TEXT NOT NULL,
Room TEXT NOT NULL,
Description TEXT NOT NULL, Description TEXT NOT NULL,
ReporterName TEXT NOT NULL,
DateCreated DATETIME DEFAULT CURRENT_TIMESTAMP, DateCreated DATETIME DEFAULT CURRENT_TIMESTAMP,
Status TEXT DEFAULT 'В процессе' Status TEXT DEFAULT 'В процессе'
); );
@ -642,6 +666,18 @@ class Program
} }
} }
private static Dictionary<long, int> userReportSteps = new Dictionary<long, int>();
private static Dictionary<long, Report> userReports = new Dictionary<long, Report>();
private class Report
{
public string Priority { get; set; } = string.Empty;
public string Room { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public string ReporterName { get; set; } = string.Empty;
}
private static Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken) private static Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
{ {
Log.Error($"Ошибка в процессе работы с ботом: {exception.Message}"); Log.Error($"Ошибка в процессе работы с ботом: {exception.Message}");