注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
制約は、あらゆるスケジューリングワークフローに不可欠な要素です。単純な時間の制限から頻繁に変更されるルールマトリクスまで、ルールの複雑さはさまざまです。検証ルールを使用すると、これらの制約をコード化でき、エンドユーザーは組織の業務を規定する制約や制限を理解したうえで、スケジュールを作成および変更できます。
各検証ルールは TypeScript 関数に基づいており、スケジュールオブジェクトの現在の状態が、関数のロジックで定義された特定の条件を満たしているかどうかを評価します。
検証ルールの結果は、Workshop の Scheduling Gantt Chart ウィジェットのフロントエンドに表示されます。初回の読み込み時には、オントロジーの現在の状態に基づいてすべてのルールが評価されます。スケジュールを変更するたびに、ルールが再評価されます。このプロセスにより、ユーザーは自身の判断が特定の制約や制限に適合しているかどうかを把握できます。
以下は、Scheduling Gantt Chart ウィジェット内のスケジューリング制約の例です。最初の画像では、トグルが示すとおり、オペレーターの重複なしルールが適用されています。このオプションにより、このルールに従う結果のみが表示されます。次の画像は出力を示しています。この例では、オペレーターである Brad Evans と Ashley Brown のスケジュールが重複しており、2行の間で競合が発生しています。
Workshop の Scheduling Gantt Chart ウィジェットでは、変更が行われるたびに検証ルールが呼び出され、スケジュールが検証されます。
1. Action "saveHandler" called on scenario
2. Validation rules called on updated scenario
3. Action "saveHandler" called on scenario
4. Validation rules called on updated scenario
etc ...
n. The user selects "Submit changes", and all Actions that have been applied to the scenario are applied to the Ontology
ルールは Scheduling Gantt Chart ウィジェットで直接設定するため、ユースケースごとにルールを適用できます。Scheduling Gantt Chart ウィジェットにルールを追加するには、次の手順に従います。
scheduleObjectPrimaryKeys 入力引数が必要です。この引数は実行時にウィジェットによって自動入力されるため、空のままにしておくことができます。
以下のデータ型は、検証ルールを記述するために必要な情報を表しており、各オブジェクトに対するルールのステータスを含みます。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30type IFoORule = (scheduleObjectPrimaryKeys: string[]) => Array<IRuleResult> /* ルールの結果は次のように解釈されます。 true - ルールの検証に合格しました false - ルールの検証に合格しませんでした undefined - ルールは指定されたスケジュールオブジェクトに関連しません */ interface IRuleResult { result: boolean | undefined; scheduleObjectPrimaryKey: string; details?: Array<IRuleResultDetails>; } /* デフォルトでは、ポップオーバーカードのテキストにルール名が表示されます。 このルール名はルールオブジェクトで設定されたものです。 必要に応じて、ルールの評価結果に基づいて カスタムテキストを明示的に定義できます。 また、関連する puckIds を指定することで、 ルールが合格または不合格となる理由をユーザーに示せます。 */ interface IRuleResultDetails { description: string; relatedPuckIds: string[]; }
以下は、検証の中核となるロジックを含まない、基本的な関数の例です。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52import { Function, Integer } from "@foundry/functions-api"; import { Objects, TaskOrSchedule, ObjectSet} from "@foundry/ontology-api"; // 型定義については、公開ドキュメントを参照してください。 interface IRuleResultDetails { description: string; relatedPuckIds: string[]; } interface IRuleResult { result: boolean | undefined; scheduleObjectPrimaryKey: string; details?: Array<IRuleResultDetails>; } type IFoORule = (scheduleObjectPrimaryKeys: string[]) => Array<IRuleResult> export class MyFunctions { // 注:制約関数の入力引数名は、必ず正確に `scheduleObjectPrimaryKeys` としてください。 // ウィジェットはこの名前に基づいて、正しいキーの集合をこの関数に送信します。 @Function() public async evaluateIfTaskOrScheduleIsValid(scheduleObjectPrimaryKeys: string[]): Promise<Array<IRuleResult>> { // すべてのスケジュールのオントロジーオブジェクトを取得します。 const taskOrSchedules = await Objects.search().taskOrSchedule() .filter(taskOrSchedule => taskOrSchedule.primaryKey.exactMatch(...scheduleObjectPrimaryKeys)) .allAsync(); // すべての入力キーを順に処理し、それぞれの結果エントリーを生成します。 const ruleResults: Array<IRuleResult> = scheduleObjectPrimaryKeys.map(pk => { const currentTaskOrSchedule = taskOrSchedules.find(taskOrSchedule => taskOrSchedule.primaryKey === pk); // オブジェクトに対して何らかの処理を行い、何らかの検証を行います。... // 検証結果を作成します。 const currentValidationDetails: Array<IRuleResultDetails> = []; currentValidationDetails.push( { description: "This is the description of the validation that passes or not", relatedPuckIds: [] }); const currentResult: IRuleResult= { result: true, scheduleObjectPrimaryKey: pk, details: currentValidationDetails, }; return currentResult; }); return ruleResults; } }
より複雑な検証ルールも作成できます。たとえば、ルールで以下を確認できます。