diff --git a/Project/Manager/data_source/db_user.sql b/Project/Manager/data_source/db_user.sql index c6854c0..3473976 100644 --- a/Project/Manager/data_source/db_user.sql +++ b/Project/Manager/data_source/db_user.sql @@ -13,5 +13,6 @@ GRANT ALL PRIVILEGES ON ServiceDatabase.Airports TO 'serviceAgent'@'%'; GRANT ALL PRIVILEGES ON ServiceDatabase.Tickets TO 'serviceAgent'@'%'; GRANT SELECT, UPDATE (First_class_seats_remaining, Business_class_seats_remaining, Economy_class_seats_remaining) ON ServiceDatabase.Flights TO 'serviceAgent'@'%'; +GRANT EXECUTE ON PROCEDURE ServiceDatabase.AddPassengerAndTicket TO 'serviceAgent'@'%'; FLUSH PRIVILEGES; \ No newline at end of file diff --git a/Project/Manager/data_source/init_service_db.sql b/Project/Manager/data_source/init_service_db.sql index e5e23ad..9d70249 100644 --- a/Project/Manager/data_source/init_service_db.sql +++ b/Project/Manager/data_source/init_service_db.sql @@ -68,4 +68,64 @@ CREATE TABLE ServiceDatabase.Tickets ( FOREIGN KEY (PassengerID) REFERENCES Passengers(ID) ON DELETE CASCADE, FOREIGN KEY (OrderID) REFERENCES Orders(ID) ON DELETE CASCADE, CHECK (Seat_class IN ('First Class', 'Business Class', 'Economy Class')) -); \ No newline at end of file +); + +USE ServiceDatabase; + +DELIMITER // + +CREATE PROCEDURE AddPassengerAndTicket( + IN p_passenger_id VARCHAR(18), + IN p_name VARCHAR(255), + IN p_phone_number BIGINT, + IN p_seat_class VARCHAR(255), + IN p_flight_id VARCHAR(255), + IN p_price DECIMAL(7, 2), + IN p_order_id INT +) +BEGIN + -- 插入或更新乘客信息 + INSERT INTO Passengers (ID, Name, Phone_number) + VALUES (p_passenger_id, p_name, p_phone_number) + ON DUPLICATE KEY UPDATE Name=VALUES(Name), Phone_number=VALUES(Phone_number); + + -- 更新航班座位数 + IF p_seat_class = 'First Class' THEN + UPDATE Flights + SET First_class_seats_remaining = First_class_seats_remaining - 1 + WHERE ID = p_flight_id; + ELSEIF p_seat_class = 'Business Class' THEN + UPDATE Flights + SET Business_class_seats_remaining = Business_class_seats_remaining - 1 + WHERE ID = p_flight_id; + ELSEIF p_seat_class = 'Economy Class' THEN + UPDATE Flights + SET Economy_class_seats_remaining = Economy_class_seats_remaining - 1 + WHERE ID = p_flight_id; + END IF; + + -- 插入机票信息 + INSERT INTO Tickets (Price, FlightID, Seat_class, PassengerID, OrderID) + VALUES (p_price, p_flight_id, p_seat_class, p_passenger_id, p_order_id); +END // + +CREATE TRIGGER restore_seats +BEFORE DELETE ON Tickets +FOR EACH ROW +BEGIN + IF OLD.Seat_class = 'First Class' THEN + UPDATE Flights + SET First_class_seats_remaining = First_class_seats_remaining + 1 + WHERE ID = OLD.FlightID; + ELSEIF OLD.Seat_class = 'Business Class' THEN + UPDATE Flights + SET Business_class_seats_remaining = Business_class_seats_remaining + 1 + WHERE ID = OLD.FlightID; + ELSEIF OLD.Seat_class = 'Economy Class' THEN + UPDATE Flights + SET Economy_class_seats_remaining = Economy_class_seats_remaining + 1 + WHERE ID = OLD.FlightID; + END IF; +END // + +DELIMITER ; \ No newline at end of file diff --git a/Project/Service/func/__pycache__/book.cpython-311.pyc b/Project/Service/func/__pycache__/book.cpython-311.pyc index e0746ab..3f35b0e 100644 Binary files a/Project/Service/func/__pycache__/book.cpython-311.pyc and b/Project/Service/func/__pycache__/book.cpython-311.pyc differ diff --git a/Project/Service/func/__pycache__/cancel_order.cpython-311.pyc b/Project/Service/func/__pycache__/cancel_order.cpython-311.pyc index 9d2e09e..7299e3e 100644 Binary files a/Project/Service/func/__pycache__/cancel_order.cpython-311.pyc and b/Project/Service/func/__pycache__/cancel_order.cpython-311.pyc differ diff --git a/Project/Service/func/book.py b/Project/Service/func/book.py index 6252349..25d551d 100644 --- a/Project/Service/func/book.py +++ b/Project/Service/func/book.py @@ -37,7 +37,7 @@ def book(): if not passengers: flash("请至少添加一位乘客", "error") - return redirect(url_for('index')) + return redirect(url_for('search')) conn = pymysql.connect(**db) cursor = conn.cursor() @@ -62,25 +62,8 @@ def book(): cursor.execute(price_sql, (flight_id,)) price = cursor.fetchone()[0] - insert_passenger_sql = """ - INSERT INTO Passengers (ID, Name, Phone_number) - VALUES (%s, %s, %s) - ON DUPLICATE KEY UPDATE Name=VALUES(Name), Phone_number=VALUES(Phone_number); - """ - cursor.execute(insert_passenger_sql, (passenger_id, name, phone_number)) - - update_seat_sql = f""" - UPDATE Flights - SET {seat_class.replace(' ', '_').lower()}_seats_remaining = {seat_class.replace(' ', '_').lower()}_seats_remaining - 1 - WHERE ID = %s - """ - cursor.execute(update_seat_sql, (flight_id,)) - - insert_ticket_sql = """ - INSERT INTO Tickets (Price, FlightID, Seat_class, PassengerID, OrderID) - VALUES (%s, %s, %s, %s, %s) - """ - cursor.execute(insert_ticket_sql, (price, flight_id, seat_class, passenger_id, order_id)) + # 调用存储过程 + cursor.callproc('AddPassengerAndTicket', (passenger_id, name, phone_number, seat_class, flight_id, price, order_id)) conn.commit() return redirect(url_for('order', order_id=order_id)) @@ -89,8 +72,8 @@ def book(): conn.rollback() print(e) flash("订票失败", "error") - return redirect(url_for('index')) + return redirect(url_for('search')) finally: cursor.close() - conn.close() + conn.close() \ No newline at end of file diff --git a/Project/Service/func/cancel_order.py b/Project/Service/func/cancel_order.py index 5e7fcfd..41275c7 100644 --- a/Project/Service/func/cancel_order.py +++ b/Project/Service/func/cancel_order.py @@ -1,4 +1,4 @@ -from flask import request, redirect, url_for, g +from flask import request, redirect, url_for, g, flash from .config import db import pymysql @@ -19,33 +19,23 @@ def cancel_order(): conn.close() return redirect(url_for("order_list")) - # 查询订单中所有机票的航班ID和座位级别 - tickets_sql = "SELECT FlightID, Seat_class FROM Tickets WHERE OrderID = %s" - cursor.execute(tickets_sql, (order_id,)) - tickets = cursor.fetchall() + try: + # 删除对应的机票 + delete_tickets_sql = "DELETE FROM Tickets WHERE OrderID = %s" + cursor.execute(delete_tickets_sql, (order_id,)) - # 恢复航班的对应余座数 - for ticket in tickets: - flight_id = ticket['FlightID'] - seat_class = ticket['Seat_class'] - seat_column = seat_class.replace(' ', '_').lower() + "_seats_remaining" - update_seat_sql = f""" - UPDATE Flights - SET {seat_column} = {seat_column} + 1 - WHERE ID = %s - """ - cursor.execute(update_seat_sql, (flight_id,)) + # 删除订单 + delete_order_sql = "DELETE FROM Orders WHERE ID = %s" + cursor.execute(delete_order_sql, (order_id,)) - # 删除对应的机票 - delete_tickets_sql = "DELETE FROM Tickets WHERE OrderID = %s" - cursor.execute(delete_tickets_sql, (order_id,)) - - # 删除订单 - delete_order_sql = "DELETE FROM Orders WHERE ID = %s" - cursor.execute(delete_order_sql, (order_id,)) - - conn.commit() - cursor.close() - conn.close() + conn.commit() + flash("订单取消成功", "success") + except Exception as e: + conn.rollback() + print(e) + flash(f"订单取消失败:{e}", "error") + finally: + cursor.close() + conn.close() return redirect(url_for('order_list'))