← Quay lại mục lục

Bài 28 — Đặt lịch khám bệnh

Đặt lịch 5 bước: chuyên khoa → bác sĩ → slot → thông tin bệnh nhân → xác nhận. Test time-based slot, conditional validation cho trẻ em, slot lock.

Khó #system #time-based #conditional-validation #slot-lock #booking #medical

🏢 Bài 28: Đặt lịch khám bệnh

Luồng đặt lịch điển hình của 1 hệ thống y tế: chọn chuyên khoa → chọn bác sĩ → chọn slot → khai báo thông tin bệnh nhân → xác nhận. Bài này tập trung vào time-based logic, conditional validation, và concurrency.

📊 Sơ đồ flow

    ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌────────────┐
    │chuyên    │ →  │ bác sĩ   │ →  │   slot   │ →  │  thông   │ →  │  xác nhận  │
    │khoa      │    │          │    │          │    │ tin BN   │    │            │
    │(Screen 1)│    │(Screen 2)│    │(Screen 3)│    │(Screen 4)│    │ (Screen 5) │
    └──────────┘    └──────────┘    └──────────┘    └──────────┘    └────────────┘

📋 Đặc tả

🟦 Screen 1 — Chuyên khoa

Chọn 1 trong 4 chuyên khoa: Nội tổng quát, Ngoại khoa, Sản phụ khoa, Nhi khoa.

🟨 Screen 2 — Bác sĩ

  • Hiển thị danh sách các bác sĩ thuộc chuyên khoa đã chọn.
  • Mỗi bác sĩ có 1 trong 3 trạng thái:
    • available — Sẵn sàng khám.
    • busy — Đang khám bệnh nhân khác (có thể đặt cho slot sau).
    • on_leave — Đang nghỉ phép (KHÔNG cho phép đặt).
  • Bác sĩ on_leave phải bị ẩn hoặc disable, không cho click chọn.

🟧 Screen 3 — Chọn slot

  • Hiển thị slot grid: 7 ngày tới (hôm nay → hôm nay + 6).
  • Mỗi ngày có 6 slot: 08:00, 09:00, 10:00, 14:00, 15:00, 16:00.
  • Slot đã quá giờ trong ngày hiện tại (ví dụ: lúc 14:30 mở trang → các slot 08:00, 09:00, 10:00 cùng ngày phải bị disable).
  • Slot đã có người đặt với cùng bác sĩ → bị disable + hiển thị "Đã đặt".

🟪 Screen 4 — Thông tin bệnh nhân

FieldYêu cầu
Họ tênBắt buộc, 2-100 ký tự.
Năm sinhBắt buộc, 1900 ≤ năm ≤ năm hiện tại. Tự tính tuổi.
Số điện thoạiBắt buộc. Đúng 10 chữ số bắt đầu bằng 0 (regex /^0\d{9}$/). Không cho phép chữ, ký tự đặc biệt, dấu cách.
Triệu chứngBắt buộc, ≥ 10 ký tự.
Người giám hộ — Họ tênBắt buộc nếu bệnh nhân < 18 tuổi, ngược lại là tùy chọn.
Người giám hộ — SĐTBắt buộc nếu bệnh nhân < 18 tuổi. Cùng format SĐT bệnh nhân.

🟩 Screen 5 — Xác nhận

  • Hiển thị mã booking (vd: BK20260427-001).
  • Tổng hợp: chuyên khoa + bác sĩ + ngày giờ + thông tin bệnh nhân.
  • Nút "Đặt lịch khám tiếp" → reset state, về Screen 1.

🎯 Test scenarios cần cover

  1. Happy path: Chọn đầy đủ 5 bước → confirmation hiển thị mã booking.
  2. Bác sĩ nghỉ phép: Vào danh sách bác sĩ → bác sĩ on_leave phải bị ẩn/disable.
  3. Slot quá giờ: Mở vào buổi chiều → các slot buổi sáng cùng ngày phải bị disable.
  4. Slot trùng: Đặt 1 slot cho bác sĩ A → quay lại đặt lại cùng slot cùng bác sĩ → phải bị chặn / slot disabled.
  5. Phone không hợp lệ: Test các giá trị "abc1234567", "012-345-6789", "+84901234567", "0", 9 số, 11 số.
  6. Trẻ em: Năm sinh = năm nay - 10 (10 tuổi) → form phải bắt buộc thông tin người giám hộ. Bỏ trống → fail validation.
  7. Ranh giới 18 tuổi: Năm sinh = năm nay - 17 (17t, vẫn cần GH) vs năm nay - 18 (18t, không cần). So sánh boundary.
  8. Năm sinh: Test giá trị 1899, 1900, năm hiện tại, năm tương lai.

💡 Kỹ thuật test áp dụng

  • Time-based: Slot picker phụ thuộc vào giờ hiện tại + ngày hiện tại.
  • Conditional validation: Field giám hộ chỉ bắt buộc khi tuổi < 18.
  • Boundary value: Tuổi 17/18, năm 1900, slot rìa giờ.
  • Equivalence partitioning: Status bác sĩ (available/busy/on_leave), tuổi (<18, ≥18).
  • Format validation: Phone regex.
  • Concurrency: 2 tab cùng đặt 1 slot.

📝 Template bug report

STTMô tảBước tái hiệnThực tếMong đợiMức độ
1(học viên điền)
⚠️ Lưu ý: Bài này có cài cắm 6 bug ở các screen khác nhau, đặc biệt nhiều bug liên quan đến thời gian thựcđiều kiện ngầm.
💡 Mẹo: Để test bug "slot quá giờ", hãy mở trang vào buổi chiều (sau 10:00 sáng) — khi đó các slot 08:00 / 09:00 / 10:00 trong ngày phải bị disable nếu spec đúng.
🔐

Vui lòng đăng nhập để nộp bài.

Đăng nhập
🔐

Tab dành cho giảng viên

Tab này chứa danh sách các lỗi đã cài cắm trong form. Vui lòng nhập mã giảng viên để mở khóa. Mã sẽ ghi nhớ trong phiên làm việc — chỉ cần nhập 1 lần cho cả 3 bài.