93 lines
3.5 KiB
Python
93 lines
3.5 KiB
Python
from flask import render_template, request, redirect, url_for, g, flash, session
|
|
from .config import db
|
|
import pymysql
|
|
from datetime import datetime
|
|
|
|
def book():
|
|
flight_id = request.args.get('flight_id')
|
|
if request.method == 'GET':
|
|
if not g.user:
|
|
return redirect(url_for("login"))
|
|
conn = pymysql.connect(**db)
|
|
cursor = conn.cursor(pymysql.cursors.DictCursor)
|
|
flight_sql = """
|
|
SELECT f.*, d.Name as Departure_airport_name, a.Name as Arrival_airport_name
|
|
FROM Flights f
|
|
JOIN Airports d ON f.Departure_airport = d.ID
|
|
JOIN Airports a ON f.Arrival_airport = a.ID
|
|
WHERE f.ID = %s;
|
|
"""
|
|
cursor.execute(flight_sql, (flight_id,))
|
|
flight = cursor.fetchone()
|
|
|
|
cursor.close()
|
|
conn.close()
|
|
|
|
return render_template('book.html', flight=flight, username=g.name)
|
|
|
|
if request.method == 'POST':
|
|
passengers = []
|
|
passenger_keys = ['card_code', 'name', 'phone_number', 'seat_class']
|
|
|
|
for i in range(len(request.form) // len(passenger_keys)):
|
|
passenger = {}
|
|
for key in passenger_keys:
|
|
passenger[key] = request.form.get(f'passengers[{i}][{key}]')
|
|
passengers.append(passenger)
|
|
|
|
conn = pymysql.connect(**db)
|
|
cursor = conn.cursor()
|
|
|
|
try:
|
|
# 插入订单记录
|
|
insert_order_sql = """
|
|
INSERT INTO Orders (Order_time, Paid, User_phone_number)
|
|
VALUES (%s, 0, %s)
|
|
"""
|
|
cursor.execute(insert_order_sql, (datetime.now(), g.user))
|
|
order_id = cursor.lastrowid
|
|
|
|
for passenger in passengers:
|
|
passenger_id = passenger['card_code']
|
|
name = passenger['name']
|
|
phone_number = passenger['phone_number']
|
|
seat_class = passenger['seat_class']
|
|
|
|
price_field = f"{seat_class.replace(' ', '_').lower()}_price"
|
|
price_sql = f"SELECT {price_field} FROM Flights WHERE ID = %s"
|
|
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))
|
|
|
|
conn.commit()
|
|
return redirect(url_for('order', order_id=order_id))
|
|
|
|
except Exception as e:
|
|
conn.rollback()
|
|
print(e)
|
|
flash("订票失败", "error")
|
|
return redirect(url_for('search'))
|
|
|
|
finally:
|
|
cursor.close()
|
|
conn.close()
|