Скачиваний:
1
Добавлен:
12.04.2025
Размер:
8.45 Mб
Скачать

Приложение ж

Листинг – Файл Order.aspx.cs

using System;

using System.Data.SqlClient;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace WebApplication3

{

public partial class WebForm4 : Page

{

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

try

{

string tourID = Request.QueryString["TourID"];

string startDateText = Request.QueryString["StartDate"];

string ticketsCountText = Request.QueryString["TicketsCount"];

if (string.IsNullOrEmpty(tourID) || string.IsNullOrEmpty(startDateText) || string.IsNullOrEmpty(ticketsCountText))

{

throw new Exception("Некорректные данные.");

}

if (!int.TryParse(ticketsCountText, out int ticketsCount) || ticketsCount <= 0)

{

throw new Exception("Неверное количество билетов.");

}

ViewState["TicketsCount"] = ticketsCount;

ViewState["TourID"] = tourID;

ViewState["StartDate"] = startDateText;

LoadTourDetails(tourID);

StartDateLabel.Text = startDateText;

GeneratePassengerFields(ticketsCount);

CalculateTotalPrice(tourID, ticketsCount);

}

catch (Exception ex)

{

ErrorMessage.Text = $"Ошибка: {ex.Message}";

}

}

else

{

if (ViewState["TicketsCount"] != null)

{

int ticketsCount = (int)ViewState["TicketsCount"];

GeneratePassengerFields(ticketsCount);

}

}

}

private void LoadTourDetails(string tourID)

{

string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["travelConnectionString4"].ConnectionString;

try

{

using (SqlConnection conn = new SqlConnection(connectionString))

{

string query = @"

SELECT t.Name_T, t.Description_T, tr.StartDate, tr.EndDate

FROM Tour t

INNER JOIN Trip tr ON t.Tour_ID = tr.Tour_ID

WHERE t.Tour_ID = @TourID";

using (SqlCommand cmd = new SqlCommand(query, conn))

{

cmd.Parameters.AddWithValue("@TourID", tourID);

conn.Open();

using (SqlDataReader reader = cmd.ExecuteReader())

{

if (reader.Read())

{

TourNameLabel.Text = reader["Name_T"].ToString();

DescriptionLabel.Text = reader["Description_T"].ToString();

StartDateLabel.Text = Convert.ToDateTime(reader["StartDate"]).ToString("dd.MM.yyyy");

EndDateLabel.Text = reader["EndDate"] != DBNull.Value

? Convert.ToDateTime(reader["EndDate"]).ToString("dd.MM.yyyy")

: "Дата не указана";

}

else

{

throw new Exception("Тур не найден.");

}

}

}

}

}

catch (Exception ex)

{

ErrorMessage.Text = $"Ошибка загрузки данных тура: {ex.Message}";

}

}

private void GeneratePassengerFields(int ticketsCount)

{

for (int i = 1; i <= ticketsCount; i++)

{

Label label = new Label { Text = $"Пассажир {i}:", CssClass = "passenger-label" };

TextBox nameBox = new TextBox { ID = $"PassengerName_{i}", CssClass = "passenger-input", Attributes = { ["placeholder"] = "ФИО" } };

TextBox dobBox = new TextBox { ID = $"PassengerDOB_{i}", CssClass = "passenger-input", TextMode = TextBoxMode.Date };

Label dobLabel = new Label { Text = "Дата рождения:", CssClass = "dob-label" };

PassengersPanel.Controls.Add(label);

PassengersPanel.Controls.Add(new Literal { Text = "<br/>" });

PassengersPanel.Controls.Add(nameBox);

PassengersPanel.Controls.Add(new Literal { Text = "<br/>" });

PassengersPanel.Controls.Add(dobLabel);

PassengersPanel.Controls.Add(new Literal { Text = "<br/>" });

PassengersPanel.Controls.Add(dobBox);

PassengersPanel.Controls.Add(new Literal { Text = "<hr/>" });

}

}

private void CalculateTotalPrice(string tourID, int ticketsCount)

{

string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["travelConnectionString4"].ConnectionString;

try

{

using (SqlConnection conn = new SqlConnection(connectionString))

{

string query = @"SELECT Price FROM Trip WHERE Tour_ID = @TourID AND StartDate = @StartDate";

using (SqlCommand cmd = new SqlCommand(query, conn))

{

cmd.Parameters.AddWithValue("@TourID", tourID);

cmd.Parameters.AddWithValue("@StartDate", DateTime.Parse(StartDateLabel.Text));

conn.Open();

object result = cmd.ExecuteScalar();

if (result != null)

{

decimal pricePerTicket = Convert.ToDecimal(result);

decimal totalPrice = pricePerTicket * ticketsCount;

TotalPriceLabel.Text = $"Общая стоимость: {totalPrice:C}";

}

else

{

ErrorMessage.Text = "Ошибка: Цена не найдена.";

}

}

}

}

catch (Exception ex)

{

ErrorMessage.Text = $"Ошибка расчета стоимости: {ex.Message}";

}

}

protected void ConfirmOrderButton_Click(object sender, EventArgs e)

{

try

{

string tourID = Request.QueryString["TourID"];

string startDateText = StartDateLabel.Text;

int ticketsCount = int.Parse(Request.QueryString["TicketsCount"]);

if (string.IsNullOrEmpty(tourID) || string.IsNullOrEmpty(startDateText) || ticketsCount <= 0)

{

ErrorMessage.Text = "Проверьте введенные данные.";

return;

}

if (Session["UserId"] == null)

{

ErrorMessage.Text = "Пользователь не авторизован.";

return;

}

ProcessOrder(tourID, startDateText, ticketsCount);

SuccessMessage.Text = "Ваш заказ успешно оформлен!";

}

catch (Exception ex)

{

ErrorMessage.Text = $"Ошибка оформления заказа: {ex.Message}";

}

}

private void ProcessOrder(string tourID, string startDateText, int ticketsCount)

{

string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["travelConnectionString4"].ConnectionString;

using (SqlConnection conn = new SqlConnection(connectionString))

{

conn.Open();

SqlTransaction transaction = conn.BeginTransaction();

try

{

int tripID = GetTripID(conn, transaction, tourID, startDateText);

int orderID = InsertOrder(conn, transaction, tripID, ticketsCount);

AddPassengers(conn, transaction, orderID, ticketsCount);

UpdateTripCount(conn, transaction, tripID, ticketsCount);

transaction.Commit();

}

catch

{

transaction.Rollback();

throw;

}

}

}

private int GetTripID(SqlConnection conn, SqlTransaction transaction, string tourID, string startDateText)

{

string query = @"

SELECT Trip_ID

FROM Trip

WHERE Tour_ID = @TourID AND StartDate = @StartDate";

using (SqlCommand cmd = new SqlCommand(query, conn, transaction))

{

cmd.Parameters.AddWithValue("@TourID", tourID);

cmd.Parameters.AddWithValue("@StartDate", DateTime.Parse(startDateText));

object result = cmd.ExecuteScalar();

if (result == null)

{

throw new Exception("Поездка не найдена.");

}

return Convert.ToInt32(result);

}

}

private int InsertOrder(SqlConnection conn, SqlTransaction transaction, int tripID, int ticketsCount)

{

string query = @"

INSERT INTO Order_data (OrderDate, Client_ID, PeopleCount, Trip_ID)

OUTPUT INSERTED.Order_ID

VALUES (GETDATE(), @ClientID, @PeopleCount, @TripID)";

using (SqlCommand cmd = new SqlCommand(query, conn, transaction))

{

cmd.Parameters.AddWithValue("@ClientID", Session["UserId"]);

cmd.Parameters.AddWithValue("@PeopleCount", ticketsCount);

cmd.Parameters.AddWithValue("@TripID", tripID);

return (int)cmd.ExecuteScalar();

}

}

private void AddPassengers(SqlConnection conn, SqlTransaction transaction, int orderID, int ticketsCount)

{

string query = @"

INSERT INTO Permit (Order_ID, LastName, FirstName, MiddleName, DOB)

VALUES (@OrderID, @LastName, @FirstName, @MiddleName, @DOB)";

for (int i = 1; i <= ticketsCount; i++)

{

string passengerName = ((TextBox)PassengersPanel.FindControl($"PassengerName_{i}"))?.Text;

string passengerDOB = ((TextBox)PassengersPanel.FindControl($"PassengerDOB_{i}"))?.Text;

string[] nameParts = passengerName?.Split(' ');

if (nameParts == null || nameParts.Length < 2)

{

throw new Exception($"Ошибка в данных пассажира {i}. Укажите ФИО в формате: 'Фамилия Имя Отчество'.");

}

string lastName = nameParts[0];

string firstName = nameParts[1];

string middleName = nameParts.Length > 2 ? nameParts[2] : "";

if (string.IsNullOrEmpty(passengerDOB) || !DateTime.TryParse(passengerDOB, out DateTime dob))

{

throw new Exception($"Ошибка в данных пассажира {i}. Укажите корректную дату рождения.");

}

using (SqlCommand cmd = new SqlCommand(query, conn, transaction))

{

cmd.Parameters.AddWithValue("@OrderID", orderID);

cmd.Parameters.AddWithValue("@LastName", lastName);

cmd.Parameters.AddWithValue("@FirstName", firstName);

cmd.Parameters.AddWithValue("@MiddleName", middleName);

cmd.Parameters.AddWithValue("@DOB", dob);

cmd.ExecuteNonQuery();

}

}

}

private void UpdateTripCount(SqlConnection conn, SqlTransaction transaction, int tripID, int ticketsCount)

{

string query = @"

UPDATE Trip

SET TripCount = TripCount - @TicketsCount

WHERE Trip_ID = @TripID";

using (SqlCommand cmd = new SqlCommand(query, conn, transaction))

{

cmd.Parameters.AddWithValue("@TicketsCount", ticketsCount);

cmd.Parameters.AddWithValue("@TripID", tripID);

cmd.ExecuteNonQuery();

}

}

}

}

Соседние файлы в предмете Проектирование информационных систем