Chương 12: Đặt Phòng họp và Workflow
Tin rằng đến giờ, bạn đã rất quen thuộc với NocoBase rồi.
Trong chương này, chúng ta cùng nhau hiện thực một kịch bản đặc biệt: module quản lý cuộc họp.
Module này bao gồm các chức năng đặt Phòng họp và thông báo. Trong quá trình này, chúng ta sẽ từng bước xây dựng một module quản lý cuộc họp từ con số không, bắt đầu từ cơ bản và dần dần hiện thực các chức năng phức tạp hơn. Hãy bắt đầu thiết kế cấu trúc bảng dữ liệu cơ bản của module này.
12.1 Thiết kế cấu trúc bảng dữ liệu
Cấu trúc bảng dữ liệu có thể hiểu là khung cơ bản của module quản lý cuộc họp. Ở đây chúng ta sẽ tập trung giới thiệu bảng Phòng họp và bảng đặt chỗ, đồng thời sẽ liên quan đến một số quan hệ mới như quan hệ nhiều-nhiều với người dùng.

12.1.1 Bảng Phòng họp
Bảng Phòng họp dùng để lưu trữ thông tin cơ bản của tất cả Phòng họp, các Field bao gồm tên Phòng họp, vị trí, sức chứa, cấu hình, v.v.
Ví dụ cấu trúc bảng
12.1.2 Bảng đặt chỗ
Bảng đặt chỗ dùng để ghi lại tất cả thông tin đặt cuộc họp, các Field bao gồm Phòng họp, người dùng tham gia, khoảng thời gian, chủ đề và mô tả cuộc họp, v.v.
Ví dụ cấu trúc bảng
Quan hệ nhiều-nhiều
Trong bảng đặt chỗ, có liên quan đến một quan hệ "nhiều-nhiều": một người dùng có thể tham gia nhiều cuộc họp, một cuộc họp cũng có thể có nhiều người dùng tham gia. Quan hệ nhiều-nhiều ở đây cần cấu hình tốt liên kết khóa ngoại. Để dễ quản lý, chúng ta có thể đặt tên bảng trung gian là booking_users.

12.2 Xây dựng module quản lý cuộc họp
Sau khi thiết kế xong cấu trúc bảng dữ liệu, chúng ta có thể tạo hai bảng theo thiết kế và xây dựng module "Quản lý cuộc họp". Sau đây là các bước tạo và cấu hình:
12.2.1 Tạo Block bảng
Đầu tiên, thêm module "Quản lý cuộc họp" trên trang, lần lượt tạo Block bảng Phòng họp và Block bảng bảng đặt chỗ. Sau đó tạo thêm một Block lịch bảng đặt chỗ, view mặc định của lịch đặt là "ngày".

Thiết lập liên kết Block bảng Phòng họp
Liên kết Block bảng Phòng họp với hai Block còn lại, như vậy có thể tự động lọc ra các bản ghi đặt chỗ tương ứng với Phòng họp đó. Tiếp theo, hãy thử các chức năng lọc, thêm, xóa, sửa, đọc để kiểm tra tương tác cơ bản của module.
Kết nối Block NocoBase (khuyến nghị!!):
Ngoài Block lọc trước đó, Block bảng của chúng ta cũng có thể kết nối với các Block khác để hiện thực hiệu ứng nhấp lọc.
Như hình bên dưới, trong cấu hình bảng Phòng họp, chúng ta kết nối hai Block khác của bảng đặt chỗ (Block bảng đặt chỗ, Block lịch đặt chỗ)

Sau khi kết nối thành công, nhấp vào bảng Phòng họp, bạn sẽ thấy hai bảng còn lại cũng được lọc theo! Nhấp lại vào mục đã chọn để hủy chọn.
12.3 Phát hiện tình trạng sử dụng Phòng họp
Sau khi cấu hình trang xong, chúng ta cần thêm một chức năng quan trọng: phát hiện tình trạng sử dụng Phòng họp. Chức năng này sẽ kiểm tra xem Phòng họp mục tiêu có đang được sử dụng trong khoảng thời gian chỉ định hay không khi tạo hoặc cập nhật cuộc họp, để tránh xung đột đặt chỗ.
12.3.1 Thiết lập Workflow "sự kiện trước Action"
Để phát hiện trong quá trình đặt chỗ, chúng ta sử dụng một loại Workflow đặc biệt — "sự kiện trước Action":
- Sự kiện trước Action (Plugin thương mại): Thực hiện một loạt các thao tác trước khi thêm, xóa, sửa dữ liệu, có thể tạm dừng và chặn trước bất cứ lúc nào, cách này rất gần với quy trình phát triển code hàng ngày của chúng ta!

12.3.2 Cấu hình Node
Trong Workflow phát hiện tình trạng sử dụng, chúng ta cần các loại Node sau:
- Node tính toán (logic chuyển đổi dữ liệu, dùng để xử lý các trường hợp sửa, thêm)
- Thao tác SQL (thực thi truy vấn SQL)
- Phân tích JSON (Plugin thương mại, dùng để phân tích dữ liệu JSON)
- Tin nhắn phản hồi (Plugin thương mại, dùng để trả về thông tin gợi ý)
12.3.3 Liên kết bảng đặt chỗ và cấu hình trigger
Bây giờ, chúng ta liên kết bảng đặt chỗ, chế độ trigger chọn "chế độ toàn cục", và chọn loại Action là tạo bản ghi và cập nhật bản ghi.

12.4 Cấu hình Node tính toán
12.4.1 Tạo Node tính toán "Chuyển ID trống thành -1"
Đầu tiên, chúng ta tạo một Node tính toán để chuyển ID trống thành -1. Node tính toán có thể chuyển đổi biến theo cách chúng ta cần, cung cấp ba dạng thao tác sau:
- Math.js (tham khảo Math.js)
- Formula.js (tham khảo Formula.js)
- Template chuỗi (dùng để nối dữ liệu)
Ở đây, chúng ta sử dụng Formula.js để đánh giá giá trị:

12.5. Tạo Node thao tác SQL
Tiếp theo, tạo Node thao tác SQL, thực thi câu lệnh truy vấn để kiểm tra Phòng họp khả dụng:
12.5.1 Câu lệnh SQL truy vấn Phòng họp khả dụng
Lưu ý SQL: Biến sẽ được thay thế trực tiếp vào câu lệnh sql, hãy kiểm tra biến cẩn thận để tránh xảy ra SQL injection. Thêm dấu nháy đơn ở vị trí phù hợp.
Trong đó các biến lần lượt là:
{{$jobsMapByNodeKey.3a0lsms6tgg}} đại diện cho kết quả của Node trước, 【Dữ liệu Node/Chuyển ID trống thành -1】
{{$context.params.values.end_time}} đại diện cho 【Biến trigger/Tham số/Đối tượng giá trị submit/Thời gian kết thúc】
{{$context.params.values.start_time}} đại diện cho 【Biến trigger/Tham số/Đối tượng giá trị submit/Thời gian bắt đầu】
12.5.2 Kiểm tra SQL
Mục đích của chúng ta là truy vấn ra tất cả Phòng họp không xung đột với khoảng thời gian mục tiêu.
Trong quá trình này, có thể nhấp vào "Test run" bên dưới, thay đổi giá trị biến, debug SQL.


12.6 Phân tích JSON
12.6.1 Cấu hình Node phân tích JSON
Thông qua kiểm tra ở bước trước, chúng ta có thể quan sát kết quả ở dạng sau, lúc này cần kích hoạt Plugin JSON query node:
Cách phân tích JSON được chia thành ba loại: JMESPath JSON Path Plus JSONata
Ở đây chúng ta chọn một loại bất kỳ, ví dụ định dạng JMESPath, chúng ta cần lọc danh sách tên các Phòng họp khả dụng, vì vậy biểu thức điền:
Cấu hình ánh xạ thuộc tính áp dụng cho danh sách đối tượng, hiện tại không cần thiết, có thể không điền.

12.7 Đánh giá điều kiện
Cấu hình Node đánh giá điều kiện, đánh giá xem Phòng họp hiện tại có nằm trong danh sách Phòng họp khả dụng hay không. Dựa vào kết quả đánh giá là đúng hoặc sai, lần lượt cấu hình tin nhắn phản hồi:
Điều kiện đánh giá, chọn phép tính "cơ bản":

12.7.1 Đúng: Cấu hình tin nhắn thành công
Lúc này cần kích hoạt Plugin Workflow: Response message:

12.7.2 Sai: Cấu hình tin nhắn thất bại
Lưu ý, khi đánh giá thất bại, chúng ta nhất định phải cấu hình Node "Kết thúc luồng", kết thúc luồng thủ công.

12.8 Kiểm tra chức năng và debug chi tiết
Bây giờ chúng ta đi vào giai đoạn kiểm tra cuối cùng của hệ thống quản lý cuộc họp. Mục đích của giai đoạn này là xác nhận xem Workflow của chúng ta có thể phát hiện chính xác và ngăn chặn việc đặt Phòng họp xung đột hay không.
12.8.1 Thêm đặt chỗ với khoảng thời gian xung đột
Đầu tiên, chúng ta thử thêm một cuộc họp xung đột với thời gian đặt chỗ đã có để xem hệ thống có chặn thao tác và hiển thị thông báo lỗi hay không.
- Đặt khoảng thời gian đặt chỗ xung đột
Chúng ta thử thêm một đặt chỗ mới ở "Phòng họp 1" với thời gian là
2024-11-14 00:00:00 - 2024-11-14 23:00:00
Khoảng thời gian này bao trùm cả ngày, chúng ta cố tình tạo xung đột với thời gian đặt chỗ hiện có.
- Xác nhận đặt cuộc họp đã tồn tại
Trong "Phòng họp 1", đã có hai khoảng thời gian đặt chỗ:
2024-11-14 09:00:00 đến 2024-11-14 12:00:002024-11-14 14:00:00 đến 2024-11-14 16:30:00
Hai khoảng thời gian này đều có chồng chéo với khoảng thời gian chúng ta định thêm
(2024-11-14 00:00:00 - 2024-11-14 23:00:00).
Vì vậy, theo logic đánh giá, hệ thống nên phát hiện xung đột thời gian và chặn lần đặt chỗ này.
- Submit đặt chỗ và xác minh phản hồi
Chúng ta nhấp vào nút Submit, hệ thống sẽ thực thi quy trình phát hiện trong Workflow:
Phản hồi thành công: Sau khi submit, hệ thống hiển thị thông báo xung đột, cho thấy logic phát hiện hoạt động bình thường. Trang phản hồi thành công thông báo cho chúng ta rằng không thể hoàn thành đặt chỗ này.

12.8.2 Thêm đặt chỗ với khoảng thời gian không xung đột
Tiếp theo kiểm tra đặt chỗ không xung đột~
Đảm bảo khi thời gian cuộc họp không chồng chéo, chúng ta có thể đặt Phòng họp thành công!
- Đặt khoảng thời gian đặt chỗ không xung đột
Chúng ta chọn một khoảng thời gian không xung đột, ví dụ
2024-11-10 16:00:00 - 2024-11-10 17:00:00.
Khoảng thời gian này không chồng chéo với thời gian đặt chỗ hiện có, vì vậy phù hợp với yêu cầu đặt Phòng họp.
- Submit đặt chỗ không xung đột
Nhấp vào nút Submit, hệ thống lại thực thi logic phát hiện của Workflow:
Hãy cùng xác minh: Submit thành công! Hệ thống hiển thị thông báo "Đặt chỗ thành công". Cho thấy chức năng đặt chỗ trong trường hợp không xung đột cũng hoạt động bình thường.

12.8.3 Sửa thời gian đặt chỗ đã có
Ngoài việc thêm đặt chỗ mới, các bạn còn có thể kiểm tra việc sửa thời gian đặt chỗ đã tồn tại.
Ví dụ, đổi thời gian cuộc họp đã có sang một khoảng thời gian không xung đột khác, sau đó nhấp submit lại.
Bước này dành cho các bạn nhé.
12.9 Tối ưu Dashboard và bảng lịch trình cá nhân
Sau khi tất cả các bài kiểm tra chức năng đã thông qua, chúng ta có thể tiếp tục làm đẹp và tối ưu Dashboard để nâng cao trải nghiệm người dùng.
12.9.1 Điều chỉnh bố cục Dashboard
Trong Dashboard, chúng ta có thể sắp xếp lại nội dung trang theo thói quen thao tác của người dùng, để người dùng tiện xem tình hình dữ liệu hệ thống hơn.
Để nâng cao trải nghiệm người dùng hơn nữa, có thể tạo một bảng lịch trình cuộc họp riêng cho mỗi người dùng. Thao tác cụ thể như sau:
- Tạo Block "Lịch trình cá nhân" mới: Trong Dashboard, thêm một Block lịch hoặc Block danh sách mới, hiển thị lịch trình cuộc họp cá nhân của người dùng.
- Đặt giá trị mặc định cho thành viên: Đặt giá trị mặc định của thành viên là người dùng hiện tại, để khi người dùng mở Dashboard sẽ mặc định hiển thị các cuộc họp liên quan đến mình.
Tiếp tục tối ưu trải nghiệm sử dụng module quản lý cuộc họp của người dùng.
Sau khi hoàn thành các cấu hình này, chức năng và bố cục của Dashboard trực quan và dễ sử dụng hơn, chức năng cũng phong phú hơn nhiều!


Thông qua các bước trên, chúng ta đã thành công hiện thực và tối ưu các chức năng chính của module quản lý cuộc họp! Hy vọng trong quá trình thao tác, bạn có thể từng bước nắm vững các chức năng cốt lõi của NocoBase và trải nghiệm niềm vui xây dựng hệ thống mô-đun hóa.
Tiếp tục khám phá và phát huy hết khả năng sáng tạo của bạn! Nếu gặp vấn đề, đừng quên rằng bạn có thể tham khảo Tài liệu chính thức NocoBase hoặc tham gia Cộng đồng NocoBase để thảo luận bất cứ lúc nào.


