第 12 章:会議室予約とワークフロー
ここまで来たあなたは、NocoBase にかなり慣れていることでしょう。
本章では、特別なシナリオとして会議管理 モジュールを一緒に実装していきます。
このモジュールには会議室の予約と通知などの機能が含まれています。このプロセスでは、ゼロから会議管理モジュールを段階的に構築し、基礎から始めて徐々に複雑な機能を実現していきます。まず、このモジュールの基本的なデータテーブル構造を設計しましょう。
12.1 データテーブル構造の設計
データテーブル構造は、会議管理モジュールの基盤フレームワークと理解できます。ここでは会議室テーブルと予約テーブルを中心に説明し、ユーザーとの多対多リレーションなど、いくつかの新しいリレーションも取り上げます。

12.1.1 会議室テーブル
会議室テーブルは、すべての会議室の基本情報を格納するために使用します。フィールドには会議室の名称、場所、収容人数、設備などが含まれます。
テーブル構造の例
12.1.2 予約テーブル
予約テーブルは、すべての会議予約情報を記録するために使用します。フィールドには会議室、参加ユーザー、時間帯、会議テーマ、説明などが含まれます。
テーブル構造の例
多対多リレーション
予約テーブルでは「多対多」リレーションが必要です:1 人のユーザー が複数の会議に参加でき、1 つの会議にも複数のユーザーが参加できます。この多対多リレーションの外部キー関連を正しく設定する必要があります。管理しやすくするため、中間テーブルを booking_users と命名できます。

12.2 会議管理モジュールの構築
データテーブル構造の設計が完了したら、設計に従って 2 つのテーブルを作成し、「会議管理」モジュールを構築します。以下が作成と設定の手順です:
12.2.1 テーブルブロックの作成
まず、ページに「会議管理」モジュールを追加し、会議室テーブルブロックと予約テーブルのテーブルブロックをそれぞれ作成します。さらに予約テーブルのカレンダーブロックを作成し、カレンダーのデフォルトビューを「日」に設定します。

会議室テーブルブロックの関連付け設定
会議室テーブルブロックを他の 2 つのブロックと関連付けることで、その会議室に対応する予約レコードを自動的にフィルターできます。次に、フィルター、追加・削除・参照・編集の機能を試して、モジュールの基本的なインタラクションをテストしましょう。
NocoBase ブロック接続(おすすめ!):
これまでのフィルターブロックに加えて、テーブルブロックも他のブロックと接続でき、クリックによるフィルター効果を実現できます。
下図のように、会議室テーブルの設定で他の 2 つの予約テーブルのブロック(予約テーブル - テーブルブロック、予約テーブル - カレンダーブロック)を接続します。

接続が成功すると、会議室テーブルをクリックすると他の 2 つのテーブルも連動してフィルターされます!選択中の項目を再度クリックすると選択解除できます。
12.3 会議室の使用状況検出
ページの設定が完了したら、重要な機能を追加する必要があります:会議室の使用状況の検出です。この機能は、会議の作成や更新時に、対象の会議室が指定された時間帯に使用中かどうかを確認し、予約の重複を防 ぎます。
12.3.1 「操作前イベント」ワークフローの設定
予約時に検出を行うため、特別なワークフロー「操作前イベント」を使用します:
- 操作前イベント(商用プラグイン):データの追加・削除・変更の前に一連の操作を実行でき、いつでも中断して事前にインターセプトできます。この方式は日常のコード開発フローに非常に近いものです!

12.3.2 ノードの設定
使用状況検出のワークフローでは、以下の種類のノードが必要です:
- 計算ノード(データ変換ロジック、更新・追加のケースを処理)
- SQL 操作(SQL クエリの実行)
- JSON 解析(商用プラグイン、JSON データの解析用)
- レスポンスメッセージ(商用プラグイン、フィードバックメッセージの返却用)
12.3.3 予約テーブルのバインドとトリガー設定
予約テーブルをバインドし、トリガーモードを「グローバルモード」に設定して、操作タイプとしてレコードの作成とレコードの更新を選択します。

12.4 計算ノードの設定
12.4.1 「空白 ID を -1 に変換」計算ノードの作成
まず、空白の ID を -1 に変換する計算ノードを作成します。計算ノードは、必要に応じて変数を変換でき、以下の 3 つの形式の操作を提供します:
- Math.js(Math.js を参照)
- Formula.js(Formula.js を参照)
- 文字列テンプレート(データの結合用)
ここでは Formula.js を使用して数値判定を行います:

12.5 SQL 操作ノードの作成
次に、SQL 操作ノードを作成し、クエリを実行して利用可能な会議室を確認します:
12.5.1 利用可能な会議室を検索する SQL
SQL の注意点:変数は SQL 文に直接置換されるため、変数を慎重に確認し、SQL インジェクションを防いでください。適切な箇所にシングルクォートを追加してください。
各変数の意味は以下の通りです:
{{$jobsMapByNodeKey.3a0lsms6tgg}} は前のノードの結果、【ノードデータ/空白 ID を -1 に変換】を表します。
{{$context.params.values.end_time}} は【トリガー変数/パラメータ/送信値オブジェクト/終了時間】を表します。
{{$context.params.values.start_time}} は【トリガー変数/パラメータ/送信値オブジェクト/開始時間】を表します。


