| Mục | Nội dung |
|---|---|
| プロジェクト名 | LMS |
| 機能名 | BOOK SEARCH — Tìm kiếm & Đăng ký mượn sách |
| 版数 | 00.01.00 |
| 日付 | 2026年5月25日 |
| FPT-作成 | FPT-レビュー | FPT-確認 |
|---|---|---|
| AnhNTM83 | — | — |
| 2026/5/25 | — | — |
| No | 版数 | 変更日 | 変更者 | 変更内容 | 要件確認 | 技術確認 |
|---|---|---|---|---|---|---|
| 1 | 00.01.00 | 2026/5/25 | AnhNTM83 | 初版 | — | — |
Screen: Tìm kiếm & Đăng ký mượn sách (Book Search & Borrow Registration)
Mô tả: Màn hình cho phép độc giả tìm kiếm sách trong thư viện, xem chi tiết sách, chọn sách để mượn ngay hoặc đặt trước, và gửi yêu cầu mượn gộp nhiều cuốn cùng lúc.
Chức năng chính:
| No | Role | Phạm vi hiển thị | Xem | Thao tác |
|---|---|---|---|---|
| 1 | Độc giả (Student) | Toàn bộ sách trong thư viện | ○ | ○ |
| 2 | Độc giả (Teacher) | Toàn bộ sách trong thư viện | ○ | ○ |
| 3 | Thủ thư | Toàn bộ sách trong thư viện | ○ | ✕ |

| Block | Tên | Items | Mô tả |
|---|---|---|---|
| ① | Header Block | 1.1–1.4 | Logo, thông tin tài khoản độc giả |
| ② | Search & Filter | 2.1–2.4 | Thanh tìm kiếm nhanh + bộ lọc nâng cao |
| ③ | Result Toolbar | 3.1–3.4 | Tổng kết quả, sắp xếp, chuyển đổi Grid/List |
| ④ | Book Card Grid | 4.1–4.10 | Danh sách thẻ sách kết quả |
| ⑤ | Pagination | 5.1–5.4 | Phân trang |
| ⑥ | Temp Table Header | 6.1–6.4 | Tiêu đề bảng tạm sách đã chọn |
| ⑦ | Temporary Book Grid | 7.1–7.7 | Bảng tạm danh sách sách mượn/đặt chờ |
| ⑧ | Summary Panel | 8.1–8.4 | Tổng hợp + nút gửi yêu cầu mượn gộp |

| No | テーブル名 | テーブル物理名 | I/O | 備考 |
|---|---|---|---|---|
| 1 | Users | users | O | Thông tin độc giả (session) |
| 2 | Books | books | I/O | Danh mục sách, trạng thái sách |
| 3 | Book Copies | book_copies | O | Bản sao vật lý của sách |
| 4 | Categories | categories | O | Danh mục thể loại sách |
| 5 | Authors | author | O | Thông tin tác giả |
| 6 | Publishers | publisher | O | Thông tin nhà xuất bản |
| 7 | Borrow Basket | borrow_basket | O | Giỏ mượn tạm thời |
| 8 | Loans | loan | I | Phiếu mượn tổng |
| 9 | Loan Details | loan_details | I | Chi tiết phiếu mượn từng sách |
| 10 | Reservations | reservation | I | Phiếu đặt trước sách |
| No | 表示名 | テーブル物理名.物理名 | I/O | 画面表示 | 種類 | 初期値 | 備考 |
|---|---|---|---|---|---|---|---|
| 1.1 | SmartLibrary (Logo) | — | — | ○ | Label | — | Logo hệ thống + tagline "Đăng ký mượn & Đặt chỗ trực tuyến" |
| 1.2 | Tên độc giả | users.full_name | O | ○ | Label | — | Lấy từ session Ev01 |
| 1.3 | Mã DG | users.user_code | O | ○ | Label | — | VD: HS-04269 |
| 1.4 | Avatar | users.avatar | O | ○ | Image | — | Ảnh đại diện độc giả. Tham khảo Ev19 |
| No | 表示名 | テーブル物理名.物理名 | I/O | 画面表示 | 種類 | 初期値 | 備考 |
|---|---|---|---|---|---|---|---|
| 2.1 | Thanh tìm kiếm nhanh | — | I | ○ | TextBox | "" (placeholder) | Max 255 ký tự. Tham khảo Ev02 |
| 2.2 | Bộ lọc nâng cao (Toggle) | — | — | ○ | Button | — | Tham khảo Ev03. Mặc định: Collapse |
| 2.2.1 | Tên sách | — | I | ○ | TextBox | "" | Max 100 ký tự. Param: Param_Search_BookName. Ev04 |
| 2.2.2 | Tác giả | — | I | ○ | TextBox | "" | Max 100 ký tự. Param: Param_Search_Author. Ev04 |
| 2.2.3 | Nhà xuất bản (NXB) | — | I | ○ | TextBox | "" | Max 100 ký tự. Param: Param_Search_Publisher. Ev04 |
| 2.2.4 | Thể loại | categories.category_id | I | ○ | Combobox | "Tất cả thể loại" | Param: Param_Search_CategoryID. Ev05 |
| 2.2.5 | Chỉ hiện sách có sẵn (Mượn online) | — | I | ○ | Checkbox | Unchecked | Mutual exclusive với 2.2.6. Ev06 |
| 2.2.6 | Chỉ hiện sách đã bị mượn (Đặt chờ) | — | I | ○ | Checkbox | Unchecked | Mutual exclusive với 2.2.5. Ev06 |
| 2.3 | Nút "Tìm kiếm" | — | — | ○ | Button | — | Tham khảo Ev07 |
| 2.4 | Nút "Reset bộ lọc" | — | — | ○ | Button | — | Tham khảo Ev08 |
| No | 表示名 | テーブル物理名.物理名 | I/O | 画面表示 | 種類 | 初期値 | 備考 |
|---|---|---|---|---|---|---|---|
| 3.1 | Tổng kết quả tìm kiếm | — | O | ○ | Label | — | VD: "Tìm thấy 8 sách phù hợp" |
| 3.2 | Dropdown sắp xếp | — | I | ○ | Combobox | "Tên sách (A-Z)" | Options: A-Z, Z-A, Mới nhất. Ev09 |
| 3.3 | Nút Grid View | — | — | ○ | Button | Active | Ev10 |
| 3.4 | Nút List View | — | — | ○ | Button | Inactive | Ev10 |
| No | 表示名 | テーブル物理名.物理名 | I/O | 画面表示 | 種類 | 初期値 | 備考 |
|---|---|---|---|---|---|---|---|
| 4.1 | Mã sách | books.book_id | O | ○ | Label | — | VD: B-111 |
| 4.2 | Ảnh bìa sách | books.cover_image | O | ○ | Image | — | Thumbnail bìa sách |
| 4.3 | Thể loại | categories.category_name | O | ○ | Label | — | VD: "Kinh tế / Quản trị" |
| 4.4 | Nguồn sách | books.source_type | O | ○ | Badge | — | "MƯỢN ONLINE" / "NGUỒN OFFLINE" |
| 4.5 | Tên sách | books.title | O | ○ | Label | — | Tên đầy đủ cuốn sách |
| 4.6 | Tác giả | author.author_name | O | ○ | Label | — | VD: "Tác giả: Song Hongbing" |
| 4.7 | Nhà xuất bản | publisher.publisher_name | O | ○ | Label | — | VD: "NXB: NXB Lao Động" |
| 4.8 | Trạng thái sách | books.books_status | O | ○ | Badge | — | "Còn sách sẵn" (xanh) / "Đã mượn hết" (đỏ) |
| 4.9 | Nút Xem chi tiết | — | — | ○ | Button (icon mắt) | — | Tham khảo Ev11 |
| 4.10 | Nút Action | — | — | ○ | Button | Active | "[+ Chọn mượn ngay]" / "[+ Chọn đặt chờ]" / "[✓ Đã chọn]". Ev12 |
| No | 表示名 | テーブル物理名.物理名 | I/O | 画面表示 | 種類 | 初期値 | 備考 |
|---|---|---|---|---|---|---|---|
| 5.1 | Thông tin phân trang | — | O | ○ | Label | — | "Hiển thị 1-8 trên tổng 12 bản ghi" |
| 5.2 | Nút Previous | — | — | ○ | Button | — | Tham khảo Ev13 |
| 5.3 | Số trang (5.3.1, 5.3.2...) | — | — | ○ | Button | Trang 1 active | Tham khảo Ev13 |
| 5.4 | Nút Next | — | — | ○ | Button | — | Tham khảo Ev13 |
| No | 表示名 | テーブル物理名.物理名 | I/O | 画面表示 | 種類 | 初期値 | 備考 |
|---|---|---|---|---|---|---|---|
| 6.1 | Checkbox chọn tất cả | — | I | ○ | Checkbox | Unchecked | Tham khảo Ev14 |
| 6.2 | Label tiêu đề | — | — | ○ | Label | — | "DANH SÁCH SÁCH BẢNG CHỌN MƯỢN / ĐẶT CHỜ" |
| 6.3 | Badge tổng số sách tạm | — | O | ○ | Badge | 0 | Tự động đếm tổng dòng trong Khối 7 |
| 6.4 | Nút Collapse/Expand | — | — | ○ | Button | Expand | Tham khảo Ev15. Toggle ẩn/hiện Khối 7 & 8 |
| No | 表示名 | テーブル物理名.物理名 | I/O | 画面表示 | 種類 | 初期値 | 備考 |
|---|---|---|---|---|---|---|---|
| 7.1 | Checkbox chọn dòng | — | I | ○ | Checkbox | Checked | Tham khảo Ev16. Mặc định tích khi thêm mới |
| 7.2 | Mã sách | books.book_id | O | ○ | Label | — | Lấy từ thẻ sách đã chọn |
| 7.3 | Tên sách | books.title | O | ○ | Label | — | — |
| 7.4 | Tác giả | author.author_name | O | ○ | Label | — | — |
| 7.5 | Thể loại | categories.category_name | O | ○ | Label | — | — |
| 7.6 | Hình thức đăng ký | — | O | ○ | Badge | — | "Đăng ký mượn" (xanh) / "Đặt hàng chờ" (cam). Disable chỉnh sửa |
| 7.7 | Nút Xóa | — | — | ○ | Button (icon thùng rác) | — | Tham khảo Ev17 |
| No | 表示名 | テーブル物理名.物理名 | I/O | 画面表示 | 種類 | 初期値 | 備考 |
|---|---|---|---|---|---|---|---|
| 8.1 | Label "Số lượng để chọn" | — | — | ○ | Label | — | — |
| 8.2 | Số lượng sách đã tích chọn | — | O | ○ | Label | 0 | Tự động đếm dòng Checked = True |
| 8.3 | Nút Gửi Yêu Cầu Mượn Gộp | — | — | ○ | Button | Disabled | Tham khảo Ev18. Enable khi 8.2 ∈ [1, 5] |
| 8.4 | Ghi chú giới hạn | — | — | ○ | Label | — | "Gộp tối đa 5 cuốn sách…" |
| No | 表示名 | 種類 | 備考 |
|---|---|---|---|
| 11 | Header | Common area | Tham khảo tài liệu Common Design |
| 12 | Menu hệ thống | Common area | Tham khảo tài liệu Common Design |
| # | ID | Tên Event | Trigger | Mô tả |
|---|---|---|---|---|
| 1 | Ev01 | Hiển thị khởi tạo màn hình | Load | Kiểm tra phân quyền, lấy session, tải 12 sách mặc định |
| 2 | Ev02 | Nhập từ khóa tìm kiếm nhanh | Text Change | Gõ text tại thanh tìm kiếm nhanh (2.1) |
| 3 | Ev03 | Click button "Bộ lọc nâng cao" | Click | Toggle ẩn/hiện panel bộ lọc chi tiết (2.2) |
| 4 | Ev04 | Nhập thông tin lọc nâng cao | Text Change | Nhập Tên sách (2.2.1), Tác giả (2.2.2), NXB (2.2.3) |
| 5 | Ev05 | Chọn Thể loại từ Dropdown | Select | Chọn thể loại sách từ dropdown (2.2.4) |
| 6 | Ev06 | Tích chọn bộ lọc nhanh Checkbox | Click | Checkbox sách có sẵn (2.2.5) / đã mượn (2.2.6) |
| 7 | Ev07 | Click button "Tìm kiếm" | Click | Thu thập filter → truy vấn DB → tải kết quả |
| 8 | Ev08 | Click button "Reset bộ lọc" | Click | Xóa sạch bộ lọc, về trạng thái mặc định |
| 9 | Ev09 | Thay đổi tiêu chí Sắp xếp | Select | Chọn sắp xếp: A-Z, Z-A, Mới nhất (3.2) |
| 10 | Ev10 | Thay đổi chế độ xem Grid/List | Click | Toggle Grid (3.3) / List (3.4) |
| 11 | Ev11 | Click button "Xem chi tiết" | Click | Icon mắt (4.9) → Popup chi tiết sách |
| 12 | Ev12 | Chọn mượn / đặt chờ (Add Book) | Click | Nút Action (4.10) → thêm sách vào bảng tạm |
| 13 | Ev13 | Ấn chuyển trang Pagination | Click | Click số trang / prev-next (Khối 5) |
| 14 | Ev14 | Tích chọn tất cả bảng tạm | Click | Checkbox header (6.1) → check/uncheck tất cả |
| 15 | Ev15 | Click button "Thu gọn / Mở rộng" | Click | Toggle collapse/expand panel bảng tạm (6.4) |
| 16 | Ev16 | Chỉnh sửa trạng thái chọn đơn gộp | Click | Checkbox đầu dòng (7.1) |
| 17 | Ev17 | Xóa sách khỏi bảng tạm (Delete line) | Click | Icon thùng rác (7.7) |
| 18 | Ev18 | Click button "Gửi Yêu Cầu Mượn Gộp" | Click | Validate → Confirm → tạo đơn mượn |
| 19 | Ev19 | Tương tác thông tin Tài khoản độc giả | Click | Click tên/mã/avatar (1.2-1.4) → dropdown |
★Trigger: Độc giả đăng nhập vào hệ thống thành công, click chọn menu "Tìm kiếm & Đăng ký mượn sách" từ màn hình Trang chủ.
フローチャット: ✅ Có (xem mục 4.3)
Chi tiết xử lý:
1. Kiểm tra phân quyền
user_id, user_role, user_status, fine_status, overdue_days2. Get data (DB)
| Bảng kết nối | Dữ liệu lấy |
|---|---|
users |
Thông tin độc giả (tên, mã, avatar) |
books |
Danh sách 12 sách mặc định (ORDER BY book_name ASC, LIMIT 12) |
borrow_basket |
Thông tin giỏ mượn gộp hiện tại |
3. Hiển thị hạng mục màn hình
borrow_basket)[Xử lý 99] Lỗi: Không hợp lệ / Chưa Login → Hiển thị popup cảnh báo nợ phạt/lỗi → Redirect
★Trigger: Độc giả đặt con trỏ chuột vào thanh tìm kiếm nhanh (mục 2.1) và thực hiện gõ phím hoặc thay đổi text (Change Event).
フローチャット: ❌ (logic đơn giản)
Chi tiết xử lý:
', ", ;) chống SQL Injection.Validation:
| No | Hạng mục | Điều kiện |
|---|---|---|
| 1 | Thanh tìm kiếm nhanh (2.1) | Kiểu: String. Chấp nhận tiếng Việt, Anh, Nhật. Giá trị ≥ 0, ≤ 255 ký tự |
★Trigger: Độc giả click nút [Bộ lọc nâng cao ⌃] (mục 2.2).
フローチャット: ❌
Chi tiết xử lý:
[Thu gọn bộ lọc ⌅][Bộ lọc nâng cao ⌃]★Trigger: Độc giả nhập hoặc thay đổi giá trị text tại: Tên sách (2.2.1), Tác giả (2.2.2), Nhà xuất bản (2.2.3).
フローチャット: ❌
Chi tiết xử lý:
1. Kiểm tra và giới hạn định dạng nhập:
2. Lưu trữ trạng thái lọc:
Param_Search_BookName ← giá trị 2.2.1Param_Search_Author ← giá trị 2.2.2Param_Search_Publisher ← giá trị 2.2.3★Trigger: Độc giả click vào Combobox Thể loại (mục 2.2.4) và chọn một thể loại cụ thể từ danh sách xổ xuống.
フローチャット: ❌
Chi tiết xử lý:
1. Ghi nhận mã danh mục:
categories.category_id của dòng được chọn → Param_Search_CategoryID★Trigger: Độc giả click tích chọn hoặc bỏ tích chọn tại: "Chỉ hiện sách có sẵn" (2.2.5) hoặc "Chỉ hiện sách đã bị mượn" (2.2.6).
フローチャット: ❌
Chi tiết xử lý:
1. Logic loại trừ lẫn nhau (Mutual Exclusive):
2. Lưu tham số trạng thái:
★Trigger: Độc giả click [Tìm kiếm] hoặc nhấn Enter khi con trỏ ở các ô filter.
フローチャット: ❌
Chi tiết xử lý:
Step 1. Thu thập tham số lọc từ UI:
Lấy: chuỗi tìm nhanh (2.1), Tên sách (2.2.1), Tác giả (2.2.2), NXB (2.2.3), Thể loại (2.2.4), Checkbox (2.2.5, 2.2.6).
"" → gọi lại Ev01 hiện 12 sách mặc định.Step 2. Truy vấn SQL:
| Bảng kết nối | Mệnh đề điều kiện lọc |
|---|---|
| books, author, publisher, category | Kế thừa quyền truy cập từ Ev01 |
AND (LOWER(books.title) LIKE '%Keyword%' |
|
OR LOWER(author.author_name) LIKE '%Keyword%' |
|
OR LOWER(publisher.publisher_name) LIKE '%Keyword%' |
|
OR LOWER(category.category_name) LIKE '%Keyword%') |
|
Nếu 2.2.5 = True → AND books.books_status = 'Available' |
|
Nếu 2.2.6 = True → AND books.books_status = 'Out of stock' |
Step 3. Cập nhật giao diện:
★Trigger: Độc giả click [Reset bộ lọc].
フローチャット: ❌
Chi tiết xử lý:
Step 1. Làm trống UI:
""Step 2. Tải lại mặc định:
★Trigger: Độc giả mở Combobox Sắp xếp (3.2) và chọn tiêu chí.
フローチャット: ❌
Chi tiết xử lý:
Step 1. Ghi nhận tiêu chí:
| Option | SQL |
|---|---|
| Tên sách (A-Z) | ORDER BY b.book_name ASC |
| Tên sách (Z-A) | ORDER BY b.book_name DESC |
| Sách mới nhất | ORDER BY b.created_at DESC |
Step 2. Tải lại: Chạy lại SQL hiện tại + ORDER BY mới.
★Trigger: Độc giả click nút Lưới (3.3) hoặc Danh sách (3.4).
フローチャット: ❌
Chi tiết xử lý:
Step 1. Toggle nút bấm:
Step 2. Thay đổi CSS Layout:
★Trigger: Độc giả click icon con mắt [Xem chi tiết] (mục 4.9) trên thẻ sách.
フローチャット: ❌
Chi tiết xử lý:
Step 1. Lấy mã sách: Nhận books.book_id của thẻ sách được click.
Step 2. Truy vấn chi tiết: Tương tự Get data mục 3.2 Ev01. Lấy thêm: books.description, năm xuất bản, ảnh bìa phóng to, mã sách...
Step 3. Hiển thị: Mở Popup Modal / Dialog giữa màn hình. Điền thông tin. Nút [X] hoặc [Đóng] để tắt.
★Trigger: Độc giả click button Action [+ Chọn mượn ngay] hoặc [+ Chọn đặt chờ] (mục 4.10) trên thẻ sách.
フローチャット: ❌
Chi tiết xử lý:
Step 1. Khởi tạo dòng mới vào Bảng tạm (Khối 7):
| No | Hạng mục | Giá trị mặc định |
|---|---|---|
| 1 | Thông tin sách | Lấy từ thẻ sách (4.1–4.8) |
| 2 | Hình thức đăng ký | [+ mượn ngay] → "Đăng ký mượn" (xanh) / [+ đặt trước] → "Đặt hàng chờ" (cam) |
| 3 | Trạng thái dòng (7.1) | Checked |
Step 2. Thiết lập trạng thái nhập liệu:
| No | Hạng mục | Trạng thái |
|---|---|---|
| 1 | Checkbox (7.1) | Enable |
| 2 | Hình thức đăng ký (7.6) | Disable (chỉ xem) |
| 3 | Nút Xóa (7.7) | Enable |
Step 3. Validate:
| No | Hạng mục | Điều kiện |
|---|---|---|
| 1 | Trùng lặp | books.book_id chưa tồn tại trong Khối 7 |
Step 4. Cập nhật UI:
[✓ Đã chọn]★Trigger: Độc giả click số trang hoặc nút [<] [>] tại Khối 5.
フローチャット: ❌
Chi tiết xử lý:
Step 1. Xác định Current_Page.
Step 2. Tính Offset = (Current_Page - 1) × 12.
Step 3. Thực hiện SQL hiện tại + LIMIT 12 OFFSET {Offset}.
Step 4. Đổ 12 sách mới lên Khối 4. Tô đậm trang hiện tại.
★Trigger: Độc giả click Checkbox tiêu đề (mục 6.1).
フローチャット: ❌
Chi tiết xử lý:
1. Tích chọn (Checked = True):
2. Bỏ tích (Checked = False):
3. Cập nhật nút (8.3): Nếu 8.2 = 0 → Disable.
★Trigger: Độc giả click nút mũi tên (mục 6.4).
フローチャット: ❌
Chi tiết xử lý:
[⌵][⌃]★Trigger: Độc giả click Checkbox (7.1) đầu dòng sách cụ thể.
フローチャット: ❌
Chi tiết xử lý:
1. Ghi nhận True/False cho dòng đó.
2. Đếm lại tổng Checked = True → cập nhật 8.2.
3. Nếu 8.2 ∈ [1, 5] → Enable nút 8.3. Nếu = 0 hoặc > 5 → Disable.
★Trigger: Độc giả click icon thùng rác [Xóa] (mục 7.7).
フローチャット: ❌
Chi tiết xử lý:
1. Lấy books.book_id của dòng bị xóa.
2. Loại bỏ dòng khỏi Khối 7. Đồng bộ ngược Khối 4: tìm thẻ sách tương ứng, đổi button (4.10) từ [✓ Đã chọn] → [+ Chọn mượn ngay] hoặc [+ Chọn đặt chờ].
3. Đếm lại tổng sách → cập nhật 6.3. Đếm lại Checked = True → cập nhật 8.2. Kiểm tra nút 8.3: [1,5] → Enable, ngược lại → Disable.
★Trigger: Độc giả click [Gửi Yêu Cầu Mượn Gộp] (mục 8.3).
フローチャット: ❌
Chi tiết xử lý:
Step 1. Pop-up Confirm:
| Mục | Nội dung |
|---|---|
| Tiêu đề | XÁC NHẬN GỬI YÊU CẦU |
| Nội dung | "Bạn có chắc chắn muốn gửi yêu cầu gộp đơn cho các cuốn sách đã chọn không?" |
| Nút 1 | [Hủy bỏ] — xám |
| Nút 2 | [Xác nhận gửi] — xanh |
Step 2. Validate:
| No | Hạng mục | Điều kiện |
|---|---|---|
| 1 | Tổng sách gộp đơn | Dòng Checked = True: ≥ 1 VÀ ≤ 5 |
Step 3. Phân loại dữ liệu:
type = 'borrow' (mượn ngay)type = 'reserve' (đặt trước)Step 4. Input data vào DB:
4.1 Luồng 'borrow' → Bảng loan + loan_details:
Insert loan:
| No | Field | Quy tắc gán |
|---|---|---|
| 1 | loan.loan_id |
Tự sinh (VD: L-0623001) |
| 2 | loan.user_id |
Từ Get data Ev01 |
| 3 | loan.status |
'Pending' |
| 4 | loan.created_at |
Current_Time |
| 5 | loan.expires_at |
Current_Time + 24h |
Insert loan_details (cho mỗi cuốn sách):
| No | Field | Quy tắc gán |
|---|---|---|
| 6 | loan_details.id |
Tự sinh PK |
| 7 | loan_details.loan_id |
= loan.loan_id (FK) |
| 8 | loan_details.status |
'Pending' |
| 9 | loan_details.book_id |
= books.book_id từ bảng tạm |
Update books:
| No | Field | Điều kiện |
|---|---|---|
| 1 | books.books_status |
Khi COUNT(book_copies.ID) - COUNT(loan_details.ID) = 0 → 'Out of stock' |
Bắt buộc kiểm tra đồng thời để tránh Race Condition.
4.2 Luồng 'reserve' → Bảng reservation:
| No | Field | Quy tắc gán |
|---|---|---|
| 1 | reservation.reservation_id |
Tự sinh PK |
| 2 | reservation.user_id |
Từ Get data Ev01 |
| 3 | reservation.book_id |
= books.book_id |
| 4 | reservation.registered_at |
Current_Time |
| 5 | reservation.reservation_status |
'Waiting' |
| 6 | reservation.reservation_position |
Current_Max_Position + 1 |
Step 5. Hoàn tất:
temporary_table.item_count = 0.[Xử lý 99] Error Handling:
| # | Loại lỗi | Xử lý |
|---|---|---|
| 1 | Lỗi DB (kết nối / trùng lặp) | Rollback toàn bộ SQL |
| 2 | Race Condition (sách bị mượn trước vài giây) | Rollback + thông báo |
| 3 | Lỗi dữ liệu tạm | Toast: "Đã xảy ra lỗi khi tạo phiếu mượn. Vui lòng tải lại trang và chọn lại sách!" + đóng hộp thoại |
★Trigger: Độc giả click vùng tên/mã/avatar (1.2, 1.3, 1.4) góc trên bên phải.
フローチャット: ❌
Chi tiết xử lý:
Hiển thị dropdown menu:
— Hết tài liệu —