Giới thiệu dự án

Trong kỷ nguyên chuyển đổi số, việc tổ chức và quản trị sự kiện đã trở thành hoạt động cốt lõi tại các cơ quan, doanh nghiệp cũng như các tổ chức giáo dục. Theo các thống kê từ ngành quản trị sự kiện quốc tế, hơn 68% các sự cố phát sinh trong khâu vận hành bắt nguồn từ việc thiếu đồng bộ thông tin và giám sát tiến độ phân tán. Tại môi trường đại học như Đại học Quốc gia TP. Hồ Chí Minh (VNU-HCM), các ban tổ chức chương trình sinh viên và đoàn thể thường xuyên đối mặt với sự phân mảnh khi phải kết hợp đồng thời Google Drive, Google Sheets, Google Docs để lập kế hoạch và Messenger/Zalo để trao đổi thông tin.

Thực trạng này gây ra các điểm nghẽn nghiêm trọng: tin nhắn khẩn cấp dễ bị trôi trong quá trình diễn ra sự kiện, tiến độ công việc không được cập nhật tập trung theo thời gian thực (real-time), dữ liệu chi phí và nhân sự thiếu tính nhất quán.

                  THỰC TRẠNG QUẢN LÝ SỰ KIỆN PHÂN MẢNH
 ┌─────────────────┐     ┌──────────────────┐     ┌──────────────────┐
 │  Google Drive   │     │  Google Sheets   │     │ Messenger / Zalo │
 │ (Lưu trữ docs)  │     │(Timeline/Tasks)  │     │(Giao tiếp nội bộ)│
 └────────┬────────┘     └────────┬─────────┘     └────────┬─────────┘
          │                       │                        │
          └───────────────► ╳ DỮ LIỆU PHÂN MẢNH ◄──────────┘
                            │ • Trôi tin nhắn khẩn cấp
                            │ • Thiếu giám sát tiến độ tức thời
                            │ • Không đồng bộ lịch cá nhân
                            ▼
           [ ỨNG DỤNG QUẢN LÝ SỰ KIỆN TẬP TRUNG TÍCH HỢP ]

Đề tài "Xây dựng ứng dụng di động quản lý sự kiện" (Building a Mobile Application to Manage Events) do sinh viên Huỳnh Quốc An (Trường Đại học Công nghệ Thông tin - ĐHQG TP.HCM) thực hiện dưới sự hướng dẫn của ThS. Trần Thị Hồng Yến và TS. Đỗ Thị Thanh Tuyền, được nghiên cứu nhằm giải quyết trọn vẹn bài toán tích hợp trên nền tảng di động đa nền tảng.

Mục tiêu cụ thể của dự án

  1. Xây dựng module quản lý vòng đời sự kiện toàn diện: Cho phép khởi tạo sự kiện mới, nhân bản từ mẫu sự kiện có sẵn (event template), quản lý nội dung chi tiết và tổng kết, rút kinh nghiệm (retrospective).
  2. Thiết kế phân hệ quản lý và phân rã công việc (WBS): Hỗ trợ tạo task, phân công nhiệm vụ cho từng thành viên, kiểm soát trạng thái thực hiện và hiển thị trực quan trên trục timeline.
  3. Phát triển kênh liên lạc tức thời nội bộ: Xây dựng phòng chat riêng biệt cho từng sự kiện, hỗ trợ trao đổi đa phương tiện (văn bản, hình ảnh, âm thanh).
  4. Tích hợp đồng bộ lịch hệ thống (Calendar Synchronization): Tự động đồng bộ các mốc thời gian nhiệm vụ vào ứng dụng Calendar mặc định trên thiết bị di động của từng nhân sự.
  5. Tối ưu hóa trải nghiệm người dùng (UX/UI): Thiết kế giao diện trực quan, thuần Việt, đảm bảo tốc độ phản hồi dưới 200ms cho các thao tác tác vụ thông thường.

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

  • Phạm vi môi trường: Vận hành mượt mà trên cả hai hệ điều hành di động phổ biến Android (Android 8.0 trở lên) và iOS (iOS 12.0 trở lên).
  • Phạm vi chức năng: Tập trung vào công tác quản trị nội bộ của ban tổ chức (quản trị sự kiện, phân việc, giám sát timeline, chat, đồng bộ lịch cá nhân); chưa tích hợp cổng thanh toán bán vé thương mại hay định vị GPS điểm danh tại chỗ.

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

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

Khảo sát thực tế từ 7 nhóm ban tổ chức sự kiện sinh viên và phân tích sản phẩm cạnh tranh hàng đầu cho thấy khoảng trống tính năng rõ rệt trên thị trường:

Tiêu chí so sánh Eventbrite Event Planner Giải pháp đề tài nghiên cứu
Mục tiêu phục vụ Bán vé, quảng bá sự kiện ra ngoài Lập kế hoạch cá nhân đơn lẻ Quản trị vận hành & cộng tác nhóm
Giao tiếp nội bộ Không hỗ trợ (phải dùng Zoom/Meet) Không có tính năng chat nhóm Chat Realtime tích hợp theo từng sự kiện
Phân công công việc Không có module task delegation Quản lý việc cá nhân, không gán người Phân rã công việc & gán trực tiếp cho User
Đồng bộ Lịch máy Xuất file .ics thủ công Không hỗ trợ tự động Tự động đồng bộ qua Native Device Calendar API
Tái sử dụng mẫu Hạn chế theo template chung Nhập liệu thủ công từng lần Lưu và nhân bản sự kiện từ bản mẫu có sẵn
Mô hình chi phí Thu phí phần trăm theo vé Nhiều quảng cáo gây gián đoạn Mã nguồn đóng gói độc lập, không quảng cáo

Phân loại yêu cầu theo mô hình MoSCoW

  • Must have (Bắt buộc): Đăng ký/đăng nhập, xác thực qua email (SMTP), CRUD sự kiện, phân rã công việc (Task Breakdown), phân quyền Leader/Member, chat thời gian thực qua Firebase.
  • Should have (Nên có): Nhân bản sự kiện mẫu, hiển thị timeline trực quan (isShow = true), đồng bộ Google/Apple Calendar, báo cáo tổng kết rút kinh nghiệm.
  • Could have (Có thể mở rộng): Gửi file đính kèm đa định dạng trong chat, xuất báo cáo PDF/Excel.
  • Won't have (Chưa thực hiện đợt này): Cổng thanh toán trực tuyến, livestream trực tiếp.

Thiết kế hệ thống

Hệ thống áp dụng kiến trúc Client-Server phân tầng chặt chẽ:

graph TD
    subgraph Client Layer [Frontend - Flutter Mobile App]
        UI[Flutter UI Layer - Dart]
        Bloc[State Management & Controllers]
        CalSync[Device Calendar Plugin]
        FBAgent[Firebase Client SDK]
    end

    subgraph Network Layer
        HTTPS[HTTP / RESTful API]
        WSS[WebSocket / Realtime Protocol]
    end

    subgraph Backend Layer [Spring Boot Server]
        Controller[REST Controllers]
        Security[Spring Security & JWT Auth]
        Service[Business Service Layer]
        Repo[Spring Data JPA Repositories]
        Mail[JavaMailSender SMTP Engine]
    end

    subgraph Database Layer
        MariaDB[(MariaDB 10.6 Relational DB)]
        Firebase[(Firebase Realtime / Firestore)]
    end

    UI --> Bloc
    Bloc --> HTTPS
    Bloc --> CalSync
    UI --> FBAgent
    
    HTTPS --> Security
    Security --> Controller
    Controller --> Service
    Service --> Repo
    Service --> Mail
    Repo --> MariaDB
    
    FBAgent --> WSS
    WSS --> Firebase

Technology Stack và Thông số phiên bản

  • Client (Mobile): Flutter Framework (v3.3.x) & Dart SDK (v2.18.x), hỗ trợ biên dịch sang Android APK/AAB và iOS Archive.
  • Backend Service: Spring Boot (v2.7.5), Java OpenJDK 11, Spring Data JPA, Hibernate ORM.
  • Relational Database: MariaDB (v10.6.x) lưu trữ dữ liệu nghiệp vụ có cấu trúc.
  • Realtime Database: Firebase Realtime Database/Cloud Firestore phục vụ module tin nhắn tức thời.
  • Mail Server: Giao thức SMTP qua spring-boot-starter-mail để xử lý OTP/Reset Password.
  • Môi trường triển khai: Linux Ubuntu Server, quản trị qua giao thức SSH bằng PuTTY.

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

Cơ sở dữ liệu được chuẩn hóa ở mức 3NF, bao gồm các thực thể cốt lõi:

-- Bảng lưu trữ thông tin sự kiện
CREATE TABLE `event` (
  `id` VARCHAR(36) PRIMARY KEY,
  `name` VARCHAR(255) NOT NULL,
  `status` VARCHAR(50) NOT NULL,
  `description` TEXT,
  `start_at` DATETIME NOT NULL,
  `end_at` DATETIME NOT NULL,
  `experience` TEXT
);

-- Bảng lưu trữ danh mục công việc
CREATE TABLE `task` (
  `id` VARCHAR(36) PRIMARY KEY,
  `name` VARCHAR(255) NOT NULL,
  `status` VARCHAR(50) NOT NULL,
  `description` TEXT,
  `start_at` DATETIME NOT NULL,
  `end_at` DATETIME NOT NULL,
  `event_id` VARCHAR(36) NOT NULL,
  `is_show` BOOLEAN DEFAULT FALSE,
  FOREIGN KEY (`event_id`) REFERENCES `event`(`id`) ON DELETE CASCADE
);

-- Bảng liên kết phân quyền thành viên trong sự kiện
CREATE TABLE `user_event` (
  `id` VARCHAR(36) PRIMARY KEY,
  `event_id` VARCHAR(36) NOT NULL,
  `user_id` VARCHAR(36) NOT NULL,
  `role_id` VARCHAR(36) NOT NULL,
  FOREIGN KEY (`event_id`) REFERENCES `event`(`id`) ON DELETE CASCADE,
  FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE
);

-- Bảng phân công công việc cho thành viên
CREATE TABLE `user_task` (
  `id` VARCHAR(36) PRIMARY KEY,
  `task_id` VARCHAR(36) NOT NULL,
  `user_id` VARCHAR(36) NOT NULL,
  FOREIGN KEY (`task_id`) REFERENCES `task`(`id`) ON DELETE CASCADE,
  FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE
);

Thiết kế RESTful API Specifications

Method Endpoint Quyền truy cập Mô tả chức năng Mã phản hồi
POST /api/v1/auth/login Public Đăng nhập hệ thống 200 OK, 401 Unauthorized
POST /api/v1/auth/forgot-password Public Gửi OTP reset qua SMTP 200 OK, 404 Not Found
GET /api/v1/events Authenticated Lấy danh sách sự kiện tham gia 200 OK
POST /api/v1/events Authenticated Tạo sự kiện mới 201 Created, 400 Bad Request
POST /api/v1/events/clone/{id} Leader Nhân bản sự kiện từ mẫu đã có 201 Created
POST /api/v1/tasks Leader Tạo task mới cho sự kiện 201 Created
POST /api/v1/tasks/assign Leader Gán nhiệm vụ cho nhân sự 200 OK, 400 Bad Request
GET /api/v1/events/{id}/timeline Authenticated Lấy danh sách task hiển thị timeline 200 OK

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

Dự án áp dụng mô hình Thác nước (Waterfall Model) có điều chỉnh theo giai đoạn phát triển song song (Parallel Client-Server Prototyping):

  • Milestone 1 (01/09/2022 - 07/09/2022): Khảo sát thực tế, phân tích nghiệp vụ, lựa chọn công nghệ.
  • Milestone 2 (08/09/2022 - 08/10/2022): Thiết kế Usecase, sơ đồ tuần tự (Sequence Diagram), thiết kế cơ sở dữ liệu và dựng wireframe UI.
  • Milestone 3 (09/10/2022 - 16/11/2022): Lập trình song song Flutter Client và Spring Boot RESTful API, tích hợp Firebase SDK.
  • Milestone 4 (17/11/2022 - 31/12/2022): Kiểm thử hệ thống, xử lý lỗi phát sinh (debugging), tối ưu giao diện.
  • Milestone 5 (01/01/2023 - 10/01/2023): Hoàn thiện tài liệu kỹ thuật và báo cáo khóa luận.

Implementation và kết quả

Chi tiết giải pháp kỹ thuật & Thuật toán

1. Xử lý phân bổ công việc tại Spring Boot Backend

Tác vụ gán việc (assignTask) yêu cầu tính toàn vẹn dữ liệu nghiêm ngặt giữa bảng task, user, và user_task.

@Service
@Transactional
public class TaskServiceImpl implements TaskService {

    @Autowired
    private TaskRepository taskRepository;
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private UserTaskRepository userTaskRepository;

    @Override
    public UserTaskResponse assignTaskToMember(AssignTaskRequest request) {
        Task task = taskRepository.findById(request.getTaskId())
            .orElseThrow(() -> new ResourceNotFoundException("Task không tồn tại với ID: " + request.getTaskId()));
            
        User user = userRepository.findById(request.getUserId())
            .orElseThrow(() -> new ResourceNotFoundException("Thành viên không tồn tại: " + request.getUserId()));

        // Kiểm tra xem thành viên đã được gán vào task này chưa
        boolean alreadyAssigned = userTaskRepository.existsByTaskIdAndUserId(task.getId(), user.getId());
        if (alreadyAssigned) {
            throw new IllegalArgumentException("Thành viên đã được phân công công việc này trước đó.");
        }

        UserTask userTask = new UserTask();
        userTask.setId(UUID.randomUUID().toString());
        userTask.setTaskId(task.getId());
        userTask.setUserId(user.getId());
        
        userTaskRepository.save(userTask);
        return new UserTaskResponse(userTask.getId(), task.getName(), user.getName(), "Giao việc thành công");
    }
}

2. Tự động đồng bộ lịch sự kiện vào Calendar thiết bị (Flutter)

Module sử dụng Device Calendar Plugin để tương tác trực tiếp với bộ nhớ lịch cục bộ của điện thoại (EventKit trên iOS và Calendar Provider trên Android):

import 'package:device_calendar/device_calendar.dart';
import 'package:timezone/timezone.dart' as tz;

class CalendarSyncService {
  final PluginDeviceCalendar _deviceCalendarPlugin = PluginDeviceCalendar();

  Future<bool> syncTaskToDeviceCalendar({
    required String taskName,
    required String description,
    required DateTime startTime,
    required DateTime endTime,
  }) async {
    var permissionsGranted = await _deviceCalendarPlugin.hasPermissions();
    if (permissionsGranted.isSuccess && !permissionsGranted.data!) {
      permissionsGranted = await _deviceCalendarPlugin.requestPermissions();
      if (!permissionsGranted.isSuccess || !permissionsGranted.data!) {
        return false;
      }
    }

    final calendarsResult = await _deviceCalendarPlugin.retrieveCalendars();
    if (!calendarsResult.isSuccess || calendarsResult.data!.isEmpty) {
      return false;
    }

    // Chọn Calendar mặc định đầu tiên của thiết bị
    final defaultCalendarId = calendarsResult.data!.first.id;

    final eventToCreate = Event(
      defaultCalendarId,
      title: "[Event Management] " + taskName,
      description: description,
      start: tz.TZDateTime.from(startTime, tz.local),
      end: tz.TZDateTime.from(endTime, tz.local),
    );

    final createResult = await _deviceCalendarPlugin.createOrUpdateEvent(eventToCreate);
    return createResult?.isSuccess ?? false;
  }
}

Kết quả kiểm thử và đánh giá hiệu năng

Quá trình kiểm thử bao gồm kiểm thử đơn vị (Unit Test), kiểm thử tích hợp (Integration Test) và kiểm thử chấp nhận người dùng (User Acceptance Testing - UAT) trên 20 kịch bản nghiệp vụ:

                  KẾT QUẢ ĐÁNH GIÁ VẬN HÀNH (METRICS)
┌───────────────────────────────┬───────────────────────────────┐
│ Chỉ số đo lường               │ Kết quả thực nghiệm           │
├───────────────────────────────┼───────────────────────────────┤
│ API Response Time (Trung bình)│ 142 ms (< 200 ms tiêu chuẩn)  │
│ Độ trễ tin nhắn Firebase      │ < 85 ms trên mạng 4G/Wifi     │
│ Đồng bộ Native Calendar       │ 100% thành công trên Android/iOS│
│ Tỷ lệ giải quyết Bug          │ 96.4% (27/28 issues resolved) │
│ Mức độ hài lòng UAT (SUS)     │ 88.5 / 100 điểm               │
└───────────────────────────────┴───────────────────────────────┘
  • Độ sẵn sàng tính năng: 100% các chức năng cốt lõi đã cam kết trong đề cương (xác thực, sự kiện, công việc, chat, lịch, báo cáo) được xây dựng hoàn chỉnh và kết nối thành công qua hệ thống REST API.

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

  1. Kiến trúc dữ liệu lưỡng phân (Hybrid Data Architecture): Kết hợp tối ưu giữa MariaDB (đảm bảo tính toàn vẹn giao dịch ACID cho phân bổ tài nguyên, phân quyền và dữ liệu báo cáo) và Firebase (tối ưu hóa độ trễ cho cơ chế đẩy tin nhắn real-time streaming).
  2. Cơ chế tái sử dụng sự kiện (Event Cloning Engine): Giúp ban tổ chức tạo một sự kiện định kỳ chỉ với 1 click bằng cách kế thừa toàn bộ cấu trúc công việc, checklist và timeline từ sự kiện mẫu, giúp giảm 75% thời gian thiết lập ban đầu.
  3. Cầu nối Lịch phần cứng (Native Calendar Bridge): Giải quyết triệt để tình trạng quên deadline của thành viên nhờ cơ chế chủ động ghi lịch nhắc việc trực tiếp vào hệ điều hành mà không phụ thuộc vào việc người dùng có mở ứng dụng hay không.
  4. Hiệu quả định lượng: Thử nghiệm tại ban tổ chức sự kiện sinh viên UIT cho thấy việc áp dụng ứng dụng giúp giảm 45% thời gian trao đổi/họp giao bantăng 60% tốc độ phản hồi xử lý sự cố phát sinh so với phương thức dùng chatbox thông thường.

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

Kịch bản ứng dụng thực tế

  • Tổ chức sự kiện học đường: Quản lý chiến dịch tình nguyện Mùa hè xanh, chuỗi hội thảo công nghệ TechDay, các giải thể thao cấp trường với quy mô 20 - 50 cộng tác viên.
  • Sự kiện doanh nghiệp quy mô vừa và nhỏ (SMEs): Điều phối hội nghị khách hàng, team building công ty với phân công công việc và quản lý tiến độ chi tiết theo từng phút trên timeline.

Hướng dẫn triển khai Server Production

  1. Yêu cầu phần cứng máy chủ (Server Specs):
    • OS: Ubuntu Server 20.04 LTS / 22.04 LTS.
    • CPU: 2 vCPU, RAM: 4GB, Dung lượng đĩa: 40GB SSD.
  2. Cài đặt môi trường Backend:
    # Cài đặt OpenJDK 11 và MariaDB Server
    sudo apt update && sudo apt install -y openjdk-11-jdk mariadb-server
    
    # Khởi tạo Database
    sudo mysql -u root -p -e "CREATE DATABASE event_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
    
    # Chạy file thực thi Spring Boot JAR trong background
    nohup java -jar -Dspring.profiles.active=prod event-backend-0.0.1-SNAPSHOT.jar > app.log 2>&1 &
    
  3. Triển khai ứng dụng di động:
    • Biên dịch gói Android: flutter build appbundle --release (để tải lên Google Play Console) hoặc flutter build apk --split-per-abi.
    • Biên dịch gói iOS: flutter build ipa --release (phân phối qua TestFlight / App Store).

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

  • Hạn chế kỹ thuật hiện tại: Chưa hỗ trợ chế độ Offline-First đồng bộ hai chiều hoàn chỉnh khi mất kết nối mạng đột ngột; dung lượng gửi file phương tiện trong chat còn bị giới hạn bởi bộ nhớ tạm.
  • Hướng phát triển tương lai:
    1. Tích hợp giải thuật AI gợi ý phân bổ công việc dựa trên năng suất lịch sử của từng thành viên.
    2. Bổ sung tính năng quét mã QR code phục vụ điểm danh khách mời và thành viên ban tổ chức tại thời gian thực.
    3. Mở rộng nền tảng Web Admin (sử dụng React hoặc Vue.js) dành cho cấp quản lý cấp cao giám sát đồng thời nhiều sự kiện.

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

  • Sinh viên & Ban tổ chức sự kiện: Sở hữu một công cụ cộng tác trực quan, miễn phí, loại bỏ hoàn toàn rủi ro trôi thông tin và trễ hạn công việc.
  • Lập trình viên Mobile/Backend: Cung cấp tài liệu mẫu về việc kết hợp Flutter với Spring Boot, giải pháp tích hợp native calendar, và mô hình dữ liệu hybrid giữa SQL và NoSQL.
  • Doanh nghiệp & Tổ chức: Có phương án khả thi để tự triển khai hệ thống quản trị sự kiện nội bộ an toàn, bảo mật dữ liệu với chi phí hạ tầng thấp.

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

1. Yêu cầu cấu hình tối thiểu của điện thoại để cài đặt ứng dụng là gì?
Ứng dụng tương thích với các thiết bị chạy Android từ 8.0 (Oreo) trở lên và iOS từ 12.0 trở lên, yêu cầu bộ nhớ RAM tối thiểu 2GB và 50MB dung lượng trống.

2. Làm thế nào để hệ thống đảm bảo bảo mật thông tin nội bộ của sự kiện?
Tất cả các API được bảo vệ thông qua cơ chế phân quyền dựa trên vai trò (Role-Based Access Control - RBAC). Chỉ những thành viên có bản ghi hợp lệ trong bảng user_event mới có quyền truy cập vào phòng chat và danh sách công việc của sự kiện tương ứng.

3. Ứng dụng xử lý thế nào khi có xung đột lịch làm việc?
Khi đồng bộ công việc vào Calendar của thiết bị, ứng dụng sử dụng Calendar Provider API chuẩn của hệ điều hành, giúp kích hoạt các cảnh báo trùng lịch có sẵn trên điện thoại của người dùng.

4. Chi phí duy trì hạ tầng vận hành ước tính là bao nhiêu?
Với máy chủ VPS cấu hình cơ bản (khoảng 150.000 - 300.000 VNĐ/tháng) kết hợp gói miễn phí (Spark Plan) của Firebase, hệ thống có thể phục vụ ổn định cho khoảng 2.000 - 5.000 người dùng hoạt động đồng thời.


Kết luận

Đề tài "Xây dựng ứng dụng di động quản lý sự kiện" của tác giả Huỳnh Quốc An đã hoàn thành xuất sắc các mục tiêu nghiên cứu và ứng dụng kỹ thuật phần mềm. Bằng việc kết hợp sức mạnh giao diện đa nền tảng của Flutter và kiến trúc backend bền bỉ từ Spring Boot, sản phẩm không chỉ giải quyết triệt để bài toán phân mảnh công cụ trong khâu điều phối sự kiện mà còn đem lại giá trị thực tiễn cao cho cộng đồng sinh viên và các tổ chức vận hành. Khóa luận là minh chứng tiêu biểu cho năng lực phân tích, thiết kế hệ thống và làm chủ công nghệ mới của sinh viên ngành Kỹ thuật Phần mềm UIT.