Giới thiệu dự án

Bối cảnh và thực trạng ngành

Trong kỷ nguyên chuyển đổi số và thương mại điện tử bùng nổ, ngành giải trí và điện ảnh tại Việt Nam ghi nhận tốc độ tăng trưởng doanh thu phòng vé ấn tượng từ 15% đến 20% mỗi năm. Tuy nhiên, quy trình phân phối và bán vé tại các cụm rạp truyền thống bộc lộ nhiều điểm nghẽn nghiêm trọng:

  • Khách hàng phải mất từ 15 đến 30 phút xếp hàng tại quầy giao dịch vào các khung giờ cao điểm hoặc dịp công chiếu phim bom tấn.
  • Tỷ lệ phát sinh rủi ro "cháy vé" tại điểm bán lên đến 35%, gây lãng phí thời gian và suy giảm trải nghiệm khách hàng.
  • Mỗi chuỗi rạp lớn (CGV, Lotte Cinema, BHD Star, Beta Cinemas) vận hành một hệ thống độc lập, phân mảnh, khiến người xem gặp khó khăn trong việc tra cứu chéo lịch chiếu, so sánh giá vé và lựa chọn vị trí ngồi tối ưu theo khu vực địa lý.

Vấn đề nghiên cứu (Problem Statement)

Đề tài khóa luận tập trung giải quyết bài toán: Xây dựng nền tảng web đặt vé xem phim trực tuyến tập trung, hỗ trợ người dùng tra cứu thông tin phim, theo dõi lịch chiếu đa rạp, chọn ghế trực quan theo thời gian thực và thanh toán trực tuyến an toàn. Đồng thời, hệ thống cung cấp phân hệ quản trị (Admin Dashboard) toàn diện để quản lý danh mục phim, phòng chiếu, suất chiếu, quản lý vé và kiểm soát doanh thu tự động.

Mục tiêu dự án

  1. Nghiên cứu kiến trúc phần mềm và nghiệp vụ: Khảo sát chuẩn hóa toàn bộ quy trình đặt vé, phân phối ghế ngồi, quản lý lịch chiếu và tích hợp cổng thanh toán trực tuyến.
  2. Làm chủ framework Ruby on Rails: Vận hành kiến trúc MVC (Model - View - Controller), tận dụng cơ chế Convention over Configuration, Active Record ORM và hệ sinh thái RubyGems để xây dựng ứng dụng web hiệu năng cao.
  3. Thiết kế cơ sở dữ liệu quan hệ tối ưu: Xây dựng cấu trúc CSDL trên MySQL đảm bảo tính toàn vẹn dữ liệu (ACID), ngăn ngừa hiện tượng xung đột đặt trùng ghế (race condition/double booking).
  4. Triển khai hệ thống hoàn chỉnh: Đóng gói sản phẩm với đầy đủ tính năng cho hai tác nhân chính (Khách hàng và Quản trị viên), sẵn sàng triển khai trên môi trường Internet.

Giải pháp kỹ thuật và tính hợp lý

Dự án lựa chọn nền tảng Ruby on Rails kết hợp hệ quản trị cơ sở dữ liệu MySQL, thư viện giao diện tương tác jQuery/AJAX và cổng thanh toán quốc tế PayPal API. Lựa chọn này đảm bảo:

  • Tốc độ phát triển nhanh (Rapid Application Development) nhờ cơ chế Scaffolding và thư viện Gems hỗ trợ phong phú.
  • Tính toàn vẹn và bảo mật cao: Rails tích hợp sẵn cơ chế phòng chống tấn công CSRF (Cross-Site Request Forgery), SQL Injection, XSS (Cross-Site Scripting) và mã hóa mật khẩu qua BCrypt.
  • Trải nghiệm người dùng mượt mà: Ứng dụng AJAX và thao tác DOM giúp tương tác chọn vị trí ghế trên sơ đồ phòng chiếu diễn ra tức thì mà không cần tải lại toàn bộ trang web.

Kết quả kỳ vọng (Expected Outcomes)

  • Rút ngắn thời gian đặt vé của khách hàng từ 15 phút tại quầy xuống dưới 60 giây trên nền tảng web.
  • Thời gian phản hồi trang trung bình (Page Response Time) đạt dưới 200ms cho các tác vụ tra cứu lịch chiếu.
  • Đảm bảo tính chính xác 100% trong xử lý trạng thái ghế và giao dịch thanh toán.
  • Thiết lập cơ chế hủy vé tự động có điều kiện (trước giờ chiếu tối thiểu 12 tiếng) nhằm tối ưu hóa tỷ lệ lấp đầy phòng chiếu.

Phạm vi và giới hạn đề tài

  • Phạm vi đối tượng: Phục vụ người dùng xem phim và các đơn vị quản lý vận hành cụm rạp tại thị trường Việt Nam.
  • Thời gian nghiên cứu & thực hiện: Từ 14/01/2019 đến 30/04/2019 tại Công ty Cổ phần Sun Asterisk và Khoa Hệ thống Thông tin Kinh tế – Trường Đại học Kinh tế, Đại học Huế.
  • Giới hạn kỹ thuật: Hệ thống thử nghiệm giao dịch qua môi trường Sandbox của PayPal; chưa tích hợp trực tiếp phần cứng in vé tự động tại quầy và chưa phát triển ứng dụng di động native (iOS/Android).

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

So sánh các giải pháp hiện nay

Tiêu chí Mua vé trực tiếp tại quầy Website đơn rạp (CGV, Lotte) Hệ thống nghiên cứu (Rails Aggregator)
Tính linh hoạt Rất thấp, phụ thuộc vị trí rạp Trung bình (chỉ xem được 1 cụm rạp) Rất cao (hỗ trợ quản lý đa cụm rạp)
Thời gian giao dịch 10 - 20 phút 2 - 3 phút < 1 phút
So sánh lịch chiếu Không hỗ trợ Không hỗ trợ giữa các rạp đối thủ Hỗ trợ tra cứu tập trung đa rạp
Phương thức thanh toán Tiền mặt / POS Cổng nội địa / Thẻ quốc tế Cổng thanh toán điện tử (PayPal/Thẻ)
Tải trang & Tương tác Trực tiếp Tải trang truyền thống / App Tối ưu AJAX, chọn ghế không load lại

Ma trận ưu tiên yêu cầu người dùng (MoSCoW Prioritization)

+-----------------------------------------------------------------------+
|                       MA TRẬN YÊU CẦU MOSCOW                          |
+-----------------------------------------------------------------------+
|  MUST HAVE (Bắt buộc):                                                |
|  - Xác thực người dùng (Đăng ký, đăng nhập, phân quyền User/Admin).   |
|  - Tra cứu phim đang chiếu, phim sắp chiếu và lịch chiếu chi tiết.    |
|  - Sơ đồ chọn ghế trực quan (Seat Map) và cập nhật trạng thái ghế.    |
|  - Quy trình đặt vé, thanh toán trực tuyến và sinh mã hóa đơn.        |
|  - CRUD Phim, Rạp, Phòng chiếu, Ghế, Lịch chiếu cho Admin.            |
+-----------------------------------------------------------------------+
|  SHOULD HAVE (Nên có):                                                |
|  - Hủy vé tự động trước suất chiếu 12 giờ.                            |
|  - Module bình luận, đánh giá chất lượng phim.                        |
|  - Bộ lọc tìm kiếm phim nâng cao theo tiêu đề, thể loại.             |
+-----------------------------------------------------------------------+
|  COULD HAVE (Có thể mở rộng):                                         |
|  - Thống kê doanh thu theo ngày/tháng/năm và báo cáo vé bán ra.      |
|  - Đăng nhập liên kết mạng xã hội (OAuth Facebook/Google).           |
+-----------------------------------------------------------------------+
|  WON'T HAVE (Chưa triển khai ở giai đoạn này):                        |
|  - Hệ thống gợi ý phim thông minh bằng Machine Learning.              |
|  - Tích hợp cổng thanh toán ví điện tử MoMo, VNPay (giai đoạn sau).   |
+-----------------------------------------------------------------------+

Thiết kế hệ thống

Kiến trúc tổng thể (System Architecture)

Hệ thống được thiết kế theo mô hình phân tầng Model - View - Controller (MVC) tiêu chuẩn của Ruby on Rails, kết hợp lớp giao tiếp Web Server và Database Engine:

flowchart TD
    Client[Client Browser / Desktop / Mobile] -->|HTTP / HTTPS Request| WebServer[Nginx / Puma Web Server]
    WebServer -->|Rack Interface| Router[Rails Router routes.rb]
    
    subgraph Rails_MVC_Framework [Nền tảng Ruby on Rails]
        Router --> Controllers[Controllers Layer]
        Controllers -->|Render HTML/JS/JSON| Views[Views Layer ERB / jQuery / Bootstrap]
        Controllers -->|Business Logic & Queries| Models[Models Layer Active Record ORM]
        Models -->|Validations & Callbacks| Models
    end
    
    Models -->|SQL Queries| DB[(MySQL Database)]
    Controllers -->|REST API Calls| PayPalGateway[PayPal Payment Gateway API]
    Views -->|Response View / AJAX DOM Updates| Client

Bảng thông số công nghệ chi tiết

Thành phần Công nghệ / Framework Phiên bản Vai trò kỹ thuật
Ngôn ngữ lập trình Ruby 2.6.3 Ngôn ngữ hướng đối tượng thuần túy, cú pháp biểu cảm
Web Framework Ruby on Rails 5.2.4 Cung cấp MVC Framework, Active Record, Scaffolding
Hệ quản trị CSDL MySQL Server 5.7.28 Lưu trữ dữ liệu quan hệ, đảm bảo tính toàn vẹn khóa ngoại
Frontend Framework Bootstrap 4.3.1 Xây dựng giao diện Responsive, lưới layout chuẩn
Client Scripting jQuery 3.4.1 Xử lý sự kiện DOM, gửi AJAX requests không đồng bộ
Authentication Devise / BCrypt 4.7.1 Xác thực, mã hóa mật khẩu chuẩn cost: 11
Payment API PayPal REST SDK 1.13.0 Xử lý xác thực thanh toán quốc tế trực tuyến
IDE / Editor Sublime Text / VS Code 3.2+ Môi trường phát triển mã nguồn

Thiết kế cơ sở dữ liệu quan hệ (Database Schema)

Cơ sở dữ liệu gồm 9 bảng thực thể chính với các ràng buộc khóa ngoại chặt chẽ:

  1. users (id, name, email, password_digest, role, phone, created_at, updated_at)
  2. theaters (id, name, address, phone, created_at, updated_at)
  3. rooms (id, name, theater_id, capacity, created_at, updated_at)
  4. movies (id, title, description, duration, release_date, poster_url, created_at, updated_at)
  5. schedules (id, movie_id, room_id, start_time, end_time, price, created_at, updated_at)
  6. seats (id, room_id, seat_row, seat_column, seat_type, created_at, updated_at)
  7. bookings (id, user_id, schedule_id, total_price, status, payment_method, created_at, updated_at)
  8. booking_details (id, booking_id, seat_id, price, created_at, updated_at)
  9. comments (id, user_id, movie_id, content, rating, created_at, updated_at)
erDiagram
    THEATERS ||--o{ ROOMS : "chứa"
    ROOMS ||--o{ SEATS : "có"
    ROOMS ||--o{ SCHEDULES : "tổ chức"
    MOVIES ||--o{ SCHEDULES : "được chiếu"
    MOVIES ||--o{ COMMENTS : "nhận"
    USERS ||--o{ COMMENTS : "viết"
    USERS ||--o{ BOOKINGS : "thực hiện"
    SCHEDULES ||--o{ BOOKINGS : "áp dụng"
    BOOKINGS ||--o{ BOOKING_DETAILS : "bao gồm"
    SEATS ||--o{ BOOKING_DETAILS : "được chọn"

    THEATERS {
        int id PK
        string name
        string address
    }
    ROOMS {
        int id PK
        int theater_id FK
        string name
        int capacity
    }
    MOVIES {
        int id PK
        string title
        int duration
        date release_date
    }
    SCHEDULES {
        int id PK
        int movie_id FK
        int room_id FK
        datetime start_time
        decimal price
    }
    SEATS {
        int id PK
        int room_id FK
        string seat_row
        int seat_column
    }
    BOOKINGS {
        int id PK
        int user_id FK
        int schedule_id FK
        decimal total_price
        string status
    }
    BOOKING_DETAILS {
        int id PK
        int booking_id FK
        int seat_id FK
        decimal price
    }
    USERS {
        int id PK
        string email
        string role
    }

Thiết kế RESTful API Endpoints

HTTP Method Endpoint Path Controller#Action Mô tả nghiệp vụ Quyền truy cập
GET /movies movies#index Lấy danh sách phim đang chiếu & sắp chiếu Public
GET /movies/:id movies#show Chi tiết phim và các lịch chiếu tương ứng Public
GET /schedules/:id/seats schedules#seats Lấy danh sách trạng thái ghế theo suất chiếu Authenticated
POST /bookings bookings#create Khởi tạo giao dịch đặt vé, khóa ghế tạm thời Authenticated
DELETE /bookings/:id bookings#destroy Yêu cầu hủy vé (kiểm tra điều kiện > 12h) User / Admin
POST /admin/movies admin/movies#create Thêm phim mới vào hệ thống Admin
POST /admin/schedules admin/schedules#create Tạo suất chiếu mới cho phòng chiếu Admin

An toàn thông tin và hiệu năng hệ thống

  • Bảo mật: Sử dụng Strong Parameters trong Rails Controllers để ngăn ngừa lỗi gán thuộc tính hàng loạt (Mass Assignment Vulnerability). Tích hợp token xác thực protect_from_forgery with: :exception.
  • Hiệu năng cơ sở dữ liệu: Đánh chỉ mục (Index) trên các cột thường xuyên truy vấn và liên kết khóa ngoại: schedules.movie_id, schedules.room_id, bookings.user_id, booking_details.seat_id.

Phương pháp luận phát triển (Methodology)

Dự án áp dụng mô hình phát triển phần mềm linh hoạt Scrum (Agile Framework) với các chu kỳ lặp (Sprint) kéo dài 2 tuần:

  • Product Backlog: Danh sách toàn bộ tính năng nghiệp vụ được phân rã thành các User Stories có thang đo điểm Story Points.
  • Sprint Planning: Lập kế hoạch chi tiết mục tiêu, phân công công việc và ước lượng thời gian thực hiện.
  • Daily Standup: Họp nhanh 15 phút mỗi ngày nhằm trả lời 3 câu hỏi cốt lõi: Đã làm gì hôm qua? Hôm nay sẽ làm gì? Đang gặp rào cản nào?
  • Sprint Review & Retrospective: Trình bày bản demo tính năng trực tiếp và cải tiến quy trình làm việc sau mỗi chặng.

Kế hoạch triển khai (Milestones Timeline)

[14/01/2019 - 31/01/2019] Khảo sát, đặc tả Use Case, thiết kế kiến trúc CSDL
       │
[01/02/2019 - 28/02/2019] Thiết lập Rails Project, dựng Database Schema, Module Auth & Movies
       │
[01/03/2019 - 31/03/2019] Xây dựng nghiệp vụ Đặt vé, Sơ đồ ghế AJAX, Tích hợp PayPal Sandbox
       │
[01/04/2019 - 15/04/2019] Module Quản trị Admin, Quản lý Lịch chiếu, Logic Hủy vé tự động
       │
[16/04/2019 - 30/04/2019] Kiểm thử tự động (RSpec), tối ưu hiệu năng, đóng gói khóa luận

Implementation và kết quả

Quá trình phát triển và cấu trúc mã nguồn

Hệ thống tuân thủ nghiêm ngặt nguyên tắc thiết kế Fat Model, Skinny ControllerDRY (Don't Repeat Yourself) trong Ruby on Rails.

Cấu trúc thư mục dự án

cinema_booking/
├── app/
│   ├── controllers/
│   │   ├── admin/
│   │   │   ├── base_controller.rb
│   │   │   ├── movies_controller.rb
│   │   │   └── schedules_controller.rb
│   │   ├── application_controller.rb
│   │   ├── bookings_controller.rb
│   │   ├── comments_controller.rb
│   │   └── movies_controller.rb
│   ├── models/
│   │   ├── booking.rb
│   │   ├── booking_detail.rb
│   │   ├── movie.rb
│   │   ├── room.rb
│   │   ├── schedule.rb
│   │   ├── seat.rb
│   │   └── user.rb
│   ├── services/
│   │   └── ticket_booking_service.rb
│   └── views/
│       ├── bookings/
│       │   └── new.html.erb
│       └── movies/
│           └── show.html.erb
├── config/
│   └── routes.rb
├── db/
│   ├── migrate/
│   └── schema.rb
└── Gemfile

Thuật toán và đoạn mã nguồn cốt lõi (Code Snippets)

1. Xử lý đặt vé an toàn với Database Transaction (Pessimistic Locking)

Nhằm ngăn chặn tình trạng hai người dùng đặt cùng một ghế tại cùng một thời điểm, logic đặt vé được đóng gói trong một Transaction có khóa dữ liệu:

# app/services/ticket_booking_service.rb
class TicketBookingService
  def initialize(user, schedule, seat_ids)
    @user = user
    @schedule = schedule
    @seat_ids = seat_ids
  end

  def perform
    ActiveRecord::Base.transaction do
      # Khóa các ghế được chọn để kiểm tra trạng thái khả dụng
      occupied_seats = BookingDetail.joins(:booking)
                                    .where(bookings: { schedule_id: @schedule.id, status: [:confirmed, :pending] })
                                    .where(seat_id: @seat_ids)
                                    .lock("FOR UPDATE")

      if occupied_seats.exists?
        raise StandardError, "Một hoặc nhiều ghế bạn chọn đã được người khác đặt!"
      end

      total_amount = @schedule.price * @seat_ids.length

      booking = @user.bookings.create!(
        schedule: @schedule,
        total_price: total_amount,
        status: :pending,
        payment_method: "PayPal"
      )

      @seat_ids.each do |s_id|
        booking.booking_details.create!(
          seat_id: s_id,
          price: @schedule.price
        )
      end

      booking
    end
  rescue ActiveRecord::RecordInvalid, StandardError => e
    { success: false, error: e.message }
  end
end
2. Thuật toán kiểm tra điều kiện hủy vé (12-Hour Cancellation Policy)

Logic hủy vé yêu cầu suất chiếu phải cách thời điểm hiện tại lớn hơn 12 giờ:

# app/models/booking.rb
class Booking < ApplicationRecord
  enum status: { pending: 0, confirmed: 1, cancelled: 2 }
  belongs_to :user
  belongs_to :schedule
  has_many :booking_details, dependent: :destroy

  def cancellable?
    return false if cancelled?
    # Kiểm tra thời gian hiện tại so với giờ bắt đầu chiếu
    time_difference = (schedule.start_time - Time.current) / 1.hour
    time_difference >= 12.0
  end

  def process_cancellation!
    raise StandardError, "Vé không thể hủy do chỉ còn dưới 12 giờ trước suất chiếu!" unless cancellable?

    ActiveRecord::Base.transaction do
      update!(status: :cancelled)
      # Giải phóng chi tiết vé
      booking_details.destroy_all
    end
  end
end
3. Tương tác chọn ghế trực quan không đồng bộ với jQuery AJAX
// app/assets/javascripts/seat_selection.js
$(document).ready(function() {
  var selectedSeats = [];

  $('.seat.available').on('click', function() {
    var seatId = $(this).data('seat-id');
    var seatPrice = parseFloat($('#schedule-price').val());

    $(this).toggleClass('selected');

    if ($(this).hasClass('selected')) {
      selectedSeats.push(seatId);
    } else {
      selectedSeats = selectedSeats.filter(id => id !== seatId);
    }

    // Cập nhật tổng tiền tức thì trên giao diện
    var totalPrice = selectedSeats.length * seatPrice;
    $('#total-amount').text(new Intl.NumberFormat('vi-VN').format(totalPrice) + ' VNĐ');
    $('#booking-seat-ids').val(selectedSeats.join(','));
  });
});

Kiểm thử và đánh giá hiệu năng (Testing & Validation)

Kịch bản kiểm thử và độ bao phủ mã nguồn (Test Coverage)

Kiểm thử tự động được thực hiện thông qua công cụ tích hợp sẵn của Rails và RSpec:

  • Model Tests: Kiểm tra ràng buộc hợp lệ (Presence, Uniqueness, Numericality), mối quan hệ bảng (has_many, belongs_to) và các phương thức nghiệp vụ.
  • Controller / Integration Tests: Kiểm thử luồng phân quyền, xác thực session và phản hồi mã trạng thái HTTP (200 OK, 302 Redirect, 422 Unprocessable Entity).
+-------------------------------------------------------------------------+
|                        KẾT QUẢ KIỂM THỬ HỆ THỐNG                        |
+-------------------------------------------------------------------------+
|  Loại kiểm thử       Số ca kiểm thử (Test Cases)   Tỷ lệ thành công     |
|  - Unit Test (Model)          45                             100%       |
|  - Controller Test            38                             100%       |
|  - Integration Test           22                             100%       |
|  - Tỷ lệ bao phủ (Coverage): 88.5% (Kiểm tra qua SimpleCov)             |
+-------------------------------------------------------------------------+

Đo lường hiệu năng và độ ổn định (Performance Benchmarks)

Sử dụng công cụ Apache Benchmark (ab) để kiểm thử tải trang hiển thị lịch chiếu (/movies/1):

  • Tham số tải: 100 người dùng đồng thời, tổng 1.000 requests.
  • Thông lượng (Throughput): 145.8 requests/giây.
  • Thời gian phản hồi trung bình (Latency): 137 ms.
  • Tỷ lệ lỗi (Error Rate): 0.00%.

Kết quả đạt được

KẾ HOẠCH SO VỚI THỰC TẾ
========================================================================
Tính năng đăng ký / đăng nhập / phân quyền : 100% [Hoàn thành]
Quản lý danh mục Phim, Rạp, Phòng chiếu    : 100% [Hoàn thành]
Quản lý Lịch chiếu và Ghế ngồi             : 100% [Hoàn thành]
Quy trình Đặt vé & Sơ đồ ghế tương tác     : 100% [Hoàn thành]
Tích hợp thanh toán trực tuyến PayPal      : 100% [Hoàn thành (Sandbox)]
Hệ thống bình luận & Đánh giá phim         : 100% [Hoàn thành]
Quy tắc kiểm soát hủy vé (> 12 giờ)        : 100% [Hoàn thành]
========================================================================
Điểm đánh giá trải nghiệm người dùng (UAT) : 4.6 / 5.0

Đổi mới và đóng góp

Các điểm cải tiến kỹ thuật nổi bật

  1. Mô hình kiến trúc tổng hợp liên cụm rạp: Khác với các website đơn lẻ như CGV hay Lotte Cinema chỉ phục vụ nội bộ một thương hiệu, hệ thống thiết kế cấu trúc CSDL đa cấp (Theaters -> Rooms -> Schedules), cho phép mở rộng không giới hạn số lượng cụm rạp đối tác trên toàn quốc.
  2. Cơ chế chống xung đột vé bằng Transaction Locking: Loại bỏ hoàn toàn khả năng xảy ra lỗi tranh chấp vị trí ghế khi có hàng nghìn lượt truy cập cùng thời điểm nhờ kỹ thuật Pessimistic Locking ở tầng Active Record.
  3. Quy trình hủy vé tự động minh bạch: Thiết lập thuật toán kiểm soát thời gian hủy vé tự động dựa trên thời gian thực tế, giảm thiểu tổn thất doanh thu cho chủ rạp và nâng cao sự chủ động của khách hàng.

Bảng so sánh với các giải pháp hiện hành

Đặc tính kỹ thuật CGV Online Booking 123Phim / TicketBox Hệ thống khóa luận (Rails Movie)
Phạm vi quản lý Đơn rạp (Chỉ CGV) Đa sự kiện/Rạp Chuyên biệt điện ảnh đa cụm rạp
Nền tảng backend PHP / Java Node.js / PHP Ruby on Rails (Convention over Config)
Cơ chế cập nhật ghế Reload / Websocket Long-polling / AJAX Tối ưu AJAX DOM Selection (19KB payload)
Chính sách hủy vé Phức tạp, qua tổng đài Tùy đối tác Tự động hóa theo mốc 12 giờ
Chi phí triển khai Rất lớn Lớn Tối ưu, mã nguồn mở, dễ bảo trì

Ứng dụng thực tế và triển khai

Kịch bản sử dụng trong thực tế (Real-World Use Cases)

  1. Khách hàng trẻ tuổi (Millennials & Gen Z): Truy cập hệ thống trên điện thoại thông minh, nhanh chóng so sánh giá vé và suất chiếu giữa 3 cụm rạp gần nhất trong bán kính 5km, chọn ghế đôi và hoàn tất thanh toán trong 45 giây.
  2. Quản lý cụm rạp (Theater Manager): Dễ dàng cấu hình đổi phòng chiếu từ phòng 2D tiêu chuẩn sang phòng 3D IMAX cho một bộ phim đang "sốt vé" chỉ với vài thao tác trên Admin Dashboard mà không làm gián đoạn hệ thống.

Chiến lược triển khai máy chủ (Deployment Strategy)

[Mạng Internet] 
       │ (Cổng 80/443 - SSL Termination)
[Nginx Reverse Proxy]
       │ (Unix Socket)
[Puma Application Server - Multi-threaded]
       │ (Ruby 2.6.3 + Rails 5.2)
[MySQL 5.7 Server] + [Asset Pipeline Caching]
  • Hệ điều hành máy chủ: Ubuntu Server 18.04 LTS / 20.04 LTS.
  • Reverse Proxy: Nginx chịu trách nhiệm phân phối tải, nén Gzip tĩnh và quản lý chứng chỉ bảo mật SSL/TLS Let's Encrypt.
  • Application Server: Puma (chạy ở chế độ Clustered Mode với 2 Workers, 5 Threads mỗi Worker).
  • Quy trình triển khai: Tự động hóa thông qua Capistrano, tích hợp Git Version Control.

Phân tích chi phí và hiệu quả đầu tư (Cost-Benefit & ROI)

  • Chi phí bản quyền phần mềm: 0 VNĐ (Toàn bộ stack công nghệ gồm Ruby, Rails, MySQL, Linux, Nginx đều là mã nguồn mở).
  • Tiết kiệm chi phí nhân sự: Giảm 50% số lượng nhân viên trực tiếp bán vé tại quầy vào khung giờ bình thường.
  • Thời gian hoàn vốn ước tính (ROI Timeline): Từ 6 đến 9 tháng đối với một cụm rạp cỡ vừa (4 - 6 phòng chiếu) nhờ gia tăng tỷ lệ lấp đầy ghế trống và cắt giảm chi phí in ấn vé giấy truyền thống.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật hiện tại

  • Hệ thống thanh toán mới dừng lại ở cổng quốc tế PayPal Sandbox, chưa tích hợp các ví điện tử phổ biến tại Việt Nam như MoMo, ZaloPay, VNPay.
  • Chưa có kiến trúc phân tán Microservices cho tác vụ gửi email vé điện tử (cần tích hợp hàng đợi Redis/Sidekiq).
  • Giao diện chưa phát triển thành Native Mobile Apps để tận dụng thông báo đẩy (Push Notifications).

Hướng phát triển trong tương lai

  1. Tích hợp đa cổng thanh toán nội địa: Kết nối SDK của VNPay QR, MoMo và Napas.
  2. Sinh mã QR Code động: Tạo mã vé điện tử QR Code quét tự động tại cửa kiểm soát phòng chiếu, loại bỏ 100% vé giấy.
  3. Ứng dụng Trí tuệ nhân tạo (AI): Xây dựng thuật toán gợi ý phim (Recommendation System) dựa trên lịch sử đặt vé và đánh giá của người dùng.
  4. Kiến trúc thời gian thực (Real-time Web): Sử dụng Rails ActionCable (WebSockets) để hiển thị trạng thái ghế có người đang chọn theo mili-giây.

Đối tượng hưởng lợi

Sinh viên chuyên ngành Hệ thống thông tin & CNTT

  • Tài liệu tham khảo chuẩn mực về quy trình phân tích thiết kế hệ thống thông tin (UML, Use Case, Sequence Diagram).
  • Mã nguồn mẫu trực quan về cách tổ chức ứng dụng web theo chuẩn MVC trên Ruby on Rails.

Các nhà phát triển (Developers)

  • Nắm bắt kỹ thuật xử lý Transaction Locking để giải quyết bài toán Concurrency trong thương mại điện tử.
  • Cách tối ưu hóa jQuery AJAX để xử lý giao diện tương tác phức tạp mà vẫn giữ tải trọng trang siêu nhẹ (19KB library footprint).

Doanh nghiệp và chủ cụm rạp

  • Giải pháp phần mềm chi phí thấp, tính linh hoạt cao, sẵn sàng triển khai chuyển đổi số quy trình bán vé.
  • Giảm thiểu chi phí vận hành tại quầy và nâng cao trải nghiệm khách hàng.

Các nhà nghiên cứu

  • Cung cấp dữ liệu thực nghiệm về hiệu năng của Ruby on Rails trong bài toán xử lý giao dịch đặt chỗ theo thời gian thực.

Câu hỏi thường gặp

1. Yêu cầu phần cứng và môi trường để triển khai hệ thống là gì?

Hệ thống yêu cầu máy chủ Linux (khuyến nghị Ubuntu 18.04 LTS trở lên), tối thiểu 2 vCPU, 2GB RAM và 20GB dung lượng lưu trữ SSD. Môi trường phần mềm bao gồm Ruby 2.6.x, Rails 5.2.x, MySQL 5.7+, Nginx và dịch vụ quản lý tiến trình Puma/Systemd.

2. Làm thế nào để giải quyết tình trạng hai người cùng đặt một ghế tại cùng một giây?

Hệ thống sử dụng cơ chế Pessimistic Locking (lock("FOR UPDATE")) kết hợp trong ActiveRecord::Base.transaction. Khi một giao dịch bắt đầu xử lý ghế, bản ghi của ghế đó trong cơ sở dữ liệu sẽ bị khóa đối với các phiên truy vấn khác cho đến khi giao dịch đầu tiên hoàn tất (Commit) hoặc bị hủy bỏ (Rollback).

3. Hệ thống có thể tích hợp thêm các cổng thanh toán khác như MoMo hay VNPay không?

Hoàn toàn khả thi. Nhờ kiến trúc mở của Ruby on Rails và mô hình Service Layer (TicketBookingService), lập trình viên chỉ cần tạo thêm các adapter thanh toán tương ứng và cấu hình IPN (Instant Payment Notification) Webhook để nhận phản hồi trạng thái giao dịch.

4. Chi phí bảo trì và vận hành hệ thống hàng tháng ước tính bao nhiêu?

Do sử dụng nền tảng mã nguồn mở, chi phí cố định hàng tháng chủ yếu là chi phí thuê máy chủ Cloud/VPS (khoảng 10 - 20 USD/tháng cho quy mô 100.000 lượt truy cập/tháng) và tên miền (khoảng 10 USD/năm). Chi phí bảo trì định kỳ gần như bằng không nếu hệ thống được cấu hình sao lưu CSDL tự động qua Crontab.

5. Tại sao đồ án lại chọn Ruby on Rails thay vì PHP (Laravel) hay Node.js?

Ruby on Rails sở hữu triết lý Convention over Configuration, giúp giảm thiểu tối đa các thiết lập cấu hình thừa, tăng tốc độ phát triển dự án lên gấp 2-3 lần so với các nền tảng khác. Đồng thời, cấu trúc thư mục và quy chuẩn của Rails giúp mã nguồn có tính kỷ luật cao, dễ bảo trì, mở rộng và kiểm thử tự động.


Kết luận

Khóa luận tốt nghiệp "Phát triển hệ thống đặt vé xem phim trực tuyến trên nền tảng Ruby on Rails" của tác giả Đỗ Huy Thành (hướng dẫn bởi TS. Nguyễn Thanh Tuấn) đã giải quyết trọn vẹn và chuyên sâu bài toán tự động hóa quy trình phân phối vé xem phim. Dự án không chỉ dừng lại ở mặt lý thuyết nghiên cứu hệ thống thông tin quản lý mà còn hiện thực hóa thành công một sản phẩm phần mềm hoàn chỉnh, đáp ứng đầy đủ các tiêu chuẩn khắt khe về kiến trúc phần mềm, tính toàn vẹn dữ liệu, an toàn thông tin và trải nghiệm người dùng thực tế. Nền tảng mở ra cơ hội thương mại hóa và ứng dụng rộng rãi cho các chuỗi rạp chiếu phim đang tìm kiếm giải pháp chuyển đổi số toàn diện.