Đây là tài liệu kỹ thuật cốt lõi dùng chung cho luồng Đặt lịch (
US-OWN-09). Mục đích để đồng bộ logic xử lý Array giữa team Frontend và team Backend.1. Mục tiêu (Objective)
- Kiểm tra tính khả dụng của một lịch đặt ngay trên Frontend trước khi gửi Request lên API.
- Cải thiện trải nghiệm người dùng (UX) bằng cách phản hồi tức thì mỗi khi đổi số lượng Pet hoặc giờ đặt.
- Giảm tải cho Backend bằng cách chặn bớt các Request rác khi ca làm việc đã kín chỗ (Fully Booked).
2. Quy ước dữ liệu (Data Conventions)
- Khung giờ (Timeslot): Toàn bộ Timeline trong một ngày được chia thành một mảng (Array). Mỗi index trong mảng đại diện cho một khung giờ cố định (Ví dụ:
30 phút / 1 slot). - Sức chứa (Capacity): Giá trị của phần tử tại mỗi index thể hiện sức chứa của cửa hàng tại khung giờ đó.
- Mảng BE (Supply Matrix): Mảng do Backend sinh ra, thể hiện sức chứa còn trống.
- Mảng FE (Demand Matrix): Mảng do Frontend tự dựng, thể hiện sức chứa cần tiêu tốn cho booking hiện tại.
3. Nhiệm vụ của Backend (Supply Side)
Khi Frontend gọi API lấy lịch khả dụng của một Dịch vụ trong 1 ngày, Backend phải trả về Mảng BE (Supply Matrix).1
Tổng hợp Sức chứa tối đa (Max Capacity)
BE quét US-MER-06 (Ma trận Nhân sự & Kỹ năng) để đếm số lượng nhân viên Active, đang rảnh và có khả năng làm dịch vụ này tại từng khung giờ.
2
Trừ đi Booking đã nhận
BE trừ đi số lượng Slot đã bị chiếm bởi các Booking ở trạng thái
Pending và Confirmed.3
Trả về Payload (Ví dụ)
4. Nhiệm vụ của Frontend (Validation Algorithm)
Mỗi khi người dùng tương tác chọn Giờ đặt hoặc đổi Số lượng Pet, Frontend không gọi API mà tự chạy Javascript thuật toán sau:Bước 1: Tính toán Demand (Giá trị A)
Bước 1: Tính toán Demand (Giá trị A)
- Lấy thông số
Hạn mức tải / 1 Pettừ cấu hình dịch vụ (US-MER-04). - Công thức:
A = (Hạn mức tải của dịch vụ) x (Số lượng pet được chọn) - Ví dụ: Dịch vụ Tắm chó lớn tốn 2 capacity/bé. Khách đặt 2 bé ➔
A = 4.
Bước 2: Xây dựng Ma trận Booking (Mảng C)
Bước 2: Xây dựng Ma trận Booking (Mảng C)
- Khởi tạo mảng
Ctoàn số0với độ dài bằng độ dài mảng của BE. - Dựa vào thời gian bắt đầu và thời lượng dịch vụ, xác định dịch vụ sẽ chiếm dụng những Index nào.
- Fill giá trị
Avào các Index đó. - Ví dụ: Booking 2 tiếng (tương đương 4 slot 30 phút), bắt đầu từ slot số 2. Mảng C có dạng:
[0, A, A, A, A, 0, 0...]
Bước 3: Đối chiếu Khả dụng
Bước 3: Đối chiếu Khả dụng
Thực hiện phép trừ ma trận: Quyết định UI dựa trên Mảng D:
Mảng kết quả (D) = Mảng BE - Mảng CVí dụ minh hoạ:- Quét qua Mảng D, nếu TẤT CẢ các phần tử đều >= 0: Trạng thái Khả dụng 👉 Cho phép đặt (Enable nút Submit).
- Nếu có BẤT KỲ 1 phần tử nào < 0: Trạng thái Quá tải 👉 Báo lỗi, Disable nút Đặt lịch, bôi đỏ các khung giờ bị âm.
5. Ràng buộc Xử lý Ngoại lệ (Race Condition)
Vì Mảng BE gửi xuống Frontend là dữ liệu tại thời điểm load trang, việc xung đột (tranh chấp lượt đặt) khi 2 người cùng đặt 1 slot là hoàn toàn có thể xảy ra. Q quy tắc bắt buộc đối với Backend:- Khi FE thực hiện Request gọi API
POST /bookings(Tạo Booking thực tế). - BE TUYỆT ĐỐI KHÔNG TIN TƯỞNG kết quả check của FE.
- BE phải chạy lại hàm đối chiếu ma trận này một lần nữa bằng dữ liệu Database real-time.
- Nếu kết quả ra số âm (Bị khách khác lấy mất slot trong lúc đang chọn), BE trả về HTTP 400 kèm mã lỗi
SLOT_UNAVAILABLE. - FE nhận lỗi, popup thông báo khách hàng và load lại API lấy
available_capacitymới nhất.