Добавить поддержку ChatId и улучшить управление заявками

Внесены изменения в класс `Program` в файле `Program.cs`:
- Добавлено поле `ChatId` в SQL-запрос для извлечения идентификатора чата.
- Введена переменная `ownerChatId` для хранения значения `ChatId`.
- Обновлена логика формирования клавиатуры для администраторов и пользователей.
- Добавлена проверка прав администратора в методе `UpdateReportStatus`.
- Реализована логика возврата к списку в зависимости от роли пользователя, если заявка не найдена.
- Добавлен метод `RemoveAdminFromDatabase` для удаления администратора из базы данных.
This commit is contained in:
107 2025-03-21 09:39:31 +07:00
parent 621f8c25c8
commit e26002b16a

View File

@ -1145,7 +1145,7 @@ class Program
{
await connection.OpenAsync();
var command = connection.CreateCommand();
command.CommandText = "SELECT Priority, Room, Description, ReporterName, Status, DateCreated, AdminId FROM Reports WHERE Id = @id";
command.CommandText = "SELECT Priority, Room, Description, ReporterName, Status, DateCreated, AdminId, ChatId FROM Reports WHERE Id = @id";
command.Parameters.AddWithValue("@id", reportId);
using (var reader = await command.ExecuteReaderAsync())
@ -1158,6 +1158,7 @@ class Program
string reporterName = reader.GetString(3);
string status = reader.GetString(4);
string dateCreated = reader.GetDateTime(5).ToString("yyyy-MM-dd HH:mm:ss");
long ownerChatId = reader.GetInt64(7);
// Проверяем существование столбца AdminId
long adminId = 0;
@ -1178,27 +1179,50 @@ class Program
string priorityEmoji = GetPriorityEmoji(priority);
string statusEmoji = GetStatusEmoji(status);
var statusButtons = new InlineKeyboardMarkup(new[]
InlineKeyboardMarkup keyboard;
// Разные клавиатуры для админов и обычных пользователей
if (admins.Contains(chatId))
{
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")
// Клавиатура для администраторов с возможностью изменения статуса
keyboard = 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")
}
});
}
else
{
// Клавиатура для обычных пользователей - только удаление своих заявок
keyboard = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData("❌ Удалить заявку", $"delete_{reportId}")
},
new[]
{
InlineKeyboardButton.WithCallbackData("🔙 Назад к списку", "user_reports"),
InlineKeyboardButton.WithCallbackData("🏠 Главное меню", "main_menu")
}
});
}
});
string newText = $"Заявка #{reportId}\n\n" +
$"Приоритет: {priorityEmoji} {priority}\n" +
@ -1212,7 +1236,7 @@ class Program
await botClient.SendMessage(
chatId: chatId,
text: newText,
replyMarkup: statusButtons
replyMarkup: keyboard
);
}
else
@ -1224,7 +1248,16 @@ class Program
);
Log.Warning($"Заявка #{reportId} не найдена при попытке просмотра деталей.");
await Task.Delay(2000);
await ViewReports(botClient, chatId);
// Возвращаем к нужному списку в зависимости от роли пользователя
if (admins.Contains(chatId))
{
await ViewReports(botClient, chatId);
}
else
{
await ViewUserReports(botClient, chatId);
}
}
}
}
@ -1242,6 +1275,7 @@ class Program
// Метод для удаления администратора из базы данных
private static async Task RemoveAdminFromDatabase(long chatId)
{
@ -1548,6 +1582,12 @@ class Program
{
try
{
if (!admins.Contains(changerId))
{
Log.Warning($"Попытка изменения статуса пользователем без прав администратора: {changerId}");
return; // Прерываем выполнение, если пользователь не администратор
}
string oldStatus = "";
long userChatId = 0;